{"_id":"specguard-mcp","_rev":"39-0aa4a57f197bb2548930ac2d0a8784bb","name":"specguard-mcp","dist-tags":{"latest":"0.1.38"},"versions":{"0.1.0":{"name":"specguard-mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.0","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"2c44256e4afcff6a30acc5ed7233b78f1df1d2f4","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.0.tgz","fileCount":38,"integrity":"sha512-HsBqc7Hx7t9WSWXZ5ClOJB9GMK8EckuDi2KawukdKZi8kLl/tbsrTUtKv/XCDDKm3CACZU39pgZ3dgfv+dtLrw==","signatures":[{"sig":"MEUCIQDT1MrBC7iC6E57wbS/9g1oJYYkeph1VhTwdaxijT6EGwIgPJdoRaxqBEG5LRjlO3hpJQC3a3MOgOZ3UsUnZ+inW3Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242522},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"42680f58454b42222f9a64b950c8bcdd7918f761","scripts":{"test":"node --test \".test-build/test/**/*.test.js\"","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"yatfa-admin","email":"admin@yatfa.com"},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"11.6.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"25.1.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.0_1787046442580_0.24638306206319216","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"specguard-mcp","version":"0.1.1","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.1","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"18cbaaca50b3392c2bb8dc02f2613a11a233c31e","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.1.tgz","fileCount":38,"integrity":"sha512-PEbL3lSx0aqhl6GZ3OUvbw4Gq5K/yG/Lldi9vZtepCsROtyX92rY5uAeuooAUb5jjojNNaWzLBFJZ6oeU+x1QQ==","signatures":[{"sig":"MEYCIQCSf0WSQ5hEhxcd8m880URDlt0TzxyR2fHHDw23WoykwwIhAP214Y15mEsSAjo7azaoztc/y2+/Xq18kfVQ51ynUgki","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":242522},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"1f0ecf0c24e0a56b2fb1d7e0d202bc8534f41b5a","scripts":{"test":"node --test \".test-build/test/**/*.test.js\"","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.1_1787078966979_0.24136405151502927","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"specguard-mcp","version":"0.1.2","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.2","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"63e5bb9e1b7b1e19a4cc47ea581864ce52a832a3","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.2.tgz","fileCount":41,"integrity":"sha512-k0dZMxVSNtQ+XRLWy8Qk0Twy5I+Dig0VzVC1wg9OZMDU0Rm9UFFrYiH/r8noKl11ReeeGCvG3yWYsHCndJeGEw==","signatures":[{"sig":"MEUCICRSSJI+DHKsqb5MrYCkLPaRdCBjZ8HYy/pPsSYafHPhAiEA/Cit4YvmJXHJ1pRLuW35Ji2/VhszQrIrrh8Sn/koYaU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":272519},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"82ae3b183f44155ff765cb855c47ce72e4633aee","scripts":{"test":"node --test \".test-build/test/**/*.test.js\"","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.2_1787188610391_0.8673087165497155","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"specguard-mcp","version":"0.1.3","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.3","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"7eeee2660449c2660228fb97a636f6b9ced7862d","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.3.tgz","fileCount":47,"integrity":"sha512-QBTKZzLB0xmg180UidaJfvyS5qqW80beCFheEIlInjRc0kbb5V1rucZ2ILJPeKxqjjEDZBP7948Zx3yaivoeWg==","signatures":[{"sig":"MEUCIQCiCKfWRBJRciXzvrtH/YbPcY5Ypu7tHKXDvWIt8R5y0QIgdeGt2yOxC8QP73AEXsm/owhRE0uND5lyVkFc94bHC2A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":322105},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"98ec8c8883a0caec86046cbb4be8a8448b88b9cc","scripts":{"test":"node --test \".test-build/test/**/*.test.js\"","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.3_1787863362579_0.5455307349489924","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"specguard-mcp","version":"0.1.4","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.4","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"d6edf261bf312907d1b62e5e3dda9334524ad062","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.4.tgz","fileCount":59,"integrity":"sha512-R56abcBrWaLweFYRGkozOQKc2K/H86NiIybpV1mKPvywwYs08ZNCsHJNWCLI9pTuOSqwjDPIAzPvNViiqZcsPg==","signatures":[{"sig":"MEQCIAZFD4h+pdxPy2Dbif93lCDZvIcWH5FkljUK01aa7+zaAiBC1rkII6KOvY0ZnA2D0I2rfrYWiUPIaj0D+sFxM3vOjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":368935},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"89a1d448f7edcb4401077b1392c5c50ad0fb020d","scripts":{"test":"node --test \".test-build/test/**/*.test.js\"","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.4_1787932327592_0.4724295181416518","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"specguard-mcp","version":"0.1.5","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.5","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"9bdd7c1f03a875350e24d71e76a69f3d9bcf0c96","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.5.tgz","fileCount":77,"integrity":"sha512-sAgsQwu5iZZZye9UzOt9JUyeilP7nxmoKjTRiyfDk8MwjjMbwGqy8PiYxONkhvvYj7JQpDZ0lTJC8Ikc9ijWOw==","signatures":[{"sig":"MEYCIQDjnyTVSSnNYMXTBQQ2P8l1ErLzXwHmA+Rbb3NUWI5ZTgIhAMPiIH587Forx4DZISLRxrfkvNaoauY1Jq6/HwRsG4JW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":447597},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"65bd5c200c1ad314bd425ecf683ac0b01e791d63","scripts":{"test":"node --test \".test-build/test/**/*.test.js\"","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","specguard-ts":"github:yatfa-ai/specguard-ts"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.5_1788063360887_0.17362375420293952","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"specguard-mcp","version":"0.1.6","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.6","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"96b5fdebcb22a49983d18e5827f29475bf747363","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.6.tgz","fileCount":77,"integrity":"sha512-2nOnLvpfAwHD3K2bvpKqhSNrNzX9nSyAPGF9KnnWFkODCMG5aXNWJqHjdzCP+U/urgekAyo0R+hN12pKwQyAZA==","signatures":[{"sig":"MEQCIAMG41Y/ZvwhrXGOBwtUbUDDnTXk0zsjKrakytmqV2GMAiAUlEFlm8evVey3nDyns8S9xaztIRdwYswvQAEU1afayQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":447597},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"1172b9fa252fca03ae44293abd593501f963744b","scripts":{"test":"node --test \".test-build/test/**/*.test.js\"","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","specguard-ts":"github:yatfa-ai/specguard-ts"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.6_1788179379681_0.7780121231105306","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"specguard-mcp","version":"0.1.7","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.7","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"371c25af7efdebf9d96143625fcb9ab65618f4d6","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.7.tgz","fileCount":77,"integrity":"sha512-JJc0JD5sAL1B9DI/D86y+DIXQA4KakAMsjSRhsN5TxF+czs7Lfw6S68/YnRE1TJb5HL2g67HtJfJrMOSwB4zhA==","signatures":[{"sig":"MEYCIQDnRM9kUbnrq2Jb7tsfk7vQlumWLvbjYEBXPnpEDyEHoQIhAPQrmpGYzXI7YWVJMgNFMBtaXUXlzLakQjFEpIIYICwv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":447727},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"58b8e1712b9afc8d589bc47bc1e1492613b36111","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","specguard-ts":"github:yatfa-ai/specguard-ts"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.7_1788630770536_0.10245912756638798","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"specguard-mcp","version":"0.1.8","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.8","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"2c38c86d9435b2ca3e6c4e8f5766fe415329bf5a","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.8.tgz","fileCount":77,"integrity":"sha512-I9J83+8/1mvYBrg+HUTlXVGgk5TMPVjbCpzsPczu70cxWQf1aXa5ZAVeyyGVaNoJBWocxlBozooFPemEJfIrLQ==","signatures":[{"sig":"MEYCIQCalq7OhM4VPpil5RhX7Eqe8c4CsLYouj36J5mLl1DVNwIhAIIuAfjHhewPwI3JShJXKejpSgK9T7ReMdrIBcWElHws","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":447709},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"c1e92fea0b814008bd3e477f94956a3349b5eb96","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.8_1788710512411_0.6300324266595365","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"specguard-mcp","version":"0.1.9","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.9","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"1b24f0c15c6c23cd461533547be90c3602462065","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.9.tgz","fileCount":77,"integrity":"sha512-e5RsWbHcUWx+XR6cZw2jIqJWdSVn6R3ShgdJ52S9wekCp/6VKWi90yPkkKCNVw8fkrzFGHMQ5BNjaQ7pESUSLQ==","signatures":[{"sig":"MEYCIQDtOh4p5IhMPhgTBWBiQlAbpbCltZzk6dEmetzM7WnFnAIhALd5xB92mij8zl6ef8hesjAhzj7NXuQ0uu/1MEZPsP9q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":450597},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"1a76f330a271ced23e03427e98f33fdbe32f7fb0","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.9_1788789725840_0.6616995238190724","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"specguard-mcp","version":"0.1.10","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.10","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"c0150b8431da650872d493a5a28e1ce0b8a497d5","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.10.tgz","fileCount":77,"integrity":"sha512-6BME32I9iThcLHBf1o8/k0BUIUw/sO9EstU/DEBv5ZEwPMSFejrMyXUH+YnDbsBMLRAgljkX4t8MoZ2fSEjUxA==","signatures":[{"sig":"MEQCIANCzQK3FndR3ngQAbnmH7bJ+d1dGE/2ygkNvnFzLxzmAiBq1RThaMrLnN64RXyz8YSxWCyeh4bPiP9+2uhKVnFw0w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":450598},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"51b37c640a9fbe7c931f44d58c0b978f5fed2672","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.10_1788998648773_0.24943722086818565","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"specguard-mcp","version":"0.1.11","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.11","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"e1ec0ed279b76496ad21877e4c3609ae90a16be6","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.11.tgz","fileCount":86,"integrity":"sha512-i2DzcULYP3QAqEUrNUaZ2SAlMKSwzgD1v7fd18lp7I+NxNu5oO1TBo26eHaC33J2Q3y3Sx4Y4payeeoozUcipA==","signatures":[{"sig":"MEUCIGMzcm0QN/XSv7tG4reY5hvEbEnukAEj0blh3cEQB6uKAiEA8nG44lLdEx/40qiRK4mIkZqvGCbnbWt3klKjRR/+ULs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":488684},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"ee3e51587a20a53c6fece8631ba98d381a901e3e","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.11_1789135444435_0.15051287514090816","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"specguard-mcp","version":"0.1.12","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.12","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"2fb46747775deae98d226f3a2dc3f285b360926c","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.12.tgz","fileCount":86,"integrity":"sha512-EzpuJD4QdhdVE5FqEwvT9gdiiqqLRvbRI4O+hh88DVjVk2qwywIeEt2X8b0XWbYrhoLTiGcNC4EeohUpD25Fyg==","signatures":[{"sig":"MEUCIQCPs/WfWaCwebRPakZ6RoNKkZJQgsPBCrmXVPk7bn6MswIgBmBkwoDWSkGPB+B5fPzA5e+qzecis/JBy57tDAUrjSw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":500912},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"51238363cf2346763f53dd50771f09f1b5731f7e","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.12_1789142651762_0.8390816076808967","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"specguard-mcp","version":"0.1.13","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.13","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"ec995fff70efd51a588015ddce24544662a9e8cf","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.13.tgz","fileCount":86,"integrity":"sha512-1qupGLf8K1XNI3X5T9xX3zBiHAv8ooDzpflUpl316k8hLuFlq6i182pdPN6qsxIKk9jg1siLC1NYItsJzC5DVQ==","signatures":[{"sig":"MEUCIQCgrz4P2uZvGIGb7icZdTetbCqsiNfV8IzGHwtp4+BslQIgS8crarKEL71tACL7Aaz/vI9QRmUHfrBYbf8Nz2Bv0EQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":543085},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"bac80a336f49404abff3f390e0d83ea6dfc706d1","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.13_1789200141618_0.651971366531191","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"specguard-mcp","version":"0.1.14","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.14","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"9aef9df5da813a9ba828b2a5a8267e23daaab3ab","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.14.tgz","fileCount":86,"integrity":"sha512-ZZBnllgrherO2b3QrikVMJG9jPDfBAZ2gA8ovZo3FVDZaVgt5CwsuFx9yYr2e0kdr5dICWA74EeXiVMTqZTf2w==","signatures":[{"sig":"MEQCIHwLjAplpyFT+ZQX24cVE4Wo0r5p39AEMOJamxtVgb/wAiBjEXR+gMqG3lsm8FelY94zWZb81OPCCCyqn7X8wf1Wiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":551211},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"f5613a2daa82393156e1ad5918f0c0b64e1eb51a","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.14_1789228927578_0.28955849556313695","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"specguard-mcp","version":"0.1.15","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.15","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"67d3d065204583cff3596e6a09aa55e7537d0783","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.15.tgz","fileCount":86,"integrity":"sha512-JJwpa14mZFoPCbeIdbf+lQV5zeP+Hny3UM5waImFwhTaq1npZaTzZ+3w5k8bjlw/vbsNFMSY6rnaPzrznlDgxw==","signatures":[{"sig":"MEUCIQD2TzK9yUEYDnZa+32eq61dBNYlyp3ZVMCfaHSdKNR8JQIgCHW9RDiEJlUE56XVJKzmN1AzP78PPI3nLHx37XFEt+c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":552257},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"a68eb69f58cb48ce701b200fa5e40401e2171ca8","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.15_1789243448274_0.8549352200661495","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"specguard-mcp","version":"0.1.16","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.16","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"303ea33bf4d16811fa7299e195f5ab1f193fd37f","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.16.tgz","fileCount":86,"integrity":"sha512-3x6I9aTImp6++DgC2SL3S3dZEsKMqegAktFr6FTqq7cAEsAJpdlZF2xtIiH0oCJamMT1PWBqvAHSnBFjudI5kw==","signatures":[{"sig":"MEQCIHmGrKB9VOZo93lFhZDiKbsNu28MlKnvkBWrVAMuA0A0AiAZWeIvxyJDV4jFxxRTtWBrZbEXpNTDPKvJvWVJNf8SWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":556449},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"7017a3e3fe2fa9858ef72db1af3041d720f02bea","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.16_1789272301251_0.1175576042401425","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"specguard-mcp","version":"0.1.17","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.17","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"8154d56b1ea8f8f7c0868ca8ec859d2c2adfe9bf","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.17.tgz","fileCount":86,"integrity":"sha512-jpZWGXez6jnT9X/NB8M8wCNVkFXDrakfSbbi2ZY7Fo1Ecml1x4FN5jHAPPMP6Gc/eYkxlrRo4jgpRUKrYt58vQ==","signatures":[{"sig":"MEQCIFxeG4iGHbZCD5vVpNz6USXQaCFRtm33/6qJI+iZ0SZyAiAYq/SgVNj7Q1g39iBIF2wsvdu2xP1x+aOWcn0y7zZ1lA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":558272},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"0b2a45af8a70577b4d723d28feab968e33dacad4","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.17_1789293836930_0.592239787871945","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"specguard-mcp","version":"0.1.18","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.18","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"62a6c1cbab735b2469f73f0e7c85826eb66e0299","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.18.tgz","fileCount":86,"integrity":"sha512-r8J01nmbBpuml9N4sDzqjzXns0xbNbQGVunIiyaIojAeb6hVsFsa5f/JPKwgIRFfFIh5O6HYHGhmRtyj6ZObDA==","signatures":[{"sig":"MEUCIBQ3QTkqZAILfyERWpcM4XzMFdeeNZkClnzc7EssJBIXAiEA/leIi7Y58wA4k9AnQ16IWGg8gaOF63LHUvByS58yIzo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.18","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":570911},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"8716022e51fbc9b50d6f2e531110e42d0fc6beb5","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.18_1789308198907_0.392630782138929","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"specguard-mcp","version":"0.1.19","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.19","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"4bafbc5849c6ddbcfa742aaabae14f5b5199e846","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.19.tgz","fileCount":86,"integrity":"sha512-7HHwPo8LbPG1DcHpUR9mATPqnBSsurCv/dHVeLi1jgOg60Ke3HyqTZjEki72LJ0YAI6m4+YRuc0iwkgpUx0Kig==","signatures":[{"sig":"MEUCIQCQD5hPMQJanUOT4BnPn/585FCAM1x8VTUDfcT9FFm8cQIgD5l7WQIkCG1woDn6jQFXC4yZFcm5/uNDVT9TnEwx8KU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.19","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":575833},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"bf57fd780446fdc3f48a7eb3e518a6e1d5d9239f","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.19_1789329682974_0.9125091813895969","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"specguard-mcp","version":"0.1.20","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.20","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"14ce39cbf14a5cb598ebb4790e8bd44c41a72cf9","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.20.tgz","fileCount":86,"integrity":"sha512-4z8j1TNTv1i61m3jnsydh1zoyFAwq1CLFqd7tmXyZXkUivJTf6TBsp0CREfm5gnzKK+iUfM+BRXhAhDoTlzV9A==","signatures":[{"sig":"MEUCIQCihQ/54tg8X1d4X7xz8l+cprl3Ds3Opm0lOdYHj3sPAwIgTokW6WT/4aLkhau0fkQOn7lDgTyXaj0+WgXK71bwq9U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.20","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":576743},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"02f36a44d737f70a04d9a3fa668ea9f10c924dd0","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.20_1789337068985_0.21933379529155728","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"specguard-mcp","version":"0.1.21","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.21","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"d98dfd01c501f743cbe0f4cc6c1e8a64a806f61f","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.21.tgz","fileCount":86,"integrity":"sha512-/XBNf0z5Mf4vG1c9x8m/AnIURimFWHQIa0vWcnQ4odupeLnd1jeKMyMCA96T88hYYQe/v49eASJOPynNhqLzcQ==","signatures":[{"sig":"MEQCIDlszaholnKMnp31C90EFBFGzahVwA8NPk8me0itgFCnAiBjQQZg5Bw3Uc5dMsRSevx+x2LyfyVCQeBXcMqni+aQdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.21","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":579575},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"a6794a03f23b3d5d38b0c72716f2961310c3cc5c","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.21_1789401969022_0.6044564465825133","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"specguard-mcp","version":"0.1.22","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.22","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"26dff4f9a1237ba2f7efe8ae9f8603def052dbc6","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.22.tgz","fileCount":89,"integrity":"sha512-vBnj52ms7IDaXi6bavdqXJuWmyRWupiJ5dhqAxyB5ZgjPcE14saK3N4ZXPV33sxTCBplj0q+/7MPYAZsYDl3vw==","signatures":[{"sig":"MEUCIQCRX2xuAjAWLJVFLkIOHKASJ9LvqSIrcwfIbcq3JtpQdwIgOnBiBIF9kFnvkJTp1j3EMqbWulYrYJuJ5ba2ALM8E+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.22","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":596522},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"3e975fc8f8e7290f6fb32494a937c9fccda6d94c","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.22_1789423389406_0.30913973130389927","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"specguard-mcp","version":"0.1.23","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.23","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"f35be7ce69ce99d5072d270aa6e010ad581ca321","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.23.tgz","fileCount":89,"integrity":"sha512-5B1sGSBQqFXdvRUOuKEsyQg83pm9ZVfKfdyDblLRtuMZ9bqZu9HPb7xJbrpYGRfayvDLTIXtfo7zlP8wK3bsmA==","signatures":[{"sig":"MEYCIQCoqK6fClklaIDfk85llEnKv8J+7TBygGRaL1w3DWUCQQIhAMP37vgAA3Cburp3Yi7bEVipfAjFbCQ7Ttw2jzShCkSJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.23","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":601947},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"2df277a644fcc5f41d330e23ff0149bfe43acfa5","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.23_1789466646882_0.17587373101825232","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"specguard-mcp","version":"0.1.24","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.24","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"0b975d338e545bd2a080ca86da3eb3ba3de6d6ee","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.24.tgz","fileCount":89,"integrity":"sha512-bhjAS7ecYy9+4gFw7C7tJGH38i8d+uDjcb+VxI6xKSqAYJiKp8LOuc9XLlU9UF4QO7hLo183lH+ZzwYXTWFYfQ==","signatures":[{"sig":"MEQCIH+qIkNSwutyPky/2jRTnlqRBv0Sc8KmXBbZD6w/I3rWAiBzjg6hV7geYL0Zel6E4i7cup/ZpvJ11TlHcFbIugEQoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.24","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":602694},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"d17a63b0489d76d74e6ded0b8da4a18a1a4074a3","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.24_1789509795583_0.3012326762844324","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"specguard-mcp","version":"0.1.25","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.25","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"4b763fd8869b2948d54799db810a3ebd73bfbee2","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.25.tgz","fileCount":89,"integrity":"sha512-rRDizXOxkdTcbjBwlaArypkqsf784sHokrhanTGI7fcLj8Dsb4XVkL8yXBymzS9exF9wHx+EOfvu9CtdQCQfFQ==","signatures":[{"sig":"MEQCIGz6VLqw+EWhtviY2oaNRx7KBcje1tkKQvT58Xl+/CAbAiA/eWbngUp4+kGtNoSK8QRtJhUb66uYW8PWPTKCovQZ+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.25","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":609046},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"ba94d23d0a7607603d3bbff2fdb58381d9c3abf6","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.25_1789617828769_0.08297686848362607","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"specguard-mcp","version":"0.1.26","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.26","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"f855192b9b27a43a29151938778814c67dbed80e","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.26.tgz","fileCount":89,"integrity":"sha512-311UZfLKAAkaU8ygQDp/9mcTS4J6V5OH5Ji83ci9XkeBZt+4w5UAwndzFAUdZE2zXTN3nER6RruS5Pa9oho3Zg==","signatures":[{"sig":"MEQCIEzvuZ/lFW5qynBZIP765Lj5qgf7+WlW4SxLvVx+0ENPAiBx0TTPQmrf1IQ0/A8GgRxNY5cpmq8v6y8jM4+wM3BaJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.26","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":611596},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"3212451e0e8e74b2dc6ef3a7cd79694deacafd45","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.26_1789625081995_0.8996667124033702","host":"s3://npm-registry-packages-npm-production"}},"0.1.27":{"name":"specguard-mcp","version":"0.1.27","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.27","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"0c5a184b21050568bdc71b24d30efea3639640a6","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.27.tgz","fileCount":92,"integrity":"sha512-PQhFZKThhJbbZMS2Qoz9C8fYl2BCuL9cQAH8Mil0etphniPfsGseArQyEg1uFVfKqM3LHdi47tm8K+AmzDLJ7g==","signatures":[{"sig":"MEUCIQDVl5AIZhrPgsdVIMuyNu3yVzXhJCOi3GV3UsZZi/bBswIgaO5IfGFdCrgSGwzgO7FwswM35QJFgHv8trYLZZyZOwM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFUAFz+iZCBlNp4vxmCsNlT9k438M5RjiT6Mmm/swQ3UAiAG0IZMvgnZ6KaBTeKpfXfbPZqCS3ChZ320RcTEo05ChQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.27","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":634822},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"798cadd8a61c7f4473945e1df20fd7dba363f009","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.27_1789682536118_0.6507257785089948","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"name":"specguard-mcp","version":"0.1.28","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.28","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"23cef35d0e903d7eb83519f7da20f908bb2ac9e7","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.28.tgz","fileCount":92,"integrity":"sha512-EA2aCzVRVnBG2hzprUODTjha90uAIfoN8bDEY1W5jFYB9cuQTfB+OPD8uDqhhBbd/CdzI7DG110+CPVKvwiPgg==","signatures":[{"sig":"MEYCIQDZify02B3vOoNG437wG/BvX5mwc3Ma6JGekFMXFYrp1QIhAL+yUB0aSNMls7vlgzfYA54aivamcKh5OAdebciOUIgm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIASwulR3TtBfOgbwuMb4qoJcz66JqqV28hFPgTMVmTSEAiEA54DFgTOJIHXlHa/t91SR7sacRN0K5Fp14veq9xlGqdc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.28","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":639242},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"c23d49291ae5aa3c0b7d8d72b7da90d0e539c58e","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.28_1789732985439_0.5997056000714862","host":"s3://npm-registry-packages-npm-production"}},"0.1.29":{"name":"specguard-mcp","version":"0.1.29","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.29","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"ede41dbc1accf05da8f50ef955642c2ab4eaffbe","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.29.tgz","fileCount":92,"integrity":"sha512-ifRHmMQBJo2mkdOuuTNx0jYn/iBI1cLaUiITWAYLDJJ0MHZXtRqHcpTo7+N7VkkY0EXQ5zaD0Qk1qxqZGb/j2w==","signatures":[{"sig":"MEYCIQDCb7qOyJM/f/1gFhnF4z/erXwFQ0DGFVLVlRyaBR1oBgIhAJVlTl+TU+PWUMTaZDsb6XSqDCVYd9mkNLXUgN96eek4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDQFhmbUSq7KOaXEjee2Grj9YXCtHlrH8fPqBQAD3ykUAIhAKSBjmbIWUV5tNS0s/sJI3llglcZIfoWrxfwr3rK3hex","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.29","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":640157},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"564aeaa5dfd98ec439d7e1b1a06d78924737a38b","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.29_1789761774635_0.7515058279483693","host":"s3://npm-registry-packages-npm-production"}},"0.1.30":{"name":"specguard-mcp","version":"0.1.30","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.30","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"83f517da78f8d79cf79a831a4a8e503904814d8b","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.30.tgz","fileCount":92,"integrity":"sha512-2IqGBO01sWKqN8ivmfC9NG7M/jT2akKdAJIBQEsaT9mc0DZoohRKSTeUQxNOIlfOvCOoPfyJ/yyNkaWMTqI56A==","signatures":[{"sig":"MEYCIQCf22z2zGJi7GwfTkwl4yf5I/bYYye+3NzkmwdJMhVAkQIhAMcieO/aRVIItsIdOGBfHU0NsGLtzmYlWo/oB7qcCrPd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD70nfet1HtjYxWRY3X5WRBZL1VU9BbGJBqaXixOUq+FgIhAOQR6Z7XTxiJmh2BGZoTBunbuELpQnn7xpSlxE+gHS6h","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.30","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":642575},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"1be548f70cab5b15607a69fe6cf69db3ae2d463f","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.30_1789812594486_0.9300764917502791","host":"s3://npm-registry-packages-npm-production"}},"0.1.31":{"name":"specguard-mcp","version":"0.1.31","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.31","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"8a9f516207795bc6a3f498a9a8d1bd403666e09e","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.31.tgz","fileCount":92,"integrity":"sha512-hQfb/lVYxjv5I9dQsXcdUjk1FUIlrtmGEd9uHFrCKwoeS04BIj4TQvyCSMUKc8pmiEO3c9+laNm4/kioK1mchg==","signatures":[{"sig":"MEQCIDx7vJz3m3kd0IuHRN6tWWEIm8fOYBNOERoXGt83gbeQAiAUJVBpncdDrEg74dkXpCJZiKrNNV9K+lmb92OuWZ2ICA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE/5jtqMWIQbfKD53+Busbg/ubjn8AWYyd8tgrZm1NaGAiA7z4+SvpDIjcsLvvv+ECtcY0LsEOtdgMWHrjnXfYLOcQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.31","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":642779},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"f4beedb2b7276bd69a6621d2dde83d376229b164","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.31_1789833723760_0.36405746479367007","host":"s3://npm-registry-packages-npm-production"}},"0.1.32":{"name":"specguard-mcp","version":"0.1.32","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.32","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"c5755c7b7691b0118d0548996db67f6266156310","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.32.tgz","fileCount":92,"integrity":"sha512-csafrOm9VJa4xCDn/GpomlM8Xj1kTEGCRCZmcY09Bh+ZSwaErlpqNzl3V4p4Iy+RObEJewT01C6w0kRrGq5KcQ==","signatures":[{"sig":"MEUCIAxv7YPtk5sOOBL//7Rb8wFEWPPk0WBAhxKEGwVvUHIAAiEAkVwmrxptjW9HasBPVdWue69h9LR9YLi9SKSR4XG6QGU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHBNh0PRNYGfi/7u9FqST75FBSvOxwdE5Bk/oGmV8HawAiEA1kKyBnEM/ZThXDGCV6acxADbJ3IjcAxabwi7NsIRaRE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.32","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":643465},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"8a3bd0ece321869c042b3a517aa85e205083521a","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.32_1789848102277_0.49257278437748075","host":"s3://npm-registry-packages-npm-production"}},"0.1.33":{"name":"specguard-mcp","version":"0.1.33","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.33","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"73e06978828f5abce508343966407328baa7c84a","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.33.tgz","fileCount":95,"integrity":"sha512-K6RONH8Qkl4+AnslTav9fbSZEs0X3zk9q7bXg0J58eNPYphdr6s3y/HFZ9Rr/MuVyKGTCuBCZVOKCCwZIDwvpw==","signatures":[{"sig":"MEUCIQCRr6ij2Y/QfSzwL3SQoRDwYUt3alLBULrE8QMKY1ROYAIgefh4BSlZDTfmPqLgqwHdgs44KBKbxMomzpUoLJCFlPk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFt4tzljX9QuYn62OIM/LaDNGOMRxkoB8sFnz6Gs/nQWAiEAnuTcvcPyDDszCrUWUd2IWlCFWcF9h+TH3ry/FaFEH8M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.33","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":666049},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"eda505142fbe53c5a6018e00e87e7b3d809a7b0f","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.33_1789987464924_0.3450314571799391","host":"s3://npm-registry-packages-npm-production"}},"0.1.34":{"name":"specguard-mcp","version":"0.1.34","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.34","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"62d43813fcc8481def523bbc077812e779e428e9","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.34.tgz","fileCount":95,"integrity":"sha512-oz87zFk6tGkj4XQWrnja4S974SZGPUqNqC+M4aCKXgON5/Mhki0kI16pZGyZl7YD9ktIECHKgjkcI5XpOZ2PIw==","signatures":[{"sig":"MEYCIQCzo+Vd8CjdAnjukHZ5dH6DgimWVAH9gwbR0rMA6lFpVwIhANsl7pabKzmNUlS4XziurNeZYaY6q46gheucQL/f64jt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCARk8kgVKm9OFpAEJBL3idJjvwqvqUSItz7lPgI6zDkQIgZqk1+I9bnPk/90JtSyUx4/cQAVip+pqb9BtYGBqg9/M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.34","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":677329},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"ea10894403f549de2610e4fac9ffa2a2ad4b2a7f","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.0.2","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.34_1790073812211_0.8030631127960548","host":"s3://npm-registry-packages-npm-production"}},"0.1.35":{"name":"specguard-mcp","version":"0.1.35","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.35","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"34b02cd1ae45f285abf93fc522d5fb5db919e24d","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.35.tgz","fileCount":95,"integrity":"sha512-OjvTkJ2UyR/Q6jCQNdAUvz0Qq/WtWLuLmdJS4Ak3Gv4hMkZpiSLuRgmVJB4hWXXQatD1DnV6mq3Sd6Yy3z3MYQ==","signatures":[{"sig":"MEUCIDToXPEXtKDT8iaiLtTDO2pR/Ex2vEg8hvqz71ykE00aAiEAh0svje1cwEGzhR7xM0bgh+QMwGtHOoSLVybEArCD7rw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDmhAtskLbiWmA75rlP/wpIDQ5EpP9AfmdsAHjXPFX9ZgIgLLGii9a9KT9X0omfI82ledfGNXulFX6oDNIORnxJlj8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.35","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":677546},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"bdde1dd0d1bef076815c0ff02f76e0f9b15f78c6","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.1.0","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.35_1790160171778_0.4876867475980262","host":"s3://npm-registry-packages-npm-production"}},"0.1.36":{"name":"specguard-mcp","version":"0.1.36","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.36","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"fd73e984edc272a47c402f3569bf16e947f62eb1","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.36.tgz","fileCount":95,"integrity":"sha512-kmV8Tyte7OamcQ2zqnKpdXEN1Ju6J2Ltvb27CjUz7GANZfwZB1riRHt2JDWImDEex+Pm0EfNUeOOufIEtDxyDw==","signatures":[{"sig":"MEYCIQCBUQfn4QXHtBhcRUFuxohJIgkqxsuLQJW7X+D/rX+3yAIhAOFntct/ThHJ7AOMiswdNIA71EbkTvNLeHJxzADsD2Zy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICKFOdXKOKnYOKa7UCx2KKsGN7r/M6obykkUiJmJ/xpQAiEA5KLYx7h6u5UMcH5RRR07jIOW7CSnwXnmOFLvWqMuUr4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.36","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":685474},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"16c24e698183d3793b25719a46ff39bbd38fd801","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.1.0","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.36_1790419397136_0.7263245036071473","host":"s3://npm-registry-packages-npm-production"}},"0.1.37":{"name":"specguard-mcp","version":"0.1.37","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"license":"ISC","_id":"specguard-mcp@0.1.37","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"dist":{"shasum":"72c634c21ea30dd0f36fa925cf3dca5611625ee9","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.37.tgz","fileCount":95,"integrity":"sha512-JyvhW2rslgjnRDGQp645nwIfZz7MDyoi9X+cUgL730tUFKt3OgMHzBz2+x1zTvT86Ms54F+Y3F88iSKgfSm4wg==","signatures":[{"sig":"MEUCIDF3GN7yKgPHRd8B47BjVlUXezeL0NrWGC+83mnf+j6zAiEA5t/7P5uj7fjaqODeXNB+xFlggZoJV7/G8om4Zj64TTA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDOcDwUcpLhdCQqNnCcn1tm/pvj2EdjIGxfKdduj27x3AiAxNv14GGZWRmJmPSijeBUnFLgdF1quoJrLxi0i6bBPAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.37","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":688242},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"06e5a712638d428f61e34d1149ba2e4ae411331d","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"273c5e09-dd66-41b5-9820-365ee41020ed"}},"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.2.0","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/specguard-mcp_0.1.37_1790851426674_0.7794281225281685","host":"s3://npm-registry-packages-npm-production"}},"0.1.38":{"_id":"specguard-mcp@0.1.38","bin":{"specguard-mcp":"dist/bin/specguard-mcp.js"},"bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"dist":{"shasum":"6884b15bcf6998d4f87c05f2cf9add4d756984c4","tarball":"https://registry.npmjs.org/specguard-mcp/-/specguard-mcp-0.1.38.tgz","fileCount":95,"integrity":"sha512-4fRDarBIcWnpdyOt/yYbxFcUUVT+xUQDPGk2Fz6rnx639mitnj4DCRsHDH3qOhcofxYEvRh1t2BuezLlOe7Mpg==","signatures":[{"sig":"MEUCIA9vZmgsBN83IPwtO/ZfPCNC5FQjpUQ/E7LvMcAtZYK0AiEAn4cDWhj7gjeweyiS/4B6WDe1ueGnb2H1xAWYUYQ/o0A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCwh5Zy28hed9UiLrjMDelQ/LEvbhcaEpF6ZQkwYO+i/AIhAOcO05ELdjPrZTy2B8QKw1/WJB94w4UVV5wANr+KkHsY"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/specguard-mcp@0.1.38","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":689046},"main":"dist/src/index.js","name":"specguard-mcp","type":"module","types":"dist/src/index.d.ts","engines":{"node":">=20"},"gitHead":"ea3081a18329b9cb5b5e1ed838fab260af5c0dd3","license":"ISC","scripts":{"test":"files=$(find .test-build/test -name '*.test.js'); [ -n \"$files\" ] || { echo 'specguard-mcp: no compiled test files found — did pretest run?'; exit 1; }; node --test $files","build":"tsc --project tsconfig.build.json","prepare":"npm run build","pretest":"rm -rf .test-build && tsc --project tsconfig.test.json","typecheck":"tsc --noEmit"},"version":"0.1.38","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"273c5e09-dd66-41b5-9820-365ee41020ed"}},"homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"_npmVersion":"12.2.0","description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","directories":{},"maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"_nodeVersion":"24.21.0","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.0","@types/node":"^20.19.0","@yatfa/specguard":"^0.1.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/specguard-mcp_0.1.38_1790937797539_0.9479017024473837"}}},"time":{"created":"2026-08-18T09:47:22.338Z","modified":"2026-10-02T10:43:17.970Z","0.1.0":"2026-08-18T09:47:22.715Z","0.1.1":"2026-08-18T18:49:27.129Z","0.1.2":"2026-08-20T01:16:50.526Z","0.1.3":"2026-08-27T20:42:42.790Z","0.1.4":"2026-08-28T15:52:07.738Z","0.1.5":"2026-08-30T04:16:01.037Z","0.1.6":"2026-08-31T12:29:39.853Z","0.1.7":"2026-09-05T17:52:50.696Z","0.1.8":"2026-09-06T16:01:52.563Z","0.1.9":"2026-09-07T14:02:06.009Z","0.1.10":"2026-09-10T00:04:08.929Z","0.1.11":"2026-09-11T14:04:04.585Z","0.1.12":"2026-09-11T16:04:11.922Z","0.1.13":"2026-09-12T08:02:21.778Z","0.1.14":"2026-09-12T16:02:07.710Z","0.1.15":"2026-09-12T20:04:08.421Z","0.1.16":"2026-09-13T04:05:01.409Z","0.1.17":"2026-09-13T10:03:57.078Z","0.1.18":"2026-09-13T14:03:19.051Z","0.1.19":"2026-09-13T20:01:23.139Z","0.1.20":"2026-09-13T22:04:29.128Z","0.1.21":"2026-09-14T16:06:09.181Z","0.1.22":"2026-09-14T22:03:09.627Z","0.1.23":"2026-09-15T10:04:07.027Z","0.1.24":"2026-09-15T22:03:15.775Z","0.1.25":"2026-09-17T04:03:48.905Z","0.1.26":"2026-09-17T06:04:42.156Z","0.1.27":"2026-09-17T22:02:16.401Z","0.1.28":"2026-09-18T12:03:05.543Z","0.1.29":"2026-09-18T20:02:54.741Z","0.1.30":"2026-09-19T10:09:54.577Z","0.1.31":"2026-09-19T16:02:03.864Z","0.1.32":"2026-09-19T20:01:42.358Z","0.1.33":"2026-09-21T10:44:25.065Z","0.1.34":"2026-09-22T10:43:32.309Z","0.1.35":"2026-09-23T10:42:51.880Z","0.1.36":"2026-09-26T10:43:17.287Z","0.1.37":"2026-10-01T10:43:46.754Z","0.1.38":"2026-10-02T10:43:17.669Z"},"bugs":{"url":"https://github.com/yatfa-ai/specguard-mcp/issues"},"license":"ISC","homepage":"https://github.com/yatfa-ai/specguard-mcp#readme","keywords":["mcp","model-context-protocol","specguard","rspec","test-intelligence"],"repository":{"url":"git+https://github.com/yatfa-ai/specguard-mcp.git","type":"git"},"description":"MCP server exposing SpecGuard suite intelligence to AI coding agents","maintainers":[{"name":"yatfa-admin","email":"admin@yatfa.com"}],"readme":"# specguard-mcp\n\n> The MCP bridge to [SpecGuard](https://github.com/yatfa-ai/specguard) — gives an AI agent the suite\n> intelligence behind a very large test suite as tools.\n\n`specguard-mcp` is a [Model Context Protocol](https://modelcontextprotocol.io) server that connects\nan MCP-capable agent (Claude Code, Claude Desktop, …) to SpecGuard, so the agent can ask what a\nsuite covers, what it costs to run and where the gaps are — without a line of HTTP or auth code in\nits prompt.\n\nSpecGuard is built [primarily for AI coding agents](https://github.com/yatfa-ai/specguard); this\nbridge is how an agent reaches it without scraping a web UI.\n\n> **Status: bootstrap.** A small set of tools ships today, each wrapping a capability that already\n> exists — see [The tools](#the-tools) for what is in it. The toolset **grows gradually** — see\n> [Adding a tool](#adding-a-tool). It is not published to npm yet; install from a checkout.\n\n## Install\n\n```bash\ngit clone https://github.com/yatfa-ai/specguard-mcp.git\ncd specguard-mcp && npm install && npm run build\n```\n\nRequires Node.js 20 or newer.\n\n## Configure\n\nNothing is required to *start* the server. Each tool asks for what it needs when it is called, so a\nmissing variable comes back as one readable sentence in a tool result — never as a server that\nrefuses to boot and takes the tools that needed no configuration down with it.\n\n| Variable | Needed by | Default | What it is |\n| --- | --- | --- | --- |\n| `SPECGUARD_ENDPOINT` | `get_repository_overview`, `get_intent_schema`, `get_server_version`, `list_repositories`, `add_repository`, `registrable_repositories` | — | your SpecGuard instance's root URL, **including the scheme** — e.g. `https://specguard.example.com`, or `http://localhost:3000`. A value with no scheme is refused by name (`SPECGUARD_ENDPOINT is not a usable URL: \"sg.example.com\"`) rather than surfacing later as an opaque failure. `SPECGUARD_URL` is accepted as an alias, and is the name every message uses when it is the one you set. A blank value counts as unset, so leaving `SPECGUARD_ENDPOINT` empty in a templated config falls through to `SPECGUARD_URL` instead of suppressing it. `get_server_version` and `get_intent_schema` need only this variable — they send no API key, because the routes they read are unauthenticated by design |\n| `SPECGUARD_API_KEY` | `get_repository_overview`, `near_duplicate_clusters` (default calls) | — | an agent/CI API key (`sgk_…`) issued by that deployment — a **per-repository** key, which is the single repository those tools answer about by default |\n| `SPECGUARD_USER_API_KEY` | `list_repositories` (fallback), `add_repository`, `registrable_repositories`, `remove_repository` (fallback), `create_repository_api_key` (fallback), `revoke_repository_api_key` (fallback), `list_repository_api_keys` (fallback), `list_repository_agent_keys` (fallback), `revoke_repository_agent_key` (fallback), `list_repository_agent_keys_presented_revoked` (fallback), `list_repository_members` (fallback), `add_repository_member` (fallback), `update_repository_member_permissions` (fallback), `remove_repository_member` (fallback), `get_repository_overview` / `near_duplicate_clusters` **with** `repository` (fallback), `rename_repository` | — | a **user** API key (`sgu_…`), minted from that deployment's account page. A different credential from the one above, not a second place to put the same value: SpecGuard decides which of them a request may use from the token's prefix, before it reads anything, and answers `401` for the other one. Set whichever your tools need — both, if you use both |\n| `SPECGUARD_AGENT_API_KEY` | `list_repositories` (preferred), `remove_repository` (preferred), `create_repository_api_key` (preferred), `revoke_repository_api_key` (preferred), `list_repository_api_keys` (preferred), `list_repository_agent_keys` (preferred), `revoke_repository_agent_key` (preferred), `list_repository_agent_keys_presented_revoked` (preferred), `list_repository_members` (preferred), `add_repository_member` (preferred), `update_repository_member_permissions` (preferred), `remove_repository_member` (preferred), `get_repository_overview` / `near_duplicate_clusters` **with** `repository` (preferred) | — | an **agent** API key (`sga_…`), minted from that deployment's account page (Agent keys panel) with an explicit set of repositories and permissions. It speaks for nobody: its reach is exactly the set granted onto it, fixed at mint time, and every read is bounded by that set server-side. This is the credential to give an automated agent — one key, many repositories, none of a person's rights. When it and `SPECGUARD_USER_API_KEY` are both set, every tool that answers either key — `list_repositories`, `remove_repository`, the members tools, the key-lifecycle tools, and `get_repository_overview` / `near_duplicate_clusters` **with** `repository` — uses **this** one, so discovery stays inside the set the other tools can reach |\n| `SPECGUARD_LINT_COMMAND` | `lint_intent_annotations` | `specguard-lint` | the command that runs the linter — the one switch between the Ruby and the JS/TS client. Most Ruby projects need `bundle exec specguard-lint`; a JS/TS project sets `npx -p @yatfa/specguard specguard lint` (and needs the validator backend: a `validate-intent` binary whose path `SPECGUARD_VALIDATE_INTENT` names — today the only way to supply it) |\n| `SPECGUARD_TIMEOUT_MS` | HTTP tools | `30000` | how long a call to SpecGuard may take |\n\n`SPECGUARD_ENDPOINT` and `SPECGUARD_API_KEY` are the same variables\n[`specguard-rspec`](https://github.com/yatfa-ai/specguard-rspec) uses to ship a run, so a repository\nthat already posts telemetry to SpecGuard already has them. `SPECGUARD_USER_API_KEY` is **not** one\nof them — the gem has no notion of a user key — so that one is minted and set here for the first\ntime.\n\nRegister it with your MCP client — for Claude Code:\n\n```json\n{\n  \"mcpServers\": {\n    \"specguard\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/specguard-mcp/dist/bin/specguard-mcp.js\"],\n      \"env\": {\n        \"SPECGUARD_ENDPOINT\": \"https://specguard.example.com\",\n        \"SPECGUARD_API_KEY\": \"sgk_…\",\n        \"SPECGUARD_USER_API_KEY\": \"sgu_…\",\n        \"SPECGUARD_AGENT_API_KEY\": \"sga_…\",\n        \"SPECGUARD_LINT_COMMAND\": \"bundle exec specguard-lint\"\n      }\n    }\n  }\n}\n```\n\n## The tools\n\n### `lint_intent_annotations`\n\nValidates the `@intent:` annotations in a project's test files against the\n[OpenTestIntent](https://github.com/yatfa-ai/open-test-intent) schema, by running that project's own\nlinter with `--json` — `specguard-lint` (Ruby/RSpec, `*_spec.rb`) or `specguard lint` (JS/TS,\n`@yatfa/specguard`; `.ts`/`.tsx`/`.js`/`.jsx`/`.mjs`/`.cjs`). `SPECGUARD_LINT_COMMAND` selects which;\nthe server does not auto-detect it. A JS/TS run needs the validator backend: a `validate-intent` binary\nwhose path `SPECGUARD_VALIDATE_INTENT` names (install it with open-test-intent's `scripts/install.sh`). That variable is\ntoday the only way to supply it — the npm package's auto-resolution is a seam that resolves nothing yet — and without a\nbinary the linter exits `2` and says why (see the specguard-ts README, \"The validate-intent binary\"). Findings come back as data — file, line, failure kind, every violated rule\n— rather than as a prose report to regex.\n\n| argument | |\n| --- | --- |\n| `project_dir` | the project to lint; defaults to the server's working directory. A path that does not exist, or is not a directory, is refused by name — never reported as a missing linter |\n| `paths` | specific test files, relative to `project_dir`; omit to check every spec file outside dependency/build directories. An empty list is an error rather than a synonym for \"everything\", because a run that selected nothing must not come back clean |\n| `changed` | check what the branch changed since the merge base with the default branch — CI's mode; **needs a linter version that ships `--changed`**: the Ruby gem and `@yatfa/specguard` main do, `@yatfa/specguard` 0.1.1 on npm does not (exit `2`, `invalid option: --changed`); untracked spec files count too (no `git add` needed); `--exclude-standard` keeps `.gitignore`d paths out of the untracked leg alone, and a tracked file is never subject to `.gitignore`, so the dependency/build directory fence holds ignored tracked paths out |\n| `base` | diff `changed` against this ref instead |\n\nThe report is the linter's own document, echoed untouched, so its `summary` keys and finding kinds\ndiffer per client — Ruby reports `files`/`annotations`/`failed`; JS/TS reports\n`files`/`annotations`/`malformed`/`unreadable`. Both clients can emit an `unreachable` finding kind (an\nannotation extraction can never claim: stacked, separated, shadowed, or trailing on a group line); JS/TS\nadditionally emits `no-match`, which Ruby folds into `read` — read the report rather than assuming one shape.\n\nNeeds no SpecGuard deployment and no API key. A **missing** annotation is never a failure: adoption\nis gradual by design, so a suite with no annotations lints clean.\n\n**The exit code is a verdict, and the mapping matters.** Either linter exits `0` clean, `1` on a\nmalformed annotation, and `2` when it could not do its job. Exit `1` comes back as a **successful**\ntool call carrying findings — an agent told \"the tool failed\" retries the tool, where an agent handed\na finding fixes the annotation. Only exit `2` is a tool error, and it carries the linter's stderr,\nbecause the gem deliberately emits no document on that path.\n\n### `get_intent_schema`\n\nServes the **OpenTestIntent schema document itself** — the contract an `@intent:` annotation is\nvalidated against — read live from the deployment's own unauthenticated root-level schema mirror,\nwhich hands back the canonical document's bytes verbatim.\n\nCall it **before** writing or editing an annotation. This is the *reference*; `lint_intent_annotations`\nis the *judge*, and a judge can only tell you that something you already wrote is wrong.\n\n**Reading the contract is the only way to learn parts of it.** A refusal names the legal values of a\nfield you got *wrong*, and says nothing at all about a field you *omitted* — so the fastest way to\nlearn the rules from refusals alone is to submit values you believe are invalid. And an **optional**\nproperty can never appear in any refusal: `required` does not name it, and a closed-object check\nonly ever reports the key you did send, so nothing you submit at any value causes the linter to\nmention it. That part of the contract is reachable here and nowhere else in this toolset.\n\nThe answer is an **envelope** that carries the whole document in both shapes, derived from one\nfetched body so they cannot disagree — plus the enforcement identity beside it:\n\n| field | |\n| --- | --- |\n| `structured.schema` | the document **parsed** — the shape to read the field rules and any enumerated values off |\n| `structured.enforced` | the identity the deployment itself serves from its `GET /version`: `schema_sha256`, the digest of the contract it actually enforces, and `schema_origin`, where those bytes come from on the server — or `null` when the deployment could not say |\n| `text` | the served bytes **unchanged** — no re-encoding, no reformatting, so a digest taken over this text matches the canonical document's, which is the mirror's whole promise |\n\n**The end-to-end check is derivable from this one tool.** Take a SHA-256 digest over `text` and\ncompare it with `enforced.schema_sha256`: a **match** means the reference you read is the contract\nthat will judge you; a **mismatch** means the bytes you received are *not* what the deployment\nenforces — do not author annotations against them, and read `enforced.schema_origin` to see which\nhalf of the disagreement is the server's. The tool serves both facts side by side and never\njudges: a mismatch is never refused or warned here, because the judgment is yours.\n\n**`enforced: null` means \"this deployment could not say\"** — its `/version` omits the identity\nkeys (a build predating the identity channel), answers non-2xx, or the identity fetch fails\nentirely — and the document answer still stands in full. It is not the same null as a served\n`schema_sha256: null` *inside* a present `enforced`: that is the deployment's own honest \"I\nenforce from this origin and cannot currently read it\", passed through exactly as served.\n\nNothing in this bridge restates the schema's contents — not here, not in a tool description, not in\na test. The answer *is* the contract; any prose copy of it would be one release behind the document\nthis tool serves, and this repo deliberately vendors no copy of its own.\n\n**A 404 means the deployment predates the mirror route: the endpoint is right and the build is old.**\nThe error text names the endpoint as possibly misconfigured, because a non-contract 404 body names\nno cause — when the other tools work against the same endpoint, read it as *\"the deployment needs\nupgrading\"*, not as a wrong URL. A **2xx** whose body will not parse is reported as a malformed\nmirror instead, naming the route rather than your configuration: the response arrived, so the\nendpoint is not the thing to go and fix.\n\n**Needs no API key of any kind** — both routes it reads (the schema mirror and `GET /version`) are\nunauthenticated by design, because a contract is not a secret — so it works with\n`SPECGUARD_ENDPOINT` alone and sends no `Authorization` header. Takes no arguments.\n\n### `get_repository_overview`\n\nAsks SpecGuard what a repository's suite looks like **without running it** — the cold-start question\nfrom Project Goals. One call returns the latest CI run (spec counts, annotated ratio, wall-clock and\nper-shard cost), where that run spent its time (heaviest files, heaviest directories, slowest\nindividual examples with file and line), which descriptions are repeated across the suite (the\novercoverage ranking — one description carried by many examples, and which files it is spread over),\nwhich areas grew or shrank and which got slower or faster since the previous run on the same branch\n(the per-area comparisons, at both the example-count grain and the runtime grain), the recent run\nhistory, and the branches that have runs. Pass `branch` for two more: which tests fail intermittently\nrather than consistently (the cross-run flakiness ranking) and how the areas moved across the whole\nbranch window rather than between the last two runs.\n\nEverything above is answered about **one repository**, and which one has two spellings. By default\nit is the repository the configured `sgk_…` key resolves to — the key *is* the subject. Pass\n`repository` (the numeric id `list_repositories` reports) and the call goes to the **plural**\nendpoint, `GET /api/v1/repositories/:id`, which answers **either member credential**, whichever is\nset: `SPECGUARD_AGENT_API_KEY` (`sga_…`) — preferred, and the set of repositories granted onto it\nat mint time is the boundary ids are looked up inside (`list_repositories` under the same key lists\nexactly the set that is reachable) — or, when no agent key is set, `SPECGUARD_USER_API_KEY`\n(`sgu_…`), a **person** key whose accessible set is the boundary instead. With both set the agent\nkey wins, so the answer stays inside the set that key can act on. Same overview body, same ladder,\nevery parameter below honoured identically — with one\ndeliberate omission this path owns: `api_key` is **absent** from the plural body rather than nulled,\nbecause that block describes the credential that made the request and no member credential is a\nrepository key (an absent key there is the surface's shape, never a dropped block). Other\nthan that, only the subject moves. That is what makes the *other* repositories visible: an `sgk_`\nkey is one repository\nby design, so a credential holding only that could never ask about a second one. The server owns\nevery refusal on the plural path: a repository outside the presented credential's grant answers\n404, indistinguishable from one that does not exist, person and agent alike. SpecGuard refuses each\ncredential kind in the other's place before it reads anything, so the pairing is not mixable: the\ndefault call wants the `sgk_` key, the `repository` call wants a member key — and a call made with\nthe wrong kind, or with neither member key set, is refused *here*, naming the variable(s) to set,\nbefore any request is made.\n\n| argument | |\n| --- | --- |\n| `repository` | ask about THIS repository (its numeric id from `list_repositories`) under the **agent key** (`SPECGUARD_AGENT_API_KEY`, `sga_…`), or — when no agent key is set — the **user key** (`SPECGUARD_USER_API_KEY`, `sgu_…`), instead of the one the `sgk_…` key resolves to — omit it for the default, `sgk_`-keyed call |\n| `branch` | narrow the run **history** to one branch, for a real growth series — and unlock `unstable_tests` and `directory_growth`, which read the same window |\n| `spec_directory` | open ONE of the heaviest directories and list the spec files inside it |\n| `spec_file` | open ONE of the heaviest spec files and list the individual examples inside it |\n| `repeated_description` | open ONE repeated description and list the examples that all share it |\n| `unstable_test` | open ONE flaky test and list its outcome run by run across the window, newest run first (needs `branch`) |\n| `commit_sha` | anchor the answer on ONE named run instead of the repository's newest one — every run-grain block moves with it, `history` does not |\n| `unannotated_examples` | `true` to list the individual tests carrying no `@intent` — the examples behind the annotated ratio, each labelled with what SpecGuard reads of it — and, in the same answer, which areas carry the most of them |\n\n`branch` narrows `history` only — `latest_run` always names the repository's newest run, which on a\nbusy repo may be on another branch. That is a property of the endpoint, not of this bridge — and\n`commit_sha` is the remedy: it names WHICH RUN to describe, where `branch` asks about a series. Every\nrun-grain block re-anchors together (`latest_run` and its rollups, the four run-grain drill-ins —\n`spec_directory_files`, `spec_file_examples`, `repeated_description_examples`, `unannotated_examples`\n— `shards`, both growth windows, `previous_test_run`); `history` does not, so the\n`history[0] == latest_run` identity holds\non a default call and is **not** expected to hold under an explicit ask. Nor does `unstable_test_runs`,\nwhich is read over the branch window rather than off the anchored run. (`unannotated_directories`,\nbelow, re-anchors too and is *not* a fifth drill-in: this roster carries one representative key per\ndrill-in **parameter**, not one entry per response key — `spec_directory` opens three blocks and only\n`spec_directory_files` is listed, with `directory_run_file_growth` and `directory_runtime_file_growth`\nabsent for the same reason. `unannotated_directories` is a second block of an existing parameter's ask\nand adds no parameter, so it is covered above by *`latest_run` and its rollups* and the roster stays at\nfour.) A sha with no run — a stale\nbookmark, a pruned run, a commit whose CI never reported — does not error: the endpoint\nfalls back to the newest run and says so, so read `run_anchor.resolved` rather than trusting that a\nsuccessful response is about the commit you named.\n\n`branch` is also the gate on the two blocks read over that same window, and they are `null` without\nit: `unstable_tests` (which tests failed intermittently across the window rather than consistently)\nand `directory_growth` (how each area moved between the two **endpoints** of the window). The\nper-area comparisons against the **previous run** — `directory_run_growth` at the example-count\ngrain and `directory_runtime_growth` at the runtime grain — are a different question and take no\nbranch at all: they scope to the latest run's own branch by construction, so a plain unparameterised\ncall already carries them. The two grains are independent, which is why both ship: making an\nexisting spec slow adds zero examples and shows up only in the runtime pair, and splitting one slow\nspec into four fast ones is `+3` examples and *less* time.\n\n`spec_directories` ranks the heaviest areas but stops at the area grain, so it says *where* the time\nwent and not *which files* spent it. `spec_directory` is the next question: pass a path exactly as\nserved in `latest_run.spec_directories.rows[].path` and `latest_run.spec_directory_files` opens with\nthe files in that one directory (`total_seconds`, `recorded_count`, `timed_count` each), plus the\n**area's** own `file_count`/`recorded_count`/`timed_count` and the `limit` the row list was cut at —\nthose totals describe the whole area, not the returned page, so don't re-derive them from `rows`.\nOmit the argument and the key is `null`, meaning *you did not ask*; an area the run recorded nothing\nfor answers `rows: []` rather than an error, so a renamed or deleted directory is an empty result and\nnot a failure.\n\nThat one ask opens **three** blocks, each in its own grain: `latest_run.spec_directory_files` for\nwhich files carry the area's wall clock, `directory_run_file_growth` for which of them changed size\nsince the previous run, and `directory_runtime_file_growth` for which of them changed time. The last\ntwo are the answer to the question the area-grain comparisons dead-end on — `spec/models 412 → 459\n(+47)`, but *which files did that* — so they need no second parameter.\n\n`spec_files` ranks the heaviest files but stops at the file grain, so it says *which files* cost the\nmost and not *which examples* inside them spent it. `spec_file` is the next question: pass a path\nexactly as served in `latest_run.spec_files.rows[].path` and `latest_run.spec_file_examples` opens\nwith up to 50 of that file's individual examples, cut by **duration** (`name`, `file_path`,\n`line_number`, `spec_file_path`, `duration_seconds`, `outcome` each), plus the **file's** own\n`recorded_count`/`timed_count` and the `limit` the row list was cut at — those totals describe the\nwhole file, not the returned page, so don't re-derive them from `rows`. Omit the argument and the\nkey is `null`, meaning *you did not ask*; a path that matched nothing answers `rows: []` rather than\nan error, so a renamed or deleted spec file and a stale bookmark are empty results and not failures.\n\n`repeated_descriptions` ranks the descriptions carried by the most examples — the overcoverage\nranking — but names the description and the files it was seen in, not *which* examples say the same\nthing. `repeated_description` is the next question: pass a description exactly as served in\n`latest_run.repeated_descriptions.rows[].name` and `latest_run.repeated_description_examples` opens\nwith up to 25 of that group's members (the same six fields), plus the **group's** own\n`recorded_count`/`timed_count` and the `limit` the row list was cut at — again totals for the whole\ngroup and not for the returned page. This is the **only** way to reach a group's members:\n`slowest_examples` is the run-wide top ten and rarely contains them, and walking `spec_file` over\neach path in the row's `files_seen` is N unrelated lists each cut by duration, with no guarantee the\ngroup's members survive the cut in any of them. Omit the argument and the key is `null`; a\ndescription that matched nothing answers `rows: []`, so a test renamed since and an edited\ndescription are empty results and not failures.\n\n`unstable_tests` ranks the tests that failed intermittently across the branch window, but a row\ncarries `run_count`, `failed_run_count` and `outcome_words` — and those three figures are\n*identical* for four failures in runs 27–30 and four failures in runs 3, 11, 19 and 26. The first is\na **regression** and the work is to find the commit; the second is genuine **flakiness** and the work\nis quarantine or shared state. `unstable_test` is the next question: pass a description exactly as\nserved in `unstable_tests.rows[].name` and `unstable_tests.unstable_test_runs` opens with that\ndescription's rows run by run in window order, **newest run first**, up to 200 (`test_run_id`,\n`commit_sha`, `branch`, `ingested_at`, `outcome`, `duration_seconds`, `spec_file_path`,\n`line_number` each), plus the **description's** own\n`recorded_count`/`reported_outcome_count`/`unreported_outcome_count`, the window's `run_count` and\nthe `limit` the row list was cut at.\n\nNote the two ways it differs from the drill-ins above. The answer lands **inside** the flakiness\nblock — `unstable_tests.unstable_test_runs`, not under `latest_run.*` — and `branch` is a hard\nprerequisite rather than a suggestion: `unstable_tests` is `null` without it, so `unstable_test` sent\nalone leaves no block to drill into at all, and not an empty `rows: []` either. Omit the argument and\nthe key is `null`; a description the window recorded nothing for answers `rows: []`, so a renamed\ntest — which starts a new history under the project's semantic identity rule — is an empty result and\nnot a failure.\n\n**Mind the direction.** The rows are newest run first: element 0 is the most recent run in the\nwindow, so the run a failure *started* at is the **last** row of the leading failed block, not the\nfirst. Read front-to-back as run 1 onwards and the regression above reads as four failures at the\nstart of the window that have passed since — a fixed flake, the exact inversion of the truth, and\nnothing errors to signal it. The 200-row cap drops the **oldest** rows for the same reason, so a\ntruncated sequence is still the recent runs. Read the run off each row's `commit_sha`/`test_run_id`\nand never off its index: a run that recorded nothing under the description contributes no row, and a\ndescription carried by two examples in one run contributes two, so `rows` is not one entry per run\nand its length is not the window's `run_count`.\n\n`annotated_ratio` is the product's adoption metric and it was the one population on this endpoint\nyou could not walk down: the dashboard printed *\"SpecGuard cannot see the other N tests\"* and could\nnot name one of them either, so an agent told to raise annotation coverage learned how far it had to\ngo and not a single test to annotate. `unannotated_examples` is that rung.\n\n**Unannotated is not the same as unreadable, and the difference is on every response.** A test\ncalled `Invoice#total sums the line items` has an entity, an action and a behavior in its own\ndescription, so SpecGuard reads it whether or not anybody annotated it.\n`latest_run.intent_readings` splits the run's examples into `authored` (an `@intent` a human wrote),\n`derived` (read from the description) and `unreadable` (neither), with the `recorded` population\nthey were counted from — no flag to pass. **`unreadable` is the only figure on this endpoint that\nmeans tests SpecGuard can say nothing about.** `total_specs - annotated_specs` is annotation debt,\nwhich on a suite that has never been annotated is the whole suite and almost all of it readable;\nnever render that subtraction as blindness. A derived reading is genuinely weaker than an authored\none — no preconditions, a behavior written for a test runner's output rather than declared, and a\nlayer inferred from the directory — so report it as inferred and never as equivalent. And\n`authored` never replaces `annotated_ratio`: \"how much of this suite has a human-written intent\" is\nstill that figure, off the run's own counters. It is the one argument\nhere that is a **flag rather than a name** — pass `true`, not a value — because it opens a\n*population* rather than a pick: `total_specs` minus `annotated_specs` is a subtraction, and a\nsubtraction has no line to name. Which population is still yours to choose: sent alone the flag\nopens the whole run, and sent **together with** `spec_file` or `spec_directory` it narrows to that\nfile, that area, or the AND of the two — those two keep opening their own blocks as well, so\nnarrowing this one is additional rather than instead. `latest_run.unannotated_examples` opens with\nup to 100 of the unannotated examples **of whatever you asked for** (`name`, `file_path`,\n`line_number`, `spec_file_path`, `reading` and `derived_intent` each — six fields, and not the\nper-example drill-ins' six: no `duration_seconds` and no `outcome`), plus that\nsame population's own `recorded_count`, `derived_count` and `unreadable_count`, the `limit` the row\nlist was cut at, and\n`spec_file`/`spec_directory` **echoed back** as the server read them — `null` for each one you did\nnot send. Read the echo before the count: the **worklist's** `recorded_count` — and only that one,\nbecause the map below deliberately does not narrow — is the figure you would reconcile against\n`total_specs - annotated_specs`, and it counts the *narrowed* population whenever either echo is\nnon-null, so that reconciliation is expected to hold only when both are `null`. Do not re-derive\nthat count from `rows` either way: un-narrowed, this population is routinely the entire run — a\nrepository that has just installed the gem has every test in it — so the cap fires as the normal\ncase here rather than the exotic one, and a narrowed ask is cut at the same 100.\n\nThat one ask opens **two** blocks, each in its own grain: `latest_run.unannotated_examples` for\n*which tests* to go and annotate, and `latest_run.unannotated_directories` for *where the debt is* —\nthe run's annotation debt rolled up by code area, which is what you pick the next `spec_directory`\nnarrowing **from**. Both come from the one flag; there is no second argument to send and no new\nvalue. Each worklist row carries `reading` — `\"derived\"` or `\"unreadable\"` — and `derived_intent`,\nthe `entity`/`action`/`behavior` SpecGuard got from the description or `null`; the **unreadable rows\ncome first**, so the 100-row cap cannot hide them. The map's rows carry `path`,\n`unannotated_count`, the `recorded_count` that area was counted against, and the same three-way\nsplit — `authored_count`, `derived_count` and `unreadable_count`, which sum to `recorded_count`\nwhile the last two sum to `unannotated_count` (the operands, never a fraction), plus\n`directory_count` — **every** area the run\ntouched, not every area with debt, and not `rows.size` — and its **own** `limit`, which is **10 and\nnot the worklist's 100**. Two caps under one ask, and the difference is the kind of list: 100 caps a\n*worklist* to work through, 10 caps a *ranking* to pick from. The orders differ for the same reason —\nthe worklist is file-navigable within each reading, the map is ranked `unreadable_count` descending,\nthen `unannotated_count` descending, with `path` as a tiebreak only — the areas SpecGuard cannot\nread lead, because a ten-row ranking led by debt on an unannotated suite is a ranking by area size\nand the dark corners never surface. A fully-annotated area is a real **row** with `unannotated_count: 0`, never an\nomission; those rows sort last *collectively*, so on a run with more areas than the cap they are cut\nand never seen, but on a run inside the cap they *are* listed and listed is correct. So `rows.size` is\nnot a count of areas *with* debt — read each row's `unannotated_count`. Both blocks are at run grain,\nso both move with `commit_sha`.\n\n**The two blocks disagree in two places, on purpose — do not reconcile them by arithmetic.**\n*Scope:* `spec_file`/`spec_directory` narrow the **worklist** and its `recorded_count`, and the\n**map stays whole-run** under both. So under a narrowing `unannotated_examples.recorded_count` is\n*not* the sum of `unannotated_directories.rows[].unannotated_count`, and neither figure is wrong:\none counts the area or file you named, the other ranks the whole run. The map is whole-run by design\nbecause it is the thing you choose a narrowing *from* — narrowed to the area you had already picked\nit would answer nothing. The sum is short of the run's total whenever `directory_count > rows.size`\nbesides, narrowing or not. *Null versus empty:* on a run that recorded no per-example rows at all,\nwith the flag sent, `unannotated_examples` is a **present** block with `rows: []` and\n`recorded_count: 0` while `unannotated_directories` is **`null`**. That is a signal rather than an\ninconsistency — `recorded_count: 0` on the worklist means *both* \"fully annotated\" and \"recorded\nnothing\", and the map is how you tell them apart: a present map beside that zero means the zero is\nthe success state, a `null` map means the run recorded nothing and the zero is an absence of data.\n\n`false` means the same as omitting it and sends nothing at all. That matters more here than\nelsewhere: the server reads only whether the parameter was **named**, so `?unannotated_examples=false`\non the wire would open the block for a caller who asked for it not to be — declining is not sending,\nwhich is how every other argument here is declined too. Omit the flag and **both** keys are `null`,\nmeaning you did not ask. A **fully-annotated run is not an error and not a `null`**: the worklist\nanswers 200 with `rows: []` and `recorded_count: 0`, because that is the state the metric exists to\nreach — walk a repository to completion and the block goes empty rather than vanishing. A narrowing\nthat matched nothing reads the same way and is never a 404: an unknown or renamed path, an already\nfully-annotated file, and a contradictory file-and-area pair all answer `rows: []` with both\nnarrowings echoed, which is an empty intersection rather than a dropped parameter.\n\n**Two blocks come back on every response, and they take no argument at all.** They answer what every\nfigure above silently depends on — is SpecGuard still being fed? `delivery_health` is why the data\nmay be **stale**: `refusing` compares stamps rather than reading a live wire — it is true when the\nnewest refusal is newer than the newest *accepted* run, and true when nothing has ever been\naccepted, so a repository refused once and quiet since still answers `true`. Read it with\n`last_rejection_at` and judge recency yourself. Each retained rejection carries the endpoint's own\nreasons and, where the client reported one, the client\nversion that sent it, plus `served_by` — the build of the SpecGuard deployment that refused it,\nstamped on the row at write time. That stamp answers a question the deployment's live version read\ncannot: `get_server_version` reports which build is answering *now*, while retained refusals\noutlive deploys, so for a past row the two routinely disagree — read `served_by` for which build\nrefused *that row*, never the live route. The row's two nulls mean *different* things and must not\nbe read as each other: a null `reported_client` means the client sent no `User-Agent` (the row\nknows, and the client said nothing); a null `served_by` means the row carries no build identity, so\nthe platform cannot name which build answered it — the write path can land on that null in more\nthan one way (for example a row retained from before the stamp existed, a build whose VERSION file\nis missing or unreadable, a column stored blank), so the null says only that no build is named,\nnever which way it got there. The window those rows sit in carries its own **population and client\ncomposition** beside them: `retained_total` counts every rejection the retention window still holds\n(up to `retention_rows` rows) and `retained_clients` splits that total by client, largest bucket\nfirst with alphabetical ties. `retained_total` is the **window's** population, never the length of\nthe `rejections` array beside it — that list is capped at `limit`, and the whole point of serving\nboth is that they differ: a client whose refusals all sit beyond the page is named in\n`retained_clients` and in no `rejections` row, which is how an upgrade-fleet question (\"is it the\nnew gem or the old gem being refused?\") gets answered off this body instead of from the page's\nnewest ten. A null `reported_client` inside `retained_clients` carries the row-level meaning — the\nclient sent no `User-Agent` — and is not the `served_by` null. A `latest_run` from days ago beside a live rejection stream is a suite\nSpecGuard *stopped accepting*, not a suite nobody ran. `credential_health` covers the break that one\nstructurally **cannot** see: a rejected key resolves no repository and writes no rejection row, so an\nauthentication-broken pipeline is invisible to every rejection figure — it names any key that was\n**rotated** and has not authenticated since, a secret some pipeline has not picked up.\nA quiet answer is a **finding, not a gap**: `refusing: false` is \"nothing was refused\" and\n`rotated_and_unused: false` is \"no key is stranded\", and neither means \"SpecGuard does not track\nthat\". Do **not** read `api_key.last_used_at` as evidence anything was *accepted* — it is stamped on\nthe way in, before the payload is looked at, so a repository having every run thrown away still\nreports it seconds ago; the endpoint says so itself in `acceptance_reported_by` and\n`rotation_reported_by`, which name these two blocks. Where a bound sits beside a list, the list is\na **page and not the set**: `limit` next to `rows`, or on that list's `*_window` block, which is\nalso where the *order* the cut was made in is named when the list has one. What announces the cut\nvaries too — `truncated`, `bounded`, `returned` short of `limit`, or a `recorded_count` larger than\nthe rows served — so read the bound beside the list in front of you and never take a full-looking\nranking for the whole set. Where **no** bound sits beside a list, it is everything there was:\n`credential_health.keys` and both `latest_run.shards` lists are complete by construction, which is\na finding and not a disclosure someone forgot.\n\nFigures are `null` where CI did not report them. A `null` means *not measured*; it is never a zero,\nbecause a zero would read as a measurement that was taken. That rule is about nulls and does not\nrun backwards: a non-null figure is not thereby a measurement — a run that reported zero tests\nserves a real `total_specs: 0` beside `suite_size_measured: false`, so it is that boolean, never\nthe nullness, that says whether the row measured a suite.\n\nThree more keys ride **every** response, with no parameter to pass, and together they decide whether\ntwo history rows may be *differenced at all* — which is what the history is for. `suite_size_measured`\nis served on `latest_run` and on every `history[]` row, from the same predicate at both sites so one\nrun cannot disagree with itself: `false` means that run reported **no** tests, so its `total_specs`\nis a *report*, not a measurement — never difference across a row where it is false. `shard_count`\nand `timed_shard_count` ride every `history[]` row and are the two denominators: difference\n`total_specs` only across rows of *equal* `shard_count`, because that count is a sum over the shards\n**recorded**; difference `duration_seconds` only across rows of *equal* `timed_shard_count`, because\nthat figure is a max over the shards that **reported**. Ignore the second and a run whose four\nshards all reported, differenced against a run whose two slowest were cancelled — identical\n`shard_count`, identical `suite_size_measured`, only `timed_shard_count` differing — reads as a 70%\nspeedup produced entirely by telemetry loss. A half-reported run is the **ordinary** state, not an\nexotic one: every sharded run passes through it while its shards are still arriving, and a job\ncancelled after two of four shards leaves a half-sized row in the history permanently.\n\n### `get_server_version`\n\nReports **which build of the SpecGuard deployment is answering**, read from the deployment's own\nunauthenticated root-level `GET /version` — the figure the release bot's `VERSION` file carries,\nserved as a JSON object and passed through verbatim. Since SPGD-1316 the body also carries the\nenforced contract's identity beside the build (`schema_sha256` + `schema_origin`); this tool\npasses the whole answer through without interpreting it — `get_intent_schema` is where the served\ncontract is read beside that identity and the two are compared.\n\n**This is the server's build, not this bridge's.** The version in the initialize handshake's\n`serverInfo` and the `specguard-mcp/<version>` User-Agent describe *this bridge* — a different\ncomponent, released on its own cadence — so never read one as the other. Pinning which build's\ncrafted 404/400 message sentence a contract suite asserts, verifying that a deployment upgrade took\neffect, or naming the build that produced a behavior is *this* tool's question; the handshake cannot\nanswer it.\n\n**`version: null` is an honest answer, not an error.** The deployment is up but cannot say its own\nbuild — its `VERSION` file was missing or unreadable at boot — and the platform serves that\ndeliberately, because an unverifiable identity beats a 500 from the one endpoint whose whole job is\nto be askable. The null is passed through exactly as served, never replaced with a guessed value.\n\n**A 404 means the deployment predates the route: the endpoint is right and the build is old.** The\nerror text names the endpoint as possibly misconfigured, because a non-contract 404 body names no\ncause — when the other tools work against the same endpoint, read that error as *\"the deployment\nneeds upgrading\"*, not as a wrong URL.\n\n**Needs no API key of any kind** — the route is unauthenticated by design — so it works with\n`SPECGUARD_ENDPOINT` alone, and it sends no `Authorization` header (as does `get_intent_schema`, the\nother credential-free read here). Takes no arguments.\n\n### `list_repositories`\n\nLists the SpecGuard repositories this server's key may open — *what can I ask about*, which is the\none question no other tool here can answer. `get_repository_overview` without `repository` takes no\nrepository because its `sgk_…` key **is** the repository, so without this an agent can only report\non a repository somebody already named for it.\n\nThe credential decides which repositories are *in* the answer — a person's own-plus-shared set\nunder an `sgu_…` key, the agent key's mint-time granted set under an `sga_…` one; the three\noptional asks below narrow **within** whichever set answered — never around it. The endpoint has\nserved them since SpecGuard's SPGD-940 (`ef6236d`), composed through the same `RepositoryNarrowing`\nconcern the web grid reads, and this tool forwards them rather than re-deriving them. A repository\nthe credential does not admit never enters the response, so no ask can filter it *in* either. A\nblank value is no ask: passing an empty string and omitting the argument make the identical request.\n\n| argument | |\n| --- | --- |\n| `q` | keep only repositories whose `full_name` (`org/repo`) contains this substring, case-insensitively. A plain substring, not a pattern — the LIKE wildcards `%`/`_` are escaped server-side, so `org/my_repo` matches itself. A match-less ask is an empty list, not an error |\n| `role` | `\"owned\"` or `\"shared\"` — one half of the list's mix: the repositories this person owns, or the ones shared with them. Mind the spelling: the *ask* values are `owned`/`shared`, while each entry's `role` field reads `owner`/`member` — `role: \"owner\"` is not a valid ask and settles to no ask (full list, no error). Under the `sga_…` agent key the ask settles to no ask for every value: ownership is a person fact and the key speaks for nobody, so the full granted list is served |\n| `sort` | `\"stale\"` — re-order stalest-first: repositories CI has never ingested a run for first, then least-recently-ingested, with `full_name` breaking ties so two calls agree element for element. The same entries, a different order; the default order stays `full_name` ascending |\n\nThe body comes back as SpecGuard serves it — `{\"repositories\": […]}`, each entry carrying `id`,\n`full_name`, `name`, `registered_at`, `role`, `delivery_health` and `latest_run`, ordered by\n`full_name` ascending unless `sort` asks otherwise. The identity fields are deliberately the same\nfields, under the same names, that `get_repository_overview` serves in its own `repository` block,\nso a client that reads one reads the other.\n\n`delivery_health` is the entry's delivery verdict — `refusing` beside `last_rejection_at` — served\non **every** entry, so this one call triages ingest-pipeline health across the whole reachable set\ninstead of paying one `get_repository_overview` call per repository. It is the coarse sibling of\nthe overview's fuller per-repository block. A quiet verdict is a finding, not a gap:\n`refusing: false` means nothing was refused, never that delivery is untracked.\n\n`latest_run` is the entry's newest run — when CI last reported, on what branch and commit, how big\nthe suite is, how much of it SpecGuard can read, and the run-level cost scalars. `null` means CI\nhas **never reported** for that repository — never a run that found an empty suite.\n\n`role` has one value per\ncredential kind: under a **user** key (`sgu_…`) it is `owner` or `member` — the list mixes\nrepositories this person owns with repositories somebody shared with them, and nothing else tells\nthem apart — while under an **agent** key (`sga_…`) every entry is `agent`, the value that says the\nownership question does not apply because the key speaks for nobody (branching on owner/member\ncorrectly reads false for both). Read it before assuming a repository is one you may administer.\n\nUnder an **agent** key the top level also carries `credential.capabilities` — the calling key's own\ngrant, read through the server's policy, so an agent key learns what it was granted here instead of\ndiscovering its permissions by hitting refusals; under a **user** key the block is absent, not\n`null` — a person key has no mint-time permission set, and a null would assert one exists and is\nempty.\n\nAn empty list means no access, not an error.\n\n**It reads a different key from `get_repository_overview` — either of two, whichever is set.**\n`SPECGUARD_AGENT_API_KEY` (`sga_…`) when it is set: the answer is then the repository set granted\nonto that key at mint time, the same set every other agent-keyed call answers inside, so discovery\nand reach always agree. `SPECGUARD_USER_API_KEY` (`sgu_…`) when no agent key is set: the answer is\nwhat that person may open. With both set the **agent** key wins. Neither is ever a stand-in for\n`SPECGUARD_API_KEY` (`sgk_…`) — SpecGuard refuses each credential kind in the other's place, the\nprefix deciding which table is consulted before any of them is read — and every message this tool\nproduces names the variable *it* read, so a `401` here never sends you to check a key this tool\nnever used.\n\nRegistering a repository is `add_repository`, below — it reads `SPECGUARD_USER_API_KEY` (an\n`sgu_…` key, which this tool also accepts but does not require) and takes the `full_name` this\ntool reports. Removal and the key lifecycle (`remove_repository`,\n`create_repository_api_key`, `revoke_repository_api_key`) are below too, on the same\neither-credential rule; a tool\nhere is a promise the agent will act on, so each waits for the capability rather than the other way\nround.\n\n### `add_repository`\n\nRegisters a GitHub repository with SpecGuard for the person behind `SPECGUARD_USER_API_KEY`, and\nreturns the repository together with its **first CI API key** — the `sgk_…` key that repository's CI\nwill use to ingest runs, minted in the same call so a fresh registration is usable without a second\ntrip through the browser.\n\n| argument | |\n| --- | --- |\n| `full_name` | the repository to register, as `org/repo` (for example `acme/billing`) — the same handle `list_repositories` reports. Not a URL, not a bare repository name |\n\nThe body comes back as SpecGuard serves it: a `repository` block (`id`, `full_name`, `name`,\n`registered_at` — deliberately the same four fields `get_repository_overview` serves in its own\n`repository` block) and an `api_key` block (`id`, `name`, `token`, `hint`, `created_at`). `id` is\nthe key's durable handle (the token is reveal-once); every **other** key's id comes from\n`list_repository_api_keys`.\n\n> ⚠️ **`api_key.token` is shown once and never again.** Nothing stores it and no endpoint can\n> re-serve it. Capture it from this response — an agent should hand it straight to the person it is\n> working for. A key that is lost is replaced from SpecGuard's API-keys page in a browser, not from\n> here.\n\n> ⚠️ **This tool is not idempotent, and it writes.** If the call exceeds `SPECGUARD_TIMEOUT_MS` the\n> bridge gives up, but the registration may still have succeeded on the server — taking its one-time\n> token into a response nobody received. The retry is then refused with `has already been taken`,\n> which is the honest answer rather than a bug. Do not retry a timeout blindly; check\n> `list_repositories`, and recover the key in the browser.\n\n**It needs a current record of your GitHub permissions, and only a browser creates one.** SpecGuard\ndecides whether you may register a repository from a stored grant, and fails closed when that grant\nis missing or stale — which is every person who has not signed in and connected GitHub recently. That\nrefusal arrives as SpecGuard's own sentence, verbatim, naming the fix: *sign in to SpecGuard in a\nbrowser and reconnect GitHub, then try again*. No argument to this tool substitutes for it. The same\npath carries the other refusals — a repository the SpecGuard GitHub App is not installed on, one you\ndo not administer, one already registered.\n\n**The `org/repo` format is not re-checked here.** This bridge verifies only that you passed a\nnon-blank string; SpecGuard validates the name and refuses an unusable one in its own words. A second\nformat rule on this side would be free to drift from the one that actually decides, and would surface\nas this bridge rejecting a name the platform would have accepted.\n\nIt reads `SPECGUARD_USER_API_KEY` (`sgu_…`) — a **person** key, which `list_repositories` also\naccepts but does not require — and a different one from the `sgk_…` key `get_repository_overview`\nuses.\n\n### `registrable_repositories`\n\nLists the GitHub repositories the person behind `SPECGUARD_USER_API_KEY` **could** register with\nSpecGuard — the set the registration gate would consult, read out loud in advance, so an agent can\npick a `full_name` for `add_repository` from a real answer rather than by guessing. `list_repositories`\nreports what *is* registered; this reports what could be, and the two answer different questions.\n\nThe body comes back as SpecGuard serves it: `{\"repositories\": […]}` with each entry carrying\n`full_name` and `registered`, ordered by `full_name` ascending, plus a `grant` block (`captured_at`,\n`expires_at`, `stale`) describing the stored record of this person's GitHub permissions.\n\n**`registered` is asked globally, not just of your own repositories.** An entry marked\n`registered: true` was registered by *somebody* — possibly someone else — and a POST naming it will\nbe refused with `has already been taken`. That is exactly why entries are *marked* rather than\nexcluded: a reading scoped to what you can open would send you at a name nobody can register.\n\n**A name appearing here is not a promise the write will succeed.** This is the set the gate would\nconsult at the moment of the read; the repository may be registered by someone else between this\ncall and your POST.\n\n**A missing or stale grant is not an error — it is the modal first answer.** SpecGuard fails closed\nwhen it has no current record of your GitHub permissions, which is every person who has not opened\nSpecGuard in a browser recently. The call then answers `403` with SpecGuard's own sentence naming\nthe fix: *sign in to SpecGuard in a browser and reconnect GitHub, then try again*. On that refusal\nthe body still carries `grant`, and it distinguishes the two cases: `grant: null` means there never\nwas one (first-time setup), a populated grant with `stale: true` means an existing connection lapsed\n— same remedy, very different urgency. Read it before telling the person what to do.\n\n**This tool takes no arguments** — the credential is the whole of the scope. The endpoint takes no\nparameters; which repositories are in the answer is decided by SpecGuard from the person the key\nspeaks for.\n\nIt reads `SPECGUARD_USER_API_KEY` (`sgu_…`) — the same **person** key `add_repository` reads, and\na different one from the `sgk_…` key `get_repository_overview` uses; `list_repositories` also\naccepts that key but does not require it (its agent key wins when both are set).\n\n### `near_duplicate_clusters`\n\nRuns SpecGuard's near-duplicate census over a repository's tests — which tests *read alike* (same\nbody text, whatever file they sit in), clustered by similarity. Answers the refactoring question\nthe overview's per-run rankings cannot: where the same test is written twice, before you delete or\nmerge anything.\n\n**This call is served stored** (SPGD-1474): the platform computes the census once per write that\nmoves its inputs — at each ingest, after identity resolution settles the run's identities, and\nagain when a run is deleted from the repository (which can move the run the weight figures are\nweighed on) — and keeps it — so the answer returns in\nmilliseconds instead of running the minutes-scale computation that used to sit behind the ask and\nnever fit this bridge's 30-second deadline. The opt-in ask is unchanged wire contract\n(`?near_duplicates=`, shipped by SPGD-703, still opens the block; the plain overview still answers\n`near_duplicates: null` without it, and `get_repository_overview` never sends the ask). Calling\nthis tool **is** the ask.\n\nNothing about the **census** is choosable — the clusters are the repository's, computed over\nevery run; one call returns them all. (The server reads only that the `near_duplicates` key is\n*present* — `=false` would open it too — so there is no value for the ask to carry.) Which\n**repository** is censused is the one choice there is:\n\n| argument | |\n| --- | --- |\n| `repository` | census THIS repository (its numeric id from `list_repositories`) under the **agent key** (`SPECGUARD_AGENT_API_KEY`, `sga_…`), or — when no agent key is set — the **user key** (`SPECGUARD_USER_API_KEY`, `sgu_…`), instead of the one the `sgk_…` key resolves to — omit it for the default, `sgk_`-keyed census |\n\nThe credential changes with `repository`, exactly as on `get_repository_overview`: the plural\nendpoint answers **either member credential**, whichever is set — the agent key preferred (its\nmint-time granted repository set is the boundary the id is looked up inside), the user key when no\nagent key is set (its accessible set is the boundary instead), the agent key winning when both are\npresent — and the credential kinds refuse each other's tokens, so a\n`repository` ask with neither member key set is refused *here*, naming both variables, before any\nrequest is made. A repository outside the presented credential's grant answers 404 at the server,\nperson and agent alike.\n\nRead the response with its own rules in mind:\n\n- `similarity_floor` and `similarity_basis` sit **first** in the block and qualify every figure\n  below them — a cluster count without what \"similar\" meant is a count you cannot act on.\n- `computed_at` is when the stored census was taken and `weighed_run_id` is the run its weight\n  figures are from — read the stamp before acting on the figures. A census read shortly after an\n  ingest **or a run deletion** may be the **previous** artifact, carrying its own stamp, while the\n  recompute for the new state is still running; a `near_duplicates` block of `null` on this tool\n  means no census has\n  been computed for the repository yet (never a live computation, never zeros).\n- `member_count` (texts in the repository, across every run) and `example_count` (examples in the\n  one run `weighed_run_id` names) are **different grains**: a three-example table-driven loop is\n  one member and three examples. Never fold them.\n- `truncated: true` means the `clusters` list was cut at the cap while the counts above it\n  (`cluster_count`, `identity_count`, `clustered_*`) describe the whole census.\n- `unobserved_members: true` on a cluster says a member identity the weighed run did not observe\n  (deleted, renamed, deselected) is still listed — do not reconcile the member list against that\n  run's examples.\n- `similarity_range` is `[strongest, weakest]`: membership is transitive, similarity is not.\n- `total_seconds` is `null` where nothing was timed — never a zero that would read as free.\n- `layer_source` at the head of the block states where the layer dimension comes from: **declared\n  via the intent protocol** when at least one clustered member's examples declared a layer, `null`\n  on a suite that declared nothing — absence stated, never an empty fiction. The layers are\n  DECLARED, never inferred: no path or directory convention is consulted anywhere in the cut (a\n  `request`-declared test under `spec/models/` reports `request`).\n- `layer_redundancy` classifies each cluster: `cross_layer` when its members declared two or more\n  DISTINCT layers (the same behaviour covered on several levels — the test-pyramid question),\n  `same_layer` when confined to one (a plain duplicate), `null` when its members declared nothing\n  — neither state, never folded into `same_layer`.\n- `layer_groups` holds the members grouped by declared layer (alphabetically, the undeclared LAST\n  as the `layer: null` group), each group's members in the same five-field shape the flat list\n  serves. A member whose own examples declared two layers appears in EACH group it declared, so\n  the groups' sizes can exceed `member_count` by exactly those members — that is the finding, not\n  an arithmetic bug — and a member that declared nothing stays in its cluster's null group, never\n  dropped.\n- `clusters: []` with a real `identity_count` is the **success** state (nothing reads alike); the\n  three silences — nothing ingested, nothing embedded, nothing alike — are kept distinguishable by\n  `recorded_count` / `identity_count` / the list itself.\n\nWithout `repository`, same credential and endpoint as `get_repository_overview`'s default\n(`sgk_…` repository key on `GET /api/v1/repository`); the response is that body with the\n`near_duplicates` block opened, passed through unmodified. With `repository`, the plural endpoint\nanswers either member credential, exactly as on `get_repository_overview` — and carries that\npath's one deliberate omission: `api_key` is **absent** from the plural body rather than nulled,\nbecause the block describes the credential that made the request and no member credential is a\nrepository key (an absent key there is the surface's shape, never a dropped block).\n\n### `remove_repository`\n\nRemoves a repository from SpecGuard — and with it **every key, run and intent on it**. This is the\ndestructive gesture in this toolset: irreversible, no undo, and a `204` means the repository and its\nhistory are gone short of re-registering from scratch. Confirm with the user before calling.\n\n| argument | |\n| --- | --- |\n| `repository_id` | the repository to remove — its numeric `id`, as `add_repository` returns and `list_repositories` reports, not the `org/repo` handle |\n\nAuthorization is the `repo.delete` capability at **either surface** — an owner, or a member granted\n`repo.delete`, may remove the repository. A member without it is refused `403` with SpecGuard's own\nsentence, verbatim. The repository's CI keys stop authenticating the moment it succeeds.\n\nIt reads either of two credentials, whichever is set — and a different one from the `sgk_…` key\n`get_repository_overview` uses. `SPECGUARD_AGENT_API_KEY` (`sga_…`) when it is set: the call then\nreaches only the repositories granted onto that key at mint time, and only where the grant carries\n`repo.delete` — a repository outside that set is answered `404` in SpecGuard's own words.\n`SPECGUARD_USER_API_KEY` (`sgu_…`) when no agent key is set: the same **person** key `add_repository`\nreads. With both set the **agent** key wins, so the removal answers inside the same set\n`list_repositories` reports.\n\n### `create_repository_api_key`\n\nMints a new CI API key (`sgk_…`) for a SpecGuard repository, returning the new key **alone** in\nan `api_key` block — the repository's full key set (keys minted in the web panel or in an\nearlier session included) is `list_repository_api_keys`' answer, never this response's.\nMinting does not disturb existing keys — each key on a repository authenticates independently\nuntil revoked.\n\n| argument | |\n| --- | --- |\n| `repository_id` | the repository to mint the key for — its numeric `id`, as `add_repository` returns and `list_repositories` reports, not the `org/repo` handle |\n| `name` | an optional label for the key; omit it to let SpecGuard use its default name |\n\nThe body comes back as SpecGuard serves it: an `api_key` block (`id`, `name`, `token`, `hint`,\n`created_at`) — the same shape `add_repository` serves. `id` is the key's durable handle (the\ntoken is reveal-once); every **other** key's id comes from `list_repository_api_keys`.\n\n> ⚠️ **`api_key.token` is shown once and never again.** Nothing stores it and no endpoint can\n> re-serve it. Hand it to the person you are working for in your reply. If it is dropped, the\n> recovery is minting another key with this same tool — the platform has no regenerate — then\n> revoking the orphaned one with `revoke_repository_api_key`.\n\nAuthorization is the `keys_manage` capability; a member without it is refused `403` with SpecGuard's\nown sentence, verbatim.\n\nIt reads either of two credentials, whichever is set — and a different one from the `sgk_…` key\n`get_repository_overview` uses. `SPECGUARD_AGENT_API_KEY` (`sga_…`) when it is set: the call then\nreaches only the repositories granted onto that key at mint time, and only where the grant carries\n`keys.manage` — a repository outside that set is answered `404` in SpecGuard's own words.\n`SPECGUARD_USER_API_KEY` (`sgu_…`) when no agent key is set: the same **person** key `add_repository`\nreads. With both set the **agent** key wins, so the mint answers inside the same set\n`list_repositories` reports. Minting under the agent credential attributes the new key to the agent\nkey's **owner** (the server's `attributed_user` rule), so minted-key counts keep naming a person\nrather than nobody.\n\n### `list_repository_api_keys`\n\nLists a SpecGuard repository's CI API keys (`sgk_…` keys) — every row of the repository's own key\nset, **live and revoked alike** (unlike the `sga_` listing `list_repository_agent_keys`, which\nserves live rows only). One row per key: `id`, `name`, `token_hint`, `created_at`, `created_by`,\n`last_used_at` — `null` meaning the key has never presented, the negative served rather than\nomitted — `rotated_at`, and `rotated_and_unused` (live-scoped: the stranded shape\n`get_repository_overview`'s `credential_health` reports, at row grain). `status` is\n`live`/`revoked`, with `revoked_at` present only on revoked rows — a revoked `sgk_` row is not a\ncredential either, but the rotation's story lives in the population.\n\n| argument | |\n| --- | --- |\n| `repository_id` | the repository whose API keys to list — its numeric `id`, as `add_repository` returns and `list_repositories` reports, not the `org/repo` handle |\n\n**This is the verify step of the mint-and-replace rotation.** After minting a replacement with\n`create_repository_api_key` and deploying it, list here and check the replacement's\n`last_used_at` BEFORE revoking the old key — `null` means the new token has not presented itself\nyet, and cutting the old key then locks the repository's CI out until a human mints in a browser.\nNeither the mint response (point-in-time by construction: it describes only the key it just made)\nnor `credential_health` (findings only — a never-presented replacement is neither stranded nor\npresented-revoked) can answer this.\n\n**This is the id source for every row this session did not mint.** The mint response carries the\nid of the key IT minted, in its `api_key` block (SPGD-993); a key minted in the web panel, or in\nan earlier session, has no other bridge-learnable id — list here to name a `key_id` for\n`revoke_repository_api_key`.\n\n`token_hint` is a hint, never the token — the plaintext existed for exactly one response at mint\ntime and nothing persisted it. There is no regenerate: rotation is mint-and-replace\n(`create_repository_api_key` → deploy → verify here → `revoke_repository_api_key`).\n\nIt reads either of two credentials, whichever is set — and a different one from the `sgk_…` key\n`get_repository_overview` uses. `SPECGUARD_AGENT_API_KEY` (`sga_…`) when it is set: the call then\nreaches only the repositories granted onto that key at mint time, and only where the grant carries\n`keys.manage` — a repository outside that set is answered `404` in SpecGuard's own words.\n`SPECGUARD_USER_API_KEY` (`sgu_…`) when no agent key is set: the same **person** key\n`add_repository` reads. With both set the **agent** key wins, so the listing answers inside the\nsame set `list_repositories` reports.\n\n### `revoke_repository_api_key`\n\nRevokes one CI API key on a SpecGuard repository. The key stops authenticating immediately; every\n**other** key on the repository keeps working, so CI keeps ingesting if it holds a surviving key.\n\n| argument | |\n| --- | --- |\n| `repository_id` | the repository the key belongs to — its numeric `id`, as `add_repository` returns and `list_repositories` reports, not the `org/repo` handle |\n| `key_id` | the id of the key to revoke — the mint response carries the id of the key it minted in its `api_key` block (`create_repository_api_key`, or `add_repository` for the registration key); every **othe","readmeFilename":"README.md"}