본문으로 건너뛰기
cccskills
무료GitHub에 공개

review

Code Review Assistant. Reviews uncommitted changes or recent commits for pattern violations, security issues, and bugs. Optimized for solo dev moving fast. Use when reviewing code before or after committing.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(1)

  • SKILL.md9.7 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Review Skill

Fast, opinionated code review for a solo dev shipping quickly. Catches real problems, skips bikeshedding.

Modes

InvocationWhat it reviews
/reviewAll uncommitted changes (staged + unstaged)
/review last NThe last N commits on current branch
/review --scope <pkg>Uncommitted changes filtered to a package
/review --file <path>A single file

Rules

  1. No style opinions — formatting, naming preferences, comment style → skip. That's linting.
  2. No scope creep — only review what's in the diff. Never suggest "while you're here..." changes.
  3. No praise — don't say "nice work" or "good use of". Just flag problems or say "clean".
  4. Severity matters — categorize every finding. Don't mix critical bugs with nits.
  5. Be specific — file, line, what's wrong, how to fix. No vague "consider improving".
  6. Trust the dev — if something looks intentional, don't flag it. Flag things that look accidental.

Severity Levels

LevelMeaningAction
🔴 CriticalSecurity hole, data loss risk, crashMust fix before shipping
🟡 WarningBug likely, pattern violation, missing validationShould fix soon
🔵 NoteMinor issue, potential improvementFix when convenient

Fast-Path for Non-Code Changes

When the diff contains only documentation and config files (.md, .yml, .yaml, .json, .toml, .txt) and no code files (.ts, .vue, .css, .scss, .js, .mjs), skip the full checklist and use this shortened review:

Check:

  • Content is accurate and not misleading
  • No typos or grammar issues
  • Links and references are valid (file paths, URLs, anchors)
  • Formatting is consistent with surrounding content
  • No secrets, tokens, or credentials in the content

Skip: Security, correctness, project patterns, package boundaries, dead code, API endpoints, Vue components — these don't apply to non-code changes.

Detection:

# If this returns nothing, it's a doc-only diff → use fast-path
git diff --name-only <base>..<branch> | grep -E '\.(ts|vue|css|scss|js|mjs)$'

Produce the same structured report format, just with the shorter checklist.

Workflow

Step 1: Gather the diff

For uncommitted changes (/review or /review --scope):

git diff                  # unstaged
git diff --cached         # staged
git status               # new files

For recent commits (/review last N):

git log --oneline -N
git diff HEAD~N..HEAD

For single file (/review --file <path>):

git diff -- <path>        # if modified
# or just read the file if it's new

