agents-md-lint
Your
CLAUDE.mdis lying to your agent. agents-md-lint finds the paths and commands your context file claims exist — and no longer do.
⭐ Star us on GitHub if your CLAUDE.md still describes a module you deleted.
pipx install agents-md-lint && agents-md-lint check
CLAUDE.md: 5 of 6 references broken
CLAUDE.md:14 path: 'src/proxy/' — path does not exist
CLAUDE.md:18 path: 'src/main.rs' — path does not exist
did you mean: crates/tokenmiser/src/main.rs
That output is real. It is TokenMiser,
whose context file described a src/ layout for months after the code moved to
a Rust workspace under crates/.
Why this exists
Every agent workflow depends on a context file, and the failure mode is the dangerous kind: the agent doesn't error, it answers. Fluently, confidently, from a description of your repo that stopped being true three refactors ago.
Nobody notices, because nothing breaks loudly. The file just quietly stops matching the code.
What it checks
| Reference | Check |
|---|---|
Paths in backticks — `src/api/` |
Does it exist? If it moved, where to? |
| Commands in shell fences | Does the executable resolve? |
Non-zero exit past a threshold, so it drops into CI or a pre-commit hook:
- run: pipx install agents-md-lint && agents-md-lint check
Design stance
Cheap and deterministic. Path resolution, PATH lookup, git ls-files.
No LLM call, no network, no embedding pass, zero runtime dependencies. A
staleness check that costs an API call will not be run every session, and a
check nobody runs is worse than none.
False positives are the failure mode. A linter that flags prose gets
uninstalled after one run, so the extractor is deliberately conservative and
most of the test suite is cases it must stay quiet about — URLs, globs,
~/paths, <placeholders>, $VARS, system paths, prose in backticks,
” ```python ” blocks, shell comments, and a project's own CLI (which is
rarely on PATH during development).
Two of those were found by running agents-md-lint on its own CLAUDE.md.
Reports, never rebuilds. Fixing the file is your job; it knows what you meant, and this tool doesn't.
Measured on real repositories
Run across the Open Intelligence Labs monorepo:
| Context files checked | 14 |
| References checked | 96 |
| Findings | 30 |
| False positives | 0 |
Every one of the 30 findings was verified by hand against the filesystem. The
two most interesting: a Rust project documenting a src/ layout that had
become crates/, and a project listing a console/ directory that was never
built.
Most of the rest are scaffolds whose context files describe a planned layout. That is arguably not "drift" — it is a file written ahead of the code — but the tool cannot tell intent from absence, and reporting it is the honest behaviour.
Install
pipx install agents-md-lint # or: uv tool install agents-md-lint
agents-md-lint check # every context file under .
agents-md-lint check CLAUDE.md # one file
agents-md-lint check --json # machine-readable
agents-md-lint check --threshold 3 # tolerate up to 3 findings
Honest limits
This checks two things. Paths and commands. It does not check whether your architecture description is still accurate, whether a documented convention is still followed, or whether the advice is any good — those need judgement, and judgement needs an LLM, which is explicitly out of scope.
Unquoted references are not checked. "edit the main.py file" is invisible to it. Backticks are the signal that something is a reference rather than prose, and without that signal the false-positive rate is unacceptable.
Commands are resolved, never run. Whether pytest exists is checkable;
whether it passes is not, and running commands out of a context file would be a
code-execution hazard.
The category ceiling is low. Developer tooling of this kind tops out in the low thousands of stars. This exists because it is useful and finishable, not because it is a growth play.
Roadmap
- Path and command checks with move suggestions
- JSON output, thresholds, CI exit codes
- Code index / knowledge graph staleness (commits since build)
- Generated-doc staleness (source changed after doc written)
- Embedding-cache staleness ratio
- Pre-commit hook
Part of the Open Intelligence Labs ecosystem
- TokenMiser — LLM cost control
- actants — agent SDK
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agents_md_lint-0.1.0.tar.gz.
File metadata
- Download URL: agents_md_lint-0.1.0.tar.gz
- Upload date:
- Size: 14.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b6d4fcd1d0cd25916c9064f87b6fa9e035cd1c9b79ca5bdcba7a0e8e3e71c10
|
|
| MD5 |
abdd78423b8f3dab22d2a4bc5bb5a37e
|
|
| BLAKE2b-256 |
f1a73a0c63133d56d5db75353a9f23dd2fd99875d3030436da7c76f6dfcda93a
|
Provenance
The following attestation bundles were made for agents_md_lint-0.1.0.tar.gz:
Publisher:
release.yml on openintelligence-labs/agents-md-lint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agents_md_lint-0.1.0.tar.gz -
Subject digest:
3b6d4fcd1d0cd25916c9064f87b6fa9e035cd1c9b79ca5bdcba7a0e8e3e71c10 - Sigstore transparency entry: 2365701855
- Sigstore integration time:
-
Permalink:
openintelligence-labs/agents-md-lint@9f852cf5b970cd9f283a61ef4ae6308cb4aeb047 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/openintelligence-labs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9f852cf5b970cd9f283a61ef4ae6308cb4aeb047 -
Trigger Event:
push
-
Statement type:
File details
Details for the file agents_md_lint-0.1.0-py3-none-any.whl.
File metadata
- Download URL: agents_md_lint-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43b5eeda59b2ce934868f90c1d3e72f6034137e043e810b8629a5160941d27f8
|
|
| MD5 |
5a04631b5fcacb7240d4ab114a92e57f
|
|
| BLAKE2b-256 |
04a454b2a71df358da4d8fd03e4502a22b18a4ee2b0f4b236553d192a7f772c5
|
Provenance
The following attestation bundles were made for agents_md_lint-0.1.0-py3-none-any.whl:
Publisher:
release.yml on openintelligence-labs/agents-md-lint
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agents_md_lint-0.1.0-py3-none-any.whl -
Subject digest:
43b5eeda59b2ce934868f90c1d3e72f6034137e043e810b8629a5160941d27f8 - Sigstore transparency entry: 2365701865
- Sigstore integration time:
-
Permalink:
openintelligence-labs/agents-md-lint@9f852cf5b970cd9f283a61ef4ae6308cb4aeb047 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/openintelligence-labs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9f852cf5b970cd9f283a61ef4ae6308cb4aeb047 -
Trigger Event:
push
-
Statement type: