{"_id":"@abr4xas/driftwatch","_rev":"6-2e0ad0022086938b739cfcc7e0b9dc29","name":"@abr4xas/driftwatch","dist-tags":{"latest":"1.1.0"},"versions":{"0.1.0":{"name":"@abr4xas/driftwatch","version":"0.1.0","keywords":["claude","claude-code","claude-md","agents-md","agents","skills","cli","lint","documentation","drift","ai","codex","cursor"],"author":{"url":"https://github.com/abr4xas","name":"angel cruz"},"license":"MIT","_id":"@abr4xas/driftwatch@0.1.0","maintainers":[{"name":"abr4xas","email":"bullgram@gmail.com"}],"homepage":"https://github.com/abr4xas/driftwatch#readme","bugs":{"url":"https://github.com/abr4xas/driftwatch/issues"},"bin":{"driftwatch":"dist/cli.js"},"dist":{"shasum":"2106816566b9178b366e78be2bdf22e2481a7691","tarball":"https://registry.npmjs.org/@abr4xas/driftwatch/-/driftwatch-0.1.0.tgz","fileCount":14,"integrity":"sha512-Rdn0fR+FQumfvgepqH8vURhD9r+zynr9/Un2A7NhdGqRnhHp83oeNB8IDAEKtPTEEPx51cfadhFhoDk64foxJQ==","signatures":[{"sig":"MEYCIQDm7m8e/Y7XWhExTfsPKrhev2w4f7Fv7hteO90gYXsmBAIhAOaMZUx+kAjUzXr5Ltpb/hXkqHQHNkkZE5G7qlnbXkfw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156432},"type":"module","engines":{"node":">=24"},"exports":{".":"./dist/index.js"},"gitHead":"aca878dbb88d1691aa53fb6ad69b290b9e5cd508","scripts":{"lint":"oxlint src test scripts && prettier --check .","test":"vitest run","build":"tsdown","corpus":"node --experimental-strip-types scripts/corpus.ts","format":"prettier --write .","typecheck":"tsc --noEmit","pack:check":"node --experimental-strip-types scripts/check-tarball.ts","format:check":"prettier --check .","prepublishOnly":"pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"abr4xas","email":"bullgram@gmail.com"},"repository":{"url":"git+https://github.com/abr4xas/driftwatch.git","type":"git"},"_npmVersion":"11.19.0","description":"Find the parts of your CLAUDE.md, AGENTS.md and skills that are no longer true","directories":{},"_nodeVersion":"25.9.0","dependencies":{"yaml":"^2.9.0","ignore":"^7.0.8","unified":"^11.0.5","picocolors":"^1.1.1","tinyglobby":"^0.2.17","remark-parse":"^11.0.0","unist-util-visit":"^5.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.21.0","devDependencies":{"oxlint":"^1.82.0","tsdown":"^0.23.0","vitest":"^5.0.0","prettier":"^3.9.6","typescript":"^7.0.2","@types/node":"^26.5.0","@types/mdast":"^4.0.4"},"_npmOperationalInternal":{"tmp":"tmp/driftwatch_0.1.0_1789073564926_0.5565280381681039","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@abr4xas/driftwatch","version":"0.1.1","keywords":["claude","claude-code","claude-md","agents-md","agents","skills","cli","lint","documentation","drift","ai","codex","cursor"],"author":{"url":"https://github.com/abr4xas","name":"angel cruz"},"license":"MIT","_id":"@abr4xas/driftwatch@0.1.1","maintainers":[{"name":"abr4xas","email":"bullgram@gmail.com"}],"homepage":"https://github.com/abr4xas/driftwatch#readme","bugs":{"url":"https://github.com/abr4xas/driftwatch/issues"},"bin":{"driftwatch":"dist/cli.js"},"dist":{"shasum":"403aa7e09634df58806e079f2c035edd73a8fac6","tarball":"https://registry.npmjs.org/@abr4xas/driftwatch/-/driftwatch-0.1.1.tgz","fileCount":14,"integrity":"sha512-gxVTeNuX6H25lRwAsVajipE1LzSXSyuSujs/Z4Ucde5bf4xB1cYqPwXXpk/x/ZVIPAIJb9WZ2Zp+YqGJ9NesQg==","signatures":[{"sig":"MEUCID6FEs6TnnAAoAC3E1JD0ONK27y3l2H9ivfESEbbHdJFAiEAn6t5YI4V2jN4hPbo4wm86eh+2QLjDefAqO9fjj17x+g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abr4xas%2fdriftwatch@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":157111},"type":"module","engines":{"node":">=24"},"exports":{".":"./dist/index.js"},"gitHead":"9b7e56ad3351dff0134c12206cd2d7ebef513f5e","scripts":{"lint":"oxlint src test scripts && prettier --check .","test":"vitest run","build":"tsdown","corpus":"node --experimental-strip-types scripts/corpus.ts","format":"prettier --write .","typecheck":"tsc --noEmit","pack:check":"node --experimental-strip-types scripts/check-tarball.ts","format:check":"prettier --check .","prepublishOnly":"pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"abr4xas","email":"bullgram@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:e85dbda2-ae05-42c0-8dda-bc5a223c8c20"}},"repository":{"url":"git+https://github.com/abr4xas/driftwatch.git","type":"git"},"_npmVersion":"12.0.2","description":"Find the parts of your CLAUDE.md, AGENTS.md and skills that are no longer true","directories":{},"_nodeVersion":"24.20.0","dependencies":{"yaml":"^2.9.0","ignore":"^7.0.8","unified":"^11.0.5","picocolors":"^1.1.1","tinyglobby":"^0.2.17","remark-parse":"^11.0.0","unist-util-visit":"^5.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.21.0","devDependencies":{"oxlint":"^1.82.0","tsdown":"^0.23.0","vitest":"^5.0.0","prettier":"^3.9.6","typescript":"^7.0.2","@types/node":"^26.5.0","@types/mdast":"^4.0.4"},"_npmOperationalInternal":{"tmp":"tmp/driftwatch_0.1.1_1789075184190_0.3013470241076086","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@abr4xas/driftwatch","version":"0.2.0","keywords":["claude","claude-code","claude-md","agents-md","agents","skills","cli","lint","documentation","drift","ai","codex","cursor"],"author":{"url":"https://github.com/abr4xas","name":"angel cruz"},"license":"MIT","_id":"@abr4xas/driftwatch@0.2.0","maintainers":[{"name":"abr4xas","email":"bullgram@gmail.com"}],"homepage":"https://github.com/abr4xas/driftwatch#readme","bugs":{"url":"https://github.com/abr4xas/driftwatch/issues"},"bin":{"driftwatch":"dist/cli.js"},"dist":{"shasum":"5edf6246d0970533ce6a1a92d288c2e6eae99f50","tarball":"https://registry.npmjs.org/@abr4xas/driftwatch/-/driftwatch-0.2.0.tgz","fileCount":24,"integrity":"sha512-8LPUFJDYd9gL8UM+R+kKDMeHT29v9DhKo2/BGy/y8jjYfS7qIhuJNDvxYrXF5rV49TLekPVnlAffStXZnsi3Ow==","signatures":[{"sig":"MEYCIQDWmua/rVulr3CtFdiTcWk4/NbZZn0uYTD32MKO2dud7wIhAPrOmcVAAKgaWQi3xy9ZHOyvFSDyZOn/frxiE5qn1PUr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abr4xas%2fdriftwatch@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":192584},"type":"module","engines":{"node":">=24"},"exports":{".":"./dist/index.js"},"gitHead":"1cf8d64267d70b1065c0f575e549ccbe50a9f9ed","scripts":{"lint":"oxlint src test scripts && prettier --check .","test":"vitest run","build":"tsdown","corpus":"node --experimental-strip-types scripts/corpus.ts","format":"prettier --write .","typecheck":"tsc --noEmit","pack:check":"node --experimental-strip-types scripts/check-tarball.ts","format:check":"prettier --check .","prepublishOnly":"pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"abr4xas","email":"bullgram@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:e85dbda2-ae05-42c0-8dda-bc5a223c8c20"}},"repository":{"url":"git+https://github.com/abr4xas/driftwatch.git","type":"git"},"_npmVersion":"12.0.2","description":"Find the parts of your CLAUDE.md, AGENTS.md and skills that are no longer true","directories":{},"_nodeVersion":"24.20.0","dependencies":{"yaml":"^2.9.0","ignore":"^7.0.8","unified":"^11.0.5","picocolors":"^1.1.1","tinyglobby":"^0.2.17","remark-parse":"^11.0.0","unist-util-visit":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.21.0","devDependencies":{"oxlint":"^1.82.0","tsdown":"^0.23.0","vitest":"^5.0.0","prettier":"^3.9.6","typescript":"^7.0.2","@types/node":"^26.5.0","@types/mdast":"^4.0.4"},"_npmOperationalInternal":{"tmp":"tmp/driftwatch_0.2.0_1789178049701_0.26902949151698685","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@abr4xas/driftwatch","version":"0.3.0","keywords":["claude","claude-code","claude-md","agents-md","agents","skills","cli","lint","documentation","drift","ai","codex","cursor"],"author":{"url":"https://github.com/abr4xas","name":"angel cruz"},"license":"MIT","_id":"@abr4xas/driftwatch@0.3.0","maintainers":[{"name":"abr4xas","email":"bullgram@gmail.com"}],"homepage":"https://github.com/abr4xas/driftwatch#readme","bugs":{"url":"https://github.com/abr4xas/driftwatch/issues"},"bin":{"driftwatch":"dist/cli.js"},"dist":{"shasum":"f55ac680f33f4c11343693cf2236ba10eb1f1a79","tarball":"https://registry.npmjs.org/@abr4xas/driftwatch/-/driftwatch-0.3.0.tgz","fileCount":24,"integrity":"sha512-8Ga+NbZvdeCpoH/XpbyxVuv7W7nh8rKExAY/UZOvMPBTnb+r5rizyVSH+WDmQNXhNY5eK7aSbZjdHBwY6CteVg==","signatures":[{"sig":"MEYCIQCm+u4KfhUdUc3hH5kVCUUyKaaigX+CccqnZIGGE3R6LQIhAJw78bwzyHQ934wq9u8iAgCZ3OPY9RcpfOuurDa3nXzE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abr4xas%2fdriftwatch@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":194290},"type":"module","engines":{"node":">=24"},"exports":{".":"./dist/index.js"},"gitHead":"089b770c97e04b13b1e3146d1ca1fbe6b19ff21c","scripts":{"lint":"oxlint src test scripts && prettier --check .","test":"vitest run","build":"tsdown","corpus":"node --experimental-strip-types scripts/corpus.ts","format":"prettier --write .","typecheck":"tsc --noEmit","pack:check":"node --experimental-strip-types scripts/check-tarball.ts","format:check":"prettier --check .","prepublishOnly":"pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"abr4xas","email":"bullgram@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:e85dbda2-ae05-42c0-8dda-bc5a223c8c20"}},"repository":{"url":"git+https://github.com/abr4xas/driftwatch.git","type":"git"},"_npmVersion":"12.0.2","description":"Find the parts of your CLAUDE.md, AGENTS.md and skills that are no longer true","directories":{},"_nodeVersion":"24.20.0","dependencies":{"yaml":"^2.9.0","ignore":"^7.0.8","unified":"^11.0.5","picocolors":"^1.1.1","tinyglobby":"^0.2.17","remark-parse":"^11.0.0","unist-util-visit":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.21.0","devDependencies":{"oxlint":"^1.82.0","tsdown":"^0.23.0","vitest":"^5.0.0","prettier":"^3.9.6","typescript":"^7.0.2","@types/node":"^26.5.0","@types/mdast":"^4.0.4"},"_npmOperationalInternal":{"tmp":"tmp/driftwatch_0.3.0_1789225629971_0.942835826956735","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@abr4xas/driftwatch","version":"0.5.0","keywords":["claude","claude-code","claude-md","agents-md","agents","skills","cli","lint","documentation","drift","ai","codex","cursor"],"author":{"url":"https://github.com/abr4xas","name":"angel cruz"},"license":"MIT","_id":"@abr4xas/driftwatch@0.5.0","maintainers":[{"name":"abr4xas","email":"bullgram@gmail.com"}],"homepage":"https://github.com/abr4xas/driftwatch#readme","bugs":{"url":"https://github.com/abr4xas/driftwatch/issues"},"bin":{"driftwatch":"dist/cli.js"},"dist":{"shasum":"ea282a6f935f8ca004ed53fb0c9882ff18b8a1b2","tarball":"https://registry.npmjs.org/@abr4xas/driftwatch/-/driftwatch-0.5.0.tgz","fileCount":25,"integrity":"sha512-ncSsM7lakpEcOkbP5qfmYgfRH/5Y8ImD03eLO/r4bL5so5MPAm3PPk8Bg/F/c9rwRh7/6Fjwzxg9UeNDDP7eAA==","signatures":[{"sig":"MEUCIQDg24n6/y7AQqRxRvs3YdGdmVLLv1+L8huYBK79i9R7TQIgTNLZDvCu36BNZchDK2NP8GftnR83zxyCiRKsHxuSnOY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abr4xas%2fdriftwatch@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":238905},"type":"module","engines":{"node":">=24"},"exports":{".":"./dist/index.js"},"gitHead":"6cdc0301abdb566828af2b8e37f60ee86e9dcff0","scripts":{"lint":"oxlint src test scripts && prettier --check .","test":"vitest run","build":"tsdown","corpus":"node --experimental-strip-types scripts/corpus/run.ts","format":"prettier --write .","discovery":"node --env-file-if-exists=.env --env-file-if-exists=.env.local --experimental-strip-types scripts/discovery/cli.ts","site-data":"node --experimental-strip-types scripts/corpus/site-data.ts","typecheck":"tsc --noEmit","jev:review":"node --env-file-if-exists=.env --env-file-if-exists=.env.local --experimental-strip-types scripts/jev/review.ts","pack:check":"node --experimental-strip-types scripts/release/check-tarball.ts","jev:classes":"node --env-file-if-exists=.env --env-file-if-exists=.env.local --experimental-strip-types scripts/jev/classes.ts","format:check":"prettier --check .","jev:classify":"node --env-file-if-exists=.env --env-file-if-exists=.env.local --experimental-strip-types scripts/jev/classify.ts","prepublishOnly":"pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"abr4xas","email":"bullgram@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:e85dbda2-ae05-42c0-8dda-bc5a223c8c20"}},"repository":{"url":"git+https://github.com/abr4xas/driftwatch.git","type":"git"},"_npmVersion":"12.0.2","description":"Find the parts of your CLAUDE.md, AGENTS.md and skills that are no longer true","directories":{},"_nodeVersion":"24.20.0","dependencies":{"yaml":"^2.9.0","ignore":"^7.0.8","unified":"^11.0.5","picocolors":"^1.1.1","tinyglobby":"^0.2.17","remark-parse":"^11.0.0","unist-util-visit":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.21.0","devDependencies":{"ai":"^7.0.106","zod":"^4.6.5","oxlint":"^1.82.0","tsdown":"^0.23.0","vitest":"^5.0.0","prettier":"^3.9.6","typescript":"^7.0.2","@types/node":"^26.5.0","@types/mdast":"^4.0.4"},"_npmOperationalInternal":{"tmp":"tmp/driftwatch_0.5.0_1789931022094_0.5428036816435502","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"_id":"@abr4xas/driftwatch@1.1.0","bin":{"driftwatch":"dist/cli.js"},"bugs":{"url":"https://github.com/abr4xas/driftwatch/issues"},"dist":{"shasum":"6586e7ccc69448cb85cfb57846137c969a6dcd39","tarball":"https://registry.npmjs.org/@abr4xas/driftwatch/-/driftwatch-1.1.0.tgz","integrity":"sha512-gMwPZadeblJqnhmmwiOv9qZfy+mzNbFWwcOr2JFc2eSjQuDcSvTVWvkyAAhKVpNpdOQS8M/XQxK12kunAxUurg==","fileCount":24,"unpackedSize":233614,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abr4xas%2fdriftwatch@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDSbxMQJpClvspo01K8ursBA3DHTgbYs3zCGvB/yFEolgIgRWjDEmF2NQnv1JPkMcubxAoXX4CxvUUhjVRl5KBBbjo="}]},"name":"@abr4xas/driftwatch","type":"module","author":{"url":"https://github.com/abr4xas","name":"angel cruz"},"engines":{"node":">=24"},"exports":{".":"./dist/index.js"},"gitHead":"59fdaf0150ce1a75b50fa2bb7ef5f99518e01696","license":"MIT","scripts":{"lint":"oxlint src test scripts && prettier --check .","test":"vitest run","build":"tsdown","corpus":"node --experimental-strip-types scripts/corpus/run.ts","format":"prettier --write .","surface":"node --experimental-strip-types scripts/release/surface.ts","discovery":"node --env-file-if-exists=.env --env-file-if-exists=.env.local --experimental-strip-types scripts/discovery/cli.ts","site-data":"node --experimental-strip-types scripts/corpus/site-data.ts","typecheck":"tsc --noEmit","jev:review":"node --env-file-if-exists=.env --env-file-if-exists=.env.local --experimental-strip-types scripts/jev/review.ts","pack:check":"node --experimental-strip-types scripts/release/check-tarball.ts","jev:classes":"node --env-file-if-exists=.env --env-file-if-exists=.env.local --experimental-strip-types scripts/jev/classes.ts","format:check":"prettier --check .","jev:classify":"node --env-file-if-exists=.env --env-file-if-exists=.env.local --experimental-strip-types scripts/jev/classify.ts","prepublishOnly":"pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"version":"1.1.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"e85dbda2-ae05-42c0-8dda-bc5a223c8c20"},"approver":{"name":"abr4xas","email":"bullgram@gmail.com"}},"homepage":"https://github.com/abr4xas/driftwatch#readme","keywords":["claude","claude-code","claude-md","agents-md","agents","skills","cli","lint","documentation","drift","ai","codex","cursor"],"repository":{"url":"git+https://github.com/abr4xas/driftwatch.git","type":"git"},"_npmVersion":"12.1.0","description":"Find the parts of your CLAUDE.md, AGENTS.md and skills that are no longer true","directories":{},"maintainers":[{"name":"abr4xas","email":"bullgram@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"yaml":"^2.9.0","ignore":"^7.0.8","unified":"^11.0.5","picocolors":"^1.1.1","tinyglobby":"^0.2.17","remark-parse":"^11.0.0","unist-util-visit":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"packageManager":"pnpm@11.21.0","devDependencies":{"ai":"^7.0.106","zod":"^4.6.5","oxlint":"^1.82.0","tsdown":"^0.23.0","vitest":"^5.0.0","prettier":"^3.9.6","typescript":"^7.0.2","@types/node":"^26.5.0","@types/mdast":"^4.0.4"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/driftwatch_1.1.0_1790716929922_0.588242663829621"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-10T20:52:44.760Z","modified":"2026-09-29T21:22:10.324Z","0.1.0":"2026-09-10T20:52:45.071Z","0.1.1":"2026-09-10T21:19:44.269Z","0.2.0":"2026-09-12T01:54:09.805Z","0.3.0":"2026-09-12T15:07:10.064Z","0.5.0":"2026-09-20T19:03:42.173Z","1.1.0":"2026-09-29T21:22:10.030Z"},"bugs":{"url":"https://github.com/abr4xas/driftwatch/issues"},"author":{"url":"https://github.com/abr4xas","name":"angel cruz"},"license":"MIT","homepage":"https://github.com/abr4xas/driftwatch#readme","keywords":["claude","claude-code","claude-md","agents-md","agents","skills","cli","lint","documentation","drift","ai","codex","cursor"],"repository":{"url":"git+https://github.com/abr4xas/driftwatch.git","type":"git"},"description":"Find the parts of your CLAUDE.md, AGENTS.md and skills that are no longer true","maintainers":[{"name":"abr4xas","email":"bullgram@gmail.com"}],"readme":"<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\".github/driftwatch-dark.png\">\n  <img alt=\"driftwatch\" src=\".github/driftwatch-light.png\" width=\"100%\">\n</picture>\n\n# driftwatch\n\n[![npm](https://img.shields.io/npm/v/%40abr4xas%2Fdriftwatch?style=flat-square)](https://www.npmjs.com/package/@abr4xas/driftwatch)\n[![CI](https://img.shields.io/github/actions/workflow/status/abr4xas/driftwatch/ci.yml?style=flat-square&label=CI)](https://github.com/abr4xas/driftwatch/actions/workflows/ci.yml)\n[![license](https://img.shields.io/npm/l/%40abr4xas%2Fdriftwatch?style=flat-square)](./LICENSE)\n\nFind the parts of your `CLAUDE.md`, `AGENTS.md` and skills that are no longer true.\n\n> `knip` finds dead code. driftwatch finds **dead context**.\n\n```console\n$ driftwatch\nAGENTS.md\n  ✗ 3  src/util/date.ts  path does not exist  → src/helpers/date.ts?\n  ✗ 5  src/cli.ts        path does not exist\n\n1 file · 2 problems (2 errors) · 59ms\n1 fixable with --fix\n```\n\n```bash\nnpx @abr4xas/driftwatch\n```\n\nNeeds Node 24 or newer. No configuration, no API key, no network.\n\n## The problem\n\nYour `AGENTS.md` says the entry point is `src/cli.ts`. Six months ago it was.\n\nNobody notices, because nothing reads that file except the agent — and the agent does not notice either. It reads the claim, believes it, and looks for a file that is not there. Then it guesses. A stale context file does not fail loudly like a broken test; it degrades every session quietly, and the better your instructions were, the more confidently they are wrong.\n\nLinters check your code. Nothing checks the document you wrote *about* your code.\n\n## What it checks\n\n- `path/missing` — every path a context file claims exists, verified against the repo index.\n- `script/missing` — the package manager commands a document tells you to run, against the nearest `package.json`, `Makefile` or `deno.json`.\n- `link/broken` — a Markdown link to an anchor no heading in the target document produces.\n- `frontmatter/invalid` — a frontmatter block that is not valid YAML, so what it declares is not what a reader gets.\n\n`path/missing` is the one that pays for the project, because the paths are what an agent acts on, and it is the one that had to survive being wrong. It is measured against a corpus of **96 real repositories** whose findings are ruled by hand: **81 of them produce no false positive at all**, which is 84.4% against a bar of 90% the project publishes unmet rather than move. A repository is settled by its first false positive, so not every finding is read — but no repository is ever counted clean on evidence nobody looked at, and a test holds that.\n\nThat is the rule the whole tool is built on — **one false positive costs more than ten false negatives** — and [docs/guide/precision.md](./docs/guide/precision.md) is the argument, with the numbers and the rounds where they broke.\n\n## Running it\n\n```bash\ndriftwatch                       # the whole repo\ndriftwatch docs/ AGENTS.md       # only these paths\ndriftwatch --only path/missing   # only this check\ndriftwatch --skip link/broken    # everything but this one\ndriftwatch --strict              # warnings fail the build too\ndriftwatch --json                # the machine-readable contract\ndriftwatch --init                # write a commented config\n```\n\nExit `0` clean, `1` drift, `2` the tool could not run — a bad config, a path that does not exist. A crash never looks like a clean run.\n\n## Telling it what is not yours\n\nA repository carries documents it did not write: a skill installed from somebody else, a vendored `AGENTS.md`, a template's scaffold. They name paths in the project they came from, and reporting them is the check being asked the wrong question ([ADR-0008](./docs/adr/0008-a-specification-is-not-an-agent-context-file.md)).\n\n```yaml\n# driftwatch.config.yaml\nignore:\n  - '.claude/skills/vendored/**'\n  - 'third_party/**'\n\nchecks:\n  'link/broken': 'warning'\n```\n\n`ignore` subtracts, which is the one thing `sources` cannot do, and it reaches what discovery found on its own. For a document you *do* maintain, silence one line instead:\n\n```markdown\n<!-- driftwatch-ignore-next-line -->\n`src/planned/feature.ts` does not exist yet, it is the plan\n```\n\nThe distinction is the point: a directive for a document you own, `ignore` for one you do not — editing somebody else's skill to quiet your linter loses the edit the next time they ship it.\n\n## Fixing what it finds\n\n```bash\ndriftwatch --fix --dry-run    # what it would change\ndriftwatch --fix              # change it\n```\n\nIt applies a correction only when there is exactly one candidate above 0.8 confidence, it replaces the claim and nothing around it, and it refuses outright to rewrite a relative path in a document that is not at the repo root. [docs/guide/fixing.md](./docs/guide/fixing.md) has the whole list of what it will not touch, and why.\n\n## In CI\n\n```yaml\n- uses: actions/checkout@v7\n- uses: abr4xas/driftwatch@v1.1.0\n```\n\nEvery stale claim becomes an annotation on the diff, on the line that makes it. `fail-on-drift: false` makes it advisory, `sarif: true` writes a file for Code Scanning. See [docs/guide/ci.md](./docs/guide/ci.md), or [docs/guide/output.md](./docs/guide/output.md) for the formats themselves.\n\n## Learn more\n\n| Where | What is in it |\n|---|---|\n| [docs/guide/](./docs/guide/README.md) | using it: the checks, the flags, the fixes, the output formats, the precision numbers |\n| [docs/spec/](./docs/spec/README.md) | the reference specification: brief, spec, architecture, roadmap |\n| [docs/adr/](./docs/adr/) | decision records, including the ones that cost precision |\n| [test/corpus/](./test/corpus/README.md) | the 96-repo corpus: the only false positive measurement there is |\n| [AGENTS.md](./AGENTS.md) | the handoff for the agent doing the building |\n\nThe specification is primary source: when the code and those documents disagree, the first step is deciding which one is wrong, not adjusting the document to fit ([ADR-0001](./docs/adr/0001-the-specification-lives-inside-the-repo.md)).\n\n## Status\n\n**It is on npm, and the surface is frozen.** The badge above carries the published version, so this paragraph does not have to and cannot go stale. M0 through M3 are done: the four checks and `--fix`. M4 has delivered the `--json` / `--github` / `--sarif` formats, the GitHub Action and the one-page site. `1.0.0` froze eight surfaces, listed in [CONTRACT.md](./CONTRACT.md) and held there by a test — it is a claim about compatibility and not about precision ([ADR-0014](./docs/adr/0014-what-1-0-0-asserts.md)).\n\n`1.1.0` adds the `ignore` config key and five discard rules derived from a second corpus of 2533 unread repositories. Nothing was removed, so the contract grew by one line.\n\nEarly means the checks and the fixes are what is finished. `--watch` is not in the tool at all until M6 owns it, and the four tier 2 checks land in M5.\n\n**The package is scoped, the Marketplace listing is suffixed, and the command is neither.** npm refuses `driftwatch` for being too similar to `drift-watch`, an unrelated tool that analyses agent *conversations* rather than the documents they read; the GitHub Marketplace refuses it too, because a user account called Driftwatch already exists and a listing name has to be unique across every action, user and organisation. So the package is `@abr4xas/driftwatch` and the listing is `driftwatch-action`.\n\nNeither reaches you. `bin` fixes the command at `driftwatch` whatever the package is called, and the action is used as `abr4xas/driftwatch@v1.1.0`, which comes from the repository rather than from the listing.\n\n## License\n\n[MIT](./LICENSE).\n","readmeFilename":"README.md"}