ワンクリックで
quickapps-code-review
// Use before creating a PR or claiming a change is ready (or on explicit user invocation). Self-reviews the current diff against the patterns this team's reviewers consistently flag.
// Use before creating a PR or claiming a change is ready (or on explicit user invocation). Self-reviews the current diff against the patterns this team's reviewers consistently flag.
| name | quickapps-code-review |
| description | Use before creating a PR or claiming a change is ready (or on explicit user invocation). Self-reviews the current diff against the patterns this team's reviewers consistently flag. |
| allowed-tools | Read Grep Glob LSP Bash(git diff:*) Bash(git log:*) Bash(git show:*) Bash(git status:*) Bash(git rev-parse:*) Bash(date:*) Bash(gh pr view:*) Bash(gh pr diff:*) Bash(gh pr list:*) Write(docs/reviews/*) Bash(mkdir -p docs/reviews) |
| argument-hint | [pr|uncommitted] |
| arguments | scope |
| model | opus |
| effort | xhigh |
| context | fork |
| agent | general-purpose |
Self-review the current diff against the recurring feedback this team's reviewers actually leave. Catches it before they do.
gh pr createscope = $scope (one of pr | uncommitted; if empty, default to pr):
pr — review only committed changes on the current branch vs development. Use exactly:
git diff development...HEAD
Do not run plain git diff (no revision range), git diff --staged, or include git status output. Uncommitted/unstaged files are out of scope.uncommitted — review only working-tree + staged changes (not yet committed). Use exactly:
git diff HEAD
Do not include committed changes from the branch.If the resolved diff is empty (or whitespace-only), report "nothing to review" and stop — do not write a review file.
$scope above. If $scope is empty, treat it as pr. Never mix scopes in one run.nit: tag). Render each finding as a markdown checkbox (- [ ]) so they can be ticked off as they are addressed.docs/reviews/<branch>__<YYYYMMDD-HHMM>.md:
<branch>: current branch from git rev-parse --abbrev-ref HEAD, with / replaced by -. Keep prefixes (feat-, fix-, chore-) as-is.<YYYYMMDD-HHMM>: short local datetime from date +%Y%m%d-%H%M.docs/reviews/ if missing, then write the file (both pre-approved).When verifying field existence (§9) or whether an identifier still exists after a rename (§6, §8), prefer LSP (hover, goToDefinition, findReferences) over re-reading files. This skill is read-only; navigation tools are too.
Do NOT auto-apply fixes unless the user asks — surface them first.
The single most common review comment is some form of "why is this here?" — apply that lens to every new file, field, parameter, import, and comment.
del param) — don't silently leave it.else after a branch that already returns/handles)? Drop it.common/ importing from agent/.Foo()) where another site injects it? Unify on constructor injection.os.getenv in app code? Reject. Move to a pydantic-settings BaseSettings. To check if an env var was actually set, use "field_name" in settings.model_fields_set.import os solely for env access? Drop it.docs/designs/? Update the doc body to match what was actually built.Status: line to Implemented in the same PR.make dump_app_schema and commit the regenerated artifacts.Any used where a concrete type is available? Replace.@dataclass? Use Pydantic BaseModel (frozen if immutable).cast(...) or isinstance check where the type is already known? Drop it.getattr(obj, "x") where obj.x works? Use direct access.hover).logger.debug/info(...)? Switch to lazy %-form: logger.debug("msg %s", arg).if logger.isEnabledFor(DEBUG): or make lazy.json.dumps(obj, ensure_ascii=False, default=str).Authorization header? It must never carry auth — strip it. A test asserting that scenario should be deleted, not added.If you find yourself thinking any of these while reviewing your own change, treat it as a blocker:
| Thought | Reaction |
|---|---|
| "This bit isn't strictly needed but might be useful later" | Delete it — a reviewer will ask "why is this here?" |
| "I'll just sneak this rename in" | No. Separate PR. |
"It's just one os.getenv" | Move to BaseSettings. |
| "I'll update the design doc in a follow-up" | Do it in this PR. |
| "common/ importing from agent/ is fine for now" | It is not. Fix the direction. |
| "The cached tool-call responses still work" | If you renamed a tool, regenerate caches. |
"Any is fine here" | Use the concrete type. |
The file saved to docs/reviews/ and the in-chat summary share this layout:
# Code review — <branch> ($scope)
_Generated: <YYYY-MM-DD HH:MM>_
## Blocking
- [ ] `path/to/file.py:42` — §<N> <rule name>: <what's wrong>. Suggested: <fix>.
- [ ] ...
## Nits
- [ ] `path/to/file.py:88` — §<N> <rule name>: <what's wrong>. Suggested: <fix>.
## Scope / structure
- [ ] split-PR concerns, missing schema regen, design-doc updates, etc.
## Verdict
<ship | fix-then-ship | split>
Every finding is a checkbox — the author ticks them off as fixes land.
This checklist drifts as conventions evolve. At the start of every review run, check freshness:
git log -1 --since='7 days ago' --format=%h -- .claude/skills/quickapps-code-review/SKILL.md
references/REFRESHING.md.Refresh is always separate from the review run — never block reviewing on a stale checklist.
Formats file and URL parameters for tool calls. You must analyze the target tool's parameter names and descriptions to choose the correct format (base64, text, or URL ref).
Use when the user asks to review, critique, validate, or approve a design doc under docs/designs/. Appends a Review Notes block; on explicit approval, strips notes and flips Status to Approved.