| name | source-command-tech-codereview |
| description | Pre-PR code review for StarMapper. Analyzes recent changes for quality, security, performance, and StarMapper-specific patterns. Supports auto-fix loop and multi-agent modes. |
source-command-tech-codereview
Use this skill when the user asks to run the migrated source command tech-codereview.
Command Template
Code Review — StarMapper
Pre-PR local review analyzing recent changes against StarMapper conventions.
Usage
/tech:codereview # Standard review of staged/recent changes
/tech:codereview --auto # Review + auto-fix loop (max 3 iterations)
/tech:codereview --multi-agent # 4 parallel agents (comprehensive)
/tech:codereview --focus security # Single dimension
/tech:codereview --focus performance
/tech:codereview --focus types
Step 1: Get context
rtk git diff --staged
rtk git diff HEAD~1
rtk git status
Identify: which files changed, what kind of change (API route, component, lib, schema).
Step 2: Conditionally load guides
.ts/.tsx files → apply code-conventions.md rules
src/components/** → apply design-system.md + react-ref-patterns.md
src/lib/geocoder* → apply defensive-code-audit.md + rate limit rules
src/app/api/** → apply API route conventions from architecture.md
prisma/schema.prisma → apply Prisma + Neon adapter pattern rules
src/components/map/** → apply MapLibre GL 5.x patterns
Step 3: Analyze (3 severity levels)
🔴 Blocking (must fix before merge)
- Hardcoded tokens, secrets, or API keys
- GitHub token exposed in client bundle
- XSS vector in MapLibre popup innerHTML
function keyword instead of arrow function
any type without justification
- Nominatim called in parallel (rate ban risk)
- Server-side loop over all stargazers (Vercel 10s limit)
- Raw JSON payload for large repos (4.5MB limit)
- Missing
ssr: false on MapLibre dynamic import
- Prisma write without try/catch
🟡 Important (should fix, non-blocking)
- Missing
import type for type-only imports
- Arbitrary Tailwind values (
w-[Npx], bg-[#xxx])
console.log left in code
- Missing DB health guard on new cache writes
forEach with async callback
- Geocache key not normalized (
toLowerCase().trim())
- Silent catch (error swallowed, no response returned)
cursor: null passed as GraphQL variable
🟢 Suggestions (optional improvements)
memo() opportunity on component that re-renders frequently
useMemo() for GeoJSON feature array construction
Promise.all() for independent async operations
- Unused imports
Step 4: Report
## Code Review — StarMapper
**Files reviewed**: [list]
**Change type**: [API route / component / lib / schema]
### 🔴 Blocking Issues (N)
1. **[Category]**: [Description]
File: `src/...` line N
Fix: [concrete fix]
### 🟡 Important Issues (N)
1. **[Category]**: [Description]
File: `src/...` line N
Suggestion: [concrete improvement]
### 🟢 Suggestions (N)
1. ...
### ✅ Patterns Verified
- [ ] Arrow functions only
- [ ] Type imports separate
- [ ] No any
- [ ] CSS tokens used (no arbitrary values)
- [ ] MapLibre ssr:false
- [ ] Geocache key normalized
- [ ] Rate limit guards present
- [ ] No console.log
Mode: --auto
Iterative fix loop (max 3 iterations):
- Run review → identify blocking + important issues
- Apply fixes one by one
- Re-run
rtk tsc + pnpm lint after each batch
- Stop when: zero blocking + zero important issues OR 3 iterations reached
- Output summary: what was fixed, what remains
Safety: Never edit .env* files. Confirm before modifying > 5 files.
Mode: --multi-agent
Launch 4 parallel specialized agents and reconcile results:
Agent 1 — Architecture & Chunk Pattern Auditor
- Verifies chunk loop integrity (no server-side loops)
- Checks Vercel constraint compliance (10s, 4.5MB)
- Reviews cache strategy (geocache, stargazer cache, badge cache)
Agent 2 — StarMapper Patterns Enforcer
- TypeScript conventions (arrow functions, type imports, no any)
- Tailwind v4 design system compliance (tokens, no arbitrary values)
- MapLibre GL 5.x patterns (Promise-based API, ssr:false, cleanup)
- Geocoder patterns (normalized key, cache-first, sequential)
Agent 3 — Performance & Rate Limit Auditor
- GitHub GraphQL rate limit handling
- Nominatim: sequential calls, 1100ms delay
- Circuit breaker presence for Jawg/Geoapify
- MapLibre render performance (memo, useMemo)
- Bundle size implications
Agent 4 — Defensive Code Auditor
- No silent catches in API routes
- No
|| {} on Prisma returns
- No
forEach with async
- DB health guard on writes
- XSS in MapLibre popups
Reconciliation:
- Deduplicate findings across agents
- Merge into unified report with severity
- Highlight consensus findings (flagged by 2+ agents)