n8n-io/n8n:human-like-code-review
Reviews a GitHub pull request like a thoughtful human reviewer and writes the feedback to a markdown file. Prioritizes context, architecture fit, solution complexity, bugs, security edge cases, and missing tests. Use when given a PR URL to review, or when the user says /human-like-code-review.
npx skills add https://github.com/n8n-io/n8n --skill n8n:human-like-code-review
Review a GitHub pull request with a code-review mindset and produce a copy/paste-friendly
markdown file of feedback. Context is the foundation: understand the problem, intended
solution, and surrounding architecture before judging the diff. Findings are the primary
focus: prioritize architecture, over-complexity, bugs, regressions, security edge cases,
and missing tests. Do not make code changes unless the user explicitly asks for them.
The user must provide a GitHub pull request URL (e.g. https://github.com/n8n-io/n8n/pull/1234).
If not provided, ask for it before proceeding.
Extract the PR number and repository from the URL and use the gh CLI to fetch the PR diff and metadata.
gh pr diff <number> --repo <owner>/<repo>gh pr view <number> --repo <owner>/<repo>gh api repos/<owner>/<repo>/pulls/<number>/commentsn8n:linear-issue before reviewing the diff. Use the ticket description,
comments, linked GitHub issues/PRs, media, related issues, affected node
popularity, and effort estimate as review context. If the skill is not
available, fetch the same Linear context through the active Linear MCP or ask
the user to provide the ticket details before continuing.
expected, which packages or systems are affected, and what constraints come
from the PR description, Linear ticket, linked issues, specs, or existing
code.
.md file named review-<repo>-<number>.md inside the repo's gitignored tmp/ folder, so it is never committed (the tmp folder is listed in .gitignore). Create the folder if needed (mkdir -p tmp) and write to tmp/review-<repo>-<number>.md. Print the path to the file when done so the user can open it.10. Before finishing, clean up any scratch files created during review. The only
file that should remain in tmp/ from this skill run is the final
tmp/review-<repo>-<number>.md review file.
Prefer reading gh output directly instead of writing extra files. If you need
scratch files for a complex review (for example, a saved diff or extracted file
contents), remove them before you finish. Do not leave tmp/pr-*.diff,
extracted source files, or empty temporary files behind.
Do not start from the changed lines alone. First understand the problem being
solved, the exact behavior promised by the PR/ticket/spec, which architectural
layer should own it, which existing patterns or helpers it should fit, and the
important edge cases: security, permissions, malformed input, compatibility,
persistence, concurrency, and rollback behavior.
If the context is missing or contradictory, say so in ## General and review
the diff with that uncertainty explicit instead of inventing requirements.
Findings must be the primary focus, ordered by severity (most severe first):
Style, naming, and minor nits come last, and only if they genuinely matter.
For non-trivial changes, compare nearby implementations and shared utilities.
Ask whether the behavior belongs in the node, controller, service, repository,
frontend store, shared API type, or existing workflow utility. If 100 lines
could reasonably be 10, explain the simpler shape and why it is safer or easier
to maintain. Do not flag complexity just because the diff is large; flag it when
the extra code creates risk, duplicate behavior, or avoidable maintenance cost.
Especially when nodes are changed, check that the change does not break backward
compatibility for existing users' workflows (renamed/removed parameters, changed
defaults, altered output shape, different behavior for the same input).
If there's a risk of broken backward compatibility, consider node versioning and
leave this inside the comments - point out the risk and suggest a new node version
(or a versioned default) rather than changing existing behavior in place.
Use this checklist while reviewing. Do not force comments for every category,
but make sure the diff has been checked against these common failure modes.
setInterval, setTimeout) that are never cleareddispose()/destroy().write() return value ignored (missing drain await), .pipe() used instead of pipeline(), missing AbortSignal for teardown, objectMode streams with untuned highWaterMark, Transform streams without asymmetric buffer limits.null / undefined inputs - are they guarded or documented as preconditions?[] and {}?default in switch statements over union types@ProjectScope or @GlobalScopecli or n8n-specific concepts should not leak into generic SDK packages| Severity | Meaning |
|---|---|
| Critical | Data loss, crash, security hole, or resource leak that will occur in production |
| High | Likely to cause bugs or silent failures under realistic inputs |
| Medium | Reduces robustness or will cause problems as the code grows |
| Low | Style, readability, or minor improvement |
| Priority | Meaning |
|---|---|
| P1 | Must fix before merge |
| P2 | Should fix in this PR or as immediate follow-up |
| P3 | Nice to have, can be filed as a task |
The markdown file must contain:
## Hints for a reviewer section (see below).## General section (see below).## Comments section with a list of review comments in this format:file name + line number + comment
## Issue Summary section at the end of the review (omitcategories with no issues).
Comments should be easy to copy/paste. Do not quote comments using > - just write them directly.
It's totally okay to have no line comments. Do not force findings or point out
minor things just to have something to say. In those cases, prefer an empty
comments list and a short positive ## General comment.
When a comment suggests something different, be precise about it. Either propose the actual code change (a short snippet or suggestion block the author can apply directly) or, if a full snippet isn't practical, state the concrete direction (which function/value/approach to use) rather than a vague hint. Avoid comments like "this could be cleaner" with no actionable next step.
After the prose review, always end with a plain-text ## Issue Summary section. If there are no issues in a category, skip that category rather than
adding empty headings.
Use this format:
## Issue Summary
1. Critical / P1 / Memory leak
Location: `path/to/file.ts:42`
`setInterval` in constructor is never cleared.
2. High / P2 / Edge case
Location: `path/to/service.ts:100`
No guard for empty array - crashes on `arr[0].id`.
3. Medium / P3 / Method size
Location: `path/to/handler.ts:buildFoo()`
80-line method mixes validation, mapping and I/O; suggest splitting into three helpers.
Right after the header, include a ## Hints for a reviewer section to orient the
human reviewer before they read the diff:
authorAssociation or a fork-prefixed branch like random-fork-owner:fix-node-option.
Keep it to a couple of sentences. It's about saving the reviewer time, not a
detailed write-up.
Before the line-by-line comments, include a ## General section that can be
pasted as the review summary. Make it sound human and natural - it is okay to
start with something short and friendly like "Hey, nice job on this" when the
change deserves it. Then add any top-level, PR-wide feedback that doesn't belong
on a single line - e.g. design or architecture concerns, an implicit/type-unsafe
contract between files, repeated patterns, scope, or missing test coverage of
the actual change.
summary and move on - do not pad it.
Line numbers MUST be the actual line numbers in the file on the PR branch (the new/right side of the diff), NOT the position within the diff hunk.
To get the correct line number: look at the @@ hunk header (e.g. @@ -19,10 +19,9 @@). The +19 means the new file starts at line 19. Count down from there for each line that is a context line ( ) or an added line (+). Skip removed lines (-) - they don't exist in the new file.
Example: if a hunk says @@ -10,5 +10,6 @@ and you want to comment on the 3rd non-removed line in that hunk, the line number is 10 + 2 = 12.
Never guess line numbers. Always compute them from the hunk headers.
Before suggesting a change to a pattern (naming, structure, style), check whether the same pattern is used elsewhere in the codebase or in similar nodes/files. If it is an established convention, do NOT flag it. Only comment if something genuinely deviates from existing patterns.
- instead.Write review comments naturally, like a friendly human reviewer.
Feel free to use phrases like:
You can also insert an emoji from time to time 🙂
Keep comments friendly, short, and collaborative. Avoid judgmental wording like "you made a mistake" or anything overly critical.
Do not make code changes unless the user explicitly asks for them. This skill produces a review, not a patch.
The very last sentence of your reply must be a clickable Markdown link to the
review file, so the user can open it from the agent chat immediately. Use this
format: tmp/review-<repo>-<number>.md.
Nothing should come after the link.
Take n8n-io/n8n:human-like-code-review from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.