{"_id":"@andrew-semyonov/harness-linter","_rev":"3-265bc98574834bf2830c894bf146a44e","name":"@andrew-semyonov/harness-linter","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@andrew-semyonov/harness-linter","version":"0.1.0","license":"MIT","_id":"@andrew-semyonov/harness-linter@0.1.0","maintainers":[{"name":"andrew-semyonov","email":"secretofchernui@gmail.com"}],"homepage":"https://github.com/Andrew-Sem/camera-sales#readme","bugs":{"url":"https://github.com/Andrew-Sem/camera-sales/issues"},"bin":{"harnessfix":"bin/harnessfix","harnesslint":"bin/harnesslint"},"dist":{"shasum":"198a86bb72bd126cbdb3fd9353ccd1535792bf61","tarball":"https://registry.npmjs.org/@andrew-semyonov/harness-linter/-/harness-linter-0.1.0.tgz","fileCount":6,"integrity":"sha512-Axk9KpaLX775Jyyoah+eKcXzpzIhbq+g3IC8+noPdr9XAWjx0736525zMi8YGy0vBCV2hw6ihY8BFjonABElhQ==","signatures":[{"sig":"MEUCIE+dBLTHuRbPV6jJ0kPmLG1kOpMTJtmZ1Q+Zuqd4Z7ETAiEA7jupoHTsw+SKibP3NIcc9wHhOaNjkxC6jMstfP26ePE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5163},"type":"module","engines":{"node":">=18.12.0"},"gitHead":"578bcf7b65857b3e7ee4db02aa916ea435c1c7f7","_npmUser":{"name":"andrew-semyonov","email":"secretofchernui@gmail.com"},"repository":{"url":"git+https://github.com/Andrew-Sem/camera-sales.git","type":"git","directory":"packages/harness-linter"},"_npmVersion":"10.9.2","description":"Go-based repository harness policy linter and fixer.","directories":{},"_nodeVersion":"23.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@andrew-semyonov/harness-linter-linux-x64":"0.1.0","@andrew-semyonov/harness-linter-win32-x64":"0.1.0","@andrew-semyonov/harness-linter-darwin-x64":"0.1.0","@andrew-semyonov/harness-linter-linux-arm64":"0.1.0","@andrew-semyonov/harness-linter-win32-arm64":"0.1.0","@andrew-semyonov/harness-linter-darwin-arm64":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/harness-linter_0.1.0_1779809914015_0.38470136013129297","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@andrew-semyonov/harness-linter","version":"0.1.1","license":"MIT","_id":"@andrew-semyonov/harness-linter@0.1.1","maintainers":[{"name":"andrew-semyonov","email":"secretofchernui@gmail.com"}],"homepage":"https://github.com/Andrew-Sem/camera-sales#readme","bugs":{"url":"https://github.com/Andrew-Sem/camera-sales/issues"},"bin":{"harnessfix":"bin/harnessfix","harnesslint":"bin/harnesslint"},"dist":{"shasum":"6bc70c0d46ec940696b5d578729d7a80952858f1","tarball":"https://registry.npmjs.org/@andrew-semyonov/harness-linter/-/harness-linter-0.1.1.tgz","fileCount":6,"integrity":"sha512-vDrtcj5NXmTrZy/FgDw4orawrvWNHKaN59/YqFMPTeisFoUPN2IZlebkKOA5Rt3O2vQKBZj5odklLG6lsy4z6Q==","signatures":[{"sig":"MEQCIGaLvWJKzKnszoS61b6Z7WSHBCE1m0pVsyyyWx8YFTxhAiBza/gLYXtrXx7K9vtIaokqS1d2bVO4Pj5QGQ6cTA9YUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6107},"type":"module","engines":{"node":">=18.12.0"},"gitHead":"578bcf7b65857b3e7ee4db02aa916ea435c1c7f7","_npmUser":{"name":"andrew-semyonov","email":"secretofchernui@gmail.com"},"repository":{"url":"git+https://github.com/Andrew-Sem/camera-sales.git","type":"git","directory":"packages/harness-linter"},"_npmVersion":"10.9.2","description":"Go-based repository harness policy linter and fixer.","directories":{},"_nodeVersion":"23.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@andrew-semyonov/harness-linter-linux-x64":"0.1.1","@andrew-semyonov/harness-linter-win32-x64":"0.1.1","@andrew-semyonov/harness-linter-darwin-x64":"0.1.1","@andrew-semyonov/harness-linter-linux-arm64":"0.1.1","@andrew-semyonov/harness-linter-win32-arm64":"0.1.1","@andrew-semyonov/harness-linter-darwin-arm64":"0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/harness-linter_0.1.1_1779810945033_0.2702511784231685","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@andrew-semyonov/harness-linter","version":"0.1.2","description":"Go-based repository harness policy linter and fixer.","type":"module","license":"MIT","repository":{"type":"git","url":"git+https://github.com/Andrew-Sem/harness-linter.git"},"bin":{"harnesslint":"bin/harnesslint","harnessfix":"bin/harnessfix"},"engines":{"node":">=18.12.0"},"optionalDependencies":{"@andrew-semyonov/harness-linter-darwin-arm64":"0.1.2","@andrew-semyonov/harness-linter-darwin-x64":"0.1.2","@andrew-semyonov/harness-linter-linux-arm64":"0.1.2","@andrew-semyonov/harness-linter-linux-x64":"0.1.2","@andrew-semyonov/harness-linter-win32-arm64":"0.1.2","@andrew-semyonov/harness-linter-win32-x64":"0.1.2"},"publishConfig":{"access":"public"},"_id":"@andrew-semyonov/harness-linter@0.1.2","gitHead":"835ff7443137e60b947b288fff57895b0fce4034","bugs":{"url":"https://github.com/Andrew-Sem/harness-linter/issues"},"homepage":"https://github.com/Andrew-Sem/harness-linter#readme","_nodeVersion":"23.5.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-+KVc1yqGmYDHMUdlCv1XbSJQzrpHQ2lT2x04cAeiJT9pmdETscPLTZnp3j226IFdCffFUSdsZlR9oo4Dpb+vSg==","shasum":"6067e60ce706bfbe8fb0bc2bab173c61414484ba","tarball":"https://registry.npmjs.org/@andrew-semyonov/harness-linter/-/harness-linter-0.1.2.tgz","fileCount":6,"unpackedSize":6543,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDKAz3WxFrAJdciFsF2tPPq/OoJOzERaHe8Vgwa2gJp4AiA00ZnbBCzTxM9a9uL+TH7HMpe+YWV9iVU+POSRlW7PHg=="}]},"_npmUser":{"name":"andrew-semyonov","email":"secretofchernui@gmail.com"},"directories":{},"maintainers":[{"name":"andrew-semyonov","email":"secretofchernui@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/harness-linter_0.1.2_1779811747395_0.8221531857219688"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-26T15:38:33.838Z","modified":"2026-05-26T16:09:07.630Z","0.1.0":"2026-05-26T15:38:34.159Z","0.1.1":"2026-05-26T15:55:46.082Z","0.1.2":"2026-05-26T16:09:07.521Z"},"bugs":{"url":"https://github.com/Andrew-Sem/harness-linter/issues"},"license":"MIT","homepage":"https://github.com/Andrew-Sem/harness-linter#readme","repository":{"type":"git","url":"git+https://github.com/Andrew-Sem/harness-linter.git"},"description":"Go-based repository harness policy linter and fixer.","maintainers":[{"name":"andrew-semyonov","email":"secretofchernui@gmail.com"}],"readme":"# Harness Linter\n\nRepository harness policy linter and fixer for agent-friendly codebases.\n\nIt ships as an npm package with prebuilt native binaries. No Go toolchain is\nneeded in downstream repositories.\n\n## Install\n\n```sh\nnpm install --save-dev @andrew-semyonov/harness-linter\n```\n\n## Usage\n\n```sh\nnpx harnesslint .\nnpx harnessfix .\n```\n\n`harnessfix` only applies safe mechanical fixes. Today that means creating a\nmissing sibling `CLAUDE.md` containing `@AGENTS.md` when an `AGENTS.md` file\nexists.\n\n## Checks\n\n`harnesslint` currently includes these configurable rules:\n\n- `pairing`: every linted directory that has `AGENTS.md` must also have a\n  sibling `CLAUDE.md`; every linted directory that has `CLAUDE.md` must also\n  have a sibling `AGENTS.md`.\n- `claudeInclude`: every linted `CLAUDE.md` must contain exactly `@AGENTS.md`\n  after trimming whitespace. This keeps `AGENTS.md` canonical.\n- `brokenLinks`: markdown links inside `AGENTS.md` must resolve relative to that\n  `AGENTS.md` file. External `http:`, `https:`, `mailto:`, and same-page anchor\n  links are ignored.\n\nIt also includes always-on repository harness checks:\n\n- Nested guide files: README and index files are only allowed at the repository\n  root. Directory guidance should live in `AGENTS.md`.\n- Execution plans: files in docs exec-plan active and completed directories\n  must use unique numeric IDs. Active plans fail lint until moved to completed;\n  completed plans fail lint if they still have open checkboxes.\n- Operational doc paths: inline-code path references in `README.md`,\n  `AGENTS.md`, and `CLAUDE.md` must point to existing files or directories.\n\n## Configuration\n\nAdd `harnesslint.json` at the repository root:\n\n```json\n{\n  \"files\": {\n    \"ignore\": [\n      \".git/**\",\n      \"thoughts/**\",\n      \"vendor/**\",\n      \"bin/**\",\n      \"dist/**\",\n      \"node_modules/**\"\n    ]\n  },\n  \"linter\": {\n    \"rules\": {\n      \"pairing\": true,\n      \"claudeInclude\": true,\n      \"brokenLinks\": true\n    }\n  }\n}\n```\n\nBy default, the ignore list is:\n\n- `.git/**`\n- `thoughts/**`\n- `vendor/**`\n- `bin/**`\n- `dist/**`\n\nIf you set `files.ignore`, it replaces the default list, so include the default\nentries you still want. Rule flags can be set to `false` to disable a check.\n","readmeFilename":"README.md"}