{"_id":"@angelkurten/specforge","_rev":"24-86592d402dd8a41a074c8273fed33240","name":"@angelkurten/specforge","dist-tags":{"latest":"0.27.3"},"versions":{"0.7.0":{"name":"@angelkurten/specforge","version":"0.7.0","license":"MIT","_id":"@angelkurten/specforge@0.7.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"3ad974d57fcd0d59f0cb2460e84a70bf469ac30d","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.7.0.tgz","fileCount":80,"integrity":"sha512-6HcG+qUVEo39TVRzM2t8F3iRQJgzznL7twZqJ8K8sHEEKICNMl694iEuo/5aDe7/LHFqMhxRK73TPvEaWoKyVQ==","signatures":[{"sig":"MEUCIQDCnNGuenU3GnVfy0IX4htwwKFvafZIwqScITAEFjxF3gIgXCUXyImO195GRqj8sbF33yH7CyJzQiCEder4TY0umX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":471948},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"1b69566937eceaf7d2ee8e8c6e988d6d7ba1cd6d","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.7.0_1783528889124_0.7211820806061513","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@angelkurten/specforge","version":"0.7.1","license":"MIT","_id":"@angelkurten/specforge@0.7.1","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"da4a72b31e13f9b044ce4d25e8ce7948d0b5df4b","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.7.1.tgz","fileCount":80,"integrity":"sha512-TTRk4xHVMh+7DNBt8IURDgXLAM0zOT4F0sDw7mHz4sU1WDQepfeWX7CtY+CsaeIJie5ArVLeccqYy+K1ZpihvA==","signatures":[{"sig":"MEQCIHoN656iXMlEhQ8+VXchS/Y0tmhy6J+u9G8hh4r0MSB7AiBvv463yK4Iz6DY5zNiyUE436sKwqgtNd04A94JtZlKuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":477105},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"a811711c92c5c9b2fc8c29816452db4216ba72cf","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.7.1_1783534880856_0.6982799891829823","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@angelkurten/specforge","version":"0.8.0","license":"MIT","_id":"@angelkurten/specforge@0.8.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"a69c6d789ec8024e1de1d658a0d2532ce1cac913","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.8.0.tgz","fileCount":83,"integrity":"sha512-3Fj37AGezSg9zhYa+C1jmeny7cq8/tFMnzFIJbxEBQWHIvkSch4+ViBuGWqv6e/xF67rcbhjefRaG5SgfV9r/g==","signatures":[{"sig":"MEUCIHGJCSrN8ATCCwojyzfVgo1miPjTx/43PLollj6G9s/xAiEAlel1nlCem6DswakFGt+rbt0444Yb6jtqma9LKd06Cmw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":491691},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"3218c8754f943a38e01ab42dbeeaca5925e7ff2a","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.8.0_1785194493275_0.18905075415976458","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@angelkurten/specforge","version":"0.9.0","license":"MIT","_id":"@angelkurten/specforge@0.9.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"0743d3915d074be0ba3196b80fd9758b94e7eb2c","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.9.0.tgz","fileCount":83,"integrity":"sha512-Tk3ymB3PGkIqgTbliD/wuG2vZa6wu1TqvTi8Cz+WCncuRX7spL9LHZnNzB42/UB5OpF6Yn1H4p6RHzAiy24LaA==","signatures":[{"sig":"MEQCIAbivdNlxnF96v9nux3oUbwKjnHzogmz3ATwVr+qCRuOAiBcpdoXKHGydOKFwlJcTaEIklcGI3zOigVf+gU1ZurHmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":497807},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"2a77ac2c2d1a9631de4ec6fe7b4f2a7eef59b2ae","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.9.0_1785964812524_0.45743487213551437","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@angelkurten/specforge","version":"0.10.0","license":"MIT","_id":"@angelkurten/specforge@0.10.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"9c58fe86a268b02b6e48affd00674b988a3389d9","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.10.0.tgz","fileCount":71,"integrity":"sha512-p2983fELdBOr3eihLdCh3TkVoySbC81Bd/F9gxsQpaHx0Ic6rCYkvuJAjQvYppxJPNhF+FYQSnyX3cMWAGfa8Q==","signatures":[{"sig":"MEUCIQD3YOjIKWOFgQoPqrZl0fOYAa2rTt/7f1FCNicAH4YmQgIgToylG2dZtZ9SY0swBaXSYw2D5Vzc+2l+MAoXp3jjcAY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":411232},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"4034159a5649c637bf8f1ce693f63898a7ec95ca","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.10.0_1785976331734_0.1733320962884526","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@angelkurten/specforge","version":"0.11.0","license":"MIT","_id":"@angelkurten/specforge@0.11.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"f7dba987ea177f9a433edbd118986dbdb3bfe88f","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.11.0.tgz","fileCount":73,"integrity":"sha512-HyAhKT6K01yOpCEaCYy9gO4VKPmdLdfz8aAQjH8K37V2G7y7lcSDnjLzP9m9vDNvpPvnzY6C3Kg+ilPX75zZ3w==","signatures":[{"sig":"MEYCIQDtVZaGkNv8+EQFEBOvBPzTnuBfO4/Gr9iXplLRnOJxEwIhAJO37D1AZRnEAktt10VjmBrl7jSOrihZkPCHMUW6UtuO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":467719},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"0147caa9c1cc82e0fce9e48e4eac3311777b2a38","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.11.0_1786308846755_0.2679700952201465","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@angelkurten/specforge","version":"0.12.0","license":"MIT","_id":"@angelkurten/specforge@0.12.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"09a2a509c59ffeabc2ef195ae10050eff510909a","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.12.0.tgz","fileCount":73,"integrity":"sha512-vC5uA7MLlHImAo6bwI+l+WUZYdWJcx/TtnYbZaAMbIQDrEScfF/vdg0x0f4sYrXFm3/MafJx9Hi56uHrTDmoZA==","signatures":[{"sig":"MEUCIQDavkk1KDWWmHXfOtmkrPO8QkYZe2BrVzAwMpYNfoiRWAIgYH5Rgyy9EDgBlUi7ttO/Rh3zaBNPOqrsITwlK5Q2SfM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":473262},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"46c4ccb1df9d4536955d23e89e47d70d0ec17735","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.12.0_1786322039320_0.9769694607042414","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@angelkurten/specforge","version":"0.13.0","license":"MIT","_id":"@angelkurten/specforge@0.13.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"4de91966ad4752c62c94a4ffe7261747cac54a77","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.13.0.tgz","fileCount":75,"integrity":"sha512-Hjvzm9pkdH1mF+Wbn6Rv+/IB/tjlkRhTV1bu9nnMifemTV99FAGm4dRk35ZMKLvtfaQ6OTxRQQU1xXebmjm2Vg==","signatures":[{"sig":"MEUCIEDAX9SNrTMPPEbNj7oCfMt+n2CNHvmv+IohH58yLOs/AiEAyBDrc/CHMtAVrbvYtjIPFeFkCppzLvU6aY6R61uLMZk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":522028},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"bdff416ca4a24e05a5b2caeef492c40793c38340","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.13.0_1786667228488_0.5128960029095346","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@angelkurten/specforge","version":"0.14.0","license":"MIT","_id":"@angelkurten/specforge@0.14.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"788ae6f215f98fd693cc4bcd07b53d0e22a59ef5","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.14.0.tgz","fileCount":75,"integrity":"sha512-6TyR78q0tOW8OCYETlDjjiwj9CXfl5qkqQrp1gueGEFYdiuXdvYdVr9Kzjq6QwhqP6WnD9SZu74U1iaVeX/gZA==","signatures":[{"sig":"MEQCIBB2o46Xi3zdblbo7P/WflBU4KYR5KowKd9T80PmzAK6AiACdCG1bi76CUeKhoAmHSnd5VjnWKNnCaWE20YzGb8QFA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":522159},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"08dc49d6a097692c8168377dcb1cc2c53b01aecc","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.14.0_1786677578343_0.3648854202990608","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"@angelkurten/specforge","version":"0.14.1","license":"MIT","_id":"@angelkurten/specforge@0.14.1","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"6c9af948a5fc7874c2928d73caf0f0caa6b7eb8b","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.14.1.tgz","fileCount":75,"integrity":"sha512-0kOy8MIpkCeqDGqcqvqiAd5fXpGMkPY2ykGAwmc0+6m2mD2TE3lXBO//KHBlmSX87IzKvn/iTp2NgFJ69L1URg==","signatures":[{"sig":"MEYCIQCgu2iqM9YHRRz/0qrkhrUe8AfiHqx0GpMo9+G27jY/qQIhAOWTce593B1h7zE63IJiJPqmdWxM/aTr0/eTuDY+kWjO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.14.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":523894},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"97bf912241d71f2671f295524564503c7dfbfa16","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"_npmOperationalInternal":{"tmp":"tmp/specforge_0.14.1_1786679994936_0.5392821190918335","host":"s3://npm-registry-packages-npm-production"}},"0.15.2":{"name":"@angelkurten/specforge","version":"0.15.2","license":"MIT","_id":"@angelkurten/specforge@0.15.2","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"2b6080ade9fa6c40b9eb6bc3dd6c5c0a317f3aed","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.15.2.tgz","fileCount":315,"integrity":"sha512-lrjtSQP62sYFdBlsPFlJ4p4Pz+Q4m82dUK5nLzPdGYIAxYZ7MJsp2IotsuLvzdV+XD+UM2u0clTMTsIwvwL1WA==","signatures":[{"sig":"MEYCIQD7WxrKGBICyoBB0VxHYPmQSfVJ9gQk95+v8dZLgyan8QIhAPw5hLZBlgHCgN/+s3uEm3nNWU0POWc8O+AxTOjlSO/u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.15.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1276037},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"29ddbbee636ba606c5bf88ef0f52ee48004197ce","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.15.2_1786733969376_0.6740988772387166","host":"s3://npm-registry-packages-npm-production"}},"0.15.3":{"name":"@angelkurten/specforge","version":"0.15.3","license":"MIT","_id":"@angelkurten/specforge@0.15.3","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"71f4b0847efde3a029a78058c91b1b0be87b456d","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.15.3.tgz","fileCount":315,"integrity":"sha512-K7Iu7hgdoeU4W7kI+r6WqpPkhZ1IO79xk1wqIdn0QjDbcnb27FPFCDddz+Wh7iGmHAqtt0uPBS270VHdbNiIXw==","signatures":[{"sig":"MEYCIQCyPhq/RFohqXyWLeiYRLzay5cIZRpcYEps6RICrkqiBwIhANAe+vk2PKnqHLNJ2UGqSQCuoxDG0ObMXi1UbIcZzkt2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.15.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1277681},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"f136be23211be8f87a86bd2acfac13bbb8716231","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.15.3_1786742680959_0.32140964951615647","host":"s3://npm-registry-packages-npm-production"}},"0.15.4":{"name":"@angelkurten/specforge","version":"0.15.4","license":"MIT","_id":"@angelkurten/specforge@0.15.4","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"5705698a49218a1f2c09a4380ad1f0dd21cec2bd","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.15.4.tgz","fileCount":315,"integrity":"sha512-88kAyW0qmesjpC+GjUEfLOuo0ZO98KUItPfnrBTb2YC7aNX1De/0zmaE8uJ15eeIkNB+//0I7pDnGyeo0Cx1Fw==","signatures":[{"sig":"MEYCIQC0CyZB/3veaqv1nTRyvobRRu1r4gu/2B+V2nkEdppUggIhAP47YE3EpQ1OzHsdG3m3OX1JSPQM3LWU/dfOhLhJk8xZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.15.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1279281},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"a7446bf04c45d5d94ce33cfcea072511b6a90300","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.15.4_1786743621565_0.06089593415245953","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@angelkurten/specforge","version":"0.17.0","license":"MIT","_id":"@angelkurten/specforge@0.17.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"772132de3a776f1bf23613d7ae02bc70f3c38e53","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.17.0.tgz","fileCount":315,"integrity":"sha512-g3YCC/qfzSY43obQuPGkWquiYcb+ZNPpR/lq4TH/1DED36raBRCNg/ppqVhXxfUYNlOETEb4zCNwI8h3TGwwqw==","signatures":[{"sig":"MEUCIQDTZDQ032x+N3uMkzSC5RAly7GxgPoC0/RaKRUYdTY1MwIgUd0INIxAeoR6bAXF+w3kqCCELLga/PCeSLlWsAmNmF0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1288157},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"31f4783affd8e1ba78b7704c97882a1fda279b36","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.17.0_1786810600793_0.03461591489205973","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@angelkurten/specforge","version":"0.16.0","license":"MIT","_id":"@angelkurten/specforge@0.16.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"04d89eb59f18df593ed1e785044ed299bfaa0fd7","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.16.0.tgz","fileCount":315,"integrity":"sha512-2f/OOarIjt5MKWaomH/Jzlmq8pp+Z7FTcLddtT7LpQzxrdKvALNok+8VC6lwX+2SnyZ2E1A2vM21m/wGvSywCA==","signatures":[{"sig":"MEYCIQDxw6obN8Cbv6dq+lDPZQkKjlWvWnRCRmmfvnA7SwG0EQIhAJo1O95PpA1CdUoht4EHiHXRAxoM45sGgaAUxQutqpyT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.16.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1285292},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"0c751ac79045f908cf10463dc1dff0041d540fe2","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.16.0_1786810602380_0.2764698828802903","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@angelkurten/specforge","version":"0.19.0","license":"MIT","_id":"@angelkurten/specforge@0.19.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"15791138dd54ae485919af5b7ed719963a527fad","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.19.0.tgz","fileCount":315,"integrity":"sha512-1E2QAYe2MXApsGJpS//hUAvQ6UV0A4LfFbJUJrOwxIXk33R+1+8DQdWTgLzrjXEVJKH5AIiKf/he93C1hS7n/Q==","signatures":[{"sig":"MEUCICqtJ61shzNhsB5PNcBiUlhdXvwv5xxn7/raSfWGj2efAiEA2uEHJaTr2ckJXDrtfF1h3ax3giGW4PMs6nDVWwO1cSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1314111},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"022e00cf451e9f7f79d823c499774a8225a2da98","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.19.0_1786918358397_0.46213895973273433","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@angelkurten/specforge","version":"0.18.0","license":"MIT","_id":"@angelkurten/specforge@0.18.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"f7241fb565fec29fcbc523ebe1e5a40832fb1c9e","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.18.0.tgz","fileCount":315,"integrity":"sha512-6uCwTCc8sl0T68xy9yhf87r5GpkyQkr+TCfbRfSZ1Muf4CzbdOs2KdbD9gtJQDAkARsCLHdfJEf2Tld0q6YS5g==","signatures":[{"sig":"MEYCIQD02fO0hBhHg+TcnotwbIXhnNzv5qzAVOXXfKGS+QA0YAIhAIyufY+6667DrZqk5ffTBG531uMLnkybYRG4mtJ9rv+w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1310285},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"3cd6ba0840b5f7a5d6324bc5d082280faa8f00e6","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.18.0_1786923220413_0.6294660933707048","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@angelkurten/specforge","version":"0.20.0","license":"MIT","_id":"@angelkurten/specforge@0.20.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"6e08c114b735931a5bc211c38c2262b197b21adf","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.20.0.tgz","fileCount":315,"integrity":"sha512-V6ZgLptgpLBWHUGaSk03UMubWR3V2kj1tINyHPVoW1rkwfjv1p1r8/eanbdyDxbHI2pfkORuXSey1gF/jV+jbA==","signatures":[{"sig":"MEUCIEEF6USOC4DufJgvn4ydJyCsvAPJH9pqfZSFzaoGD+utAiEA4EOpqI+WyTGFcEngq/8dysmnsdHwWIkmLDqXzVF98HM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1316599},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"f66b3aef527390ad43ee91f8b72fb5793d43ab69","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.20.0_1786933085329_0.5107078063528132","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@angelkurten/specforge","version":"0.21.0","license":"MIT","_id":"@angelkurten/specforge@0.21.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"99cc2715c7ccdf8728ea0208920fe839f0d4f7d7","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.21.0.tgz","fileCount":315,"integrity":"sha512-uqUBCFIg6Nmtoo9gIO426DUf6d0/m0978n0MNxuU9rMrqVKwF/c9yVeU+w5qSiIGtNM4PiRwMg6Sy1x1rRm7jA==","signatures":[{"sig":"MEQCIFySq/Pn5COZ3lqlQrvsO1t43au50KVypUpXq1xNgd0rAiAT2YVoe7BtBv3EzR2DprIzi7gcvIuJIrqeLk6zT9eJtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1319387},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"e5f712d679834594a37a9a14bbea7189c7a980bc","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.21.0_1787003190892_0.26364044182897706","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@angelkurten/specforge","version":"0.22.0","license":"MIT","_id":"@angelkurten/specforge@0.22.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"53eed73a0d55778253dc6620e5ab6019d695d729","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.22.0.tgz","fileCount":315,"integrity":"sha512-wdELp06e1WWltZCb1okntLRzylA1yoWsqYp9qQ8uLiaAh0ZZspvAXZGnbJM9bG7f1uVONh3U+1sPCUx/1JJChg==","signatures":[{"sig":"MEUCIQDM1l2cdfet+dAs7IThPBM1bkDAvL2FMNiIABzSJbOL3gIgBMqz/BLIrjYWjStuk77L0nG9g5n8SatYIpFdcBrjhD0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1319611},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"8e5cb103ff077165b6a4019afd89ee0cb69a781d","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.22.0_1787594167547_0.8728865619718469","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@angelkurten/specforge","version":"0.23.0","license":"MIT","_id":"@angelkurten/specforge@0.23.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"2021bc9eb13f394b6eeac8dae5f690ae27536cc7","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.23.0.tgz","fileCount":314,"integrity":"sha512-0TZT6gf5Ed94mNoRE1S3ZcjrKsUIITarRFLS4wwIg9FgHtOT8DkS26jhZ/mrrQXG40rkXIVxFoBElLFGyRBKVA==","signatures":[{"sig":"MEUCIEuqq4rKUvfLHjNDzEbquncxcOxlZQApF1bRp56QZhURAiEAhuLpdldm65b6OOSVTKHkmfbPlXpfJP+Z3aWTTEZ67RI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID3b4HQIhLlUKb+1Mdtxe0QWkD9GibCZBpLFq4HPyaVzAiA1vUOeneLVtrYIK0l94Uq1VEekyI4nRalg83PxCUHZZA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.23.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1309931},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"16d74386e0023b53997b11b9fbc63d869ab1bcf9","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.23.0_1788060304980_0.4451396652829538","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"@angelkurten/specforge","version":"0.24.0","license":"MIT","_id":"@angelkurten/specforge@0.24.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"be9169326d152f78490b24cc96f7ebddcff8fe9f","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.24.0.tgz","fileCount":314,"integrity":"sha512-59b8J58wm+rZoB1gzb4xCOkSRr+ZcE0AqFkULfHq9lBhFhzxWpX+R75DnMHMEeQ/FYrQ3/N0xViDclYlP+cjfg==","signatures":[{"sig":"MEYCIQDdqNsmNyVp3uXmTIO5o8Z6cXFtokYNaU8jTa/1o0w12gIhALHHpQtAZjca/yDg6UnpSBv1vPrY2AnQXu9FAXungkHW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHjLSW+/lGzCmVBMaPfU9LvjGowH3cEfFPHKkRbkIuwzAiEA9iZ00zk8dc0M88YwSh1ErVzfyIeTDXEA7bsPkg/uzYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.24.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1301701},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"56e141fdd47b80bce168839c29318c0e79a8e335","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.24.0_1788413947023_0.5905516967916771","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@angelkurten/specforge","version":"0.25.0","license":"MIT","_id":"@angelkurten/specforge@0.25.0","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"homepage":"https://github.com/angelkurten/specforge-framework#readme","bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"bin":{"specforge":"dist/src/cli.js"},"dist":{"shasum":"8abff8166296011f02e0eccb808e06dcb56a22a3","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.25.0.tgz","fileCount":314,"integrity":"sha512-djPW08L+5LkxLT+4XKy+gquDedBAaHcEoYeettIIfBmOAaKbQijVW4kMVcLdnAPwRuFge/KbZiMQIUN9BEdfTQ==","signatures":[{"sig":"MEQCICZkprfZ/4Zeyf5MVwXVgGeZs8iHVuBfJ4lN2IJzBBM1AiByYEcwF8l2ASM7BGQRikUXMLoG3taefcRgSBsTs144JA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCEjMKcag4xPelM8VXYQrQzY3oG+Q7VF0LmJlHVK66otQIhALXH30CHCFCXzOEGBuAKkOaNBB9mTWasojWVGsvTOnH7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.25.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1303628},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"1ee9adc7f1e23d408606871cc1dbe4a4429890ed","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0","diff3":"0.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["diff3","yaml"],"_npmOperationalInternal":{"tmp":"tmp/specforge_0.25.0_1789103871594_0.7815148959895097","host":"s3://npm-registry-packages-npm-production"}},"0.27.3":{"_id":"@angelkurten/specforge@0.27.3","bin":{"specforge":"dist/src/cli.js"},"bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"dist":{"shasum":"da163e02297c17587e5424454b400e0f86dbe803","tarball":"https://registry.npmjs.org/@angelkurten/specforge/-/specforge-0.27.3.tgz","fileCount":309,"integrity":"sha512-gMiYiNsIMjPeVBDzdoTlQjo0MmMwNZ/tl+bp8iBxZENOYyu4K8pwd0ViNcTBb3cbcQ7C6iB1ADwbQ+WGpsUxBQ==","signatures":[{"sig":"MEUCIEFfqaDKKXyYzvwrMUwNWraWAa82+XkU3GW/nsjbHNIQAiEA7LiyuIIYa+wEsL7wNaH2ncxWbtwN0FTXsVuZ+2jXGGc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCWbghlY7jONs/BqO4NmbAAzKoz08tvmDaX3JSEFMpvqQIhAL5UnPZn9hV0lKEx+kK61P6tlU4P5+A8UT95axRrF3GS"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angelkurten%2fspecforge@0.27.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1358329},"name":"@angelkurten/specforge","type":"module","engines":{"node":">=20.0.0"},"gitHead":"8eed94c638bcc60794d6cde5bb48bf040851541f","license":"MIT","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && tsc -p tsconfig.scripts.json","prepack":"npm run build && npm run prepublish","prepublish":"node dist-scripts/scripts/prepublish.js","prepublishOnly":"npm run build && npm run prepublish"},"version":"0.27.3","_npmUser":{"name":"angelkurten","email":"angelkurten@hotmail.com"},"homepage":"https://github.com/angelkurten/specforge-framework#readme","repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"_npmVersion":"10.9.8","description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","directories":{},"maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"yaml":"^2.5.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":true,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^20.12.0"},"bundleDependencies":["yaml"],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/specforge_0.27.3_1790132169273_0.5300394582449557"}}},"time":{"created":"2026-07-08T16:41:28.931Z","modified":"2026-09-23T02:56:09.803Z","0.7.0":"2026-07-08T16:41:29.366Z","0.7.1":"2026-07-08T18:21:21.027Z","0.8.0":"2026-07-27T23:21:33.429Z","0.9.0":"2026-08-05T21:20:12.716Z","0.10.0":"2026-08-06T00:32:11.899Z","0.11.0":"2026-08-09T20:54:06.934Z","0.12.0":"2026-08-10T00:33:59.482Z","0.13.0":"2026-08-14T00:27:08.647Z","0.14.0":"2026-08-14T03:19:38.493Z","0.14.1":"2026-08-14T03:59:55.082Z","0.15.2":"2026-08-14T18:59:29.543Z","0.15.3":"2026-08-14T21:24:41.137Z","0.15.4":"2026-08-14T21:40:21.722Z","0.17.0":"2026-08-15T16:16:40.966Z","0.16.0":"2026-08-15T16:16:42.564Z","0.19.0":"2026-08-16T22:12:38.555Z","0.18.0":"2026-08-16T23:33:40.543Z","0.20.0":"2026-08-17T02:18:05.468Z","0.21.0":"2026-08-17T21:46:31.024Z","0.22.0":"2026-08-24T17:56:07.728Z","0.23.0":"2026-08-30T03:25:05.083Z","0.24.0":"2026-09-03T05:39:07.125Z","0.25.0":"2026-09-11T05:17:51.712Z","0.27.3":"2026-09-23T02:56:09.365Z"},"bugs":{"url":"https://github.com/angelkurten/specforge-framework/issues"},"license":"MIT","homepage":"https://github.com/angelkurten/specforge-framework#readme","repository":{"url":"git+https://github.com/angelkurten/specforge-framework.git","type":"git","directory":"tools/cli"},"description":"CLI for installing, updating, validating, and migrating specforge framework layouts.","maintainers":[{"name":"angelkurten","email":"angelkurten@hotmail.com"}],"readme":"# specforge\n\nA framework for writing rigorous specifications (PRDs and ADRs) with AI as the primary author. Stack-agnostic, domain-agnostic, human-in-the-loop.\n\n**Documentation:** [angelkurten.github.io/specforge-framework](https://angelkurten.github.io/specforge-framework/)\n**Also available in:** [Español](README.es.md)\n\n## What it is\n\nspecforge is an opinionated workflow and a set of templates for teams that use AI to draft design documents and want the output to be as careful as if a senior engineer had written it. It treats the AI as a drafting author, not a vibe-coding sidekick, and it pays for that with structure: grounding before writing, multi-reviewer critique anchored to real code, a hard gate between `Draft` and `Implemented`, and a single source of truth for current system state.\n\nIt distinguishes four kinds of documents and refuses to let them drift into each other:\n\n| Document | Purpose | Lifecycle |\n|---|---|---|\n| **PRD** | A long ADR with implementation detail. What to build and how, for one feature or change. | Historical snapshot. Frozen at `Implemented`. |\n| **ADR** | A focused architectural decision with alternatives and trade-offs. | Historical snapshot. Frozen at `Accepted`. |\n| **`SYSTEM_ARTIFACT.md`** | Current state of one sibling project, organised by domain. One file per project that needs it; lives inside that sibling, not in specforge. | Living document, updated when a PRD that impacts the project ships. |\n| **`ROADMAP.md`** | Product-level intent: problems, users, evidence, status, horizon. One global file at the specforge root. No technical detail. | Living document, mutable across generative cycles and PRD ships. |\n\nThe load-bearing distinction: **PRDs are not living docs**. A PRD marked `Implemented` is a frozen record of what the team decided and shipped at a specific commit. To learn what the system does *today*, read `SYSTEM_ARTIFACT.md` or the code. To learn *why* something was built the way it was, read the PRD that introduced it.\n\n## What specforge is opinionated about\n\nSix principles, each enforced by rule files in [`.claude/rules/`](.claude/rules/) and format references in [`CONVENTIONS.md`](CONVENTIONS.md):\n\n1. **Ground before drafting.** Never invent endpoints, tables, functions, or config keys. Verify each reference against real code, or mark it explicitly as new.\n2. **PRDs are historical snapshots, not living docs.** Promoted PRDs are frozen. Design evolution happens in a new PRD that declares `Supersedes:` against the old one.\n3. **Multi-reviewer critique anchored to code.** Four parallel reviewers (backend, frontend, security, quality — adapt to your domain), each briefed with links to real code, reporting with explicit severity 🔴🟡🟢. Reviewers with no ground-truth anchor are just correlated opinions.\n4. **A hard gate between `Draft` and `Implemented`.** A PRD cannot be promoted without a YAML gate block carrying `commit_hash`, `tests`, and `system_artifact_diff`. No exceptions.\n5. **Mermaid only for diagrams.** No ASCII art. Markdown tables and nested bullet lists are not diagrams and remain valid.\n6. **`SYSTEM_ARTIFACT.md` is the single source of truth for current state.** The gate in #4 is what keeps it honest — you cannot ship a feature without updating the living state doc.\n\n## Who should use specforge\n\nAdopt it if:\n\n- You use AI as the primary author of design docs, not just as a code assistant.\n- Your specs have to be coherent across multiple people, services, or phases.\n- You have been burned by AI-generated docs that were internally plausible but contradicted the actual code.\n- You want one file (`SYSTEM_ARTIFACT.md`) that a new engineer can read to understand what the system does today.\n\nDo not adopt it if:\n\n- Your specs are single-author, single-session, and never leave your head.\n- You prefer to iterate in code and treat docs as optional.\n- You need a lightweight README generator or a simple PRD template with no process around it.\n\nspecforge trades speed for coherence. If you do not need coherence, the ceremony will slow you down.\n\n## File layout\n\nspecforge is designed to live **as a sibling directory to the code repositories it describes**, not as a subdirectory of any one of them. A typical team layout:\n\n```\n<your-org>/                         ← repo root (monorepo or parent of sibling repos)\n├── specforge/                      ← this framework\n│   ├── README.md                   ← you are here (English)\n│   ├── README.es.md                ← Spanish version of this README\n│   ├── CLAUDE.md                   ← 47-line pointer file (mental model + TOC), auto-loaded\n│   ├── .claude/\n│   │   ├── rules/                  ← behavioural rules, loaded alongside CLAUDE.md\n│   │   │   ├── hard-rules.md       ← the 16 invariants (unscoped)\n│   │   │   ├── workflow.md         ← 9-step authoring process (unscoped)\n│   │   │   ├── gate-block.md       ← Draft → Implemented gate (unscoped)\n│   │   │   ├── prd-authoring.md    ← required sections, naming (unscoped)\n│   │   │   ├── roadmap.md          ← roadmap cycle + evidence + PII carve-out (unscoped)\n│   │   │   ├── adr-specific.md     ← loads only on ADR-*.md\n│   │   │   └── framework-maintenance.md  ← loads only on framework files\n│   │   └── agents/specforge/       ← 14 subagent definitions: 4 reviewers + 4 roadmap generators + 4 critics + 2 implementers\n│   ├── CONVENTIONS.md              ← format reference: shapes, naming, diagrams\n│   ├── SIBLINGS.md                 ← team-mutable registry of sibling projects (fill in on day 1)\n│   ├── ROADMAP.md                  ← team-mutable product-level intent (one global file, living)\n│   ├── LICENSE                     ← MIT\n│   ├── templates/\n│   │   ├── prd.md\n│   │   ├── adr.md\n│   │   ├── agdr.md                 ← optional Agent Decision Record (rare)\n│   │   ├── roadmap.md              ← blank starter for ROADMAP.md\n│   │   └── system-artifact.md      ← blank template; goes inside a sibling, not here\n│   ├── examples/\n│   │   ├── prd-001-login-example.md\n│   │   └── system-artifact-example.md   ← example SYSTEM_ARTIFACT for one sibling\n│   ├── scripts/\n│   │   └── prd-check.py            ← pre-panel PRD validator; workflow step 4 runs it\n│   ├── tests/\n│   │   └── roadmap/                ← 32 conformance walkthroughs for the roadmap cycle\n│   ├── NNN-your-prd.md             ← your PRDs live at the specforge root\n│   └── ADR-NNN-your-adr.md         ← your ADRs too\n├── api-service/                    ← sibling project (example — a backend)\n│   ├── CLAUDE.md                   ← project-specific rules (stack, lint, test conventions)\n│   └── docs/\n│       └── SYSTEM_ARTIFACT.md      ← living state for api-service; referenced by PRD gate blocks\n└── web-client/                     ← sibling project (example — a frontend)\n    ├── CLAUDE.md                   ← project-specific rules\n    └── (no SYSTEM_ARTIFACT — UI-only, grounded from code directly)\n```\n\nThe **Sibling projects registry** in [`SIBLINGS.md`](SIBLINGS.md) is the directory of everything specforge knows about — each PRD's `Impacted Projects` table must reference only projects listed there, by name. `SIBLINGS.md` is team data; the rest of the files are framework data that `npx @angelkurten/specforge update` refreshes in place without touching your registry.\n\n## Adoption via npx\n\nThe fastest way to install specforge is the npm CLI — no clone required:\n\n```bash\nmkdir specforge && cd specforge\nnpx @angelkurten/specforge init\n```\n\n`init` scaffolds the complete framework layout (rules, templates, agents, examples), writes editable stubs for your team data (`SIBLINGS.md`, `ROADMAP.md`), and records `.specforge/manifest.json` — the installed version plus per-file hashes used for drift detection.\n\nLifecycle commands, all run from the specforge directory:\n\n```bash\nnpx @angelkurten/specforge update    # refresh framework files in place; team data files are never touched\nnpx @angelkurten/specforge doctor    # validate the installed layout: hard-rule validators + drift detection\nnpx @angelkurten/specforge migrate   # apply versioned, idempotent migrations between framework versions\nnpx @angelkurten/specforge version   # report bundled vs installed framework version (--json adds a drift boolean)\n```\n\nRequires Node.js ≥ 20. The package is published exclusively from CI with [npm provenance](https://docs.npmjs.com/generating-provenance-statements); after installing it as a dependency you can verify the attestation with `npm audit signatures`.\n\n## Reinforcing delegation on Claude Code\n\nWorkflow steps 2, 5 and 9 fan out across sub-agents, and [hard rule 14](.claude/rules/hard-rules.md) makes that a standing request rather than something you re-ask for every session. Some Claude Code builds ship a default that withholds automatic delegation until the user asks for it, which lets the lead agent run a \"panel\" inside a single context — four reviewers that are one opinion restated.\n\nIf you see that, repeat the request on every prompt with a `UserPromptSubmit` hook — in `~/.claude/settings.json` for all your projects, or the specforge repo's `.claude/settings.json` for the team:\n\n```json\n{\n  \"hooks\": {\n    \"UserPromptSubmit\": [\n      { \"hooks\": [{ \"type\": \"command\", \"command\": \"printf '%s' '{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"UserPromptSubmit\\\",\\\"additionalContext\\\":\\\"specforge hard rule 14: workflow steps 2, 5 and 9 dispatch real sub-agents via the Agent tool. Never run a grounding pass or a reviewer panel inline in the lead context.\\\"}}'\" }] }\n    ]\n  }\n}\n```\n\n`init` does not write this file and `update` never touches it — settings are team data, not framework data. Naming a reviewer explicitly at the prompt (`@\"specforge-backend-reviewer (agent)\"`) is deterministic too, but it only covers that one prompt.\n\n**Restart once after the first install.** If your repo had no `.claude/agents/` directory before, Claude Code registers the 14 definitions only after one session restart. Later edits to them hot-reload; this caveat applies to the first creation of the directory only.\n\n## Turning the panels off\n\nThe 14 definitions are registered subagents the host model can delegate to on its own, outside the workflow — the four reviewers hold `Bash` so they can walk a diff and `WebFetch` so they can check a changelog or advisory against its live source, and the two implementers hold `Edit` and `Write` on top of that same `Bash`/`WebFetch` pair, since an implementer changes a sibling's code rather than only reading it. A mis-delegated reviewer therefore holds shell access and live network access at once; a mis-delegated implementer holds those plus the ability to edit and write a sibling's repo outside any reviewed workflow step — strictly worse. There is no frontmatter off-switch; `permissions.deny` is the only capability-level control. **If you do not run the review or roadmap panels, deny them**, and if you want to keep running the panels but block auto-delegation to the implementer roles specifically, deny just the two `*-implementer` entries below — in `.claude/settings.json` (or `~/.claude/settings.json`), dropping whichever entries you do run:\n\n```json\n{\n  \"permissions\": {\n    \"deny\": [\n      \"Agent(specforge-backend-reviewer)\",\n      \"Agent(specforge-frontend-reviewer)\",\n      \"Agent(specforge-security-reviewer)\",\n      \"Agent(specforge-quality-reviewer)\",\n      \"Agent(specforge-roadmap-market-generator)\",\n      \"Agent(specforge-roadmap-ux-generator)\",\n      \"Agent(specforge-roadmap-product-generator)\",\n      \"Agent(specforge-roadmap-support-generator)\",\n      \"Agent(specforge-roadmap-evidence-critic)\",\n      \"Agent(specforge-roadmap-risk-critic)\",\n      \"Agent(specforge-roadmap-devils-advocate-critic)\",\n      \"Agent(specforge-roadmap-opportunity-cost-critic)\",\n      \"Agent(specforge-backend-implementer)\",\n      \"Agent(specforge-frontend-implementer)\"\n    ]\n  }\n}\n```\n\n`permissions.deny` is also the one control that reaches a definition installed at user scope (`~/.claude/agents/`), which no repo-scoped check can see.\n\nTo attempt to bound where all fourteen `WebFetch`-holding definitions may fetch from, pair an `allow` entry for the domains you trust with a blanket `WebFetch` deny in the same `.claude/settings.json` — the `allow` half alone only pre-approves a domain and does not itself block any other:\n\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"WebFetch(domain:example.com)\"\n    ],\n    \"deny\": [\n      \"WebFetch\"\n    ]\n  }\n}\n```\n\nTwo caveats. The rule is session-wide, not per subagent — all fourteen definitions (four reviewers, two implementers, eight roadmap roles) share one list, and so does the main session. And whether this `allow`+`deny` pairing actually *restricts* fetches to the allowed domain, rather than the more specific `allow` merely taking precedence for that one case with the blanket `deny` doing nothing else useful, is **unverified**: Claude Code's precedence for this combination was not established when this was written. Treat the rule as scoping you should confirm against your own Claude Code version, not as a sandbox you already have.\n\n## Quickstart\n\n1. **Copy specforge into your repo** (or run `npx @angelkurten/specforge init` — see [Adoption via npx](#adoption-via-npx)), or keep it as a sibling directory that your AI tools can read. The files consumed automatically by Claude Code are `CLAUDE.md` (framework entry point — mental model and pointers) plus the unscoped rule files under [`.claude/rules/`](.claude/rules/) (hard rules, workflow, gate block, PRD authoring). Everything else is referenced from them.\n\n2. **Bootstrap on day 1 — in this order, before your first PRD:**\n   - **Decide where specforge lives** in your repo topology — as a top-level directory in a monorepo, or as its own repo cloned under the same parent as your code repos. Either works; both satisfy the `../api-service/` relative-path convention.\n   - **Fill in [`SIBLINGS.md`](SIBLINGS.md).** List every code repository your team maintains that PRDs will reference: project name, relative path, where its `CLAUDE.md` and `SYSTEM_ARTIFACT.md` live, stack summary, and `Status: active`. This is a prerequisite for the grounding step of the workflow.\n   - **Bootstrap each service-heavy sibling's `SYSTEM_ARTIFACT.md` inside that sibling** (typically at `<sibling>/docs/SYSTEM_ARTIFACT.md`). Copy `templates/system-artifact.md` into the sibling and run a one-off Explore pass — one agent per domain. **Incremental adoption is supported**: a team with 10 services does not bootstrap 10 SYSTEM_ARTIFACT files on day 1. Add the sibling to `SIBLINGS.md` with `Read first: CLAUDE.md` only, and the first PRD that impacts it can bootstrap its SYSTEM_ARTIFACT in the same change. UI-only siblings can skip this permanently — they ground from code directly. Do not retrofit PRDs for already-shipped features.\n\n3. **Write your first PRD.** Copy `templates/prd.md`, follow the 9-step workflow in [`.claude/rules/workflow.md`](.claude/rules/workflow.md), and use `examples/prd-001-login-example.md` as a reference for the level of detail expected.\n\n4. **Run the review loop.** Dispatch the four reviewer subagents in parallel by name — `specforge-backend-reviewer`, `specforge-frontend-reviewer`, `specforge-security-reviewer`, `specforge-quality-reviewer` — each with a structured brief carrying `REVIEW_MODE: draft`, the PRD path, the sibling's `CLAUDE.md` path, and the code references to verify against. Consolidate findings by severity. Re-dispatch *only* the domains with 🔴 blockers, with `REVIEW_MODE: re-verification` and a ledger of the findings that reviewer raised — never run a fresh review from scratch after fixes.\n\n5. **Ship as `Draft`, implement, then gate to `Implemented`.** The gate block at the bottom of the PRD stays with `[TBD]` placeholders until all three fields (`commit_hash`, `tests`, `system_artifact_diff`) are satisfied. Update `SYSTEM_ARTIFACT.md` as part of the same change — that is what the `system_artifact_diff` field references.\n\n## Workflow at a glance\n\n```mermaid\nflowchart TB\n    scope[1. Scope the request] --> ground[2. Ground in reality]\n    ground -->|parallel — one per<br/>impacted sibling| siblingsGround[[Sibling Explore:<br/>read its CLAUDE.md,<br/>SYSTEM_ARTIFACT, code]]\n    siblingsGround --> plan[3. Plan the document]\n    plan --> draft[4. Draft]\n    draft --> review[5. Multi-reviewer critique]\n    review -->|parallel — per sibling<br/>× reviewer role| reviewers[[Backend · Frontend<br/>Security · Quality<br/>reviewers in parallel]]\n    reviewers --> decide{Any 🔴<br/>blockers?}\n    decide -->|yes| fixes[6. Apply fixes]\n    fixes --> rereview[7. Scoped re-review<br/>only blocked domains]\n    rereview --> decide\n    decide -->|no| ship[8. Ship as Draft]\n    ship --> userGate{User: implement now,<br/>defer, or resume<br/>a different Draft?}\n    userGate -->|defer| pause([Draft waits in queue])\n    userGate -->|now / resume| impl[9. Implement]\n    impl -->|per impacted sibling| implTeam[[Implementation team<br/>named dispatch, six-field brief<br/>(PRD_PATH + IMPL_MODE + SCOPE + paths)]]\n    implTeam --> postReview[Re-dispatch step 5 panel<br/>post-impl mode, per-sibling diff]\n    postReview --> postDecide{Any 🔴 or<br/>untracked 🟡?}\n    postDecide -->|yes| roundCheck{Fix-round budget<br/>exhausted?}\n    roundCheck -->|no| implFix[Fix in code, or amend<br/>the PRD via the bounce]\n    implFix --> postReview\n    roundCheck -->|yes| escalate{User escalation:<br/>one more round,<br/>stop ungated,<br/>or waive?}\n    escalate -->|one more once| implFix\n    escalate -->|stop| thaw[Stop: PRD stays Draft<br/>and ungated,<br/>reason at the top]\n    escalate -->|waive + HTML comment above fence| siblingsImpl\n    postDecide -->|no| siblingsImpl[[Update sibling's<br/>SYSTEM_ARTIFACT.md +<br/>fill gate block entry]]\n    siblingsImpl --> done([Status: Implemented])\n```\n\nSteps 2, 5 and 9 **fan out across the impacted siblings** — each sibling gets its own Explore agent during grounding, its own reviewer instance (per role) during critique, and its own `SYSTEM_ARTIFACT.md` update during implementation. The review phase (steps 5 → 6 → 7) is **cyclic**: scoped re-review loops back through fixes until no 🔴 blockers remain, then proceeds to ship. After step 8 the workflow pauses at an explicit user-gate — implement now, defer, or resume a previously-drafted PRD — and step 9 closes with a **second cyclic re-review** that runs the same reviewer panel against the *shipped* code (not the draft) before the gate block can be filled.\n\nFull nine-step workflow with rules for each step: [`.claude/rules/workflow.md`](.claude/rules/workflow.md). Hard rules, gate-block schema, and PRD authoring specifics are in sibling files under [`.claude/rules/`](.claude/rules/).\n\n## Upgrading\n\nspecforge uses [semantic versioning](https://semver.org/). Your installed version is recorded in `.specforge/manifest.json`; `npx @angelkurten/specforge version` prints it next to the version the CLI carries. Add `--json` for the same pair plus a `drift` boolean.\n\nTo upgrade, run the CLI from your specforge directory (see [Adoption via npx](#adoption-via-npx)):\n\n```bash\nnpx @angelkurten/specforge update\n```\n\n`update` refreshes framework files in place. **Team data files** (`SIBLINGS.md`, `ROADMAP.md`, your PRDs, your ADRs) are never touched — they only change when you edit them. If you have edited a framework file yourself, `update` halts and reports the drift; pass `--strategy=ours`, `--strategy=theirs`, or `--strategy=merge` to resolve it.\n\n### Upgrading to 0.14.0 — read before you run `update`\n\n**All 14 subagent definitions now hold `Bash` and `WebFetch`.** The eight roadmap generator and critic roles previously held neither, and their entire input is user-supplied evidence — quotes, hypotheses, and competitor URLs a contributor wrote. They can now dereference such a URL and hold a shell while doing it.\n\nGranting the roadmap panel web access is what an earlier security review of this framework rejected. That review deferred the grant and named four structural gaps, none of which was closed before this release: generator output is unfenced, pre-fetch URL screening exists in two of the eight roles, generators have no findings channel, and the injection clause written for the reviewer roles does not cover the roadmap shape. The generators run *before* the critics, so six of the eight can dereference a contributor-supplied URL with no screen at all. `Bash` was granted on top, which the deferred design never contemplated.\n\nThis was accepted deliberately as known, unmitigated risk. The full statement and the gap analysis live in the [release notes](https://github.com/angelkurten/specforge-framework/releases) and the repository's own design records.\n\n**If your `permissions.deny` list left the eight `Agent(specforge-roadmap-*)` identities un-denied on the grounds that they held no shell and no network, that reasoning no longer holds.** Re-read it. `.claude/settings.json` sits outside the framework partition, so `update` will not touch it either way — see [Turning the panels off](#turning-the-panels-off).\n\nThe two implementer definitions also stop restricting `Bash` by category of command in this release; provenance and no-network still bind.\n\n## Language\n\n- specforge itself is written in English so that it is adoptable by any team.\n- Teams adopting specforge may write their PRDs and ADRs in whatever human language they choose. Be consistent within a team.\n- Code, JSON, SQL, config keys, endpoint paths, and file paths are always in English, regardless of the documentation language.\n- Header field names and gate block keys are always in English so that simple grep-based tooling can parse them.\n\n## Origin\n\nspecforge was distilled by [Angel Kürten](https://github.com/angelkurten) from a workflow he developed while building an internal product with AI-authored specs. A critical review of that practice surfaced six concrete improvements over the original rules: treating PRDs as historical snapshots instead of pretending they were living docs, introducing a hard three-field gate between `Draft` and `Implemented`, declaring `SYSTEM_ARTIFACT.md` as the single source of truth for current state, reversing a counterproductive ban on Mermaid diagrams, retiring a cross-reference convention that had zero adoption in practice, and softening a rigid structured-question rule to be contextual instead of mandatory. The framework was then rebuilt from scratch with those six improvements baked in from line 1. It is not a refactor of the original — it is what you would write if you had known all of this on day 1.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","readmeFilename":"README.md"}