{"_id":"sdd-kit","_rev":"29-2e29a58e267d2138da6253a0a3d9d406","name":"sdd-kit","dist-tags":{"latest":"0.10.0"},"versions":{"0.2.0":{"name":"sdd-kit","version":"0.2.0","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.2.0","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/icurbe/sdd-kit","bugs":{"url":"https://github.com/icurbe/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"7549bec3c8626e703e8697f6af7a98d56738c48c","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.2.0.tgz","fileCount":20,"integrity":"sha512-B0u/Lw/KO0qT5reWnsfRnx2iMaR1ZETQxh8ISn0V6dy599NxEiaLqyyICY03yDzdnNGP8jKtj6Lp852AA4s5mg==","signatures":[{"sig":"MEQCICdgBhTN636bK/iZgErQXHBVa6NtOhcfI3mhw9zdDRolAiAIlKo5yxUlEO9MoEVK9qbDDq29kLcCjLlTuUEB7Rurng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104478},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"6a3c0245aa534c16983f6406a75f6092a18db136","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/icurbe/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.2.0_1772750521435_0.6046154137997519","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"sdd-kit","version":"0.2.1","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.2.1","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/icurbe/sdd-kit","bugs":{"url":"https://github.com/icurbe/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"8f020f42fe2b1abe8badc4dabba90f08b70dbcf8","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.2.1.tgz","fileCount":20,"integrity":"sha512-4AKHjz3PfhEdScyY7AOk8U2ZxkWxB1b892r8o1LmiWe+U6BlXbitvnLy7SbWLmLB1PAj2HtsMcUl9EvQGM2RtA==","signatures":[{"sig":"MEYCIQCHolPPntGxMXmS8YxhCRmNpif67qtbGKymkdjTjy6oKAIhAIdtNuL1JHo+QPgUYU+6jxVaHjM3Eh5CWQZKLrBjE6/J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104480},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"887127193a37c884d5a1ac08d230d5a3f2c78cfd","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/icurbe/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.2.1_1772750705114_0.8754789592943957","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"sdd-kit","version":"0.3.0","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.3.0","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/icurbe/sdd-kit","bugs":{"url":"https://github.com/icurbe/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"9638da1edf020ac5ffbed090cf305cfa50926a8c","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.3.0.tgz","fileCount":21,"integrity":"sha512-TyYCNIAcUgrcHDrZOZgVt1BhgDjJPNytc7GWEfWSXXiq6p/FkxcZYL2J8CR0O4r7XdeC5JVM8U9P1MQDc2VEvg==","signatures":[{"sig":"MEUCIChRjHLB3lLom0OhfW9fFZVoVTUEOKvhWT3FIoHDopVYAiEAn+RJQu/cd3clckGeSzAlhDKwPb5W4mJmNFF02efDBgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110896},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"cea21f5d5c6c544b883fa470bc3b85002a1c8deb","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/icurbe/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.3.0_1772756008610_0.7937275237449817","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"sdd-kit","version":"0.3.1","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.3.1","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/icurbe/sdd-kit","bugs":{"url":"https://github.com/icurbe/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"6d75a366c6a3e0b5c9dcb547a926675207a51e8c","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.3.1.tgz","fileCount":21,"integrity":"sha512-2jESgTJMZ+Q9bUDiH+wsaEmAkGVOjqk8a5DHHykQVW1CJDUM4YQMGwNwcEL7gGwMC+5qs38H3vGModqgnoX6Rw==","signatures":[{"sig":"MEQCIFc9Xn0nZFdD+sr2jQ/RW9pfLt9BkHdxavi5gWXzVP8MAiBa26LW5PDWhcIXy5FW4P6YXDWdqE2qP7jxhuiEIyyPaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116142},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"08a3d64bcd231a9380e3719397d787100b1dcd29","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/icurbe/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.3.1_1772811966060_0.5790828318938019","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"sdd-kit","version":"0.3.2","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.3.2","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/icurbe/sdd-kit","bugs":{"url":"https://github.com/icurbe/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"b3ec5372e36345e2394fe8a923470f1ec450ebab","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.3.2.tgz","fileCount":21,"integrity":"sha512-KiimBPGlUKsSYtBlY9fgGtSC6FitQaTmDP9wM6AcsxnZdmvQ4mrzQ5ESMN/7TV1hpWrlZFkuTgcKZdj09Xlx9w==","signatures":[{"sig":"MEQCIDjBKeyxqtfKkw9jsNaV+FVy9/5FV62RxZSLRkIwxHZNAiBOzXDNOUxccmS9geF3GdHjBKgDBZ3EaMjVQfIe+QxnSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116808},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"5015d6ae5235ef211f62a66fbac701caf419b809","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/icurbe/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.3.2_1772813005269_0.9014433819925325","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"sdd-kit","version":"0.3.3","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.3.3","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/icurbe/sdd-kit","bugs":{"url":"https://github.com/icurbe/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"6c224412dd49136c1fdc6e2b718bb002565f416b","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.3.3.tgz","fileCount":21,"integrity":"sha512-SZbj5mwRXnIVvvXyDeENuqc97WdN0kzV8uxIFc8Rbl32DMHdEzJtYlhx6M8rOv/HeCo/lC/8M/P4xhzCYF+t0Q==","signatures":[{"sig":"MEQCIDf/yHJ9HSQ+PDiPSQbdAaR9ytu4QCGVKcrv7/qjWHwQAiBwc/rL4ir8ciPiFu7Cm+VYDz8+QmI9JtZqQoED7grLNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117006},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"2c7ea21bcede0d65f73ef67e0135b63146709563","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/icurbe/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.3.3_1772813955959_0.5907373445943191","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"sdd-kit","version":"0.3.4","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.3.4","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/icurbe/sdd-kit","bugs":{"url":"https://github.com/icurbe/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"ca02fa8c26241cdee8a399bec88b5bd704333b67","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.3.4.tgz","fileCount":21,"integrity":"sha512-MKRDEAsTcPicQP7smXoJ4RINxqO0SZjKqQUeGETW9lOL/3Wy5sYNIBEuXAiF+nQ7ovNnMfJ6vrVqCKVH5ItBvQ==","signatures":[{"sig":"MEYCIQCQ/eY2+diCJB1v2mCjysyZjUrSJ/VC8t6531KJUqR+tQIhANn5doBztLOCGnC7JRsq74kbVekud7hqQyBphkkkOpQs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117023},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"ac594931d85004b8d788b5900a3dc87170ad3c3c","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/icurbe/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.3.4_1772814159925_0.3450165533514369","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"sdd-kit","version":"0.3.5","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.3.5","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/icurbe/sdd-kit","bugs":{"url":"https://github.com/icurbe/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"7e2323fa43cd65156aab20eff0bf77d4d7d6c906","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.3.5.tgz","fileCount":21,"integrity":"sha512-O3HN0cbzwgcqCx4s8W6zsIuewvlRxFF59Fx9wHYQUtWtvh6eH0c6IpNmvn5eFYkwoW928wpz52tnYic48zxPIg==","signatures":[{"sig":"MEUCIQCZ25hlRO0i5TYAdqiLknTO9t3RMOzFLCYxjzSG8nYamAIgGXIKp7Spjnlx1REqm2KGd72dDpncHoXNo0GhjC3wy5Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115658},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"1b4d7ea4a21bb4a2394be5c0cf1adc709ca5eb84","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/icurbe/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.3.5_1773011225633_0.5801519489260454","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"sdd-kit","version":"0.3.6","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.3.6","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/Curbeloi/sdd-kit","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"064dc3af4ce17ac1d0d078be79a1df23f2149d6f","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.3.6.tgz","fileCount":21,"integrity":"sha512-ukrAOZv/3w60q/Zmh3PTsKRq+ml1qna9SjVknVQV8i1KcrZ+BHFxU0rLa53WitXV7ON6U4D+UDU5RLVQcS4SoA==","signatures":[{"sig":"MEUCIQDAnTuTJ51BUm3OAR1CaKxAVpNGUsBzgFjWMsm8G7Wj/QIgPtJKY/G3hiNEUND8ZQqrsjRycgMee3dYRR1gLwtLgJE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117368},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"1b4d7ea4a21bb4a2394be5c0cf1adc709ca5eb84","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/Curbeloi/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.3.6_1773673877565_0.490224554175539","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"sdd-kit","version":"0.4.0","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.4.0","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/Curbeloi/sdd-kit","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"a48ecca6a7ed3ead45c967353088331a983f3148","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.4.0.tgz","fileCount":33,"integrity":"sha512-2W2EpstCvA+LknxiF34Z/JF3t9NyM6TIoAtTBmaJQXHy5jqMz3JApnO0xMP+VRnt0U+OU7pvsVQVSnC0oQSW8w==","signatures":[{"sig":"MEQCIFe9KAsvvxMnCvNaxz8xeCRLHCHBWXW0YJ+RWDGxOQprAiAdOy1t8N1hP1YlLab+ntbRmRULnT2FicgxTfYv9/teig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146699},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"6be46f715b5952a97d71a8e5037713c4eba560f5","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/Curbeloi/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.4.0_1774296348640_0.2022101319242835","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"sdd-kit","version":"0.4.1","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.4.1","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/Curbeloi/sdd-kit","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"b7724d1cabab0ce2e9f8571ce8d48d81fb3e3936","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.4.1.tgz","fileCount":33,"integrity":"sha512-NH3qtAuWoG57ORXO50OnN8EhV7wR/0C5DJYUKjlTh99UervsDDkxNxGwy2Lkis09OBF3rE45sB713YUWjRAyzg==","signatures":[{"sig":"MEYCIQDesRd13V8SXmINjEqGHhmabRJVCBBa1emgZKFpB82vrgIhANhMeKk3LiDo4k3V8Nd9nXBW5VgVjtiHmAEHcxOvixxF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149442},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"cafebfa6ebd514c46a1720eb73346d49dffe20a0","scripts":{"test":"node --test src/**/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/Curbeloi/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.4.1_1774296701742_0.8129599375842149","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"sdd-kit","version":"0.6.0","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.6.0","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/Curbeloi/sdd-kit","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"b1c149fe3dd4217d26a06cc872ae264b06da6f5c","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.6.0.tgz","fileCount":36,"integrity":"sha512-FYVDcoTGB1qCC6/UWrSTStKBNMdF8BS6dXpS3jIYN2O4Z+1L6Tqr5DBz+cGwphMvbGKAieNuDlgY8yv/+Wzdeg==","signatures":[{"sig":"MEYCIQC3TPXFhpxYoWgPUoOSonunHw4DA7Wy5fQKsH/suh0SDwIhANR3hlbLhSk/1EP8DincyND1LLG07M6pG/gEshGrTyEe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179489},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"26f3a2788f86400af0de215fe5f9b6b9c310ec40","scripts":{"test":"node --test src/core/*.test.js src/commands/spec/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/Curbeloi/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.6.0_1776979038449_0.7680767730310025","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"sdd-kit","version":"0.7.0","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.7.0","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/Curbeloi/sdd-kit","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"edb5a10ed08d30d1af2ac9cbe02d4b495c979773","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.7.0.tgz","fileCount":45,"integrity":"sha512-gIs546HGpYdAnZW0pHUl2nUMZsvAIzEdDP3bNhMYk/LR9HcBMnpfsmRoCqTJhn/DEQZ2wzB5KD+d/27Ofrqosw==","signatures":[{"sig":"MEUCIQDpEPohxK5GjY+M53HcggERkrcY9tvzc4h3P3xSDeYSzAIgLhf07UqjcqjlcMaQw8RVYcx8dd1IdMIrkwwqw211hXk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224737},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"cc1845e6e1891cb373328db9ff7d9dafe7a69f6f","scripts":{"test":"node --test src/core/*.test.js src/core/providers/*.test.js src/commands/*.test.js src/commands/spec/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/Curbeloi/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.12.1","peerDependencies":{"openai":"^4.0.0"},"peerDependenciesMeta":{"openai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.7.0_1782495518761_0.2724108958464939","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"sdd-kit","version":"0.8.0","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.8.0","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/Curbeloi/sdd-kit","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"b6a8e4382634e0388c7cb27555d6bcc656e2a13e","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.8.0.tgz","fileCount":48,"integrity":"sha512-UJE3oV8FdOgMdGodofUK5uSFRl3emJGiI/BiYotKgZnP8y6mQEWzgH3CsvprsJtQarfbAX+jmJjk7vjB+EXAQA==","signatures":[{"sig":"MEQCIALxxVSWg9h70HWnLPHzaF7Bp7HZsFjiBvCqveVt9P8GAiAWHbt8JEs0f2pY3L3qN8076MQQ+5KwyhTRn03bNpCgJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258834},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"45b4c887e1a40033f3243f433757052c5569f7c6","scripts":{"test":"node --test src/core/*.test.js src/core/providers/*.test.js src/commands/*.test.js src/commands/spec/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/Curbeloi/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.12.1","peerDependencies":{"openai":"^4.0.0"},"peerDependenciesMeta":{"openai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.8.0_1782508087543_0.17480079406791238","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"sdd-kit","version":"0.8.1","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.8.1","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/Curbeloi/sdd-kit","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"ddab3d7429530f2e497b83fdf08fc2c526619c70","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.8.1.tgz","fileCount":48,"integrity":"sha512-9ava1CK887J7xiXYvPF/EbwaGb7UE+Zr/kffmwDL7+0r7BCAxNsv7Evdkw1NeLFJapW+w6SN7RP8L7RTMKyJ6Q==","signatures":[{"sig":"MEYCIQDkHbyT7dVDGh42KXFNXpQQoXee/qKE5lmjWRbrwgLrMAIhANa7+h2jVgKmrFL0EVwpPNcz5c2YjkNkM08IQEOsqg9E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":261585},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"ea81a290d786f284cafc91bf1b539fb7b49ff776","scripts":{"test":"node --test src/core/*.test.js src/core/providers/*.test.js src/commands/*.test.js src/commands/spec/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/Curbeloi/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.12.1","peerDependencies":{"openai":"^4.0.0"},"peerDependenciesMeta":{"openai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.8.1_1782567714163_0.5194517784007842","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"sdd-kit","version":"0.9.0","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","_id":"sdd-kit@0.9.0","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"homepage":"https://github.com/Curbeloi/sdd-kit","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"bin":{"sdd":"bin/sdd.js"},"dist":{"shasum":"a80a7c1893aae68f78454ccc21d28dad03f8bd82","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.9.0.tgz","fileCount":48,"integrity":"sha512-djS8kNZnqB0QebjFCPcbZqn8A3mpEvqTiiG9qqyJaYy5RxfaqYHtbI2VHl08R10lzyhClvHYEGcKSJMG6WLVQw==","signatures":[{"sig":"MEUCIHAypMxbQwlJwWsZXfk40NyDZheQHXQq265JEf45H657AiEAthHsjsdzpbcvXtdz5uebqx7DQbTU9xTBykXVCfoZt2s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":261634},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"6a8cf99733bc160aed3b1d5d4b6a7247592b12ca","scripts":{"test":"node --test src/core/*.test.js src/core/providers/*.test.js src/commands/*.test.js src/commands/spec/*.test.js"},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"repository":{"url":"git+https://github.com/Curbeloi/sdd-kit.git","type":"git"},"_npmVersion":"11.6.2","description":"Spec-Driven Development CLI — language-agnostic, works with any project","directories":{},"_nodeVersion":"25.3.0","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","commander":"^12.1.0","@anthropic-ai/sdk":"^0.78.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.12.1","peerDependencies":{"openai":"^4.0.0"},"peerDependenciesMeta":{"openai":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdd-kit_0.9.0_1782568207351_0.9909454518799525","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"sdd-kit","version":"0.10.0","description":"Spec-Driven Development CLI — language-agnostic, works with any project","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","publishConfig":{"access":"public"},"homepage":"https://github.com/Curbeloi/sdd-kit","repository":{"type":"git","url":"git+https://github.com/Curbeloi/sdd-kit.git"},"type":"module","packageManager":"pnpm@11.9.0","bin":{"sdd":"bin/sdd.js"},"scripts":{"test":"node --test src/*.test.js src/core/*.test.js src/core/providers/*.test.js src/commands/*.test.js src/commands/spec/*.test.js"},"dependencies":{"@anthropic-ai/sdk":"^0.115.0","chalk":"^6.0.0","commander":"^15.0.0","ora":"^9.4.1"},"peerDependencies":{"openai":"^7.0.0"},"peerDependenciesMeta":{"openai":{"optional":true}},"engines":{"node":">=22.23.0"},"gitHead":"9da2501e429d8cd344ec23e24add29c16eec4afd","_id":"sdd-kit@0.10.0","bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"_nodeVersion":"25.3.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-jYJox6jCG3QVKKvX+JvUBsVmNuW6BCEfXJRHAOD8el5ItGGO/Zgav3YODFfha3weJTq31BgZM0emnp8b/+4S9Q==","shasum":"1e888d83cb930f67f6d1fa1d781aac6016470861","tarball":"https://registry.npmjs.org/sdd-kit/-/sdd-kit-0.10.0.tgz","fileCount":53,"unpackedSize":324089,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCGdeoYjo8bUqn+ZbgN/582lguO9zmyJueEnn6G6UozkAIgNzv0xBFXqnosmDI3dqt+8WAV9Vb/5j2VhQSkJpKgCGE="}]},"_npmUser":{"name":"icurbe","email":"hcurbelo@gmail.com"},"directories":{},"maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdd-kit_0.10.0_1786402117758_0.22910562521358147"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-05T22:42:01.434Z","modified":"2026-08-10T22:48:38.093Z","0.0.1":"2023-09-06T17:23:40.888Z","0.0.2":"2023-09-06T20:51:04.916Z","0.0.3":"2023-09-07T14:25:30.797Z","0.0.4":"2023-09-07T14:37:06.619Z","0.0.5":"2023-09-07T14:37:38.658Z","0.0.6":"2023-09-07T14:42:07.416Z","0.0.7":"2023-09-07T21:04:22.000Z","0.0.8":"2023-09-08T12:59:24.427Z","0.0.10":"2023-09-08T13:03:42.736Z","0.0.11":"2023-09-08T13:06:01.271Z","0.0.12":"2023-09-08T13:11:11.442Z","0.2.0":"2026-03-05T22:42:01.584Z","0.2.1":"2026-03-05T22:45:05.278Z","0.3.0":"2026-03-06T00:13:28.797Z","0.3.1":"2026-03-06T15:46:06.218Z","0.3.2":"2026-03-06T16:03:25.428Z","0.3.3":"2026-03-06T16:19:16.103Z","0.3.4":"2026-03-06T16:22:40.059Z","0.3.5":"2026-03-08T23:07:05.787Z","0.3.6":"2026-03-16T15:11:17.717Z","0.4.0":"2026-03-23T20:05:48.795Z","0.4.1":"2026-03-23T20:11:41.900Z","0.6.0":"2026-04-23T21:17:18.579Z","0.7.0":"2026-06-26T17:38:38.882Z","0.8.0":"2026-06-26T21:08:07.714Z","0.8.1":"2026-06-27T13:41:54.295Z","0.9.0":"2026-06-27T13:50:07.519Z","0.10.0":"2026-08-10T22:48:37.920Z"},"bugs":{"url":"https://github.com/Curbeloi/sdd-kit/issues"},"author":{"name":"iCurbe / Cognidata","email":"hello@icurbe.com"},"license":"MIT","homepage":"https://github.com/Curbeloi/sdd-kit","keywords":["sdd","spec-driven","ai","claude","fastapi","react","architecture"],"repository":{"type":"git","url":"git+https://github.com/Curbeloi/sdd-kit.git"},"description":"Spec-Driven Development CLI — language-agnostic, works with any project","maintainers":[{"name":"icurbe","email":"hcurbelo@gmail.com"}],"readme":"# sdd-kit\n\n**Spec-Driven Development for AI coding agents** — works with Claude Code, OpenAI, Ollama, vLLM, or opencode. Language-agnostic, works with any project.\n\nThe biggest engineering orgs (Amazon's six-pagers, Google's design docs, Stripe's RFCs) have always written specs before code. `sdd-kit` brings that discipline to your AI workflow — structured specs in, quality code out.\n\n```\nYou describe what to build  →  sdd-kit structures the spec  →  your agent executes it\n```\n\n**Not a code generator. A clarity tool.** The spec is the source of truth. Your coding agent is the execution engine — Claude Code by default, or any provider you choose.\n\n---\n\n## Highlights\n\n- 🧩 **Any LLM provider** — Anthropic, OpenAI, **Ollama**, **vLLM**, or [opencode](https://github.com/sst/opencode). Switch in one command: `sdd provider set openai`. → [LLM providers](#llm-providers-multi-provider)\n- 📐 **Right-sized specs** — `-1` for a bug fix, `-3` for new architecture. Auto-filed by type into `features/`, `bugfix/`, `chore/`, … → [Spec name & type](#sdd-spec-create-description)\n- 🔄 **Living documentation** — feature specs, a per-directory module map, and architecture views stay in sync with your code automatically.\n- 🩺 **`sdd doctor`** — one command validates your whole setup (keys, packages, endpoints, CLIs) before you run.\n- 🌍 **Language-agnostic** — pure Markdown, lives in git, works with any stack. No lock-in.\n- 🤖 **Claude Code native** — `sdd init` drops a skill file where your agent (Claude Code or opencode) finds it, so it understands sdd-kit from day one.\n\n```bash\nsdd spec create \"JWT auth for the API\"   # structure the spec\nsdd spec execute feat-jwt-auth           # Claude Code builds it\nsdd doctor                               # check your provider/CLI setup\n```\n\n---\n\n## Requirements\n\n**Node.js >= 22.23** (oldest maintained LTS) is the only hard requirement. For the AI engine, pick whatever you already use:\n\n- **Claude Code** *(default, recommended)* — the richest experience. Install: `npm install -g @anthropic-ai/claude-code`\n- **Anthropic API** — set `ANTHROPIC_API_KEY` for faster SDK mode (spec generation straight from the API)\n- **OpenAI / Ollama / vLLM** — any OpenAI-compatible provider, hosted or fully local\n- **[opencode](https://github.com/sst/opencode)** — alternative agentic CLI\n\n→ Wire up any of them in one line: [LLM providers](#llm-providers-multi-provider).\n\nNo engine at all? sdd-kit still runs in **prompt-only mode** (`--prompt-only`) — it generates structured prompts you can paste into any AI tool.\n\n## Quick start\n\nFollow these steps in order. Each builds on the previous one.\n\n### Step 1 — Install\n\n```bash\nnpm install -g sdd-kit\n```\n\n> **Language:** sdd-kit follows your system language. Force it with `SDD_LANG=es` (Spanish) or `SDD_LANG=en` (English).\n\n### Step 2 — Choose your engine *(optional)*\n\nBy default sdd-kit uses **Claude Code** (if `claude` is installed) or the **Anthropic API** (if `ANTHROPIC_API_KEY` is set). To use OpenAI, a local Ollama, vLLM, or opencode, switch in one command:\n\n```bash\nsdd provider list                       # see providers + the active one\nsdd provider set ollama --model llama3.1 # writes .sddrc (no API key needed for Ollama)\n```\n\n`sdd provider set` only touches the keys you pass — the rest of your `.sddrc` is preserved. (You can still hand-edit `.sddrc` if you prefer.) Then confirm everything is wired up before you run anything real:\n\n```bash\nsdd doctor                  # ✓ package, ✓ endpoint reachable, ✓ model, ✓ CLI on PATH\nsdd provider models         # list the models your endpoint actually serves\n```\n\n→ Full options in [LLM providers](#llm-providers-multi-provider).\n\n### Step 3 — Initialize the project\n\n```bash\nsdd init                    # scaffolds steering + specs/, writes the instruction & skill files\n```\n\n`sdd init` puts its files where your agent looks: under `.claude/` when **Claude Code** is installed, otherwise under a single root **`sdd/`** folder. Then fill in the steering files with your project context:\n\n- `…/steering/product.md` — what this project is (vision, users, goals)\n- `…/steering/tech.md` — your stack and constraints\n- `…/steering/structure.md` — how the code is organized\n\n(`…` = `.claude` with Claude Code, else `sdd`.)\n\n> **Already have a codebase?** Document it first so specs have real context, then auto-generate steering:\n> ```bash\n> sdd spec document src/      # reverse-engineer modules into specs/_map/\n> sdd init --auto             # generate steering from those module specs\n> ```\n\n### Step 4 — Create a spec\n\n```bash\nsdd spec create \"JWT authentication for API endpoints\"\n#   -1 = tasks only (bug fix) · -2 = requirements + tasks (default) · -3 = full spec\n```\n\nOpen the generated `specs/features/feat-jwt-authentication/` and review it before building.\n\n### Step 5 — Execute tasks\n\n```bash\nsdd spec execute feat-jwt-authentication   # runs the next pending task\n```\n\nRepeat until every task is checked off. Each run sends the task plus its requirements, design, and module context to the engine, then auto-refreshes docs.\n\n### Step 6 — Track & visualize\n\n```bash\nsdd spec status             # progress across all specs\nsdd arch                    # build architecture views + dashboard.html\nopen specs/_arch/dashboard.html\n```\n\n## How documentation stays up to date\n\nsdd-kit keeps documentation in sync with code through **automatic refresh** at every step:\n\n| Event | What gets updated |\n|-------|-------------------|\n| `sdd spec execute` completes a task | Project map specs are refreshed only for modules with **structural** changes (files added/deleted); steering docs are updated. Use `--refresh=auto` for old behavior (refresh on any change) or `--refresh=off` to skip. |\n| `sdd spec create` generates a new spec | Steering docs are updated with the new feature |\n| `sdd spec refresh` (manual) | Project map specs are regenerated **only for modules whose source files changed** (content-hash dedup via `.sdd/cache/`). By default the prompt ships **per-file symbol summaries** (~80% smaller than raw source). Use `--deep` for truncated source (old behavior, higher fidelity), `--force` to ignore the hash cache, `--verbose` to raise the per-module output budget from 1000 to 2000 tokens. |\n| `sdd arch` | Architecture views + dashboard rebuilt from all specs |\n\n**Living documentation flow:**\n\n```\nCode changes --> project map updates --> steering docs update --> arch views update\n     (auto)           (auto)                 (auto)                (on demand)\n```\n\nProject map (`specs/_map/`) is auto-generated per directory. Steering docs (`.claude/steering/`) are auto-refreshed after spec operations. Architecture views (`specs/_arch/`) are rebuilt on `sdd arch`. The only manual step is running `sdd arch` when you want an updated dashboard.\n\n## How it works\n\nsdd-kit creates and manages structured Markdown specs in your repo:\n\n```\nyour-project/\n├── CLAUDE.md                  # Auto-updated with SDD section on `sdd init`\n├── .claude/                   # Only with Claude Code (else everything is under sdd/)\n│   ├── steering/              # Project context (auto-refreshed)\n│   │   ├── product.md         # Vision, users, goals\n│   │   ├── tech.md            # Stack, infra, constraints\n│   │   └── structure.md       # Code organization, conventions\n│   └── skills/sdd/SKILL.md    # SDD workflow skill\n├── specs/\n│   ├── _map/                  # Living project map (auto-generated)\n│   │   ├── src--auth.spec.md  # One spec per directory\n│   │   ├── src--services.spec.md\n│   │   └── ...\n│   ├── features/              # One folder per feature\n│   │   └── feat-jwt-auth/\n│   │       ├── requirements.md    # User stories + acceptance criteria\n│   │       ├── design.md          # Architecture, diagrams, API contracts\n│   │       └── tasks.md           # Atomic tasks with checkboxes\n│   └── _arch/                 # Generated architecture views\n│       ├── architecture.md    # Mermaid diagrams (renders on GitHub)\n│       ├── architecture.json  # Structured summary data\n│       └── dashboard.html     # Interactive visual dashboard\n```\n\nEverything is Markdown. Everything lives in git. No lock-in.\n\n> Without Claude Code, `sdd init` skips `.claude/` and puts steering + skill under a single root `sdd/` folder (`sdd/steering/`, `sdd/SKILL.md`); opencode also gets the workflow via `AGENTS.md`.\n\n## Commands\n\n### `sdd init`\n\nScaffolds the SDD structure in your project: steering template files, the `specs/` directory, and the instruction + skill files your agent reads.\n\n```bash\n# Template steering docs (manual edit)\nsdd init\n\n# Auto-generate steering from existing map specs\nsdd init --auto\n```\n\n**Where files go** — `.claude/` is used **only when Claude Code is installed**; otherwise everything lives under a single root **`sdd/`** folder:\n\n| Claude Code on PATH | Steering docs | Skill file |\n|---|---|---|\n| yes | `.claude/steering/` | `.claude/skills/sdd/SKILL.md` |\n| no | `sdd/steering/` | `sdd/SKILL.md` |\n\nWhen the location isn't the default, `sdd init` records `steering_dir` in `.sddrc` so later refreshes/reads stay consistent. (opencode also gets the workflow via `AGENTS.md` below.)\n\n**Instruction file** — the SDD section is written to the file your agent reads as project guidance:\n\n| Detected on PATH | Instruction file |\n|------------------|------------------|\n| `claude` | `CLAUDE.md` (Claude Code's primary; also opencode's fallback) |\n| `opencode` | `AGENTS.md` (opencode's primary) **+** `CLAUDE.md` |\n| neither | `CLAUDE.md` |\n\n`CLAUDE.md` is always written (universal baseline). `AGENTS.md` is created **only when opencode is detected**, and an existing `AGENTS.md` is always kept in sync.\n\nSafe to run multiple times — skips existing steering and skill files, updates the instruction-file section idempotently.\n\n### `sdd spec document <path>`\n\nReverse-engineers existing code into a map spec. This is the starting point for existing projects — document what you have before planning what to build.\n\n```bash\n# Document a directory\nsdd spec document src/auth/\n\n# Document a specific file\nsdd spec document app/services/rag_service.py --name rag-service\n\n# Without Claude Code\nsdd spec document src/components/ --prompt-only\n```\n\nOutput goes to `specs/_map/`. These specs are used as context for `sdd arch`, `sdd init --auto`, and `sdd spec create`.\n\n### `sdd spec create <description>`\n\nGenerates spec files from a feature description. The CLI adapts to the size of the change via numeric flags:\n\n| Flag | Files generated | When to use |\n|------|----------------|-------------|\n| `-1` | `tasks.md` only | Bug fixes, tweaks, refactors |\n| `-2` *(default)* | `requirements.md` + `tasks.md` | Clear features (1-3 days) |\n| `-3` | `requirements.md` + `design.md` + `tasks.md` | Complex features, new architecture |\n\n```bash\n# Bug fix — just tasks, no ceremony\nsdd spec create \"Fix 422 error on login endpoint\" -1\n\n# Default — requirements + tasks\nsdd spec create \"Add JWT refresh tokens\"\n\n# Complex feature — full spec with design doc\nsdd spec create \"Hybrid RAG search pipeline\" -3\n\n# Custom name\nsdd spec create \"WhatsApp webhook integration\" --name feat-whatsapp-hooks\n```\n\n**Spec name, \"type\" & folder.** sdd-kit models the **size** of a change (`-1`/`-2`/`-3`) — it does *not* enforce a fixed set of types. The \"type\" is simply the **prefix you choose in `--name`** (`feat-`, `fix-`, `chore-`, …), and that prefix also decides **which folder** the spec is filed under:\n\n| Name prefix | Folder |\n|-------------|--------|\n| `feat-` / `feature-` *(and auto-generated names)* | `specs/features/` |\n| `fix-` / `bug-` / `bugfix-` | `specs/bugfix/` |\n| `hotfix-` | `specs/hotfix/` |\n| `chore-` | `specs/chore/` |\n| `refactor-` | `specs/refactor/` |\n| `docs-` / `doc-` | `specs/docs/` |\n| `perf-` | `specs/perf/` |\n| `test-` | `specs/test/` |\n| any other prefix | `specs/features/` (fallback) |\n\n- With `--name`, the name is used **verbatim** — pick any prefix.\n- Without `--name`, the name is auto-generated from the description and **always prefixed `feat-`** (so it lands in `features/`).\n\n```bash\nsdd spec create \"Fix 422 on login\"    -1 --name fix-login-422     # → specs/bugfix/fix-login-422/\nsdd spec create \"Bump dependencies\"    -1 --name chore-deps        # → specs/chore/chore-deps/\nsdd spec create \"Refactor auth module\" -2 --name refactor-auth     # → specs/refactor/refactor-auth/\nsdd spec create \"Add JWT auth\"                                     # → specs/features/feat-add-jwt-auth/\n```\n\nEvery command (`list`, `status`, `execute`, `delete`, `rename`, `archive`, `arch`) finds specs across **all** type folders automatically — `feat-*` stays in `specs/features/` exactly as before, so existing projects are unaffected.\n\n> Tip: choose the **size flag** for ceremony (`-1` bug fix → `-3` architecture) and the **`--name` prefix** for type/folder. Use `--name` whenever you want anything other than `feat-`.\n\n### `sdd spec status [spec-name]`\n\nShows project progress with visual indicators.\n\n```bash\n# All specs overview\nsdd spec status\n\n# Output:\n# SDD Project Status\n#\n#   3 specs · 5/12 tasks · ████████░░░░░░░░░░░░ 42%\n#\n#   feat-jwt-auth              RDT  ████████████████ 3/3 done\n#   feat-rag-search            RDT  ████████░░░░░░░░ 2/5 40%\n#   feat-whatsapp-hooks        RDT  ░░░░░░░░░░░░░░░░ 0/4 planned\n\n# Single spec with task details\nsdd spec status feat-rag-search --verbose\n```\n\nIndicators: **R** = requirements.md, **D** = design.md, **T** = tasks.md (green = exists, dim = missing).\n\n### `sdd spec execute <spec-name>`\n\nExecutes the next pending task via Claude Code. Sends the task description along with requirements, design, and module context so Claude has full understanding. After execution, refreshes map specs only for modules with **structural** changes (files added/deleted) — tunable via `--refresh`.\n\n```bash\n# Next pending task\nsdd spec execute feat-jwt-auth\n\n# Specific task\nsdd spec execute feat-jwt-auth --task 1.2\n\n# Preview without executing\nsdd spec execute feat-rag-search --dry-run\n\n# Skip all auto-refresh (module + steering)\nsdd spec execute feat-jwt-auth --refresh=off\n\n# Old behavior — refresh on any changed file\nsdd spec execute feat-jwt-auth --refresh=auto\n```\n\n### `sdd spec refresh [dir]`\n\nManually refreshes map specs (living documentation). Useful after making changes outside of `sdd spec execute`.\n\n```bash\n# Refresh changed modules (symbol summaries, 1000 tokens/module)\nsdd spec refresh\n\n# Refresh one directory\nsdd spec refresh src/core\n\n# Higher detail output (2000 tokens/module)\nsdd spec refresh --verbose\n\n# Regenerate everything, ignoring the cached hash\nsdd spec refresh --force\n\n# Send full truncated source instead of symbol summaries (higher fidelity, higher cost)\nsdd spec refresh --deep\n```\n\n**How the dedup works.** Each generated `<label>.spec.md` carries a `source_hash` in its YAML frontmatter. On subsequent runs, modules whose content-hash matches the stored one are skipped — no Claude call. The per-file hash cache lives at `.sdd/cache/hashes.json` (safe to delete — it rebuilds).\n\n**How the symbol summary works.** By default, the prompt for each module contains per-file headers with extracted top-level symbols (functions, classes, exports, imports) rather than truncated source code. Measured on sdd-kit's own `src/` tree, this shrinks the prompt by ~80% while preserving enough structure for Claude to infer module purpose and relationships. Pass `--deep` when you need the old behavior.\n\n### `sdd spec list`\n\nLists all specs with a compact summary: files present, task progress, and date.\n\n```bash\nsdd spec list\n\n# Output:\n# feat-jwt-auth              RDT  done     2025-12-01\n# feat-rag-search            R-T  2/5      2025-12-15\n# feat-whatsapp-hooks        ---  empty    2026-01-10\n```\n\n### `sdd spec delete <name>`\n\nDeletes a spec directory after confirmation.\n\n```bash\n# With confirmation prompt\nsdd spec delete feat-old-feature\n\n# Skip confirmation\nsdd spec delete feat-old-feature --force\n```\n\n### `sdd spec rename <old> <new>`\n\nRenames a spec directory and updates internal Markdown headers.\n\n```bash\nsdd spec rename feat-old-name feat-new-name\n```\n\n### `sdd spec archive [name]`\n\nMoves specs to `specs/archived/`, which every reader skips — so archived specs stop counting\ntoward `sdd spec status` and stop consuming the `sdd arch` context budget. Nothing is deleted.\n\nFeature specs accumulate forever: every fix, chore and experiment leaves one behind. Past a few\nhundred they no longer fit in a model's context and `sdd arch` has to condense them. Archiving\nfinished work is how you keep the architecture view sharp.\n\n```bash\n# Archive one spec\nsdd spec archive feat-jwt-auth\n\n# See what a bulk archive would move — nothing is touched\nsdd spec archive --completed --dry-run\n\n# Archive every spec whose tasks are all checked off\nsdd spec archive --completed\n\n# Archive specs untouched since a date\nsdd spec archive --before 2026-01-01\n\n# Combine: finished *and* stale\nsdd spec archive --completed --before 2026-01-01\n\n# Restore one later\nsdd spec archive feat-jwt-auth --restore\n```\n\n| Flag | Effect |\n|------|--------|\n| `--completed` | Selects specs with at least one task where **all** tasks are done |\n| `--before <date>` | Selects specs untouched since `<date>` (`YYYY-MM-DD`) |\n| `--dry-run` | Lists what would move; changes nothing |\n| `--restore` | Moves one spec back out of `specs/archived/` |\n\nA spec with an empty `tasks.md` is treated as unstarted, not finished, so `--completed` never\narchives work that was never done.\n\n### `sdd arch`\n\nGenerates architecture views from all specs, module docs, and steering docs. Produces:\n\n- **`architecture.md`** — Mermaid diagrams that render directly on GitHub\n- **`architecture.json`** — Structured data (components, features, tech stack)\n- **`dashboard.html`** — Interactive HTML dashboard with system overview, service map, module breakdown, feature flows, and progress stats\n\n```bash\n# Generate architecture views\nsdd arch\n\n# Emphasize a level — every section is still produced, this shifts the depth\nsdd arch --level services      # system (default) | services | modules\n\n# Ask for a detailed sequence diagram for one feature\nsdd arch --flow feat-jwt-auth\n\n# Without Claude Code\nsdd arch --prompt-only\n\n# Open the dashboard\nopen specs/_arch/dashboard.html\n```\n\n`--level` and `--flow` change emphasis, never coverage: the dashboard renders every\nview, so suppressing a section would leave blanks. A `--flow` that matches no spec is\nan error (with a near-match suggestion), not a silently ignored flag.\n\n**Large spec corpora.** The whole corpus can't be sent to the model verbatim — past roughly 300\nfeature specs it exceeds the context window. `sdd arch` spends a character budget\n(`arch_max_prompt_chars`, default 300,000 ≈ 75k tokens) in priority order: steering docs first,\nthen module specs, then feature specs. If the feature tier doesn't fit whole it degrades — full\ntext → summaries → names and task counts — and the run tells you what happened:\n\n```\nCorpus trimmed to fit the model context (~75,000 tokens).\n  332 feature spec(s) condensed to their summaries.\n```\n\nThe agent keeps `Read` access, so the prompt points it at the full specs on disk for anything it\nneeds in detail. To get richer input back, prune the corpus with\n[`sdd spec archive --completed`](#sdd-spec-archive-name) rather than raising the budget past what\nyour model can hold.\n\n### `sdd config`\n\nShows the active configuration, including values from `.sddrc` and defaults.\n\n```bash\nsdd config\n\n# Output:\n# specs_dir       specs/features       (default)\n# modules_dir     specs/_map           (default)\n# concurrency     4                    (default)\n# max_file_size   50KB                 (default)\n# provider        auto                 (default)\n# model           (unset)              (default)\n# agent_cli       claude               (default)\n```\n\nYou can customize sdd-kit by creating a `.sddrc` file (JSON) in your project root:\n\n```json\n{\n  \"specs_dir\": \"docs/specs\",\n  \"concurrency\": 2,\n  \"max_file_size\": 102400,\n  \"max_depth\": 10\n}\n```\n\nAvailable options:\n\n| Key | Default | Purpose |\n|-----|---------|---------|\n| `specs_dir`, `modules_dir`, `steering_dir`, `arch_dir` | conventional paths | Where specs/maps/steering/arch live |\n| `concurrency` | `4` | Max parallel LLM requests |\n| `max_file_size`, `max_depth` | `50KB`, `8` | Scanner limits |\n| `arch_max_prompt_chars` | `300000` | Character budget for the `sdd arch` corpus (~75k tokens) |\n| `provider` | `auto` | Text-gen provider — see [LLM providers](#llm-providers-multi-provider) |\n| `model` | per-provider | Model for the text-gen layer |\n| `base_url`, `api_key_env` | per-provider | OpenAI-compatible endpoint + key env var |\n| `agent_cli` | `claude` | Agentic CLI for `create`/`execute`/`arch` (`claude` \\| `opencode`) |\n| `agent_model` | inherit | Model for the agentic CLI (e.g. Claude Code alias `sonnet`/`opus`) |\n| `agent_max_budget_usd` | `1.0` | Spend cap per agentic run (`create`/`execute`/`arch`) |\n\n### `sdd doctor`\n\nValidates your active provider/CLI setup — keys, the `openai` package, endpoint reachability, model, the agentic CLI on `PATH`, and that the SDD skill file exists. Exits non-zero on failure (CI-friendly). See [LLM providers](#llm-providers-multi-provider).\n\n```bash\nsdd doctor\nsdd doctor --provider ollama --model llama3.1   # check a specific setup\n```\n\n### `sdd provider`\n\nInspect, switch, and configure the LLM provider without hand-editing `.sddrc`.\n\n```bash\n# See every provider and which one is active (+ where it's configured)\nsdd provider list\n\n# Switch provider — writes only the keys you pass into .sddrc, preserving the rest\nsdd provider set openai --model gpt-4o\nsdd provider set ollama --model llama3.1\nsdd provider set vllm --model meta-llama/Llama-3.1-8B-Instruct --base-url http://localhost:8000/v1\n\n# List the models your active endpoint actually serves\nsdd provider models\nsdd provider models --provider anthropic   # query a specific provider\n```\n\n- **`list`** highlights the active provider and its source (`.sddrc` / env / default / auto-detect).\n- **`set <provider>`** validates the name, merges into `.sddrc`, and reminds you to run `sdd doctor`. Flags: `--model`, `--base-url`, `--api-key-env`.\n- **`models`** hits the provider's `/models` endpoint (Anthropic / OpenAI / Ollama / vLLM). When opencode is your agentic CLI (or on `PATH`), it also lists opencode's models.\n\n## LLM providers (multi-provider)\n\nsdd-kit talks to LLMs in **two independent layers**, each separately configurable:\n\n- **Text generation** (`init`, `spec refresh`, `spec document`) → `provider` + `model`.\n- **Agentic execution** (`spec create`, `spec execute`, `arch`) → `agent_cli` + `agent_model`.\n\nEvery option can be set in `.sddrc` or via env var (`.sddrc` wins): `SDD_PROVIDER`, `SDD_MODEL`, `SDD_BASE_URL`, `SDD_API_KEY_ENV`, `SDD_AGENT_CLI`, `SDD_AGENT_MODEL`.\n\n> **Easiest way:** `sdd provider set <provider> [--model …]` writes `.sddrc` for you, `sdd provider list` shows the active one, and `sdd provider models` lists what's available. See [`sdd provider`](#sdd-provider).\n\n### Text-generation providers (`provider`)\n\n| `provider` | Engine | Needs |\n|------------|--------|-------|\n| `auto` *(default)* | Anthropic API if `ANTHROPIC_API_KEY`, else OpenAI if `OPENAI_API_KEY`, else Claude Code CLI | — |\n| `anthropic` | Anthropic SDK (native) | `ANTHROPIC_API_KEY` |\n| `openai` | OpenAI Chat Completions | `OPENAI_API_KEY` + `pnpm add openai` |\n| `ollama` | Local Ollama (OpenAI-compatible) | Ollama running + `pnpm add openai` |\n| `vllm` | Self-hosted vLLM (OpenAI-compatible) | vLLM serving + `pnpm add openai` |\n| `claude-cli` | `claude -p` (your Claude Code subscription) | Claude Code CLI |\n\n> `openai`, `ollama`, and `vllm` all speak the **OpenAI-compatible API** — they share one implementation; only `base_url`/`model`/key differ. The `openai` npm package is an **optional** dependency: install it only if you use one of these (`pnpm add openai`). sdd-kit prints an actionable error if it's missing.\n\n**Anthropic API (default when key is set):**\n```json\n{ \"provider\": \"anthropic\", \"model\": \"claude-sonnet-4-6\" }\n```\n\n**OpenAI:**\n```json\n{ \"provider\": \"openai\", \"model\": \"gpt-4o\" }   // reads OPENAI_API_KEY\n```\n\n**Ollama (local, no key):**\n```json\n{ \"provider\": \"ollama\", \"model\": \"llama3.1\" } // base_url defaults to http://localhost:11434/v1\n```\n\n**vLLM (self-hosted):**\n```json\n{ \"provider\": \"vllm\", \"model\": \"meta-llama/Llama-3.1-8B-Instruct\", \"base_url\": \"http://localhost:8000/v1\", \"api_key_env\": \"VLLM_API_KEY\" }\n```\n\n### Agentic CLI (`agent_cli`)\n\nThe commands that actually write code/specs run through an agentic CLI. Default is `claude` (Claude Code). To use [opencode](https://github.com/sst/opencode) instead:\n\n```json\n{ \"agent_cli\": \"opencode\", \"agent_model\": \"anthropic/claude-sonnet-4-6\" }\n```\n\n`sdd spec execute` / `create` / `arch` then shell out to `opencode run` (model format is `provider/model`). If the configured CLI isn't installed, these commands fall back to **prompt-only** mode (`--prompt-only`).\n\n> Leave `agent_model` empty to inherit the CLI's own default model (e.g. your Claude Code default). For `claude`, set a Claude Code alias (`sonnet`/`opus`/`haiku`); for `opencode`, use `provider/model`.\n\n**opencode mostly works with zero config.** opencode natively discovers `.claude/skills/*/SKILL.md`, so the sdd-kit skill is picked up automatically. It also reads `CLAUDE.md` as a fallback when no `AGENTS.md` exists, so the SDD steering block from `sdd init` is seen out of the box. If your project already has an `AGENTS.md` (opencode's primary instruction file, which takes precedence over `CLAUDE.md`), `sdd init` mirrors the SDD block into it so opencode still gets the steering.\n\n### Per-command overrides\n\nEvery LLM command (`spec create`/`execute`/`refresh`/`document`, `arch`, `init`, `doctor`) accepts `--provider` and `--model` to override `.sddrc`/env for that run — handy for quick tests:\n\n```bash\nsdd spec refresh --provider ollama --model llama3.1\nsdd spec document src/ --provider openai --model gpt-4o\n```\n\n### Validate your setup: `sdd doctor`\n\n`sdd doctor` checks the active configuration and tells you exactly what's missing:\n\n```bash\nsdd doctor\n# ✓ openai package installed\n# ✓ model = llama3.1\n# ✓ endpoint reachable  (http://localhost:11434/v1)\n# ✓ agentic CLI \"claude\" on PATH\n```\n\nPer layer it verifies: API key present (anthropic/openai), the `openai` package installed (openai/ollama/vllm), the **endpoint reachable**, a model configured, and the agentic CLI on `PATH`. Exits non-zero if any check fails — useful in CI. Accepts `--provider`/`--model` too.\n\n> **OpenAI new models:** the o-series and gpt-5 reject `max_tokens` in favor of `max_completion_tokens`. sdd-kit sends the right one automatically (and retries with the other if an endpoint disagrees), so OpenAI, Ollama, and vLLM all work without tuning.\n\n## Built for Claude Code\n\nsdd-kit is designed specifically for Claude Code. Every command leverages Claude Code's full project understanding — it reads your files, follows your CLAUDE.md conventions, and writes code that fits your codebase.\n\n| Mode | When | What happens |\n|------|------|-------------|\n| **Claude Code** | `claude` CLI installed | Full execution — reads project, generates specs, writes code, updates docs |\n| **SDK / API** | `ANTHROPIC_API_KEY` set (or another provider) | Fast mode — calls the LLM API directly for spec generation (no code execution) |\n| **Prompt-only** | `--prompt-only` flag | Saves structured prompts you paste into any AI tool |\n\nClaude Code is the default and the richest experience, but the text-generation layer is **provider-agnostic** — point it at OpenAI, a local Ollama, or vLLM, and swap the agentic CLI for opencode if you prefer. See [LLM providers](#llm-providers-multi-provider).\n\n```bash\n# Claude Code mode (default) — full power\nsdd spec create \"Add caching layer\"\nsdd spec execute feat-caching\n\n# Prompt-only — works without Claude Code\nsdd spec create \"Add caching layer\" --prompt-only\n```\n\nWhy Claude Code? Because a raw API call sees nothing but the prompt. Claude Code sees your entire project, your conventions, your existing code. The specs sdd-kit generates become Claude Code's instructions — structured context that produces better code.\n\n## Task format\n\nTasks in `tasks.md` follow this format:\n\n```markdown\n- [ ] **1.1** Create User model `app/models/user.py`\n- [x] **1.2** Add login endpoint `app/routers/auth.py` <- Req 1.1\n- [ ] **2.1** Write integration tests `tests/test_auth.py`\n```\n\nEach task has: checkbox, numbered ID, description, optional file path, optional requirement reference. The `spec-reader` parses this exact format for progress tracking and execution.\n\n## Spec sizes: why it matters\n\n> \"Using a full SDD workflow for a bug fix is like using a sledgehammer to crack a nut.\"\n> — Birgitta Boeckeler, Thoughtworks ([Martin Fowler's blog](https://martinfowler.com/articles/exploring-gen-ai/sdd-3-tools.html))\n\nNot every change needs three documents. A typo fix doesn't need acceptance criteria. A one-line bug fix doesn't need an architecture diagram. The numeric size flag adapts the ceremony to the change:\n\n- **`-1` small**: You know exactly what to do. Just need to track the tasks.\n- **`-2` medium** *(default)*: Requirements are clear, but you want documented acceptance criteria before implementation.\n- **`-3` large**: The problem space is complex. You need to think through architecture, data models, and API contracts before writing code.\n\n## Works with any project\n\nsdd-kit reads only Markdown. It doesn't parse your code, import your modules, or require any specific language or framework. Use it with:\n\n- React / Next.js / Vue\n- FastAPI / Django / Express\n- Rails / Laravel / Spring\n- Mobile apps, CLI tools, infrastructure\n- Any language, any framework\n\n## Project structure\n\n```\nsdd-kit/\n├── bin/sdd.js                  # CLI entry point\n├── src/\n│   ├── cli.js                  # Commander setup\n│   ├── core/\n│   │   ├── config.js           # .sddrc + env + CLI-override config system\n│   │   ├── log.js              # Debug logging (SDD_DEBUG=1)\n│   │   ├── generator.js        # Agentic CLI invocation (claude/opencode) + prompt fallback\n│   │   ├── claude-api.js       # Text-gen facade over the provider layer\n│   │   ├── providers/          # LLM providers (anthropic, openai-compatible, claude-cli)\n│   │   │   ├── index.js        # selectProvider — config/env-driven selection\n│   │   │   ├── anthropic-provider.js\n│   │   │   ├── openai-provider.js   # OpenAI / Ollama / vLLM\n│   │   │   └── cli-provider.js\n│   │   ├── spec-reader.js      # Read/parse specs + type-folder routing/resolution\n│   │   ├── cli-detect.js       # Detect claude/opencode on PATH (shared)\n│   │   ├── scanner.js          # Project directory scanner\n│   │   ├── git-changes.js      # Git diff detection for smart refresh\n│   │   └── progress.js         # Progress indicator for streaming\n│   └── commands/\n│       ├── init.js             # Init + CLAUDE.md/AGENTS.md + skill file + steering refresh\n│       ├── config.js           # Show active configuration\n│       ├── doctor.js           # Validate provider / agentic CLI / skill setup\n│       ├── provider.js         # provider list / set / models\n│       ├── arch.js             # Architecture views + dashboard\n│       └── spec/\n│           ├── create.js       # Create feature specs (routed by name prefix)\n│           ├── document.js     # Reverse-engineer code into specs\n│           ├── execute.js      # Execute tasks from specs\n│           ├── refresh.js      # Refresh map specs\n│           ├── status.js       # Show progress\n│           ├── list.js         # List all specs\n│           ├── delete.js       # Delete a spec\n│           ├── rename.js       # Rename a spec\n│           └── archive.js      # Archive/restore specs\n├── templates/\n│   ├── arch-dashboard.html     # HTML dashboard template\n│   └── steering/               # Init templates\n└── package.json\n```\n\n## Contributing\n\n```bash\n# Clone and install\ngit clone https://github.com/icurbe/sdd-kit.git\ncd sdd-kit\npnpm install\n\n# Run locally\nnode bin/sdd.js --help\n\n# Link for global testing\npnpm link --global\nsdd --help\n```\n\n## License\n\nMIT — [iCurbe](https://icurbe.com)\n","readmeFilename":"README.md"}