Spooner
Make this git repository ready for AI — so AI coding agents can work in it from the first run. Audit its AI coding readiness, score it out of 10, then transform it in place: CI gates, AGENTS.md, a spec-driven workflow. Every step verifiable, never breaking the existing build.
audit → transform → check → sync — one pipeline, no build step, zero dependencies.
What Spooner does
Spooner is an Agent Skills (SKILL.md) package for coding agents. It scores your repository's AI readiness /10, installs the missing gates in place (never breaking the existing build), and keeps them from drifting.
An AI-native repository generally comes with complete quality gates and AI guidance: pre-commit hooks, lint / formatter checks that actually run, CI that agrees with the local gates, an AGENTS.md that tells the agent how things run, and a spec-driven contract (SDD templates) — to name a few. New quality gates, as they emerge, join the readiness score.
Why the name? Spooner = Detective Del Spooner in I, Robot (2004) — his left arm is robotic and serves him well. This project evaluates what your repository is missing and serves it the same way.
The "before" is a zero-state copy of this repository — the same code, minus everything spooner installs (no AGENTS.md, no pre-commit/commitlint gates, no drift gate, no SDD workflow). One run of the pipeline takes it from 4.3/10 (AI-Aware) to 9.2/10 (AI-Native) — a score with evidence, not an opinion (full report).
The score is on a 10-point scale, grouped into five tiers:
| Tier | Score | What it means |
|---|---|---|
| AI-Native | 9–10 | Ready from the first run — AGENTS.md, real gates, CI that agrees with the local hooks, no drift |
| AI-Friendly | 7–8.9 | Most facilities in place, one or two gaps left (dead hooks, CI that disagrees, no AGENTS.md) |
| AI-Curious | 5–6.9 | Some AI-oriented setup exists, but incomplete |
| AI-Aware | 3–4.9 | Readable by an AI agent, nothing prepared for it |
| AI-Absent | 0–2.9 | Hard for an AI to even understand — no README, no structure, no traceable commands |
Quick start
Requirements: Node.js >= 22.18 and git. The audit itself works fully offline.
Install — one command, works for every mainstream coding agent (Claude Code, Codex, Cursor, Copilot, OpenCode, Kilo Code, Goose, Qwen Code, Kimi Code, Antigravity, TRAE, Qoder, ZCode, CodeBuddy and more):
npx skills add ZM-BAD/spooner
Useful flags: -g / --global (all projects), -a / --agent <agent> (target a specific agent), -s / --skill <name> (only the spooner skill). The skills CLI detects your agent from the environment and copies skills/spooner/ into its skills directory. After install, list it with /skills in your agent session.
Run the audit on any repository (a deterministic health check — scores are reproducible, evidence-backed, and never a bare opinion):
$ node skills/spooner/scripts/audit.ts --root /path/to/repo --format markdown
# AI-Readiness Report
- Stack: node · Maturity: stable · Score: **9.2/10**
## Score by category
| Category | Score | Max |
| ------------- | ----- | --- |
| Agent Setup | 4.5 | 4.5 |
| Configuration | 1.9 | 2 |
| Integrity | 1.5 | 1.5 |
| Freshness | 0.5 | 0.5 |
| Structure | 0.8 | 1.5 |
Every gap in the report names an action the toolset actually delivers — no invented advice. Follow the report, re-run, and watch the score move.
What you get after transform
Running transform --stage all installs, in place and with a pre/post build-green verification:
- Git gates —
.commitlintrc.json(Conventional Commits), a stack-aware.pre-commit-config.yaml(lint/format/typecheck/test hooks for your stack, check-only),.markdownlint-cli2.yaml - CI — a stack-specific
.github/workflows/ai-native.yml: quality jobs (warn-only by default,--gates hardto make them hard), a declared-commands gate, a commit-msg commitlint check, and a manifest drift gate that turns CI red if templates drift - Agent files — an
AGENTS.mdgenerated from your real commands (package.json scripts / Makefile / CI), with aCLAUDE.mdsymlink - SDD workflow (optional) —
docs/sdd/spec/plan/tasks templates + a spec-existence CI gate - A manifest —
.ai-native.ymlrecords exactly what was installed;checkdetects drift,syncre-syncs when the tool advances
Every stage is verifiable and rollback-able (git restore of the listed files); a pre-existing broken build is reported with the reason and never blocks the install.
The workflow
| Command | What it does | When |
|---|---|---|
audit |
Detect and score AI coding readiness (repeatable — a health check) | Any repo, anytime |
transform |
Incremental, verifiable, rollback-able transformations (stack-aware CI gates incl. the manifest drift gate / AGENTS.md / SDD) | Once per repository |
check |
Continuously detect drift (repeatable, with records) | Every CI run |
sync |
Re-sync installed templates to the current tool version (version-aware, one-click) | When the tool advances |
badge |
Render a readiness badge matched to your README's badge style (5 shields styles, links to the audit report) | After transform, whenever the score moves |
Stack support
| Stack | detect + audit | transform (gates + CI + AGENTS.md) |
|---|---|---|
| node (incl. React/Vue/Next) | ✅ | ✅ npm lifecycle |
| python | ✅ | ✅ python3 -m unittest discover |
| go | ✅ | ✅ go build/test ./... |
| java (Maven + Gradle) | ✅ | ✅ mvn -q -B test / gradle build |
| rust | ✅ | ✅ cargo build/test (fmt/clippy gates) |
| ruby / php / swift / dotnet / harmonyos | ✅ (audit under-scores only) | ⚠️ cross-stack gates + explicit notice |
| apple / c-cpp / dart-flutter / unity (Tier 1) | ✅ (canonical lifecycle credit: xcodebuild / cmake+ctest / flutter test+dart analyze) | ⚠️ cross-stack gates + explicit notice |
| zig | ✅ (zig build/test lifecycle credit) | ⚠️ cross-stack gates + explicit notice |
FAQ
- GitHub is unreachable in my environment — will commits be blocked? The generated pre-commit config fetches its hook repos from GitHub at run time; with GitHub unreachable, pre-commit cannot prepare hooks and commits are blocked — the generated header documents this and names the mirror workaround. CI (GitHub Actions) is unaffected. For intranet/air-gapped environments, run
transform --stage 2 --offlinefor a repo:local-only config (never fetches GitHub; npm-managed hooks honestly omitted), or--hook-mirror <base>to rewrite the managed repo URLs to an intranet mirror.
Development
Spec-driven (SDD): every feature starts as a spec in specs/<nnn>-<name>.md (proposed → approved → in-progress → shipped), implemented in independently verifiable slices. Template: specs/spec-template.md.
npm run typecheck # tsc --noEmit (TypeScript 6, zero build)
npm run lint:md # markdownlint-cli2
npm run check # typecheck + lint:md + tests
pre-commit install --hook-type commit-msg # enforce Conventional Commits on every commit
pre-commit run --all-files
node skills/spooner/scripts/detect.ts # slice 1: stack detection
Constraints: TypeScript 6 only (major locked — the toolchain still requires the 6.0 API until TS 7.1), erasable syntax only (no enum/namespace), zero-dependency scripts, Conventional Commits (commitlint enforced).
Docs: AGENTS.md (agent contract) · specs/README.md (SDD workflow) · specs/ROADMAP.md (planning index) · skills/spooner/SKILL.md (the distributable skill entry). The code lives under skills/spooner/scripts/ — read the directory, it is the source of truth.
Contributors
Thanks to the users whose trial feedback shaped this project — each release lists the people whose reports were fixed:
⭐ Found this useful? Star the repo and share it with a repo that needs it.
No comments yet
Be the first to share your take.