skills/readme-updater/SKILL.md
Bring a project's README up to date with the current state of the codebase. Audits the existing README for stale commands, dead links, renamed tools, and drifted status claims; surveys what's changed since the README was last touched; rewrites it with verified facts; then commits and pushes. Use this skill whenever the user says "update the README", "the readme is stale", "refresh the README", "rewrite README.md", "add new features to the readme", or otherwise asks for documentation that reflects the current state of the project. Also trigger when a README clearly hasn't kept pace with the codebase (e.g. recent feature commits not reflected, broken examples).
npx skillsauth add mistakenot/auto-stack readme-updaterInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Bring a stale README back into sync with reality, end to end, in one pass. The skill runs four phases sequentially without pausing for human input, then commits and pushes the result.
It does not trigger for:
Never trust your memory or the existing README for CLI claims. On every prior run, the model has shipped at least one snippet referencing a flag that no longer exists or a subcommand that was renamed. The verification phase below is non-negotiable — it is the one step that distinguishes a useful README update from a confidence-damaging one.
Find when the README was last meaningfully updated and what's changed since. This bounds the work.
# Last commits that touched README.md (not just chore renames)
git log --oneline -20 README.md
# Pick the most recent substantive update commit — call it $LAST_README_SHA
git log --oneline $LAST_README_SHA..HEAD | wc -l # how many commits since
git log --oneline $LAST_README_SHA..HEAD # the actual list
If the README has never been written (empty repo or new file), there is no prior state to audit — skip Phase 2 and treat Phase 3 as a fresh inventory.
Before drafting anything new, scan the existing README for claims that no longer match reality. This is faster than rewriting from scratch and catches drift the user may not know about.
Run these checks. Don't pause for user input — log findings inline and carry them into Phase 4.
For every code block in the README that looks like a CLI invocation
(<binary> <subcommand> --flag value), check that the binary, subcommand,
and flag still exist.
# Get the real command tree
<binary> --help
<binary> <subcommand> --help
Flag the snippet as stale if any of:
cochange → co-change)For every path/to/file or dir/ mentioned, verify it exists:
ls path/to/file 2>/dev/null || echo "STALE: path/to/file"
If the README lists tools, packages, or sub-projects in a table, compare that list to what the repo actually contains. New tools added since the last README touch are the most common source of staleness.
# For monorepos with discoverable sub-projects
ls -d <prefix>-*/ # e.g. auto-*/, packages/*, apps/*
Flag missing entries (tool exists in repo, not in README) and dead entries (README lists tool, repo doesn't have it).
Skim the README for inconsistent naming of the same thing:
auto-eval vs autoeval vs auto_evalmyproject-cli vs myproject vs mpPick one canonical name (usually the binary name) and standardise.
If the README labels things as "Active", "Beta", "Coming Soon", "Deprecated":
curl … | bash) — fetch the URL or confirm the repo path.Go 1.22+, Node 18+) — confirm against go.mod /
package.json / CI config.Keep findings in a short scratch list (audit_findings) — you'll address
them in Phase 4.
Dispatch parallel research agents to inventory the current state. Run them concurrently — this is the longest phase and the agents are independent.
For monorepos, the inventory is per-sub-project. For single-project repos, substitute "the project" for "each sub-project".
Prompt template:
For each directory below, read its README/CLAUDE.md, list the binary's available commands (look at main.go / cmd/ / package.json scripts / cobra command tree), and identify whether it is fully implemented or scaffolded.
For each, report under 100 words:
- One-line description
- Status: Active / Working / Scaffolded
- Binary name
- Top-level commands
- Notable recent features
Total report under 1500 words.
Prompt template:
The README was last updated at commit $LAST_README_SHA. Run
git log --oneline $LAST_README_SHA..HEADand for eachfeat:commit summarise the user-visible feature added. Group by tool/area. For each feature give: tool, feature name, one-sentence description, commit hash. Focus on user-facing features, not refactors or CI changes. Under 1000 words.
Sending both agents in one message (parallel tool calls) is important — they run concurrently and you get both reports back before Phase 4 starts.
Rewrite the README using the audit findings (Phase 2) and survey reports (Phase 3). Some structural defaults that have proven to work:
Replace ASCII diagrams with Mermaid. GitHub renders Mermaid natively in
the web UI, in PRs, and in issues. Mermaid is text-based, diff-friendly,
and requires no build step. Use flowchart LR for pipelines and
flowchart TD for data architecture.
Other options considered (in case the user asks):
Style classes give a polished look:
flowchart LR
A[Foo] --> B[Bar]
classDef active fill:#1f6feb,stroke:#1f6feb,color:#fff;
class A,B active;
For status-of-tool tables, use shields.io badges:




