{"_id":"pinnedai","_rev":"38-77868be7e0ace3f9f0309f46fe5c3882","name":"pinnedai","dist-tags":{"beta":"0.5.0-beta.8","latest":"0.6.2"},"versions":{"0.0.1":{"name":"pinnedai","version":"0.0.1","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.0.1","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/mzon7/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"630ee25b6e74fd9af2ea13086327ef4c6e420033","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.0.1.tgz","fileCount":2,"integrity":"sha512-2QB1MZCvSSjr8PmUsGpJ3x+5qFS99mOhD4lJ1HocTMUtcwcf0a85U43qK/GdoIXL3NY89AvKoHEM/7G4gUolYQ==","signatures":[{"sig":"MEYCIQCADqyrbEkrFqzqemMkm7j1PXg2cr3X9mw8ZS+eOfkbyAIhAOkq7E9/jYPcNtnZ+85fKnpoYif7QgH2EUPB8QhNtUtn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3755},"type":"module","engines":{"node":">=20"},"gitHead":"ccacb4dc23fac92d91d92d7f33906788d1ff10a9","scripts":{"dev":"tsx src/cli.ts","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/mzon7/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Pin PR description claims as permanent CI tests. AI agents write PRs that claim to do things — Pinned makes them prove it. Future regressions break CI with a back-reference to the original PR.","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"^12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.0.0","typescript":"^5.6.3","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.0.1_1779163964127_0.007383874563613446","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"pinnedai","version":"0.1.0","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.1.0","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"78e0314ec4a68bd7c4dd8c3ba5a5f0102655492a","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.1.0.tgz","fileCount":28,"integrity":"sha512-y5G458e/gJ4aQBMSck2TG/qIPxfApjhe96VWSgF3BdUp2d5geK8rYGE3eHlRf/7HiKW+97/GfjFBKDNrHRm6rw==","signatures":[{"sig":"MEUCIQCxC2fYEBP0J8pwm7yvfsAzwIHxMve/LJPWjRIQFfjRfQIgcxYEgA3+Nm3ThxxLLeDf8Nn1dIk2Bt9tNR9TI3yiFOI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":794237},"type":"module","engines":{"node":">=20"},"gitHead":"894446b706b13412c6a0cf7bc6a9ef42b67d0fef","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.1.0_1779855024886_0.30061932639951916","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"pinnedai","version":"0.1.1","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.1.1","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"2d37a8b08f3948b20cf25a3e92db9dd56d5b5246","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.1.1.tgz","fileCount":28,"integrity":"sha512-smOISo2GnX7Y3eFYzdk9wmqqbwp4QK88kfh8tD6hSCrRJuSNghZykJrQyEawJtpCIErl9hxGJEOI/aCyP86tBw==","signatures":[{"sig":"MEYCIQCyR+PNX60ILH/8ovYPOhelZlua1WcA7gU5iXpPGuJdiwIhAKHNb4wqtp2xUeYHhg+mO13qp9v/9m+5/4OSt5volBds","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":820060},"type":"module","engines":{"node":">=20"},"gitHead":"762152133697a6f13c6a7e7356487a616cedaaae","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.1.1_1780369496046_0.8587575670339853","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"pinnedai","version":"0.1.2","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.1.2","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"e97680bfd57d30679262d68aae5889124c9dfbca","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.1.2.tgz","fileCount":28,"integrity":"sha512-dbVOX2alhDw6/f/mxhJ5xYTQgPGaZUVsxjELzey4kRSIJjVvO1mk5UvJRfqafVutW6F2V44vqvfVhtLHMVYATg==","signatures":[{"sig":"MEYCIQD1kkVvNjGaWz6Of0hswMmsXfn+kGZkerW5AIBxyLEMfgIhAK710LVUVroEcXebZLRFEmFZ/j8cvVMOWF1lCNgq2VsK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":823845},"type":"module","engines":{"node":">=20"},"gitHead":"8fa43fc850a20dba475ba7f76af4c58fb60c5c90","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.1.2_1780371104176_0.8167560101572213","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"pinnedai","version":"0.2.0","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.0","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"536683164d969978294605a72aee4885284ebae2","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.0.tgz","fileCount":28,"integrity":"sha512-f3ouYN2cA2FFspaLIAgm1s0O3uoPqwKUMBOp0sY3JXECI6t0/sV+mP9tRuv9cyn6K0WkaBdPf1nOUZE1Vols/g==","signatures":[{"sig":"MEUCIQC6HSaNbMsxehNp/jypJoxfmDsdb2Z8K9bkGwYm25Z2DwIgaqvyPfBTBOwiB917eewrKWc05EaCKE/XEJ6lbXZcMak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":858218},"type":"module","engines":{"node":">=20"},"gitHead":"fcad11677188a7edbbd92406330755ddde9ca2a6","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.0_1780384617444_0.7791311751223482","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"pinnedai","version":"0.2.1","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.1","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"84e960241100a2397b825b28a433793eb3c14dfa","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.1.tgz","fileCount":28,"integrity":"sha512-w+EbOU3drTdRLAGVouSgR1xhdKj+JN45O7UOCSnqKNb6NJ+yRunwcGEB64PWoxTERf9uiaiay6H8kacIPgCvdw==","signatures":[{"sig":"MEQCIECuIwfabK4/2HY9caXxSpfssuWDgA1eyEVAB6/hmb4rAiBBq44bRMBLHmA8t6fujBbY/9WI3QvYJQZfo43uZB4azg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":864710},"type":"module","engines":{"node":">=20"},"gitHead":"fcad11677188a7edbbd92406330755ddde9ca2a6","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.1_1780385452669_0.22638714584102315","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"pinnedai","version":"0.2.2","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.2","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"531bb6c3b0759b17eccfe19978a0cb85fafa81ba","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.2.tgz","fileCount":28,"integrity":"sha512-lf8qV+3Vaf6/4+g2N/9mVoFVKjqP0sXVq+E3o/hYdzYibYNs3BUgNcPH04UmsPCf6O5zy6smhnxTvQCu8hSEEw==","signatures":[{"sig":"MEUCIQCCUI5rYnPmyu1Aw7TuicnqwLtlQjMYQu38+poHbVkxzwIgB5K8b+49QPIaO2F4sGR/LvM4uNJQrGamfgRAS/s12Hg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":867406},"type":"module","engines":{"node":">=20"},"gitHead":"96ff776dfeeff459bb8c87944086d88444cae7f0","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.2_1780385937989_0.32468906410760456","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"pinnedai","version":"0.2.3","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.3","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"7163ddc0bf028df6804fc39582493051cdba7b28","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.3.tgz","fileCount":28,"integrity":"sha512-sTXrWIYxJjXWhlqTbnxQCUdGjWybJY01u6cDg79CizScQBxbo5dsT4049lTkjbGMKRD1ZB07vcO2s0Bd6XL2lQ==","signatures":[{"sig":"MEQCIHSyf3CwtdSKbv4FDsJWghNE5aU8U96MCOMOaZXs44pEAiAdV9/iXwpXJJnTLztA4DBb97ksxzy74FCtdjJMf/aWlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":868532},"type":"module","engines":{"node":">=20"},"gitHead":"96ff776dfeeff459bb8c87944086d88444cae7f0","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.3_1780386251066_0.5841144981343123","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"pinnedai","version":"0.2.4","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.4","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"8679872fea0509371ef625deedf313d7c22d7dc5","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.4.tgz","fileCount":28,"integrity":"sha512-bz9o9lyt/0Wo255xoDe/NBeW9lKm014YDrJBuhwXWcT7oMhbye0ivpQxTp3PqyS8W+CI28p7Al3clMaYbZRsHQ==","signatures":[{"sig":"MEYCIQCdF6NGjk4c6yuKDXRb8K00sGcBW/XlgJGxcRkS2S7XZAIhAILXaF+JmxQx1PwkgITyK4LGSkPzVjOwPm7I9mRrH5NT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":870913},"type":"module","engines":{"node":">=20"},"gitHead":"96ff776dfeeff459bb8c87944086d88444cae7f0","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.4_1780387230250_0.24610748231107782","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"pinnedai","version":"0.2.5","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.5","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"9eb0469e4b753b72dd269713b6a0d7ed932468a9","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.5.tgz","fileCount":28,"integrity":"sha512-1y3z+qPkVldAbOzNMUO340YsGKhDsCaFSBp8C5W67h+shRWYcV0UY8inaKyWMRTieDDBWN2d9ghOEmpHw+jO7Q==","signatures":[{"sig":"MEUCIQDdY7PKhD9XvceCiZZ8ON7bQNqZJS75IJLRasR8vxSh2gIgbmA6zZUSj/7ZLuRx4wzaRelMHKU9MB4reNuFG6kpSYQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":873742},"type":"module","engines":{"node":">=20"},"gitHead":"96ff776dfeeff459bb8c87944086d88444cae7f0","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.5_1780387841708_0.2067284876115123","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"pinnedai","version":"0.2.6","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.6","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"870c576061eadea482a5bc3ba1e104bf5c41e433","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.6.tgz","fileCount":28,"integrity":"sha512-z8nCNnWpZ6IcwImlBa2XqksYuXvU2mKdKAak6JG01vzsArXIaAjtnmurLNecGrDtqdnieJjYszyWGzLGVSmcAg==","signatures":[{"sig":"MEUCIQD8DhgETKzIIMZ8WShUuKyByxPzmPL9EcuOfLGcVq/elwIgBb6jaBb5nc/7O4ftEDKHFhJGPaq/BwqcFVFlRnSwNDk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":879613},"type":"module","engines":{"node":">=20"},"gitHead":"c242782994b4396cb211e304d2efacc73a107268","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.6_1780388153476_0.18603633091571714","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"pinnedai","version":"0.2.7","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.7","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"2d8357d6b022efe33fbd8cb1e666d89768c67d0d","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.7.tgz","fileCount":28,"integrity":"sha512-anauZKo0YzytbngAV2QzkrgVvzISlqgrnHbAOYohq4DALxPACq1m1R22rNm/bVevURHQ3fYlNyvDDShyNJ19ww==","signatures":[{"sig":"MEQCIBCxZowBeXFpmYhDkvXH6JIyXTDPxxqEjyqDi3TqQKvLAiArq3faLGaYZBNksM0lAr+aOqOiYbZmgmO8S2i9l3ULhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":929599},"type":"module","engines":{"node":">=20"},"gitHead":"ba8bceb87dd598751c91e1e1840f4b435bf73095","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.7_1780392273548_0.01176855637219254","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"pinnedai","version":"0.2.8","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.8","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"1a01dd24847bd44a7f5ba4c936640795d996510d","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.8.tgz","fileCount":28,"integrity":"sha512-OY0yxHFqYksfh7wf6sYi7d6r21UBdPD/ClkdygycB6LCcqV6LEKxw7XaR5Hmu7lAC3jEcU+sB5Dym2jeDr/tNQ==","signatures":[{"sig":"MEUCIHCgkPyNaPtMBExaZOmmSnxipJL9V7/XiJ7FjjNJjEO0AiEArMeFnDG2i9ZMpNjpofcqg3l9STo9OUSoqPPN85SUnmg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":946329},"type":"module","engines":{"node":">=20"},"gitHead":"e44b452cf7509185b172ff53a9487b51271540a7","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.8_1780403477393_0.3414980396824119","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"pinnedai","version":"0.2.9","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.9","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"895758ecf91dce90f47eeffc21a465b8af9e7a57","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.9.tgz","fileCount":28,"integrity":"sha512-Bvzp6wz4p5Y6FRcqIP3Fy4XHjBPYsKxG+0KvjKHWqWI10J4Zz1HAZR+Btxa2ATM0dL7mczT1tx2FxLrFMSQxqg==","signatures":[{"sig":"MEUCIAFRvzG4hAoTiaaZn769bIGkxTWYGHhiQV+MnxuCFs7bAiEA0tUWGF+P+5vxr7pRtD+BUfaVYVohQSt/ssBBnRRv8Ak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":954337},"type":"module","engines":{"node":">=20"},"gitHead":"e44b452cf7509185b172ff53a9487b51271540a7","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.9_1780405099117_0.5117075806604894","host":"s3://npm-registry-packages-npm-production"}},"0.2.10":{"name":"pinnedai","version":"0.2.10","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.10","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"5a70e4fa31f7d6580796ca9ec9eecb52504ef1fa","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.10.tgz","fileCount":28,"integrity":"sha512-6FOCAtHLYqgAZvnF9GcFeuvyLWNfRcw7BQldya2Epo973hX5+mI2l+uP0aQEz21Ofs7WFAYVzdJ4RLhArc/JkA==","signatures":[{"sig":"MEUCID7tiUUChV49XK8R6svo92lGvsBouaeLBjBpFSVe303hAiEAxo6CY5u4QTLsRkddBwC6fz8E7VxJQyucz+k8yTV/k3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":960394},"type":"module","engines":{"node":">=20"},"gitHead":"eeaef3fea1700f3c503eb2442e9884dad12668c1","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.10_1780408428641_0.038364490104317195","host":"s3://npm-registry-packages-npm-production"}},"0.2.11":{"name":"pinnedai","version":"0.2.11","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.11","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"689e758953f3f479931b1b9344f6b36807939ecf","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.11.tgz","fileCount":28,"integrity":"sha512-pzAJx27RCd9bZ11r4OdsQ9Yf+PiJwcwdq5bHl5zPq+uCRl6LT4GzG58AS/h4NSVqKhzmLJc9UrBEsCXlEVUH0A==","signatures":[{"sig":"MEUCIFTorr6BKdGSMcnKGFxOqe1/JN36vJyD/T4e/Joll4Y+AiEAiARgc5AhFYOPB4fvjCyCUt1hngIjm7dFU4qFThjPKsg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":967586},"type":"module","engines":{"node":">=20"},"gitHead":"3f6ce868b4bd08439155801c2921f70015f3aa4c","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.11_1780409437036_0.9286900513001404","host":"s3://npm-registry-packages-npm-production"}},"0.2.12":{"name":"pinnedai","version":"0.2.12","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.12","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"69f72c945e9f533db8bf03d6ba191e846330d946","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.12.tgz","fileCount":28,"integrity":"sha512-Zgq9ahO2zG5eES2fVrTz7ggo/3UkK7MLOQF+JMpCN3YW6GANcCaKbhz3iZ47zScDx8RLxwF3Mm3QMuusCqn/wQ==","signatures":[{"sig":"MEQCIH8goD8xI8k1TRE+k1d4wqqZ+4gHsfdCBM1RnnRiOBbpAiAGDK+S18Wear3z29i4W4YP+25I2b43XgxTlKxxh41pqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1009226},"type":"module","engines":{"node":">=20"},"gitHead":"3f6ce868b4bd08439155801c2921f70015f3aa4c","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.12_1780441584421_0.9879974710327504","host":"s3://npm-registry-packages-npm-production"}},"0.2.13":{"name":"pinnedai","version":"0.2.13","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.13","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"9077cb95c0f4b2cda24dd915c142c9c18b67d128","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.13.tgz","fileCount":28,"integrity":"sha512-GDHOIZi7RZC64LhQTH8D//OQU1PZQNV29/aRlJrlGtKVl3g0uwRr/np75jGHrQ0wXMOrC13xY/ughEpL7WxmZw==","signatures":[{"sig":"MEUCIQDqfIZbR6Jdv7wESBOw8Nw1JDucIg4QX8LEcZpckrb+VwIgOUnXEynxGngCeJcLw9ofGgtsPClaAEyL/udoO+5CklQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1021434},"type":"module","engines":{"node":">=20"},"gitHead":"3f6ce868b4bd08439155801c2921f70015f3aa4c","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.13_1780442465227_0.13260623457283272","host":"s3://npm-registry-packages-npm-production"}},"0.2.14":{"name":"pinnedai","version":"0.2.14","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.14","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"28633b2893e57d06d310a08db50f3b23b4f8adce","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.14.tgz","fileCount":28,"integrity":"sha512-BgWksjn+kPt+pTyaBzd0iFA4RzIeUkr1jqO1l73MT62RKw2KKWmznPCpXml/0YMnIxnZGjIO8R51DGnMiOjwqw==","signatures":[{"sig":"MEQCIFyljMir2jxRIHadEQyumltMzVkHn4PEORZH5rcnjJ+jAiATVTEPYfPfg6wkpd0q6C3VLZ12WhXB8bkRYOfLPtITLA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1024065},"type":"module","engines":{"node":">=20"},"gitHead":"fa66958b97770aea389e75461b85c89f281a0892","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.14_1780443511645_0.8264954295603517","host":"s3://npm-registry-packages-npm-production"}},"0.2.16":{"name":"pinnedai","version":"0.2.16","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.16","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"3e138f5c6444f626c527da409b98ae01a417c72c","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.16.tgz","fileCount":28,"integrity":"sha512-2PNz94XeO282uDOKh7LkgeLxdRbAQa+FSWosqOHr3rNOQ5EQ37ALFkI+pwoH1IriIkVYQnVACIL5M/uDTAxcIQ==","signatures":[{"sig":"MEUCIB6LTLjC7WdDxGON2xXFh9epKvUmy6RJx138Yl7/7coXAiEAzBHtW0s9cymhoAHH7rU4kZv3d9PpOAnSlmkqqnCpgAk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1051235},"type":"module","engines":{"node":">=20"},"gitHead":"6a1190a0d3853a8c0d6ec1812c4336b868621115","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.16_1780492460196_0.37378711696681544","host":"s3://npm-registry-packages-npm-production"}},"0.2.17":{"name":"pinnedai","version":"0.2.17","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.17","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"6046d6c710b35ade02727d2af6786e272dee3d2c","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.17.tgz","fileCount":28,"integrity":"sha512-CFclZ8la2YUBdZBXTFYbJlDEiBiyBhQGOebel8eHATLMt14FJSpQnDoeJXSWK09K6WhbkPTSl+WlUFUz10k65w==","signatures":[{"sig":"MEQCIEJxTR/7qS0iV8WP5fGMKdqwjMc9nUGtE0WM3wJeFBY9AiB8YHcbEFAlMS/LCkfK4ehyau35SQgvx2J6WNf7xc3mTw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1065890},"type":"module","engines":{"node":">=20"},"gitHead":"b35b5414c39982aaac77c1106e3cb276e45af5db","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.17_1780493696930_0.4491719240309713","host":"s3://npm-registry-packages-npm-production"}},"0.2.18":{"name":"pinnedai","version":"0.2.18","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.18","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"3258c49926199e129cf978711741f33927af2005","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.18.tgz","fileCount":28,"integrity":"sha512-VrzXX8IMGBdU5rHkSt9h792JCD2xBYxuYP5EFz+kSwV1CjSculWlqdi9jg+a2l09NOQeo+28CAtXxW4X5wCQrA==","signatures":[{"sig":"MEYCIQDpn9E5D2hpdEhUmhOZ+Fg9cQV5rlNCo1orNMWMFHgbDgIhAKp/duy9GxtsnBPpzkjgjJEAOgGFwZ0dj950D3hlkMaR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1095737},"type":"module","engines":{"node":">=20"},"gitHead":"0d06d42e9539045d70a7e63b646bbae668eaa96a","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.18_1780533797745_0.29035925630131953","host":"s3://npm-registry-packages-npm-production"}},"0.2.20":{"name":"pinnedai","version":"0.2.20","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.20","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"cf8bad8c7a46a805ff921a263dc46a028c748ff2","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.20.tgz","fileCount":28,"integrity":"sha512-Vu3oAkkyU7JTcVOOg9AdcLA7TNa3a4Mxn6aZvdWFJ7JJIK8n3b5IcE6BOALQO9+1uO3F9JEsnZXexeOaZY9hAA==","signatures":[{"sig":"MEQCIHrmN+ZfACeBsRYMPh6wPbSXevINXkoCTGm9dC8jaQj3AiBeksWPBTaDGx8dIZcbwrBtK0z3PF/bPYYnwhA2OFRFZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1138417},"type":"module","engines":{"node":">=20"},"gitHead":"b1ca8afa0b4d15e0108fe0c0f391380e55b4dbfb","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.20_1780542721774_0.3786390787155711","host":"s3://npm-registry-packages-npm-production"}},"0.2.21":{"name":"pinnedai","version":"0.2.21","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.2.21","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"f8e4c6076a3bad57cf9847eee294f6cc959e5359","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.2.21.tgz","fileCount":28,"integrity":"sha512-ivZHifvQxx1iCfWU99FPYMg/uUlDL0/tLccMNvx4A90RLhJscBNM0UoOU6zcFqNdIPCwpeXe0VBdyyrq3x6nXQ==","signatures":[{"sig":"MEUCIQCAu0w1m/ffwvznJYifga4uHDQiiqSRSbHqCQPTw7Gd2AIgDWFNChBq1nnfuHccMxkgf5LSSvvUV4wQoHO7mNuM3co=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1153053},"type":"module","engines":{"node":">=20"},"gitHead":"65c3e2f2e87187e34aedfeba286ce6fcfc5e43eb","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Stop your AI coder from repeating bugs. Free beta · Founder Pro waitlist open. Pinned captures bug patterns, builds regression guards, audits sibling code paths, and blocks future AI edits that break or weaken those guards. Bug → guard → siblings audited ","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.2.21_1780570638372_0.40225174308834766","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"pinnedai","version":"0.3.0","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.3.0","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"674fcb02f8a06f67df53f3b6596f0360916bc585","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.3.0.tgz","fileCount":38,"integrity":"sha512-QykPW1Nn7MhnTXLzxAqDJOefcsvEzCYGS7raRkInGWqqjhSD583NmcW1uWU3OuikqRiBoLY/j8NqepB+T0kZqA==","signatures":[{"sig":"MEUCIQCNkE5DVj07nBK6EZCVdmM+Buk2UpwHeq3L+ljJ9zUiSgIgOioLLczr7ylZcCFYlzRXh7fSd5ywCN1I51FmA6yJ4IY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1368914},"type":"module","engines":{"node":">=20"},"gitHead":"3712ae19c6c55fadc6452eebecfb3455e9fbadda","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants (non-empty, terminal state within bound, rejects bad input, errors on faults). Catches the AI-shipped-but-never-works bu","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.3.0_1780665108953_0.8071875125865706","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"pinnedai","version":"0.3.1","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.3.1","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"171dddf7547b9274269faa990d31e1338dc8c646","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.3.1.tgz","fileCount":38,"integrity":"sha512-SH5IF0Yyzt+ecb/f+34dZfKDnmahpJeC86BAPzIibrMQ6LqRuy9ucUPHPl6dWIt5cr71BJpbK3T0QEkfzBT4Ng==","signatures":[{"sig":"MEYCIQCDrVHgwjzA8ndJKQIEG8Bn9B3my56fn/A+7isCNMB0FgIhAJNPaqcnG0QXWeYGbpEcWCSW7B80YSRXrFmnr5ikyS2T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1386050},"type":"module","engines":{"node":">=20"},"gitHead":"43049e1ee673b5536f9fe0d3e2ef760c7d427ca4","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants (non-empty, terminal state within bound, rejects bad input, errors on faults). Catches the AI-shipped-but-never-works bu","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.3.1_1780666863330_0.9079749634520953","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"pinnedai","version":"0.3.2","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.3.2","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"c82886c4789f6669a9f8315281a1548bab84becc","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.3.2.tgz","fileCount":38,"integrity":"sha512-/jw3Lj4s83+eevem9heQ9AzCsOXlMs/oXkMDtqNy4edeDjbTZbyXkm7ett0Xfd+iGT/JUGFvZGVZvf2iPkfFtA==","signatures":[{"sig":"MEQCIA/3HjhmtJm3oLhpngsulnEPs8M0UDRHNx7UFK7qFLvpAiBKTpTU2DPbNp1YqkRhnlBdCQbHzdcYQtnfnfJDRmMI8Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1392038},"type":"module","engines":{"node":">=20"},"gitHead":"70f8e6fe277d40b9313fe4c0a9ccbdab5679f660","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants (non-empty, terminal state within bound, rejects bad input, errors on faults). Catches the AI-shipped-but-never-works bu","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.3.2_1780667810872_0.7058360895283107","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"pinnedai","version":"0.3.3","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.3.3","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"728f1a56dbe6d2fd1e0bab43d62632bb39ff93f0","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.3.3.tgz","fileCount":38,"integrity":"sha512-RqunDFxVlWX1j6kU/b6Wm6i0dz0x5HGtUwjPaE6ZlM+dHK8gCIxKSgAJGKpwVg1D6p4pmRR4ui20I2NHQmGtMA==","signatures":[{"sig":"MEYCIQDmaiyWp940PxAslmVS8UIfN5zUmsROTzlGDqJnUYRiXgIhAOhOlY2kOXMYLE5/uhW6Br2ntmcZN889yW041AFSeMGm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1394473},"type":"module","engines":{"node":">=20"},"gitHead":"87a34426d2e4dd39652da196bc9097957435583d","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants (non-empty, terminal state within bound, rejects bad input, errors on faults). Catches the AI-shipped-but-never-works bu","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.3.3_1780704177334_0.33875323968599025","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"pinnedai","version":"0.4.0","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.4.0","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"f7d9b439b690f8a107ade1cf6cb9062658ebac72","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.4.0.tgz","fileCount":42,"integrity":"sha512-5oBgggnjgDnZGq771WvdMuhZS/P5XRM4TnCKDC5V1A8NbWSpXup4t0NNpFVynqddvk9XhdbTEgnXq/K5zfpFsw==","signatures":[{"sig":"MEQCIHY7uZtoY7COfDr0Egt4RBm3ZuLsDr2bAiC4fVvuFFHUAiBDUqHd35fAaexUFPHKXNJZevMKYTTOjbV6LtjBmdJlvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1449619},"type":"module","engines":{"node":">=20"},"gitHead":"a14ef4ef5ad0ed3643157b3a39cf88b6611d0bb2","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants (non-empty, terminal state within bound, rejects bad input, errors on faults). Catches the AI-shipped-but-never-works bu","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.4.0_1780733809981_0.5294225728621869","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"pinnedai","version":"0.4.1","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.4.1","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"1fff266fbf5d341c45b571e918a3ff31e9475eba","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.4.1.tgz","fileCount":42,"integrity":"sha512-ZYsKNZQaWLxFhQ/40en7gkXY5Eez3zismUSXDcYqA7kxNRz8hsKvPZu/5astE4u33Hft5MZGbf/EnM4jKsxlUQ==","signatures":[{"sig":"MEUCIQDiVRfQKBG3MrUi90I1c2FCfyw/qJctlpE/3cTTsH7zdQIgBAUuMwWaV/dSFzt/0Sbvdeg2+zb2HcYZMhzwXyNkH3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1455852},"type":"module","engines":{"node":">=20"},"gitHead":"b012b5c046927fd88cb788935d1b4e66f6bee1d9","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.4.1_1780812577298_0.3309774368278904","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"pinnedai","version":"0.4.2","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.4.2","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"468820185adc879c25f97614bb764bab7a00e87a","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.4.2.tgz","fileCount":42,"integrity":"sha512-6svn80Ild3VPpsGzmt0/hucRDGjWcg6I9ZU38ohw4Ae7bjPitT+TKA1evS0uJUYqQ/EwRdbGmXVd7LsyC8/aCQ==","signatures":[{"sig":"MEUCIQDHJunVkaOzbPrF8NR7d/GcsnJJht2WwpgPISRy5aHDNQIgbQq6kr9pqhm3Bdy0ICIaVCdkEUiigIY9CvaWPt6pA7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1461166},"type":"module","engines":{"node":">=20"},"gitHead":"2f6317757fd55d05e450282452eb7956c5ce10d7","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.4.2_1780830688582_0.7547031894877405","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"pinnedai","version":"0.4.3","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.4.3","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"89d8dcd013aa641dc18b5900182a38544088c399","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.4.3.tgz","fileCount":42,"integrity":"sha512-jD9BVdP/L5mp5XIcBkEjgcKtri4H28SJE9FCQuiVHvZXb8x14siaRHpbMximZBSYDghzV42Hu4tIOChQK5FKiA==","signatures":[{"sig":"MEUCIERs/KoRDs80aqSgqwj4OX4kMIxzmi24j/mZt8Ae6w3OAiEAsbjSj/n8exbr3Gshqxeo6AP0qsgUCoilQZTUrj8Frys=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1464354},"type":"module","engines":{"node":">=20"},"gitHead":"4c57f62ed4d1d794325ea7b379bd3a74fd337149","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.4.3_1780835173500_0.7829592101648895","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"pinnedai","version":"0.4.4","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.4.4","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"117116210ce4f535a9f649d79aafc23c7b7e1836","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.4.4.tgz","fileCount":42,"integrity":"sha512-9CWMrg9sTN9934OBBN5ynRj5ZBOb43QdmEbtVkscLF/tpMu+5umD8cwn3/IJiB3cYZIjVuucgpIs9AFgMX5u1A==","signatures":[{"sig":"MEUCIEaduvFl6x2Vn8NHMeOQkLydLjxjSjgcVML3842hFIgcAiEAibO24FeB2wxzPM80hcEAbrNXzrg24Qqss27PxngMg9I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1465008},"type":"module","engines":{"node":">=20"},"gitHead":"7c1ce9a16458ca65e8f051e61d9a420ecf377aa1","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.4.4_1780876416418_0.7188237674433495","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"pinnedai","version":"0.4.5","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.4.5","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"5a0c26da09d069dafb0007af3c9ffca31901c8c9","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.4.5.tgz","fileCount":42,"integrity":"sha512-a1ay4UFcdm/JLidbPlHOyLRZt03QKbMDFO2d3YRMrhbolugOnT8NW6XycPW1U+I8KAA/zQcTdaYczLIfcKA10w==","signatures":[{"sig":"MEYCIQDs0dFxF/sltUWWLa08ZQwe3wKtudNkCmYeQP1TecaL6AIhALYzdAKEBcTLgul0jvdicWjdBylJDYCTyILMd9iwtpQL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1469965},"type":"module","engines":{"node":">=20"},"gitHead":"97404b9cfbc087b5d1f7ce93e3ebfab5c6bd36d6","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.4.5_1780881164804_0.32702071583273584","host":"s3://npm-registry-packages-npm-production"}},"0.5.0-beta.8":{"name":"pinnedai","version":"0.5.0-beta.8","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.5.0-beta.8","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"ccecc1b1aa86330d2eb2272946dbad3c7f1f885c","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.5.0-beta.8.tgz","fileCount":44,"integrity":"sha512-o3JDGLbgjgV1kjT7XFNRmYPOe1C+7EzUNg4caIZYGyVDpFbvdv9SgmPrHXAkMbny34xltJG/52i7bcivGmIKTQ==","signatures":[{"sig":"MEUCIQDfA4CpD37aGbqXcTY3BhrS3ItZsQHOVVxOCiX3CnsqRwIgBPoFugRaaAaN68UsNydUY4VFCXxS4IsVCLGU8p/YLK4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1506067},"type":"module","engines":{"node":">=20"},"gitHead":"fec2fe748691d44fff4115d45f558301a5263e39","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","playwright":"^1.60.0","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.5.0-beta.8_1780887606076_0.6229761124737192","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"pinnedai","version":"0.6.0","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.6.0","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"5c68d3d47719fad8a35e3178e0f90f05a80e6303","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.6.0.tgz","fileCount":50,"integrity":"sha512-olW81Bvhun/WKzF1uFufmls8nF/5Qp8IVBjNyWX9N1lFTwSeq89Al1gJj6NZrQjhlufh6iJ1NzDAwsDF/4dPEQ==","signatures":[{"sig":"MEUCIQCPs8mGNPvnmEQNNEj+7usv9v5jKV1LnzYDy5Iv/+MpBwIgQ2BMCBzypWzDvjJAYDwLdvOzsK8yxCmqLwow21dAK0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1559930},"type":"module","engines":{"node":">=20"},"gitHead":"3f50de63e764b4f54fe971a21efb118b35feeeb7","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md && pnpm exec vitest run src/failureModes.gate.test.ts --reporter=basic && pnpm exec vitest run --reporter=basic"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","playwright":"^1.60.0","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.6.0_1781138105825_0.5328213343457988","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"pinnedai","version":"0.6.1","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"license":"Apache-2.0","_id":"pinnedai@0.6.1","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"homepage":"https://pinnedai.dev","bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"bin":{"pinned":"dist/cli.js"},"dist":{"shasum":"3b8c8a0abb404645c74d3637e2ced27d2c0b0252","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.6.1.tgz","fileCount":50,"integrity":"sha512-LWxqzRpE40fWL1ewTpneNXoBm2qiDmTdQrMdS3JNxriGMb+qMUDYHGmOTDpKdhUqvBjT+Wm3Rpkt0x6L908SjA==","signatures":[{"sig":"MEUCIQCNWaPiFrA3/r0ZJ4MMfM/3bmbYXrOZsGMhDbC3mVlPXwIgfY6Ghg6bYOkTbp0D6dRXZnhtGD5GTuKVcAhTTcXSd2I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1578062},"type":"module","engines":{"node":">=20"},"gitHead":"3f50de63e764b4f54fe971a21efb118b35feeeb7","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md && pnpm exec vitest run src/failureModes.gate.test.ts src/baselineAuthGate.test.ts src/backendNotConfigured.e2e.test.ts src/lockfileLiteralExclusion.test.ts src/honestCatchNarration.test.ts src/upgradeNudge.e2e.test.ts --reporter=basic && pnpm exec vitest run --reporter=basic"},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"repository":{"url":"git+https://github.com/pinnedai/pinnedai.git","type":"git"},"_npmVersion":"11.3.0","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","directories":{},"_nodeVersion":"24.1.0","dependencies":{"commander":"12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.0","tsup":"8.5.1","vitest":"2.1.9","playwright":"^1.60.0","typescript":"5.6.3","@types/node":"20.19.9"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pinnedai_0.6.1_1781219640911_0.34427911186212135","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"pinnedai","version":"0.6.2","description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","type":"module","license":"Apache-2.0","bin":{"pinned":"dist/cli.js"},"engines":{"node":">=20"},"scripts":{"build":"tsup src/cli.ts --format esm --target node20 --out-dir dist --shims --clean","dev":"tsx src/cli.ts","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","postinstall":"node scripts/postinstall.cjs","prepublishOnly":"cp ../../README.md ./README.md && pnpm exec vitest run src/failureModes.gate.test.ts src/baselineAuthGate.test.ts src/backendNotConfigured.e2e.test.ts src/lockfileLiteralExclusion.test.ts src/honestCatchNarration.test.ts src/upgradeNudge.e2e.test.ts --reporter=basic && pnpm exec vitest run --reporter=basic"},"keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"author":{"name":"Michael Zon"},"homepage":"https://pinnedai.dev","repository":{"type":"git","url":"git+https://github.com/pinnedai/pinnedai.git"},"bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"publishConfig":{"access":"public"},"dependencies":{"commander":"12.1.0"},"peerDependencies":{"vitest":">=1 <4"},"peerDependenciesMeta":{"vitest":{"optional":true}},"devDependencies":{"@types/node":"20.19.9","playwright":"^1.60.0","tsup":"8.5.1","tsx":"4.20.0","typescript":"5.6.3","vitest":"2.1.9"},"_id":"pinnedai@0.6.2","gitHead":"3f50de63e764b4f54fe971a21efb118b35feeeb7","_nodeVersion":"24.1.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-jDqhfjThMk7bwjJm42FROPiq0PiwR35550Ma0HIFNWvZqVajcsTNKT9F46gh5yei7n9L+lVPXKF1XTOVUpnrQA==","shasum":"d7caf93fa595ffd434deed134f51886fd72dec4d","tarball":"https://registry.npmjs.org/pinnedai/-/pinnedai-0.6.2.tgz","fileCount":51,"unpackedSize":1580498,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDITRYVBbR68JnLs7Lnn4KxEPWTi87LkrjVWHicbC+gYAIhAPLgxBV1c82FtWGYRMwSUihpY31YbdGl8+Nea05mVx1Z"}]},"_npmUser":{"name":"drentropy","email":"michaelzon7@gmail.com"},"directories":{},"maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pinnedai_0.6.2_1781302242447_0.4038124591906673"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T04:12:44.028Z","modified":"2026-06-12T22:10:42.776Z","0.0.1":"2026-05-19T04:12:44.266Z","0.1.0":"2026-05-27T04:10:25.127Z","0.1.1":"2026-06-02T03:04:56.223Z","0.1.2":"2026-06-02T03:31:44.362Z","0.2.0":"2026-06-02T07:16:57.621Z","0.2.1":"2026-06-02T07:30:52.900Z","0.2.2":"2026-06-02T07:38:58.211Z","0.2.3":"2026-06-02T07:44:11.254Z","0.2.4":"2026-06-02T08:00:30.401Z","0.2.5":"2026-06-02T08:10:41.847Z","0.2.6":"2026-06-02T08:15:53.665Z","0.2.7":"2026-06-02T09:24:33.725Z","0.2.8":"2026-06-02T12:31:17.546Z","0.2.9":"2026-06-02T12:58:19.276Z","0.2.10":"2026-06-02T13:53:48.827Z","0.2.11":"2026-06-02T14:10:37.193Z","0.2.12":"2026-06-02T23:06:24.655Z","0.2.13":"2026-06-02T23:21:05.494Z","0.2.14":"2026-06-02T23:38:31.831Z","0.2.16":"2026-06-03T13:14:20.437Z","0.2.17":"2026-06-03T13:34:57.123Z","0.2.18":"2026-06-04T00:43:17.896Z","0.2.20":"2026-06-04T03:12:02.373Z","0.2.21":"2026-06-04T10:57:18.541Z","0.3.0":"2026-06-05T13:11:49.138Z","0.3.1":"2026-06-05T13:41:03.508Z","0.3.2":"2026-06-05T13:56:51.096Z","0.3.3":"2026-06-06T00:02:57.522Z","0.4.0":"2026-06-06T08:16:50.147Z","0.4.1":"2026-06-07T06:09:37.481Z","0.4.2":"2026-06-07T11:11:28.751Z","0.4.3":"2026-06-07T12:26:13.663Z","0.4.4":"2026-06-07T23:53:36.583Z","0.4.5":"2026-06-08T01:12:44.955Z","0.5.0-beta.8":"2026-06-08T03:00:06.259Z","0.6.0":"2026-06-11T00:35:06.029Z","0.6.1":"2026-06-11T23:14:01.091Z","0.6.2":"2026-06-12T22:10:42.683Z"},"bugs":{"url":"https://github.com/pinnedai/pinnedai/issues"},"author":{"name":"Michael Zon"},"license":"Apache-2.0","homepage":"https://pinnedai.dev","keywords":["ci","pr","code-review","ai-coding","cursor","claude-code","devin","github-actions","test-generation","regression-prevention"],"repository":{"type":"git","url":"git+https://github.com/pinnedai/pinnedai.git"},"description":"Smoke-test AI-built features so they actually work — not just parse. `pinned smoke add` runs your endpoint and asserts real invariants. `pinned render add` renders EVERY route in a collection (Next.js generateStaticParams, a getter, sitemap) — adding a ne","maintainers":[{"name":"drentropy","email":"michaelzon7@gmail.com"}],"readme":"# PinnedAI\n\n> **Pinned actually runs your AI-built features and asserts they produce real outcomes — not just that the code parses.** Smoke pins execute endpoints. Render-collection pins cover every route in a multi-tenant app (a new row gets covered automatically — no pin edit). Visibility-invariant pins assert the negative — drafts MUST 404, not 200. `pinned dev` runs them locally with zero config. The generated CI workflow auto-detects Vercel/Netlify preview URLs AND verifies pins actually executed (zero-pins-ran fails the step). Plus the full first-time-bug detector net: enum drift, missing env declarations, undeclared Supabase columns/tables, webhook header typos, unguarded results, response-shape, mass-mutation.\n>\n> *Free beta · Founder Pro waitlist open at [pinnedai.dev](https://pinnedai.dev).*\n\n## The value loop\n\n1. **`npx pinnedai audit`** — read-only inventory of your write surfaces. Zero install footprint. Tells you what Pinned would protect before you commit to anything.\n2. **`pinned sweep`** — one command auto-detects every high-stakes surface across your tree (not just the current diff): Server Actions, paid-API calls, Edge Functions, cron schedules, Stripe webhook event dispatch, multi-step journeys, host-conditional families. Each becomes a `tests/pinned/*.test.ts` file.\n3. **`pinned smoke add` / `pinned render add` / `pinned visibility add`** — pins that actually RUN your features and assert real outcomes, not just code shape:\n   - **`smoke`** asserts spec-derived invariants on a single endpoint (non-empty body, terminal state within bound, rejects bad input, errors on faults).\n   - **`render`** covers every route in a collection — Next.js `generateStaticParams`, a custom getter, or `/sitemap.xml`. Adding a new row gets covered automatically. Per-row failure naming.\n   - **`visibility`** asserts the negative half render pins cannot provide — items marked draft/private/archived MUST return 404 / 307 / 308, never 200.\n4. **`pinned dev`** — boots your dev server (Next/Vite/Astro/SvelteKit/Remix/Nuxt auto-detected), runs the pin suite locally with zero env vars, verifies pins actually executed (auto-opt-in that silently still skips is the same trap), tears down. The recommended pre-commit / pre-push loop.\n5. **`pinned init`** — wires hooks + generates a CI workflow that auto-detects Vercel/Netlify/Cloudflare Pages/Render preview URLs AND verifies pins executed (zero-pins-ran fails the step). Pre-commit + pre-push Guard Integrity blocks AI-weakening attempts (`.skip()` / weakened assertions / deleted tests / `--no-verify` bypass). Claude Code PostToolUse hook auto-verifies pins against your running dev server after every agent edit. AI-coder rules seeded into `CLAUDE.md` / `.cursorrules` / `AGENTS.md`.\n6. **Every commit + every agent edit** runs the pin suite. Bug fixes captured as `pinned record-server-action` / `record-interaction` fixtures land in your repo permanently.\n7. **AI Lessons** (`.pinned/ai-lessons.md`) capture repo-specific rules from real blocked events. **`pinned sync-rules`** inlines the top-N lessons directly into every agent-rules file (CLAUDE.md, AGENTS.md, .cursorrules) — *inline the lesson, never redirect*. `pinned audit --learned` finds sibling code paths with the same mistake pattern.\n\nThe output of every finding is an **executable test**, not a review comment. Cancel Pinned tomorrow and the pins stay.\n\n**Proof it works**: see the [`/proof` page](https://pinnedai.dev/proof) for benchmark results, or [Status](#status) below for headline numbers. Real dyad-app dogfood: 63 detections across 10 repos, 0 spurious; 42 unprotected Edge Function writes surfaced on a single repo.\n\n---\n\n## Quickstart\n\n```bash\n# 0. See what Pinned would protect — read-only, no install footprint\nnpx pinnedai audit\n\n# 1. Auto-detect every high-stakes write surface and pin it\nnpx pinnedai sweep\n\n# 2. Wire continuous verification (hooks + AI-coder rules + CI workflow)\nnpx pinnedai init\n```\n\n`pinned sweep` finds (precision-bound, no false positives in 10-repo dogfood):\n- **Server Action mutations** (`\"use server\"` functions with DB writes / file uploads / paid-API calls — auth gate + input schema captured)\n- **Paid-API calls** (Anthropic / OpenAI / Gemini / Stripe — model literal + max_tokens preserved)\n- **Supabase Edge Functions** (Deno runtime — HTTP-route detection misses these)\n- **Cron handlers** (Vercel `vercel.json:crons[]` + GitHub Actions `on.schedule`)\n- **Stripe webhook event dispatch** (case-literal preservation — catches one-letter typos)\n- **Multi-step journeys** (POST→GET redirects, signup→thanks flows with shared session)\n- **Host-conditional families** (one root file → multiple consumer routes)\n\n`pinned init` writes `.github/workflows/pinned.yml`, creates `tests/pinned/` with `PINS.md`, installs pre-commit + pre-push hooks, seeds AI-coder rules into `CLAUDE.md` + `.github/copilot-instructions.md`, and (for Claude Code users) wires the PostToolUse hook so Pinned auto-verifies pins against your running dev server after every agent edit. Each step prompts before writing in interactive mode; pass `--auto` to accept all.\n\nIf your repo already has `.cursorrules`, `.clinerules`, `AGENTS.md`, or `.windsurfrules`, init writes to those too — same marker-bounded block, identical uninstall flow (`pinned uninstall-agent-rules`).\n\n---\n\n## Editor + AI-tool surfaces\n\nPinned ships across every major AI-coder surface:\n\n| Surface | What you get | How to install |\n|---|---|---|\n| **VS Code / Cursor / Windsurf / Codium** | `◆ pinned · N guards · ✓` in the status bar, rich hover tooltip with recent guards + latest AI lesson, click → Quick Pick (action chooser) → command runs in a Pinned-managed terminal. Works in stock VS Code (Copilot users), Cursor, Windsurf, Codium. | Bundled `.vsix` auto-installs during `pinned init` (until we publish to the Marketplace + Open VSX in v0.1.1) |\n| **Claude Code** | **PostToolUse hook** — after every Claude edit, Pinned auto-verifies the affected pins against your running dev server and injects the result into Claude's next turn (catches regressions *while the agent is still in the loop*). Plus statusline (`◆ pinned · LEARNED · 1 new AI mistake`), UserPromptSubmit hook (transient block-event messages), `/pinned-status`, `/pinned-list`, `/pinned-review`, `/pinned-done` slash commands. | PostToolUse hook auto-wired by `init`; slash commands via `npx pinnedai install-claude` |\n| **GitHub Copilot Chat (free + paid)** | Reads Pinned rules from `.github/copilot-instructions.md` before generating code | Auto-created during `init` |\n| **MCP-aware tools (Claude Desktop, Cline, Continue)** | `pinned_before_code_change`, `pinned_before_done_check`, `pinned_scan_diff`, `pinned_list_guards`, `pinned_check_pr_description`, `pinned_suggest_init` as native tools with structured `human_summary` + must-report `agent_instruction` fields | Add `pinnedai-mcp` to the tool's MCP config — see [docs/integrations/](./docs/integrations/) |\n| **GitHub Action (CI)** | Runs `pinned test` (all sweep-emitted pins) + `pinned check-guard-removal` on every PR. Guard weakening attempts AND functional regressions fail CI. | Auto-wired via `.github/workflows/pinned.yml` from `init`, or use the [Marketplace action](https://github.com/marketplace/actions/pinnedai) directly |\n| **Pre-commit + pre-push hooks** | Block bypass attempts locally before they reach CI | Auto-wired by `init` |\n\nPer-tool integration docs:\n\n- [docs/integrations/cursor-rules.md](./docs/integrations/cursor-rules.md)\n- [docs/integrations/windsurf-rules.md](./docs/integrations/windsurf-rules.md)\n- [docs/integrations/claude-code.md](./docs/integrations/claude-code.md)\n\n## README badge\n\n```markdown\n[![Pinned protected](https://pinnedai.dev/badge.svg)](https://pinnedai.dev)\n```\n\n---\n\n## Pin templates\n\nEach template is a deterministic verifier — the LLM never writes test logic, it only fills slots. Templates auto-fire from `pinned sweep` based on what the detectors find in your tree. The full inventory:\n\n### 🆕 First-time bug catching (0.2.22+)\n\nEvery other Pinned template catches **regressions** — bugs that appear when previously-good code breaks. This category catches bugs **at the moment they're written**, before any baseline exists. All static (no creds, no runtime probes).\n\n- **`enum-drift`** — consumer reads `x === \"done\"` but in-repo producer only emits `\"completed\"/\"failed\"/\"processing\"`. The socialideagen-dogfood-shape bug. Two confidence tiers: confirmed (≥1 vocabulary overlap, auto-pin) and review (zero overlap, soft signal — cross-table column collisions or cross-repo external producers).\n- **`env-required`** — code reads `process.env.X_API_KEY` but `.env.example` / `vercel.json` env / `next.config.js` env block / `wrangler.toml [vars]` doesn't declare it. Cloned-repo first-runs and deploys silently get `undefined`.\n- **`supabase-column`** — `.from(\"X\").select(\"col_a, col_b\")` against a Supabase table where one of the columns isn't in `supabase/migrations/*.sql` or `database.types.ts`. Runtime error on first query.\n- **`expected-header`** — webhook handler reads `x-stripe-signature` (wrong) when the Stripe SDK signs with canonical `stripe-signature`. Signature verification silently fails on every request. Provider catalog: Stripe / GitHub / Svix / Twilio / Shopify.\n- **`nullable-result`** — `arr.find(...)` / `.match()` / `.exec()` result used without null guard in **server-side route handlers** (`route.ts` / `*.actions.ts` / `supabase/functions/`). First edge-case input crashes the route with a 500.\n- **`response-shape`** — consumer reads `body.referralCode` from a `fetch(\"/api/X\")` response, but the producer's `NextResponse.json({...})` never emits that key. Generalizes the enum-drift bug class to JSON-key mismatches in same-repo HTTP routes.\n\n### HTTP / API surface\n- **`page-renders`** — *\"GET /path renders without crashing.\"* Catches React/Next/Vite render errors + 500 pages + broken SSR.\n- **`validation-rejects-bad`** — *\"POST /api/X with bad input returns 400.\"* One pin, N sub-tests (malformed-JSON + per-field missing).\n- **`happy-path-with-side-effect`** — *\"POST /api/X creates a users record.\"* Catches stub endpoints returning 200 without doing the work (misleading-green) via the `X-Pinned-Side-Effect` response header convention.\n- **`auth-required`** / **`permission-required`** / **`tier-cap`** — auth gates + role checks + per-tier caps survive.\n- **`rate-limit`** / **`idempotent`** — rate limiters + webhook dedup keys preserved.\n- **`returns-status`** — `<method> <route> returns <status> on <condition>` — auto-generated from added validation schemas in diffs.\n\n### App-Router + modern mutation surfaces (0.2.18+)\n- **`server-action-write`** — `\"use server\"` mutations with DB write / file upload / paid-API call. Direct-invoke pin with `vi.mock()` for the auth helper — runs the success path AND the reject path so AI silently *removing* the auth gate is caught (not just bypassing it).\n- **`paid-api-call`** — Anthropic / OpenAI / Gemini / Stripe calls anywhere in the codebase (not just inside Server Actions). Captures the call expression + **model literal** (catches `claude-opus` → `claude-haiku` silent swaps) + **max_tokens cap** (catches unbounded-spend regressions).\n- **`edge-function-write`** — Supabase Edge Functions at `supabase/functions/<name>/index.ts` (Deno runtime — HTTP-route detection misses these). Three-tier auth posture: confirmed (recognized helper) / ambiguous (auth-shaped signals but unrecognized — soft warn) / none (truly bare endpoint — loud alarm).\n- **`cron-handler`** — Vercel `vercel.json:crons[]` entries + GitHub Actions `on.schedule[].cron`. Catches silent schedule drift (`0 4 * * *` → `0 4 * * 0`, runs once a week instead of daily) + handler renames.\n- **`stripe-event-handled`** — Stripe webhook `switch (event.type) { case \"X\": ... }` dispatch. Catches AI silently typoing `\"checkout.session.complete\"` (one-letter rename), merging fallthrough arms dropping one, or wholesale deleting a case. Signature still verifies — paying customers never get provisioned.\n\n### Multi-step + family-shaped\n- **`journey`** — multi-step flows (signup→thanks, login→dashboard) with shared session. Catches \"step 1 succeeds but step 2 silently regresses\" — single-route pins structurally miss these.\n- Family detection (host-conditional) — one root file → multiple consumer routes. A change to the root pins all consumers as a group.\n\n### Browser interactions (🛟 BETA — opt-in)\n- **`interaction-baseline`** — Playwright records the observable effect of an interaction (carousel arrow click → scroll position, submit button → URL change). Catches `onClick` handler regressions that go undetected because the page still renders.\n- **`page-accessibility`** — axe-core via Playwright. Catches WCAG-AA contrast failures + invisible text — the *\"page renders but is unreadable\"* class that page-renders pins go GREEN on. WARN-only on violations; `confidence: \"review\"` so catches don't inflate the GA metric.\n\n### Repo integrity\n- **`lockfile-integrity`** / **`config-invariant`** / **`package-exports-exist`** / **`module-export-stable`** / **`import-path-resolves`** / **`tsc-clean`** — lockfile sha + critical config keys + module exports + import resolution + TS build all stay intact.\n- **`url-literal-preserved`** / **`changed-literal-preserved`** — URLs in code + bug-fix literals don't regress.\n- **`webhook-handler-exists`** — webhook handler signatures preserved.\n- **`react-route-registered`** — internal `<Link href=\"/foo\">` / `navigate(\"/foo\")` resolve to a real page file.\n- **`secret-not-public`** — no `NEXT_PUBLIC_*SECRET*` leaks, no `.env` commits, no debug routes exposed.\n- **`form-submit-error-handling`** — async error-handling on form submits stays wrapped.\n\n### CLI / library tooling\n- **`cli-output-contains`** / **`cli-exits-zero`** / **`cli-creates-file`** / **`cli-json-shape`** / **`cli-flag-supported`** — for CLI tools and binaries.\n- **`library-returns`** — a library function still returns the expected shape.\n\nThe detectors are precision-bound: every pin emit has a specific signal, never a generic shape match. The 10-repo dyad dogfood produced **0 false positives** across 63 detections.\n\n### Recognized write libraries\n\n`happy-path-with-side-effect` + `server-action-write` + `edge-function-write` auto-fire on these write shapes (both in new diffs AND retroactively via `pinned sweep`):\n\n| Library | Pattern detected |\n|---|---|\n| supabase-js | `supabase.from(\"X\").insert/update/upsert/delete` |\n| prisma | `prisma.X.create/update/upsert/delete` (incl. `createMany` / `updateMany`) |\n| drizzle-orm | `db.insert/update/delete(X)` (also `tx.insert(...)` inside transactions) |\n| kysely | `db.insertInto(\"X\")` / `db.updateTable(\"X\")` / `db.deleteFrom(\"X\")` |\n| mongoose | `Model.create(...)`, `new Model(...).save()`, `Model.updateOne(...)` |\n| raw SQL | `INSERT INTO X`, `UPDATE X SET`, `DELETE FROM X` inside `db.execute()` / `sql\\`...\\`` |\n| resend / sendgrid / nodemailer / aws-ses / postmark | their send / sendMail / sendEmail methods |\n| bullmq / inngest / generic queue | `queue.add()`, `inngest.send()`, `jobs.enqueue()` |\n| supabase-storage / aws-s3 / cloudflare-r2 / vercel-blob | `storage.from(BUCKET).upload`, `PutObjectCommand`, `env.BUCKET.put`, `@vercel/blob put` |\n| Anthropic / OpenAI / Gemini / Stripe (paid API) | `messages.create/parse/stream`, `chat.completions.create`, `responses.create`, `images.generate`, `embeddings.create`, `generateContent`, `checkout.sessions.create`, `billingPortal.sessions.create`, `paymentIntents.create`, `charges.create` |\n\nThe widened Supabase client-identifier vocabulary recognizes `admin.from(...)`, `db.from(...)`, `userClient.from(...)`, `serviceClient.from(...)`, etc. — not just the literal `supabase` identifier. Confirmed across 42 Edge Functions on the MediniDyad dogfood repo.\n\nIf your repo uses a write library not yet recognized, the pin won't auto-fire — open an issue with the import pattern. Adding a row is two regex lines.\n\n## What Pinned protects\n\nPinned focuses on AI-prone failure modes. Categories grow with each release:\n\n### 🆕 First-time bugs (no regression baseline needed — 0.2.22+)\n\nThe bug class where consumer + producer never agreed, OR the configuration was wrong from line 1. Other detectors miss these because there's nothing to regress from.\n\n- **Enum-value drift** — client reads `status === \"done\"` but producer emits `\"completed\"` (the socialideagen dogfood bug).\n- **Undeclared env vars** — code reads `process.env.X` but `.env.example` / `vercel.json` env / `next.config.js` env / `wrangler.toml` doesn't list it. Cloned-repo first-runs and deploys silently get undefined.\n- **Undeclared DB columns** — code queries `.from(\"X\").select(\"col_a, col_b\")` against a Supabase table where the column doesn't exist in migrations or `database.types.ts`.\n- **Webhook header typos** — handler reads `x-stripe-signature` (wrong) when Stripe SDK signs with `stripe-signature` (canonical). Silent verification failure on every request.\n- **Unguarded `.find()` / `.match()` results in route handlers** — first edge-case input crashes the route with a 500.\n- **Response-shape mismatches** — consumer reads a JSON key the producer never emits.\n\n### App-Router + modern mutation surfaces\n- **Next.js Server Actions** — `\"use server\"` functions that perform writes (DB / file upload / paid API) with auth gate + zod input schema captured. Direct-invoke verifier with `vi.mock()` for the auth helper runs success path AND reject path → catches silent gate removal too.\n- **Paid-API calls (anywhere)** — model string preserved (no silent `claude-opus` → `claude-haiku` swaps), `max_tokens` cap preserved (no unbounded-spend regressions), call expression preserved (no silent removal). Fires on plain backend services, library helpers, anywhere — not just Server Actions.\n- **Supabase Edge Functions** — Deno-runtime functions invisible to HTTP-route detection. File-existence + write expression + auth-gate idiom all preserved. Three-tier auth posture so soft-warns don't bury truly bare endpoints.\n- **Cron handlers** — Vercel `vercel.json:crons[]` + GitHub Actions `on.schedule`. Schedule drift (`0 4 * * *` → `0 4 * * 0`, daily vs weekly — same shape, very different behavior) + handler renames caught.\n- **Stripe webhook event-type dispatch** — every `case \"<event-name>\":` arm preserved. One-letter typo / merged fallthrough / deleted case fails the pin even though the signature still verifies.\n\n### Auth / access\n- **Auth gates** — `requireAuth` / `requireAdmin` / middleware matcher coverage; the middleware-aware pin uses `middleware.ts`'s captured auth signature so removing the check fails the guard.\n- **Permission roles** — per-role + per-tier caps preserved.\n- **Client / API mistakes** — missing `authHeaders()`, missing `credentials: \"include\"`, lost `if (!res.ok)` gates, removed 401/402/403 handling.\n- **Webhook signature verification** — `stripe.webhooks.constructEvent`, `x-hub-signature-256`, `svix.verify`, `twilio.validateRequest`, generic `crypto.createHmac(\"sha256\", ...)`. Removing the verify call fails the pin.\n\n### Visual / usability (🛟 BETA — opt-in)\n- **WCAG-AA contrast / invisible text** — axe-core via Playwright. Catches the \"page renders but is unreadable\" class (white-on-white text shipped 3 times in real dyad-app dogfood) that plain page-renders pins go GREEN on.\n- **Interaction baselines** — Playwright records the observable effect of a click / scroll / type. Catches `onClick` handler regressions.\n\n### Repo integrity\n- **Guard weakening** — `.skip()`, `.only()`, `xit()`, `.todo()`, `.skipIf(true)`, deleted tests, weakened assertions (`toBe(401)` → `toBeTruthy()`), `|| true`, `?? true`, `catch(() => true)`, `expect(true).toBe(true)` tautologies, commented-out `expect()`, `expect.assertions(0)`, early `return;` in test body.\n- **Pinned-infrastructure tampering** — deletion of `tests/pinned/*`, `.github/workflows/pinned.yml`, `tests/pinned/.registry.json`, `.pinned/ai-lessons.md`, or sneaky rename-to-retired/ without the matching `.audit.json`.\n- **Route / export / reference integrity** — internal `<Link href=\"/foo\">` / `navigate(\"/foo\")` / `router.push(\"/foo\")` that resolve today are pinned; future removal of the target page file fails the pin.\n- **Module exports** — package.json `exports`, named exports from libraries, import-path resolution.\n- **Lockfile + config invariants** — pnpm-lock.yaml sha + critical config keys preserved.\n\n### Public exposure\n- **Secrets in client bundle** — `NEXT_PUBLIC_*SECRET*` / `NEXT_PUBLIC_*KEY*` leaks.\n- **No-fixture checks** — `.env` committed without `.gitignore` coverage, `.map` files in `dist/`/`build/`, debug routes (`__debug`, `__test`, `debug.html`, `/admin/console`).\n\n---\n\n## AI lessons\n\nPinned writes repo-specific lessons to `.pinned/ai-lessons.md` (markdown for humans) and `.pinned/lessons.json` (structured for tools).\n\nEach lesson is generated from a real event — a blocked bypass attempt, a replay-verified bug-fix guard, or a confirmed sibling audit. Dedupe is per `guardId`: repeat attempts append evidence to the existing entry, not duplicate sections.\n\nExample:\n\n```md\n## Don't weaken client-getReport-authHeaders\n\n<!-- pinned:guard=client-getReport-authHeaders kind=guard-block -->\n\n**Past mistake:**\nweakened: src/api/getReport.ts — `headers: await authHeaders()` removed in PR #88\n\n**Rule:**\nDo not remove `authHeaders()` from `src/api/getReport.ts`. Fix the application code instead.\n\n**Guard:** `client-getReport-authHeaders`\n\n**Plain English:** don't drop authHeaders() from API calls\n```\n\nPoint your AI coder at this file with `pinned install-agent-rules` so Claude/Cursor reads the rules before editing.\n\n---\n\n## Commands\n\n### Setup\n\n```bash\nnpx pinnedai init                    # one-time per repo\nnpx pinnedai install-agent-rules     # opt-in: wire CLAUDE.md/.cursorrules/etc. to read .pinned/ai-lessons.md\nnpx pinnedai uninstall-agent-rules   # undo the above\nnpx pinnedai agent-rules             # show which agent files are wired\n```\n\n### Daily workflow\n\n```bash\nnpx pinned test                      # run the pin suite\nnpx pinned status                    # see active pins + recent events\nnpx pinned context                   # print the AI-coder context (rules + lessons) for inline prompting\nnpx pinned safety                    # static Safety Pass (exposed service keys, wide-open CORS, debug endpoints)\nnpx pinned ack <finding-id> --reason=\"...\"   # acknowledge an intentional Safety Pass finding (audit-trailed)\n```\n\nSafety Pass findings each carry a stable `[id: xxxxxxxx]`. If a finding is intentional (e.g., a deliberately public endpoint), acknowledge it with `pinned ack <id> --reason=\"...\"` — the reason is recorded in `tests/pinned/.safety-acks.json` (commit it) and the finding drops out of the warning count while staying visible. Inline alternative: a `// pinned-ok: <reason>` comment on or above the flagged line. Block-severity findings (exposed service-role keys) can never be acked away.\n\n### Discovery\n\n```bash\nnpx pinned scan-diff                 # show what Pinned would auto-protect in the current diff\nnpx pinned audit --learned           # scan sibling code paths for risks matching learned patterns\nnpx pinned probe-admin               # enumerate admin/internal routes + their protection state\nnpx pinned list                      # list all active + retired pins\nnpx pinned show <pin-id>             # what a pin asserts + what would make it fail (alias: `describe`)\nnpx pinned regenerate --all          # re-emit all pin .test.ts files using the current templates — run this after upgrading pinnedai to apply any template-bug fixes to existing pins; also auto-retires pin shapes current generators refuse to produce (audit-trailed) and flags auth pins on routes whose file declares itself public (alias: `regen`)\n```\n\n### Lifecycle\n\n```bash\nnpx pinned retire <claim-id> --reason=\"...\"   # legitimate retirement (writes audit entry)\n```\n\n### Reporting + analytics (local-first)\n\n```bash\nnpx pinned report                              # per-detector dashboard, severity-sorted + 7-day trend + per-AI-model breakdown\nnpx pinned report --json                       # full schema for piping into your own tooling\nnpx pinned analytics status                    # show whether hosted analytics is opt-in\nnpx pinned analytics enable                    # opt-in to cross-repo + per-model dashboards at app.pinnedai.dev (Pro+)\nnpx pinned analytics disable                   # flip off; local stats keep working\nnpx pinned analytics upload                    # manual one-shot upload (or auto-fires on every `pinned sweep` when enabled)\n```\n\nLocal data lives in `.pinned/repo-stats.json` (per-detector hit counts, severity ranking, per-AI-model rollup, bounded samples, 7-day snapshots). Free tier gets the full local dashboard. Hosted analytics is opt-in only — never auto-uploads. Uploaded data is structured to exclude source code, file contents, and secrets; only counts + sample file-paths + line-numbers + plain-English summaries get sent. See [tier-model-final-2026-05-23](#) for the free/paid split.\n\n### Paid-API call pins (silent model swap / token-cap defense)\n\nPin every paid API call in your backend — not just the ones in Next.js Server Actions. Captures the call expression + model literal + `max_tokens` cap so AI silently swapping `claude-opus` → `claude-haiku` (quality regression) or removing the token cap (unbounded spend) is caught immediately.\n\n```bash\nnpx pinned sweep          # auto-detects paid-API calls (Anthropic / OpenAI / Gemini / Stripe)\n```\n\nCoverage: Anthropic (`messages.create` / `parse` / `stream`), OpenAI (`chat.completions.create`, `responses.create`, `images.generate`, `embeddings.create`), Google Gemini (`generateContent`), Stripe (`paymentIntents.create`, `charges.create`, `subscriptions.create`, `customers.create`, `checkout.sessions.create`, `billingPortal.sessions.create`). Entry-point-agnostic — fires anywhere, plain backend service or Server Action.\n\n### Supabase Edge Function pins (Deno runtime)\n\nHTTP-route detection structurally misses Supabase Edge Functions (they run in Deno, not Node). Pin asserts the function file exists, the write expression survives, and the auth gate is preserved.\n\n```bash\nnpx pinned sweep          # detects supabase/functions/<name>/index.ts\n```\n\nCatches: AI deletes the function (\"dead code cleanup\"), removes the write call, weakens the auth gate.\n\n### Cron handler pins (Vercel + GitHub Actions)\n\nCron fires WITHOUT a user in the loop — schedule drift (`0 4 * * *` → `0 4 * * 0` runs once a week instead of daily) or handler rename = silent SLA break. Pin captures Vercel `vercel.json:crons[]` entries and GH Actions `on.schedule[].cron` schedules.\n\n```bash\nnpx pinned sweep          # detects vercel.json + .github/workflows/*.yml\n```\n\n### Stripe webhook event-type dispatch pins\n\nThe layer above signature-verify. Catches AI silently typoing `case \"checkout.session.complete\":` (one-letter rename), merging fallthrough arms dropping one, or wholesale deleting a case. The signature still verifies — Stripe still returns 200 — paying customers never get provisioned.\n\n### Server-Action pins (Next.js App-Router mutations)\n\nPin the App-Router mutation pattern that `/api/*` HTTP-route detectors can't see — auth-gated `\"use server\"` functions that perform DB writes, file uploads, or paid-API calls. Closes the highest-impact coverage gap reported via real-world dogfood.\n\n```bash\nnpx pinned sweep                                                     # auto-detects Server Action writes\nnpx pinned record-server-action <claim-id> --fixture <payload.json>  # capture valid payload + regenerate test\n```\n\nDetection covers: supabase / prisma / drizzle / kysely / mongoose / raw SQL DB writes; supabase-storage / S3 / R2 / Vercel Blob file uploads; outbound paid-API calls (Anthropic / OpenAI / Gemini / Stripe). Auth-gate function name (`isAdminAuthed`, `requireAuth`, etc.) and zod input-schema name are captured automatically. Until you record a fixture, the pin self-skips with a clear message.\n\n### Page accessibility pins (🛟 BETA — opt-in)\n\nCatches the *\"page renders but is unreadable\"* class — white-on-white text, WCAG-AA contrast failures, invisible labels. Plain page-renders pins stay GREEN on these because the page does render; this is the only template that catches it.\n\n```bash\nnpx pinned add-browser                  # one-time: install Playwright (~300 MB)\nnpx pinned sweep --include-beta         # auto-detects pages + emits axe-core pins\n```\n\nLoads each page via Playwright + injects axe-core (pinned version, CDN-loaded) + runs the `color-contrast` rule. WARN-only on violations (frontend a11y doesn't fail CI) + `confidence: \"review\"` so catches don't inflate the GA metric.\n\n### Browser interaction pins (🛟 BETA — opt-in)\n\nCover frontend interaction regressions (the carousel \"arrows do nothing\" class) by wrapping Playwright. Beta posture: WARN-only on drift, attach-only to a running dev server, catches quarantined as `confidence:\"review\"` so they don't inflate the GA metric.\n\n```bash\nnpx pinned add-browser                                # one-time: install Playwright + Chromium (~300 MB)\nnpx pinned sweep --include-beta                       # auto-detect interaction candidates + pin them\nnpx pinned record-interaction <claim-id>              # capture the baseline observation once\nnpx pinned record-interaction <claim-id> --dry-run    # observe without persisting (calibration)\n```\n\nAuto-detection finds buttons with stable selectors (`data-testid` preferred over `aria-label`) AND an `onClick` handler. Until you run `record-interaction`, the pin emits a single warn-only message; only after recording does drift get reported.\n\n### Internal (called by hooks)\n\n```bash\nnpx pinned check-guard-removal       # pre-commit hook entry; blocks AI bypass attempts. Workflow edits are\n                                     # classified semantically: strengthening edits (new env vars, new steps,\n                                     # tightened permissions) pass; gutting edits (guard step removed, pull_request\n                                     # trigger removed, permissions.contents downgraded, vitest step removed,\n                                     # `if: false` / `continue-on-error` / `|| true` neutralization) block\nnpx pinned statusline                # statusline rendering for Claude Code\nnpx pinned backtest --mode=bug-fix   # replay a repo's git history (calibration tool)\n```\n\n### Optional AI-assisted analysis (BYOK)\n\n```bash\nPINNEDAI_BYOK=openai PINNEDAI_OPENAI_KEY=sk-... npx pinned check\n```\n\nLLM-as-proposer fires on each commit's diff to suggest additional guards the deterministic detectors might miss. Customer pays their LLM vendor directly; Pinned doesn't proxy.\n\n---\n\n## Statusline\n\nPinned surfaces protection events without becoming a noisy reviewer. Events decay back to a calm baseline:\n\n```\n◆ pinned · 34 pins · 7 lessons · ✓ 12 verified                  # baseline\n◆ pinned · 34 pins · ⚠ 2 protected files in this commit          # editing guarded files\n◆ pinned · 34 pins · ⛔ blocked: AI weakened pin sample.test.ts   # Guard Integrity refused\n◆ pinned · 34 pins · +1 new guard                                # SAVED\n◆ pinned · 34 pins · scanned 3 similar files                     # AUDIT\n◆ pinned · 34 pins · 4 guards passed                             # COVERED\n◆ pinned · 34 pins · learned: don't drop authHeaders() from API calls  # LEARNED\n◆ pinned · 34 pins · ✗ 1 broken                                  # failing pin\n```\n\nThe `BLOCK / LEARNED / SAVED / AUDIT / COVERED` transients fall back to baseline after 1-2 minutes. Persistent value = guard count + lesson count.\n\n---\n\n## What Pinned is NOT\n\nPinned is **not** a generic code reviewer, SAST scanner, or AI bug-fixer.\n\nCodeRabbit reviews PRs. Snyk / Semgrep scan for broad security issues. They run once and leave comments.\n\nPinned protects the repo-specific promises your AI coder must not forget: the bug fixes, guards, tests, and lessons that should survive future AI edits. **The output of every finding is an executable guard, not a comment.**\n\n---\n\n## AI and privacy\n\nPinned works **without an LLM**. The core engine is deterministic: guards either pass, fail, or were weakened.\n\nOptional AI-assisted mode (BYOK) can propose additional guards, sibling audits, and lessons from diff context. AI output never enforces anything by itself — deterministic guards + CI do the enforcement.\n\nPrinciple:\n\n```\nLLM proposes. Guards prove. CI enforces.\n```\n\n**Local-first.** Free beta runs entirely on your machine + your CI. Pinned doesn't see your code unless you set BYOK env vars (in which case the calls go directly to your LLM vendor, not through Pinned infrastructure).\n\n---\n\n## Free vs Founder Pro\n\n| | Free Beta | Founder Pro (waitlist) |\n|---|---|---|\n| All deterministic detectors | ✅ Unlimited | ✅ |\n| Guard Integrity blocks | ✅ | ✅ |\n| AI Lessons file + agent config wiring | ✅ | ✅ |\n| Replay-verified bug-fix guards | ✅ | ✅ |\n| Local audit / probe / context | ✅ | ✅ |\n| Pre-commit / pre-push hooks | ✅ | ✅ |\n| Statusline integration | ✅ | ✅ |\n| Report-only CI (you wire `pinned guard` yourself) | ✅ | ✅ |\n| Optional BYOK AI proposer (your own key) | ✅ | ✅ |\n| **PR comments with repair prompts** | — | Coming |\n| **Cross-repo AI lessons** | — | Coming |\n| **Hosted AI analysis (no API key)** | — | Coming |\n| **Cloud proof / history dashboard** | — | Coming |\n| **AI / provider mistake analytics** | — | Coming |\n| **Managed CI enforcement policies** | — | Coming |\n| **Custom guard templates** | — | Coming |\n| **Team policies + audit log** | — | Coming |\n\nFounder Pro is a **waitlist** today — no payment, no card. We collect interest to gauge demand for the paid features above. When paid opens, founder pricing locks for everyone on the list.\n\n[Join the waitlist →](https://pinnedai.dev#waitlist)\n\n---\n\n## Status\n\nv0.1 (free beta) ships with:\n\n- 8 Guard Integrity detectors (23 / 23 known AI bypass tactics blocked in our mutation-test suite)\n- AI Lessons file + opt-in agent-config wiring (CLAUDE.md, .cursorrules, .github/copilot-instructions.md, etc.)\n- 6 P0 detector categories generating pins at init: Guard Integrity, client fetch / auth-headers / error-handling, auth/middleware, route/export/reference integrity, public exposure, webhook signature\n- `pinned audit --learned` for sibling discovery\n- `pinned probe-admin` for admin-route enumeration\n- `pinned context` for runtime AI-coder briefing\n- Statusline events for BLOCK / SAVED / AUDIT / COVERED / LEARNED / VERIFIED + baseline `N pins · M lessons`\n\nOpen beta. Bug reports + feature requests welcome at [github.com/pinnedai/pinnedai/issues](https://github.com/pinnedai/pinnedai/issues).\n\n---\n\n## License\n\nApache 2.0. CLI source is public; the Cloudflare Worker that backs the (coming) hosted AI / cross-repo lessons / dashboard features stays private.\n","readmeFilename":"README.md"}