If --scope is set, filter to files matching packages/<pkg>/** or apps/<pkg>/**.

Step 2: Read the full context

For every changed file, read the COMPLETE file (not just the diff). You need surrounding context to catch:

  • Unused imports after a refactor
  • Broken references from renames
  • Duplicated logic that already exists elsewhere

For files over 500 lines, read at minimum the changed sections ±50 lines.

Step 3: Run checks

Check every changed file against this checklist. Skip categories that don't apply (e.g., skip "API" checks for a component file).

Security

  • No hardcoded secrets, API keys, tokens
  • No v-html with user-controlled content (XSS)
  • Server endpoints validate input (especially route params and body)
  • Server endpoints check team authorization (useTeamContext())
  • No raw SQL — should use drizzle queries
  • No eval(), new Function(), or dynamic import() with user input

Correctness

  • Async operations wrapped in try/catch or use { data, error } pattern
  • Reactive references not destructured (loses reactivity)
  • await not missing on async calls
  • Correct HTTP method on API routes (filename matches: .get.ts, .post.ts, etc.)
  • No infinite loops or unbounded recursion
  • Proper cleanup in onUnmounted for listeners/intervals

Project Patterns (from CLAUDE.md)

  • <script setup lang="ts"> — never Options API
  • hub: { db: 'sqlite' } — never hub: { database: true }
  • useTeamContext() — never raw route.params.id for team ID
  • createError({ status, statusText }) — never statusCode/statusMessage
  • Nuxt UI v4 names — USeparator, USwitch, UDropdownMenu (not v3 names)
  • No resolveComponent() for optional cross-package components (use stub pattern)
  • useState() for state — no Pinia
  • Composition API only

Package Boundaries

  • No direct DB queries for tables owned by another package (e.g., crouton-email querying teamSettings directly instead of going through crouton-auth exports)
  • No type imports from deep internal paths of another package — use public exports or auto-imports
  • API endpoints live in the package that owns the domain (e.g., team settings CRUD in crouton-core/crouton-admin, not scattered)
  • No server utils in package A that duplicate logic from package B (e.g., re-implementing team resolution instead of using crouton-auth's resolveTeamAndCheckMembership)
  • Components that belong to a domain live in that domain's package (e.g., email components in crouton-email, not crouton-core)
  • Auto-imports from other packages are used via Nitro/Nuxt auto-import, not manual deep imports

Dead Code

  • No unused imports
  • No unreachable code after return/throw
  • No commented-out code blocks (delete it, git has history)
  • No unused variables (except intentional _ prefix)

API Endpoints (server/ files only)

  • Input validation with zod or similar
  • Consistent error responses using createError()
  • Team-scoped endpoints use useTeamContext()
  • Return types are consistent (not mixing shapes)

Gates, Checks & Flow Steps

Applies when the diff adds or changes a rule that judges other code (a validator, a CI check, a sign-off gate) or a step that mutates state (writes a file, commits, labels, dispatches). See AGENTS.md → Authoring a gate for the argument.

  • Can this path exit 0 having done nothing? The recurring defect is a silent no-op, not a crash: git add on a gitignored path adds nothing (#1933) · --add-label X on an issue already carrying X fires no event, so nothing downstream wakes (#1750) · rows.filter(r => r.refTarget) dropped the relations missing a target, then reported "No relationships" (#1953)
  • What in the output would prove it acted? A count, a path, a diff — if the run's own output can't distinguish "did the work" from "did nothing", say so and add the proof
  • Where it can no-op, assert the effect instead of assuming it — check the artifact is committable rather than trusting the write; remove-then-add rather than hoping the event fires
  • Was the rule run over the corpus, with the hit count reported? Green unit tests only prove the rule matches its author's imagination — #1957's first version passed 8 and would have refused 4 shipping schemas. Cheap to do: node scripts/corpus-check.mjs --glob 'apps/*/schemas/*.json' --rule ./my-rule.mjs (advisory — skip it when there's no meaningful corpus, e.g. a rule over one generated file)
  • Does "no matches" mean clean, or mean the query was wrong? A scan that matched nothing has proved nothing

Vue Components (*.vue files only)

  • Props have TypeScript types
  • Emits are declared with defineEmits
  • No direct DOM manipulation (use refs or VueUse)
  • Modal/Slideover uses v4 pattern (v-model + #content="{ close }")

Step 4: Produce the report

If nothing found:

## Review: clean ✅

Reviewed N files, no issues found.

If issues found:

## Review Summary

| Severity | Count |
|----------|-------|
| 🔴 Critical | X |
| 🟡 Warning | Y |
| 🔵 Note | Z |

### 🔴 Critical

#### [Short title]
**File:** `path/to/file.ts:42`
**Issue:** [What's wrong]
**Fix:** [How to fix — be specific, show code if helpful]

---

### 🟡 Warning

#### [Short title]
**File:** `path/to/file.vue:15`
**Issue:** [What's wrong]
**Fix:** [How to fix]

---

### 🔵 Note

#### [Short title]
**File:** `path/to/file.ts:88`
**Issue:** [What's wrong]
**Fix:** [How to fix]

Step 5: Offer to fix

After presenting the report:

Want me to fix any of these? (all / critical only / pick by number)

If user says "all" or "critical only", fix them directly — no confirmation per fix. Use Edit tool. After fixing, run pnpm typecheck on affected apps.

Parallelization

When reviewing 5+ files, split into parallel agents:

  • Group files by directory (server/, app/components/, app/composables/)
  • Each agent reviews its group and returns findings
  • Compile findings into single report

For <5 files, review sequentially in the main context — agent overhead isn't worth it.

Edge Cases

No changes

Nothing to review — working tree is clean and no commits specified.

Binary/generated files

Skip: *.sqlite, *.wasm, pnpm-lock.yaml, .nuxt/, dist/, .wrangler/, node_modules/

Large diffs (50+ files)

Warn the user and suggest scoping:

50+ files changed. Consider scoping:
  /review --scope crouton-core
  /review --file path/to/important-file.ts

Then proceed if they confirm, using parallel agents.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

a11y

무료

Accessibility review for Vue surfaces — the code-cleaning analog of /code-review and /simplify, pointed at WCAG/ARIA. Reviews just your diff (or a package/file), rates findings by severity, and either comments inline on the PR (--comment) or applies the safe fixes for you (--fix). Steers the depth-aware `a11y` subagent. Use when asked to "check accessibility", "a11y this", "audit ARIA/keyboard", or run /a11y.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

FriendlyInternet/nuxt-crouton102026년 10월 20일 업데이트

ask-human

무료

Emit a blocking question the owner can read in ~10 seconds and answer in one reply — the scannable, recommendation-first handoff every agent posts when it hits a fork it can't own. Leads with the one decision + a recommendation, carries the 🤖 provenance header, doubles as the

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

FriendlyInternet/nuxt-crouton102026년 10월 20일 업데이트

audit

무료

Audit packages for documentation completeness, detect drift between code and docs, and maintain documentation quality across the monorepo. Use when checking package docs, running audits, or reviewing documentation health.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

FriendlyInternet/nuxt-crouton102026년 10월 20일 업데이트

Author a placeable layout block that looks right at ANY pane size. The one hard rule — size to the PANE with container queries (@container), never the viewport — plus list/form playbooks and the sizing contract (minWidth etc.) the viability metric reads. Use when adding/converting a croutonLayoutBlocks block, or when a block overflows/breaks in a narrow pane.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

FriendlyInternet/nuxt-crouton102026년 10월 20일 업데이트

When a bug or regression is reported, the FIRST step — before fixing — is to research how and when it was introduced (git archaeology), then record that finding on the tracking issue/PR. Use the moment a bug, error, broken build, or "this used to work" is reported, before writing a fix. Produces a first-bad-commit (or "not a code regression") note you paste onto the issue.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

FriendlyInternet/nuxt-crouton102026년 10월 20일 업데이트

commit

무료

Smart, granular git commits following monorepo conventions. Analyzes changes, filters to session-relevant files, groups by intent, and uses conventional commit format. Use when committing code changes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

FriendlyInternet/nuxt-crouton102026년 10월 20일 업데이트

FriendlyInternet의 스킬 모두 보기

이 스킬의 문제 신고