Badges read at a glance and survive markdown rendering everywhere.
Order rows by role in the pipeline / system, not alphabetically. Foundation / input tools first, derived tools in the middle, infra and orchestration last, "coming soon" at the bottom. Add a one-line lede above the table explaining the ordering, so readers know the order is intentional.
If the project has a non-trivial workflow, write a numbered "Quick Start: The Full Loop" section. Each step should be runnable as-is, paired with one or two lines of explanation. The goal: someone copies the entire block, runs it, sees the system end-to-end.
A bulleted section grouped by domain (e.g. "Ingest & analytics", "Search & discovery", "Code context", "Documentation"). Pulls from the git-history mining agent's report. Each bullet is one sentence, name in bold.
These rules apply to every change you make in the README. They keep the prose feeling consistent and prevent the document from drifting into a changelog.
Sections worth preserving by default: Install, Quick Start, Data Architecture, Configuration, Development, License. Don't rewrite for the sake of it.
For every CLI snippet in the new draft, run the actual command's
--help output and confirm the binary, subcommand, and every flag is
spelt correctly and accepts the value type shown.
# For each snippet in the README, verify:
<binary> --help
<binary> <subcommand> --help
# If the snippet uses --flag value, confirm --flag exists and accepts that type.
A short, automatable pattern: grep the README for lines starting with
<binary> inside code blocks, then for each one diff against
<binary> <subcommand> --help. Doing this catches roughly five wrong
flags per rewrite on real codebases.
If a verification fails:
Also verify any URLs, file paths, version numbers, and make targets
quoted in the README still resolve.
Stage only the README (and any directly related doc updates the audit turned up — e.g. a renamed file the README pointed at). Don't sweep in unrelated working-tree changes.
git add README.md
Write a commit message that names what was done and why. The format used on the auto-stack repo:
docs(readme): <one-line subject under 70 chars>
<two or three paragraphs explaining what changed and why, calling out the
biggest categories of update (new tools, restructured sections, verified
CLI snippets, replaced ASCII with Mermaid, etc.).>
Co-Authored-By: …
Then push:
git push origin <current-branch>
If the repo has a pre-commit hook that runs format / vet / lint, let it
run. If it fails, fix the underlying issue rather than passing
--no-verify.
Brief updates per phase, not a running monologue:
If the verification phase catches the model contradicting itself (documenting a flag that doesn't exist), say so explicitly in the final report — it builds trust and helps the user spot the same kind of error the next time around.
--bash-exit-code exists." Don't
trust this. Run --help.git add -A.#section-name in the README, preserve the heading or leave a
redirect-style link.The user typically already trusts the workflow when they invoke this skill. Pausing for confirmation at the end of each phase wastes a turn. The verification phase (5) is the safety net — it catches almost every mistake before the commit lands. If something genuinely needs human judgement (e.g. a tool's status is ambiguous), surface it in the final summary so the user can amend, rather than blocking the whole flow.
tools
Run the self-improvement loop on a focus area. Use when the user asks to improve, fix recurring problems, or run self-improve on a tool. Trigger when: "self-improve", "improve auto search", "find and fix problems in". Do not trigger for doc reviews or one-off bug fixes.
development
Create a new auto-stack release by tagging a commit and pushing the tag. The GitHub Actions release workflow builds binaries and publishes the release.
development
Reconstruct and narrate the current development context from contextual commits. Run at session start, when resuming work, or when switching branches. Produces a brief, conversational summary of where things stand.
tools
Scaffold a new auto-* package in the auto-stack monorepo. Creates the full directory structure, Go source files, go.mod, CLAUDE.md, and Makefile integration following established patterns. Use when: "create a new package", "add auto-foo", "scaffold a new tool", "new auto package".