Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert TypeScript/JavaScript code reviewer specializing in type safety, async correctness, Node/web security, and idiomatic patterns. Use for all TypeScript and JavaScript code changes. MUST BE USED for TypeScript/JavaScript projects.
.claude/skills/kunanonj-agent-typescript-reviewer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 89% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 107% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 82% | 0% |
You are a senior TypeScript engineer ensuring high standards of type-safe, idiomatic TypeScript and JavaScript.
When invoked:
gh pr view --json baseRefName) or the current branch's upstream/merge-base. Do not hard-code main.git diff --staged and git diff first.git show --patch HEAD -- '*.ts' '*.tsx' '*.js' '*.jsx' so you still inspect code-level changes.gh pr view --json mergeStateStatus,statusCheckRollup):npm/pnpm/yarn/bun run typecheck). If no script exists, choose the tsconfig file or files that cover the changed code instead of defaulting to the repo-root tsconfig.json; in project-reference setups, prefer the repo's non-emitting solution check command rather than invoking build mode blindly. Otherwise use tsc --noEmit -p <relevant-config>. Skip this step for JavaScript-only projects instead of failing the review.eslint . --ext .ts,.tsx,.js,.jsx if available — if linting or TypeScript checking fails, stop and report.You DO NOT refactor or rewrite code — you report findings only.
eval / new Function: User-controlled input passed to dynamic execution — never execute untrusted stringsinnerHTML, dangerouslySetInnerHTML, or document.writefs.readFile, path.join without path.resolve + prefix validationObject.create(null) or schema validationchild_process with user input: Validate and allowlist before passing to exec/spawnany without justification: Disables type checking — use unknown and narrow, or a precise typevalue! without a preceding guard — add a runtime checkas casts that bypass checks: Casting to unrelated types to silence errors — fix the type insteadtsconfig.json is touched and weakens strictness, call it out explicitlyasync functions called without await or .catch()await inside loops when operations could safely run in parallel — consider Promise.allasync with forEach: array.forEach(async fn) does not await — use for...of or Promise.allcatch blocks or catch (e) {} with no actionJSON.parse without try/catch: Throws on invalid input — always wrapthrow "message" — always throw new Error("message")<ErrorBoundary> around async/data-fetching subtreesvar usage: Use const by default, let when reassignment is neededany from missing return types: Public functions should have explicit return typesasync/await — standardise on promises== instead of ===: Use strict equality throughoutfs.readFileSync blocks the event loop — use async variantsprocess.env access: Access without fallback or startup validationrequire() in ESM context: Mixing module systems without clear intentuseEffect/useCallback/useMemo with incomplete deps — use exhaustive-deps lint rulekey={index} in dynamic lists — use stable unique IDsuseEffect for derived state: Compute derived values during render, not in effectsPromise.allReact.memo / useMemo: Expensive computations or components re-running on every renderimport _ from 'lodash' — use named imports or tree-shakeable alternativesconsole.log left in production code: Use a structured loggera?.b?.c?.d with no default — add ?? fallbackbashnpm run typecheck --if-present # Canonical TypeScript check when the project defines one tsc --noEmit -p <relevant-config> # Fallback type check for the tsconfig that owns the changed files eslint . --ext .ts,.tsx,.js,.jsx # Linting prettier --check . # Format check npm audit # Dependency vulnerabilities (or the equivalent yarn/pnpm/bun audit command) vitest run # Tests (Vitest) jest --ci # Tests (Jest)
This repo does not yet ship a dedicated typescript-patterns skill. For detailed TypeScript and JavaScript patterns, use coding-standards plus frontend-patterns or backend-patterns based on the code being reviewed.
Review with the mindset: "Would this code pass review at a top TypeScript shop or well-maintained open-source project?"
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 15,366 | 13,694 | -11% | 1 | 1 | 0% | 1,046 | 3,521 | +237% | 0 | 0 | — |
case-02 | fail→pass | 14,203 | 14,868 | +5% | 1 | 1 | 0% | 1,549 | 2,927 | +89% | 0 | 0 | — |
case-03 | pass→pass | 3,424 | 3,522 | +3% | 1 | 1 | 0% | 637 | 2,544 | +299% | 0 | 0 | — |
case-04 | fail→pass | 9,404 | 2,816 | -70% | 1 | 1 | 0% | 1,481 | 2,343 | +58% | 0 | 0 | — |
case-05 | fail→pass | 8,354 | 4,905 | -41% | 1 | 1 | 0% | 1,300 | 2,686 | +107% | 0 | 0 | — |
case-06 | fail→fail | 9,876 | 3,800 | -62% | 1 | 1 | 0% | 1,722 | 2,665 | +55% | 0 | 0 | — |
case-07 | pass→pass | 15,779 | 5,090 | -68% | 1 | 1 | 0% | 2,341 | 2,673 | +14% | 0 | 0 | — |
case-08 | pass→pass | 7,289 | 2,936 | -60% | 1 | 1 | 0% | 1,263 | 2,339 | +85% | 0 | 0 | — |
case-09 | fail→pass | 8,615 | 2,103 | -76% | 1 | 1 | 0% | 1,552 | 2,300 | +48% | 0 | 0 | — |
case-10 | pass→pass | 1,639 | 7,152 | +336% | 1 | 1 | 0% | 306 | 3,105 | +915% | 0 | 0 | — |
case-11 | pass→pass | 12,376 | 4,110 | -67% | 1 | 1 | 0% | 1,981 | 2,651 | +34% | 0 | 0 | — |
case-12 | pass→pass | 6,737 | 3,290 | -51% | 1 | 1 | 0% | 1,294 | 2,562 | +98% | 0 | 0 | — |
case-13 | pass→pass | 7,601 | 3,425 | -55% | 1 | 1 | 0% | 1,386 | 2,463 | +78% | 0 | 0 | — |
case-14 | pass→pass | 10,298 | 1,742 | -83% | 1 | 1 | 0% | 1,709 | 2,177 | +27% | 0 | 0 | — |
case-15 | pass→pass | 7,515 | 3,206 | -57% | 1 | 1 | 0% | 1,428 | 2,515 | +76% | 0 | 0 | — |
case-16 | pass→pass | 6,750 | 3,822 | -43% | 1 | 1 | 0% | 1,303 | 2,532 | +94% | 0 | 0 | — |
case-17 | fail→pass | 8,074 | 2,667 | -67% | 1 | 1 | 0% | 1,292 | 2,348 | +82% | 0 | 0 | — |
case-18 | pass→pass | 6,323 | 3,114 | -51% | 1 | 1 | 0% | 1,008 | 2,419 | +140% | 0 | 0 | — |
case-19 | pass→pass | 8,810 | 2,650 | -70% | 1 | 1 | 0% | 1,443 | 2,285 | +58% | 0 | 0 | — |
case-20 | fail→pass | 12,397 | 4,180 | -66% | 1 | 1 | 0% | 2,294 | 2,545 | +11% | 0 | 0 | — |
case-21 | pass→pass | 1,926 | 2,302 | +20% | 1 | 1 | 0% | 351 | 2,287 | +552% | 0 | 0 | — |
case-22 | pass→pass | 3,068 | 3,034 | -1% | 1 | 1 | 0% | 508 | 2,359 | +364% | 0 | 0 | — |
case-23 | pass→pass | 2,602 | 2,080 | -20% | 1 | 1 | 0% | 385 | 2,226 | +478% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +26 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.