skills/code-review/SKILL.md
Review local code changes — uncommitted work, the current branch vs main, or a specific commit — for code quality, minimal implementation, basic security, and feature completeness. Use this skill whenever the user asks to review code, review changes, review a branch, review a commit, audit a diff, sanity-check what's about to be committed, or asks "is this ready to ship?" — even when they don't say the word "review" explicitly. This is a fast local review run inside the project, not the cloud-based /ultrareview. The output is a severity-grouped findings report with file:line citations.
npx skillsauth add abogoyavlensky/agents code-reviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill produces a focused review of local changes against four axes: code quality, minimal implementation, basic security, and feature completeness. Findings are grouped by severity (Must fix / Should fix / Nit), with each item tagged by axis and pointing to a specific file and line.
The reviewer reads the diff carefully, but also reads enough surrounding code to judge intent and call sites. A diff in isolation is rarely enough.
Pick what to review based on the user's request and repo state. Resolve in this order:
git show <ref> or
git diff <range>.git rev-parse --verify main then
master as fallback. If neither exists, ask.git log --oneline <main>..HEAD and
git diff <main>...HEAD.git diff HEAD). Untracked files do not count toward scope
detection and are not included in the review by default — they're
usually local scratch (build outputs, editor configs, dev tooling
like .mise.toml or .clj-lsp/, WIP that was never meant for
review). If the user wants a specific untracked file reviewed,
they'll name it.State the chosen scope at the top of the report so the user can correct it if you guessed wrong.
For the chosen scope:
git diff -U10 or higher) so you can
reason about callers and surrounding logic.When a finding turns on something outside the diff (a caller, a related file, a config), open that file and verify before reporting. Don't speculate — either confirm or skip.
Each axis below has a short explanation of what to look for and why. These aren't checklists to grind through mechanically — they're lenses. Read the diff once, then ask yourself the questions in each section.
Is the change clear to read? Does each function do one thing? Are names unambiguous? Is error handling at the right boundary (system edges, not internal calls between trusted modules)? Are there dead branches, unused imports, copy-pasted blocks that drifted?
Flag anything a maintainer reading this six months from now will need to re-derive. The cost of unclear code is paid every time someone touches it.
Did the change add only what the task required? Watch for:
Three similar lines beats a premature abstraction. Code is easier to generalize once a real second use arrives than to un-generalize when the abstraction was wrong.
You're not running a full security audit — you're catching obvious mistakes that wouldn't survive review at any company. Look for:
eval, pickle, Marshal, JSON.parse
on attacker-controlled input.Internal code calling internal code is a trusted boundary; don't demand validation between components that already trust each other. Validation goes at the system edge.
Does the change actually accomplish what its commit message (or apparent intent) says? Look for:
If the intent is unclear, say so in Notes rather than inventing one.
Use the template below. Severity rules of thumb:
Keep findings short. One or two sentences per item is usually enough. The file:line lets the reader jump there; don't restate the code.
If a section is empty, omit it. If the whole review finds nothing, say that explicitly — a clean review is a useful signal too.
# Code review: <one-line scope description>
**Scope:** <e.g. "uncommitted changes — 4 files, +120 -34">
**Intent:** <quoted commit message phrase, or short inferred summary, or "unclear">
## Must fix
- **<axis>** `<file>:<line>` — <short title>
<one or two sentence rationale>
## Should fix
- **<axis>** `<file>:<line>` — <short title>
<one or two sentence rationale>
## Nit
- **<axis>** `<file>:<line>` — <short title>
<one or two sentence rationale>
## Notes
<anything else worth surfacing — e.g. "no security-sensitive surfaces touched",
"tests added cover the change", "two unrelated changes mixed in this diff",
or omit if there's nothing to say>
Axis tags: quality, minimal, security, completeness.
Report findings, not patches. The user will decide what to act on and ask for fixes in follow-up turns. Adding fixes inline turns a review into an implementation pass and obscures what was found.
If a fix is genuinely two characters (a typo in a string, a missing close paren) and pasting it is shorter than describing it, you can include it — but that's the exception.
development
Review, edit, or draft technical articles, blog posts, tutorials, README-style walkthroughs, and documentation in Andrey Bogoyavlensky's practical technical writing voice. Use when asked to review or improve an article end to end (grammar, fluency, factual correctness, readability) and apply the fixes; improve grammar, fluency, structure, or style of technical prose; align a draft with "my style"; or write/rewrite articles for bogoyavlensky.com while preserving the author's voice.
documentation
Use when writing prose humans will read - documentation, commit messages, error messages, explanations, reports, or UI text. Applies Strunk's timeless rules for clearer, stronger, more professional writing.
tools
Run a second-opinion code review using the Codex CLI (`codex exec review`) in the background and surface the findings when it finishes. Use when the user says "review with codex", "second-opinion review", "what does codex think", or wants an outside model to look at local changes (uncommitted, current branch vs main, or a named commit). Also used as the review checkpoint inside the `executing-plans` skill.
documentation
Create structured implementation plan in docs/plans/