Local CLI · zero dependencies
A stale AGENTS.md is worse than none — it confidently tells a coding agent to run commands that no longer exist. agentsmd checks yours against what the repository actually contains.
pnpm build existspnpm test existslint script
did you mean pnpm lint:all?packages/database does not exist
renamed to packages/db in AprilEvery finding is traced to a file in your repo. Nothing is inferred.
npx github:trtin/agentsmd check
Node 20+. No API key, no network calls, no account.
Writes AGENTS.md from what the repo actually contains — commands verified against package.json, packages from your workspace globs, frameworks from real dependencies.
Reports where the document and the repo disagree, with a health score.
Read-only. Add --ci to fail a build on drift.
Shows a diff of what changed and applies it with --write.
Only ever touches the generated sections.
Only content between the markers is managed. Your rules, your architecture
notes, your warnings — all preserved byte-for-byte by update.
A file with no markers is never touched at all, so you can run
check against a hand-written AGENTS.md before letting the tool
write anything.
The intended shape: let it own the mechanical sections, and write the judgment yourself.
| Finding | Meaning |
|---|---|
stale-command | A documented script no longer exists — with a suggestion when it was renamed |
wrong-path | A referenced file or directory is gone |
undocumented-project | A workspace package the document never mentions |
unsupported-claim | The document says npm but the repo uses pnpm |
missing-file | No AGENTS.md at all |
No model, no network, no API key. The same repository always produces the same output and the same score, which is what makes it safe to run in CI.
The rule the whole tool is built on: never emit a claim the repo doesn't evidence. A generator that invents a command is producing exactly the staleness it exists to catch — so there's a test asserting the generator's own output always scores 100.
It also documents the environment variables your code actually reads, by
name. Values are never collected and .env files are never
opened — only source.
Written in TypeScript. Zero runtime dependencies.