ワンクリックで
analyze-code-quality
Run all available tests and linters, check for anti-patterns, and generate a comprehensive code quality report
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Run all available tests and linters, check for anti-patterns, and generate a comprehensive code quality report
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Prep apple-fm for a major release — refresh the README so it advertises the current feature set, and review/revise the demo modes (the user captures the screenshots)
Read the Hot Sheet worklist and work through the current priority items
Run as a distributed worker — continuously claim, work, and release Up Next tickets
Create a new bug ticket in Hot Sheet
Create a new feature ticket in Hot Sheet
Create a new investigation ticket in Hot Sheet
| name | analyze-code-quality |
| description | Run all available tests and linters, check for anti-patterns, and generate a comprehensive code quality report |
| allowed-tools | Read, Grep, Glob, Bash, Agent |
Analyze the overall quality of the apple-fm source. Generate a comprehensive report.
Run unit tests with coverage
npm test
Report total tests, pass/fail, and coverage per file. The thresholds in
vitest.config.ts (statements 80 / branches 75 / functions 80 / lines 80) are
the floor; flag any file that drags the suite under them. cli.ts and
repl.ts are intentionally excluded (thin I/O) — confirm they have no
testable logic that crept in.
Coverage is a floor, not a ceiling. A line/branch/function/statement percentage only proves each line ran during the suite — it says nothing about whether the right behavior was asserted, or whether sequences of operations across internal state boundaries were exercised. A module can sit at 100% on every metric and still ship basic bugs, because every operation was tested once from a clean initial state while the transitions between states were never tried. So treat high coverage as the trigger for the behavioral / state-transition audit (step 6) — not as a stopping point. Never report a coverage number as if it were a proof of correctness.
Run the linter
npm run lint
Report errors/warnings grouped by rule.
Run typecheck
npm run typecheck
Report any type errors.
Build the helper (best-effort)
npm run build:helper
On a macOS 26 machine this should emit bin/apple-fm-helper. On other
machines the script no-ops with exit 0 by design — note which happened. If it
built, run bin/apple-fm-helper --probe and report the availability line.
Check anti-patterns (conventions from CLAUDE.md):
.js — grep src//tests/ for relative
imports without a .js suffix.any leaks — grep src/ for : any\b, as any\b, <any>. The house
style is unknown + a narrowing check.strict-boolean-expressions is on; flag any
if (someString) style test (use === undefined / .length).package.json dependencies must stay empty
(the Node layer only spawns the helper). Flag any addition..swift
file under apple-fm-helper/, currently main.swift, GuidedGeneration.swift,
and Tools.swift) may reference FoundationModels. Grep src/ for
FoundationModels (should be zero hits outside comments).tests/fixtures/stub-helper.js must still implement the
same events as docs/4-protocol.md and the Swift helper.src/*.ts over ~200 LOC; prefer splitting.Behavioral / state-transition audit (the part coverage % can't see)
Static checks and a coverage number verify that lines ran; they cannot tell you a behavior or a transition between internal states is missing. This step hunts exactly those gaps.
6a. Identify the stateful modules. A module is "stateful" if its behavior depends on something that persists or changes between calls, not just on the current arguments. Heuristics — flag any module that has:
In apple-fm the prime suspects are:
src/liveSession.ts (LiveSession) — the long-lived
apple-fm-helper --session process: no-process → spawned → busy → dead →
lazy respawn, with id-correlated in-flight commands. Transitions: first
command spawns; a crash mid-command must reject that command and respawn on
the next; overlapping/out-of-order command ids; dispose while busy.src/session.ts (ChatSession) — multi-turn history with automatic
compaction: below compactAtTokens → over threshold → summarize older turns,
keep keepRecentTurns verbatim → continue appending. Transitions: cross the
threshold exactly once vs. repeatedly; a summary that itself pushes back over
threshold; empty history then refill; compaction interleaved with new turns.src/tools/permissions.ts (PermissionPolicy) and
src/tools/registry.ts (ToolRegistry) — per-call mode + remembered
allow/deny decisions accumulating across calls.6b. For each, build a small state/transition map — list the states and the legal (and illegal) transitions between them. This is quick prose or a table, not a formal FSM.
6c. Check the tests against the transitions, not the operations. Read the corresponding test file and ask: does it only ever drive each operation once, from a clean initial state? Or does it exercise multi-step sequences that cross state boundaries? Concretely, look for tests that try:
6d. Flag and recommend. For every stateful module whose tests only cover
single-operation-from-clean-state, flag it — even if its line/branch coverage
is 100% — and recommend an adversarial transition-matrix test: enumerate the
states on both axes and assert the behavior of each state→state move, including
the illegal ones. Give the concrete example sequences from 6c so the follow-up
is actionable. File these as hs-task/hs-bug tickets.
Check the build shape
npm run build && ls dist/
Verify dist/index.js, dist/cli.js, and their .d.ts files exist, and that
dist/cli.js keeps its #!/usr/bin/env node shebang.
liveSession.ts, session.ts, permissions.ts,
registry.ts, plus any others found in 6a) with: its states, whether the tests
exercise transitions vs. only single-operation-from-clean-state, and a
transition-coverage verdict (Covered / Partial / Untested-transitions). This
section must be able to flag a module as having untested transitions even when
its line/branch coverage is 100%. For each flagged module, give the concrete
adversarial sequences to add.hs-task/hs-bug)
for non-trivial findings.