{"_id":"tdd-workflow","_rev":"37-9fc337ab8b00cb93c7116869488820ed","name":"tdd-workflow","dist-tags":{"latest":"4.3.0"},"versions":{"1.0.0":{"name":"tdd-workflow","version":"1.0.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@1.0.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"e81642e0fc84bbe73cfa2f6935ffdbf004a914d1","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-1.0.0.tgz","fileCount":30,"integrity":"sha512-xUlaZSphwhGTRLRcFR1cmLaU2Ixcp3N8HBpu43a7hWy0rCF162i8a/0+JM3DwlJtKGHRTVd+b7HazD/jHoFJWQ==","signatures":[{"sig":"MEUCIDRFWw8IrX+YnwEDN2VTMeKQQI5QJzrnwrP10Sojg5/kAiEAyYXTA2qrjt216tzAobjemg3U0RuuvkoJs+wPMlzMBec=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75767},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"e9fc4978bd7518f8a38488917066786e9c190eec","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_1.0.0_1775718722614_0.028408219941327584","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"tdd-workflow","version":"1.1.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@1.1.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"8ce0385f5d368d3f07608a4721765c1ff1b06146","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-1.1.1.tgz","fileCount":30,"integrity":"sha512-Ofa9D7KE3AvswHA52v6oIwxyg6CJeuwjCnAW3dSN311KE51yvRO3wiQVkZ1iEad/Q/G0RDvDvPXy41zfk5rCKQ==","signatures":[{"sig":"MEQCIC+EKtfjhhKch48BYk66DnjJsWbFqu1kCQ1s+XS7qqoyAiAJs2d7wwCYi3foAHx0n7qxileElieUR5uPzPn2sNgjpw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82991},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"a7438718bf0d3aee7c277d40ea0504da5b64deae","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_1.1.1_1776147929481_0.027122361825993258","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"tdd-workflow","version":"1.2.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@1.2.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"96f3f3fd04b5595858fdf40eeb5e4039776873f5","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-1.2.0.tgz","fileCount":36,"integrity":"sha512-zOdmusJLQxy+hyBNoyEbEH2JztqnakiBFfJ4CeANdipgjbK4xRYdNXGG5moywO2rqaSrYsvYziyB/KpJ+kCTlg==","signatures":[{"sig":"MEYCIQDjk5G59DuBcILhg8PwhO80IezMg6MYN4/BlKEZkeRWowIhAKXN52+SG9eixc7m8oNOjrGmsSr0xHDcfis7yn0C+xw5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94473},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"a418775eb0fcc13dfdff6291e0bad4007641f653","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_1.2.0_1776345536350_0.04059084806309765","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"tdd-workflow","version":"1.2.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@1.2.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"bbb0b2d14f577284f6db036965f686c28fd02941","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-1.2.1.tgz","fileCount":36,"integrity":"sha512-l0Z048oZLShq7i+uC+irPd5QKP4Udd92/eYvS8lXPY6GVR2h2lBYEXzlmBxdaGe7CSWtN+rWPs8eTkwMzVpuyQ==","signatures":[{"sig":"MEQCIG9W4WX9TJ4aLGzdgbfhIiHgcnhblJc0Um1bGjXNe/2vAiAj/kRULf4IXJJ7of4OYvIaE4Zr6g123wyzw5iKEOCOYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100859},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"65ab64dadd7f60819dba5d242032173848354d00","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_1.2.1_1776593425844_0.9748750980763901","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"tdd-workflow","version":"2.2.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@2.2.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"e1d1403eea15e6b7ee59a0db6e28f91708e12b35","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-2.2.0.tgz","fileCount":37,"integrity":"sha512-O56+I791VPuTP/J0NjNPeRevwr7AT+r4V0+744y+ZBn+S9DKNtuPTE0N/+hkJT5hyR3ueRb+S9eVr9Ps73sbZQ==","signatures":[{"sig":"MEUCIQC8cRhRlrj3jBrRz51ROTPK79rBlY9fQAyajaXfIESD9AIgIuLHW6GjMLLEXwNntLMjFtgLuOgOjkQslOJghpRr8Eo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107369},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"e2c41afb0525fa83dffe5c7ec5b5c94c26479bfb","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_2.2.0_1776629051371_0.4555572755725821","host":"s3://npm-registry-packages-npm-production"}},"2.4.4":{"name":"tdd-workflow","version":"2.4.4","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@2.4.4","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"4a519cca6d9e65a41e3e426635b8223711a3e538","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-2.4.4.tgz","fileCount":44,"integrity":"sha512-eIH8LPepY/cmPCbq3JjfKVUVGc/56/IezKa4xN/pFgxJfVnPkYrGXlGMvmU7oO0qEwTNCQAFsUGiO8XyDzk3YQ==","signatures":[{"sig":"MEYCIQDtGwXWYLWWGGm6LBynZbUHw1wc3Kmlq49evAxIYztpqQIhAJRIERBOWYmu5LyNdAAXBWDunMCQMVrflJTjYQygXqx0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201755},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"c451dfde406c5e3b9699032a363d2bafa3cf6b1f","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_2.4.4_1777309607691_0.5282968704674182","host":"s3://npm-registry-packages-npm-production"}},"2.4.5":{"name":"tdd-workflow","version":"2.4.5","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@2.4.5","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"efe066fdf93f8a135161893f5e72a61c985ff6d2","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-2.4.5.tgz","fileCount":44,"integrity":"sha512-hdWkEp44I+uC1jbnbwuWXyO5gJISjnQsDP2pamZNeVgzddANKaWKEHQGmTxn5NkMK/apfAnWImQ+WrGqVugO3w==","signatures":[{"sig":"MEUCIQCuJllt8LyKBz4LCZ3ZSImMjERmQWp6IgMiHdzhDE5qpQIgDOTYSvVr3t/ZpU9s9yQC8b7squcB9yV05kEZGYB7t/w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":210330},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"291347e9919c47e7e29e28cde990c9193f83e201","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_2.4.5_1778050903487_0.40126612340000034","host":"s3://npm-registry-packages-npm-production"}},"2.4.6":{"name":"tdd-workflow","version":"2.4.6","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@2.4.6","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"947be2e956137b65ceb593b3e358e92403d66e0f","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-2.4.6.tgz","fileCount":44,"integrity":"sha512-LeC/pxZZ91d8biy9RuFVgJ+PMbCYDG923cENlvV18M8cyTWCI+mdTu6ogVkAPWEo1fiYurRKUxGWcpbHbLC/uw==","signatures":[{"sig":"MEUCIH893qlWZPAveM3yD4+SF/i5iALi5BKCbgOwSCnbB02YAiEA+M4uYf6EhZLqOMZvkwLjr7DN0o3ZLd6UBMeoFOCG08g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":210484},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"5e01922b3b21a9e4962b8ed0d480824f2e6c5344","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_2.4.6_1778051280811_0.7520291225558702","host":"s3://npm-registry-packages-npm-production"}},"2.4.7":{"name":"tdd-workflow","version":"2.4.7","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@2.4.7","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"98084ece5216a00a5b5ebe9b30d38d09f9fefbb9","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-2.4.7.tgz","fileCount":44,"integrity":"sha512-TQrq3Ml43JrEWhho/ht+wYqHeKDBlZ8cyC6olPQ0aKujVJdTVEZt7jUJUlk9NppgwF+gvdQwoJvRwnofKisfRw==","signatures":[{"sig":"MEUCIQCKmt7AQcRcBlTr2Ff6WZjLdNYpLWEbTzAd4pSTyIRzcQIgQqNB/yMellbiOkQGDAn/MLrRYO5NzLRAL6/cMsCqb/A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":213604},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"6286a8b61e58da5ba94c309ba7b2b253e730738f","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_2.4.7_1778328465757_0.5979356007471304","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"tdd-workflow","version":"3.0.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.0.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"713e1b192db9e67dffa8e599993aefaf3a00e0d0","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.0.0.tgz","fileCount":44,"integrity":"sha512-xbOxZEPVhRgiTOT72X3E+IC3/FmIDSnUjUh/PCfGSfCINjKlTsD1FzGHP6PHEmx4W1xVmDFye4W+nbPWbeKk8g==","signatures":[{"sig":"MEQCIFrOR0/k3qvc87UjqusZjLlMHf1zF+c9Yc9vAFcE97L/AiAisHv1fcDI7djiqHzHr3o0s1x/ehGB+o0pTTu2mU7idA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216378},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"58e3bbcaf4cf578f4ebefa6d00c6e931af56d1b6","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.0.0_1778664744365_0.248100471771461","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"tdd-workflow","version":"3.1.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.1.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"2924098269400a86ea4c92238696b7cc2127ba0d","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.1.0.tgz","fileCount":44,"integrity":"sha512-2MojW07w570PVv4TMjt7FlrcjeKjYBkjY4gFN+7cPDX+YuMeIXks8tlJB+QEHzVEyf2omZU7nhCEco5RomijYA==","signatures":[{"sig":"MEUCIA0JOfsPcWqgeaJu23GTun6gldDok56N+ob5Jr7Ke2KvAiEAhjze3xgj0qiNOEZzhWuWV+l4GDM2xciFZA9ZYuzsy58=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222680},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"82d05e5fd39bc1c05039e8ac6060cfbd66f56fde","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.1.0_1778678133146_0.9171022315937647","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"tdd-workflow","version":"3.1.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.1.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"fbe9209308434a0000f7fdd251a0ea3a3b3975ff","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.1.1.tgz","fileCount":44,"integrity":"sha512-zZpAepfU/UIU1oQv/rTlLp1C+vbYnjDsQSey+Z9Hobmuq+hJmxbyRClAkX3iF8tpcFfghTmincJFj7CLwSrNOA==","signatures":[{"sig":"MEUCIAmIndhx06V5r+GMyoNszaZDiMfmgZ28YhnvAvsyyfLOAiEAz3iweqozlsuuiosdnPWaHx6+b8zdTJsILWGufgyuCck=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224928},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"53cf744d2aa71005e721abe9c871b40a9b65e03f","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.1.1_1778729431749_0.3325069951732522","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"tdd-workflow","version":"3.2.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.2.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"f0dbf3523873ee68585dd116cfb7d0141200f3d3","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.2.0.tgz","fileCount":44,"integrity":"sha512-zGaExIQHjVN7GOZmcGQNfprhpuVUOXFextnfHu50/eRZzOnx7avrQdLodnVxRYl53xgXCEy/hDMqauc/9mFxGg==","signatures":[{"sig":"MEYCIQDffJwO5XBJ9kbzZy4ouuo8qoj4XgYsKOIspbYl8cUM4gIhANLMLchlaxbTOb9VJOG4QcbhbShv+8wRS9JxE2bvIzKJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":230699},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"26c91c13656b0bd25fdd2a0bd0abd25ffd05a9e9","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.2.0_1778755770520_0.7144356957813089","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"tdd-workflow","version":"3.3.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.3.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"f0ed5625b63b2857802caa11a32afd8943a90a19","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.3.0.tgz","fileCount":44,"integrity":"sha512-kUr0TkFet7TEeK/+VmKwNhyc6UNAN7juzYa7QGrNa51854xelF/5CSaqbFRK6u0szwxIeSZWvBCwYb5hpMsbcA==","signatures":[{"sig":"MEYCIQCCg3ilbg/QN77J9+P6ZLUsEO0ERHCO//j2gDVoUapl/AIhAOGF4UfU1OCMjlbuEkzYTY5n5+gRw527RIFSo+R63Pqk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231329},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"ba63769d70cffeb249280a5cf3fbad1aef41d919","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.3.0_1778815498437_0.7335479314855873","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"tdd-workflow","version":"3.4.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.4.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"7b6780fef591546c34962d75d47c744db2dd7468","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.4.0.tgz","fileCount":44,"integrity":"sha512-p13O9Kk7VnBsTrhEwQI6skd4Mvfj/XyPYd6oEwljsi4050UwrXzKpGw4dSLCcGjSS+BlnpYFOKAfbJuBg5c8Jw==","signatures":[{"sig":"MEUCIQCvnry6ALatr6gIBezGA7cA1hqPFIQKuk/4ENvaXku4nQIgf79c9vhlaz3fF6MdqF5NlIOf/3+Ylvm/DUOw04u7QLI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236507},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"f0e1f513afad830f989fac0bd9d67be9ae2cc3a8","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.4.0_1779409493090_0.40115156586498113","host":"s3://npm-registry-packages-npm-production"}},"3.5.0":{"name":"tdd-workflow","version":"3.5.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.5.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"fc3f67c7cc5d229c16ef221ab2b54237ec5db7bd","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.5.0.tgz","fileCount":45,"integrity":"sha512-e0rJZwOTPzELFJOAUWnsKVMnXZrmsSMeg/gVg+T1r8Mo97qLBcaCyTgJC7mo5IJ1hC93yRQNzR/LnpeLvkx+Og==","signatures":[{"sig":"MEUCIHxgxPBb8hnXn6xRl79Y03jCAytMKoBoPyJT2FKn5A0EAiEA+PsGZMephdJXl1kNtH9ZmYswlxE0I+NrUL4oVXQgiHk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":245292},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"d3cc2a75cfc218dcfece0a6425db68ebede8a0b6","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.5.0_1779413874332_0.8217123888551219","host":"s3://npm-registry-packages-npm-production"}},"3.5.1":{"name":"tdd-workflow","version":"3.5.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.5.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"afc98a102ab5b59a22380bb9c8669417a4d30cb4","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.5.1.tgz","fileCount":45,"integrity":"sha512-+SSyC9WhGjzFeLQDcbuud6svTYXAeGSdmaxIXMpO1xL6jfs6f5SS3dml79feoOWX3tbRVGdpBsn9VnhDVMGSsQ==","signatures":[{"sig":"MEUCIQDzUg+VKYK9pgssXFXDY0gJWiBwJbgiTZiVv4ztQUf/BwIgRF4sPxxV9XHWFl+Yg/aUKLwJfTfuweEslrZmG254Mgc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":246078},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"ec9c87aa9a7a64dbdfb58aa13e432687717b5af7","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.5.1_1779417842953_0.9345120702302758","host":"s3://npm-registry-packages-npm-production"}},"3.6.0":{"name":"tdd-workflow","version":"3.6.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.6.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"b5aaa5e8070847ec862dc2dc26ee7670cf5f6660","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.6.0.tgz","fileCount":45,"integrity":"sha512-c6ccGleFjBaWgmom1p0Ao9KnXORlTECUQvI/QHeFE63amTeSDZ68A1d+7o1LZCvzF3tiwEbJ67tNKNhDXqZVpQ==","signatures":[{"sig":"MEYCIQCosONT6EmfN27sGNxhJzJvRgUNvr6L6v2kSVgm7a+g7wIhAP6s22oFJ2ZrfpIcHHAokDqzgiatC1IlfeJRj5RCEBD/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":247554},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"bbdf5e1931273655aa2b92bd95b0f0c9627bc49a","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.6.0_1779695172452_0.6305550685422601","host":"s3://npm-registry-packages-npm-production"}},"3.6.1":{"name":"tdd-workflow","version":"3.6.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.6.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"53509636a35fd2d6bf04d5926334395d053a8736","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.6.1.tgz","fileCount":46,"integrity":"sha512-Mf0R6R5dO7RXJAUsVa+6mhlPBU2Adrpzkvai0X8eDig7Ii4m/Bkz0QDlZ4HlDcr6tpX7rjAFQU5/Sb+W5nIJFQ==","signatures":[{"sig":"MEYCIQDNaZuh09nDz1viyDo096QCZEFWe0XiP/33MuDwfd97jgIhAOlblgoryrJrNNy68a0tKxla1WcuUFQmZDbkzql19RgR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257428},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"42bedcc4b4e7020fc996d2b75dceaf0b5c1797a5","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.6.1_1779695664345_0.9176742738105734","host":"s3://npm-registry-packages-npm-production"}},"3.7.0":{"name":"tdd-workflow","version":"3.7.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.7.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"c7f18f2dff77e0d27df870298181f94ca5eddb28","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.7.0.tgz","fileCount":46,"integrity":"sha512-76W2B7wEqYUeKVYKsxX0qZr04ROzr1ol4w8Qwny2IMggogaYmFsN0C8YCUTkWZrOLow7yYyJ9CtVsfR+JKFyEA==","signatures":[{"sig":"MEUCIC36HcwSBt46fSLCS+p+VA8n6FwfuaZOnjBneQOrdJc+AiEAyBVjVtgKTko6Oks5M5nkx3ktZypJPEFLTzZheWmgDss=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259233},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"28750c588aff95300576d3c4d4b69f47f8262d17","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.7.0_1779702536767_0.04770057488213908","host":"s3://npm-registry-packages-npm-production"}},"3.8.0":{"name":"tdd-workflow","version":"3.8.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.8.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"718e62e40514efce1fe8d3ebc427441ce7036818","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.8.0.tgz","fileCount":46,"integrity":"sha512-ry/Oz7N7iRscO3VIHimu7Z3Nu1pb5HTc4jvwuj7NWZoNb9yqT5u2JMZArvr80WGIiltV4q6UKNW/TBFZyrl0Dg==","signatures":[{"sig":"MEUCIQDRHJZXJw8PKk/n52r5Hc1ZluWlRXlAQ+jQOrWzui/1OQIgdMp/rma/vQbz+H50WKuFZYYA6xUZcCeQGCk0a04ZQ84=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":261692},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"82fd71e34492da7be16d51b28bc76a437e9e0939","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.8.0_1779762509342_0.6249436877426613","host":"s3://npm-registry-packages-npm-production"}},"3.10.0":{"name":"tdd-workflow","version":"3.10.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.10.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"10d5b24deb8f09748fc0c885eff6283cc17d6fc3","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.10.0.tgz","fileCount":47,"integrity":"sha512-QOXtqH/jstwsj/O/kMFsjmvrwrMpQa8vMkk2S9f8cC4kN5p/XaCf1Vzh6xJcq0S90VG6osR0Jv24tgGXWfrnyA==","signatures":[{"sig":"MEYCIQCZaj4ieDEqy/PuPvJNCnKiViPqijYFzV0Vh0ejOsMsvgIhAIrhW/608Ja/cRDdxkW0/dYfjlZWzE/92Stx8kq7CUk0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277298},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"4ed19a0bb4e9d15efa352f216e871f1990ae45f8","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.10.0_1780047900914_0.22687883975553524","host":"s3://npm-registry-packages-npm-production"}},"3.10.1":{"name":"tdd-workflow","version":"3.10.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.10.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"a4c8051eab43eeca755b042eb5d5487541687a86","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.10.1.tgz","fileCount":47,"integrity":"sha512-sCY/0Kv0ev0avzGtK1PyRTuuIsdiY/vWT0fP88IUcLBlRvgMkOTsxTMzRN6mi4QnY8vGqtoofk4K5WPmlNqChQ==","signatures":[{"sig":"MEYCIQDE3uRx35YVZPv0Kw9O2IarYlMujrehSopvlKCSydcElgIhAIpaW5PIqHXgW8CAQqHpE7ezO9GILiPV5kmIKV6hf1jk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277674},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"43be72d9f855e8f79d2de5dab54fad2251609011","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.10.1_1780049935211_0.5266175162461968","host":"s3://npm-registry-packages-npm-production"}},"3.11.1":{"name":"tdd-workflow","version":"3.11.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.11.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"4580f7dc6d2cf73d6f2a0157793e41aaf0d5892d","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.11.1.tgz","fileCount":47,"integrity":"sha512-yZpqZ8NTaMfQ10zrR5zAigeWJmIqp6Eh0sEKhlV63Ke8eJhJ1GBnjZcmfz2b9+sZxuA0oRnK5M86/EDEBH2xhQ==","signatures":[{"sig":"MEQCIEt/e7Ng7oLwS7U6j0xKHtcYlhxLRIPRn25BEdI7D1VGAiAZrbjr46APL+qmKwwjOvL9lHguh0a2DwQqYaYxBDKeDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281688},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"decc83303d519ec2daff2fee8d6fff80c239b218","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.11.1_1780399209873_0.37240856709963666","host":"s3://npm-registry-packages-npm-production"}},"3.12.0":{"name":"tdd-workflow","version":"3.12.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.12.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"3d7f58225de94c04e61a81f5900bbb987c34969d","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.12.0.tgz","fileCount":48,"integrity":"sha512-qggpp24cyMP+mPgaXLiTANaJoZLM7iZGKTPQLeFlX4WSuZaxjp7lUoIgcE5IkYG2Z0s4eH8gFuiI7Z7ZfuEKJA==","signatures":[{"sig":"MEUCIGtuSp1ZxO8tyt82jDE9kXp7/zIBsnw/0ZfNAMorf6pgAiEAnIXBLT8yLuZmEekVv7lPqe9jxNKjHFkhTGwgfJ/XpxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":299929},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"391beece8257acf5fb9915680430775c148b6c0b","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.12.0_1780493947502_0.4464700481755608","host":"s3://npm-registry-packages-npm-production"}},"3.12.1":{"name":"tdd-workflow","version":"3.12.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.12.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"73adfbd275f25dd015c5542b88f18bac4669c804","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.12.1.tgz","fileCount":48,"integrity":"sha512-q0FK6oK0giAZPdSVFGDv7OGu05Ac5t3gVd2L+9b6IvsR2LnycS0NwG3DexaPNJTmrFfvMZBX0SFOdpjTqWKAzg==","signatures":[{"sig":"MEUCIQDeB6Hg88xef8Ojw4CFMf+GCi+CZmZL6rFhxsTerN9E9gIgWI8FC+LjVOPJPWE1jkvIogJrHu1YnRZeqZ3ip4UGS4c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":300143},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"a891ac53a086ea18f4e4ebf2535e389c38e332be","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.12.1_1780555212834_0.7626917440689021","host":"s3://npm-registry-packages-npm-production"}},"3.13.0":{"name":"tdd-workflow","version":"3.13.0","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.13.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"0a8ca321a15782e20c110c164921258a2ea6fe21","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.13.0.tgz","fileCount":48,"integrity":"sha512-A3+KdyYfneP8ZT7xYn5ZNObuYL6QUxqsklCCawBMWcpNaF5CvbPeyK5bsGjpwr+OIyxWrckO2AUQ7aafn5u4dg==","signatures":[{"sig":"MEUCIQDKY1gV0H23dXvSOkswi4+AKvAZ9QxHUHUQrnOUzyyuYAIgRegZO3rv+RQ65+TqXl9QYChxVxNXBC4ylDO2dffs4hc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":309616},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"5b8dac358ae3081014b330ce364281244f85c310","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.13.0_1780910460831_0.7148110496492839","host":"s3://npm-registry-packages-npm-production"}},"3.13.1":{"name":"tdd-workflow","version":"3.13.1","keywords":["tdd","workflow","ai","claude","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.13.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"f31294af573bec64d3398c2414344fc3ff4efeaf","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.13.1.tgz","fileCount":48,"integrity":"sha512-IOxd/aHqGB+z7t7UaMgUTPqF/+eIY8jOP909yfAbk2a14jL2wVp7i9OGlqyo3pJno3Kk5XExqqt2LVaWrbm0uQ==","signatures":[{"sig":"MEQCIDUufS0S1X83tUXYPxGsH2kI9aSMFg54knvwqNksNIPiAiB6AaeUnJz22aRIrqNQwSURFF4Z2z4mlv4A/AaYYs5J8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":312881},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"3873fd2b835cc82cf93062c511fae05287c4d4c4","scripts":{"dev":"tsc --watch","test":"bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.13.1_1780971557975_0.1270394683462086","host":"s3://npm-registry-packages-npm-production"}},"3.13.2":{"name":"tdd-workflow","version":"3.13.2","keywords":["tdd","workflow","ai","claude","codex","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.13.2","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"66c42540c614c498884a53d94ee1ed2b7b2d074c","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.13.2.tgz","fileCount":49,"integrity":"sha512-vPUrwtb2GcgIIeXub+mB7aagJYKgfxYlrPN8eJ6YYQQ4KPqsM0oeRyTfl+UlWGKgC5Z3hctBQBcWtJR+nA0TiA==","signatures":[{"sig":"MEQCICEqyC4/Wmunt1NJqjdsKvHaU4bTTj4dQoZBJhc9lZ22AiAj6V/Mw4Z+Iy/BlGs40QslbhHjTpGNaPqSLVAnfFPApg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":318619},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"854d6206da85a073d90f5c7f6e2976aec69466dc","scripts":{"dev":"tsc --watch","test":"npm run build && node --test test/*.test.mjs && bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.13.2_1785914256071_0.6816480766623016","host":"s3://npm-registry-packages-npm-production"}},"3.13.3":{"name":"tdd-workflow","version":"3.13.3","keywords":["tdd","workflow","ai","claude","codex","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.13.3","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"a45a3518fdf4cf8fdb72aee63771102b139ef8a1","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.13.3.tgz","fileCount":52,"integrity":"sha512-pYLa6fl7lQq5fVnRwdtJ6XfUVeXwfMPgeZTGEpHmR/l8yaStVsnyhyDD8xvrD2oGVL9fjdcsi+7Ri/IyU1FDWQ==","signatures":[{"sig":"MEUCIQCh5cwh+ZreEN5piVQOJyg6/XPxENLCahqOIIpLNUZOqAIgYWun5UiSqN61cBRHZ8s4hkxH9Rsq1Ufp4iNm/4QBWjQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340065},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"18e7b6d93cada869196a32d988b7de639bfbe718","scripts":{"dev":"tsc --watch","test":"npm run build && node --test test/*.test.mjs && bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.13.3_1785975646176_0.6940722025946979","host":"s3://npm-registry-packages-npm-production"}},"3.14.0":{"name":"tdd-workflow","version":"3.14.0","keywords":["tdd","workflow","ai","claude","codex","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@3.14.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"5ca504fc962f8856087358c6636190b415656a49","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-3.14.0.tgz","fileCount":54,"integrity":"sha512-2ThFPuuW8DIVQdeOZOAEpfacQ7ATBI9BoxwZ8nrtz64tB3lNv86X3lMBKDjRMZr7JarPQvT8ngnPPoJxEk8jrg==","signatures":[{"sig":"MEQCIFXi319VWcPVZTa9h1oZfHnoqMvITiF5Za0uSTTlaauaAiAl/b6U6q99WKWAMPwbPUjiCB7xid+zMRXkjasqPAtSYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":361212},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"3a697ceefb1150e416312748c92de2b8602ef9f9","scripts":{"dev":"tsc --watch","test":"npm run build && node --test test/*.test.mjs && bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_3.14.0_1787741983155_0.11722479358228877","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"tdd-workflow","version":"4.0.0","keywords":["tdd","workflow","ai","claude","codex","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@4.0.0","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"9d5ec9aecf44a06e960240a57888d21567c01360","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-4.0.0.tgz","fileCount":53,"integrity":"sha512-wjxKRfw7VXuwE8oyCSfuV7xy7pD+JBe/XhYcejUlFHTmIK0Aica3sFVbTuKrbuXUtEqBiuZj+BB166jZWVZjfg==","signatures":[{"sig":"MEQCIEoeUz0Uy5xhuwypUg0zWsQv4xrqa1roEBdVT92T/TlPAiAtIl7v5vLUVF6EkvSgdemwqcFwvQAaVm4KMqruWMwlVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":361840},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"6135941a5e2a96461fb53937839c8d5c956d35c5","scripts":{"dev":"tsc --watch","test":"npm run build && node --test test/*.test.mjs && bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_4.0.0_1787798817660_0.4031992547743599","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"tdd-workflow","version":"4.0.1","keywords":["tdd","workflow","ai","claude","codex","cursor","copilot","skills"],"author":{"name":"yjzhuang"},"license":"MIT","_id":"tdd-workflow@4.0.1","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"bf3d704590b5d2b9530572d0b4a174dfeba9177f","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-4.0.1.tgz","fileCount":53,"integrity":"sha512-o4e3TscaXyV81WDj+KUgScLXmdod3GJNjOshibgeTA94dfPVSB+WOLCJ2PPM3u1XREGeALXdrqVbw5J1Dv/oQQ==","signatures":[{"sig":"MEUCIEi06OV/DujSZnsrCwTGb2PwBx6CwKnbAwDAQG/19I1BAiEAqnRkWJ0/TtwNtxJwfAuukGHA/10b0VlvF7bXpWqfUfI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":379203},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"4f6e7f7b5a0e1f571c4e297f5cfd83e6d62614bf","scripts":{"dev":"tsc --watch","test":"npm run build && node --test test/*.test.mjs && bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm test"},"_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tdd-workflow_4.0.1_1787902719466_0.339645509011242","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"_id":"tdd-workflow@4.3.0","bin":{"tdd-workflow":"bin/tdd.js"},"dist":{"shasum":"a04ca25696b50979e718a899792f51dea59ca687","tarball":"https://registry.npmjs.org/tdd-workflow/-/tdd-workflow-4.3.0.tgz","fileCount":55,"integrity":"sha512-PvPa6tuICOZo+v1VKDBiZ+9nvavTMSPSS31dGXO9cGcoSsizi6m5oeadCQN0siEB220N6KaWhnYTQypqEMVs/Q==","signatures":[{"sig":"MEYCIQDzny0+MSH7WSN/ouhyqUCSzl+hCGE/XAZwAYdHPvG4KQIhAJoESwnpFIh7jPSpFugF9Z+T7aKkRPqy2Tltv7t7AHxO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCsNrz3/0JxEWIwjvr6EXMz8O98hU7vF4O7GoK41FxHMAIhAI5Wk7pZFpdMoz9eP9jFeNh4L9P2EvrU/b5TdZ6lXUMu"}],"unpackedSize":434346},"name":"tdd-workflow","type":"module","author":{"name":"yjzhuang"},"engines":{"node":">=20.0.0"},"gitHead":"d732a8271c93a1f6da2264e7dcd09ef3b0107430","license":"MIT","scripts":{"dev":"tsc --watch","test":"npm run build && node --test test/*.test.mjs && bash test/hooks-verify.sh && bash test/version-sync.sh","build":"tsc","prepublishOnly":"npm test"},"version":"4.3.0","_npmUser":{"name":"yjzhuang","email":"yanjunzhuang@qq.com"},"keywords":["tdd","workflow","ai","claude","codex","cursor","copilot","skills"],"_npmVersion":"11.11.0","description":"TDD Workflow CLI — install TDD skills for AI coding tools","directories":{},"maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"_nodeVersion":"25.8.0","dependencies":{"ora":"^8.2.0","chalk":"^5.4.0","commander":"^14.0.0","@inquirer/prompts":"^7.5.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tdd-workflow_4.3.0_1790243420086_0.6731788158107814"}}},"time":{"created":"2026-04-09T07:12:02.526Z","modified":"2026-09-24T09:50:20.384Z","1.0.0":"2026-04-09T07:12:02.760Z","1.1.0":"2026-04-13T11:52:44.911Z","1.1.1":"2026-04-14T06:25:29.611Z","1.2.0":"2026-04-16T13:18:56.492Z","1.2.1":"2026-04-19T10:10:25.985Z","2.2.0":"2026-04-19T20:04:11.561Z","2.4.4":"2026-04-27T17:06:47.833Z","2.4.5":"2026-05-06T07:01:43.663Z","2.4.6":"2026-05-06T07:08:00.970Z","2.4.7":"2026-05-09T12:07:45.917Z","3.0.0":"2026-05-13T09:32:24.591Z","3.1.0":"2026-05-13T13:15:33.294Z","3.1.1":"2026-05-14T03:30:31.913Z","3.2.0":"2026-05-14T10:49:30.731Z","3.3.0":"2026-05-15T03:24:58.576Z","3.4.0":"2026-05-22T00:24:53.236Z","3.5.0":"2026-05-22T01:37:54.508Z","3.5.1":"2026-05-22T02:44:03.102Z","3.6.0":"2026-05-25T07:46:12.606Z","3.6.1":"2026-05-25T07:54:24.502Z","3.7.0":"2026-05-25T09:48:56.977Z","3.8.0":"2026-05-26T02:28:29.490Z","3.10.0":"2026-05-29T09:45:01.068Z","3.10.1":"2026-05-29T10:18:55.383Z","3.11.1":"2026-06-02T11:20:10.009Z","3.12.0":"2026-06-03T13:39:07.642Z","3.12.1":"2026-06-04T06:40:13.005Z","3.13.0":"2026-06-08T09:21:01.013Z","3.13.1":"2026-06-09T02:19:18.166Z","3.13.2":"2026-08-05T07:17:36.233Z","3.13.3":"2026-08-06T00:20:46.326Z","3.14.0":"2026-08-26T10:59:43.344Z","4.0.0":"2026-08-27T02:46:57.818Z","4.0.1":"2026-08-28T07:38:39.632Z","4.3.0":"2026-09-24T09:50:20.174Z"},"author":{"name":"yjzhuang"},"license":"MIT","keywords":["tdd","workflow","ai","claude","codex","cursor","copilot","skills"],"description":"TDD Workflow CLI — install TDD skills for AI coding tools","maintainers":[{"name":"yjzhuang","email":"yanjunzhuang@qq.com"}],"readme":"# TDD Workflow\n\n规范驱动的 TDD 全流程工具，为 AI 编程助手安装 TDD 技能，以及宿主支持的斜杠命令。\n\n一条命令把完整的 **需求发现 → systemic 领域建模 → 行为规范 → TDD 循环（red → green → refactor） → E2E 验收 → 交付检查** 工作流装进你的项目，让 AI 助手按流程驱动开发，而不是随意写代码。\n\n支持 **Claude Code** · **OpenAI Codex** · **Cursor** · **Cline** · **Windsurf** · **CodeBuddy** · **GitHub Copilot**。\n\n> English: [README.md](./README.md)\n\n---\n\n## 目录\n\n- [快速开始](#快速开始)\n- [与 `grill-me` 结合](#与-grill-me-结合)\n- [一键全流程：`/tdd:auto`](#一键全流程tddauto)\n- [安装方式](#安装方式)\n- [CLI 命令参考](#cli-命令参考)\n- [Multi-Agent 架构](#multi-agent-架构)\n- [框架无关设计](#框架无关设计v30)\n- [UseCase-First 工作流](#usecase-first-工作流)\n- [Verification System](#verification-system)\n- [自定义文档路径](#自定义文档路径)\n- [完整工作流示例](#完整工作流示例)\n- [斜杠命令详解](#斜杠命令详解)\n- [Harness Hooks](#harness-hooks)\n- [Issue 追踪机制](#issue-追踪机制)\n- [Three-Strike Protocol](#three-strike-protocol)\n- [目录结构约定](#目录结构约定)\n- [支持的工具](#支持的工具)\n- [与 OpenSpec 的对比](#与-openspec-的对比)\n- [常见问题](#常见问题)\n\n---\n\n## 快速开始\n\n```bash\n# 在项目根目录运行（@latest 强制从 registry 拉最新版，不走本地缓存）\nnpx tdd-workflow@latest init\n\n# 或者一次安装为当前用户的 Codex skill（可在任意目录运行）\nnpx tdd-workflow@latest init --tools codex --scope user\n\n# 打开你的 AI 编程助手（如 Claude Code），输入：\n/tdd:new\n# systemic 变更在需求收敛后先确认领域模型：\n/tdd:model\n# standard 可直接进入规格生成：\n/tdd:ff\n# 开始 TDD 循环：\n/tdd:loop\n\n# 或者一键跑完整流程（每阶段间会暂停一次确认）：\n/tdd:auto <name>            # systemic 自动插入 Model 阶段\n/tdd:auto <name> --yolo     # 跳过普通检查点，但不能跳过 Model 确认\n\n# Codex 中通过 skill 调用，而不是直接输入项目斜杠命令：\n$tdd-workflow Run /tdd:new <name>\n$tdd-workflow Run /tdd:auto <name> --yolo\n$tdd-workflow Run /tdd:bug <症状或失败命令>\n```\n\n30 秒即可把 TDD 工作流注入项目。\n\n---\n\n## 与 `grill-me` 结合\n\n`grill-me` 和 TDD Workflow 解决的是同一个问题的不同层次：\n\n| 层次 | `grill-me` | TDD Workflow |\n|---|---|---|\n| 核心问题 | 我们到底要做什么决策？ | 如何实现并验证这个决策？ |\n| 主要产出 | 设计树、已确认决策、开放问题、取舍 | UseCase、规范、测试、实现、E2E 和交付证据 |\n| 最佳时机 | 功能开始前、需求变更前、遇到阻塞决策时 | 范围明确后，执行 RED → GREEN → REFACTOR → E2E → DONE |\n| 约束方式 | 不允许把未确认的决定当成事实 | 没有验证证据就不能标记完成 |\n\n两者可以串成前后两层，但不要求用户一定先运行 `grill-me`。只要前面的\n对话、Issue、设计笔记或 `grill-me` 产生了可复用信息，就可以记录到可选的\n`tdd-specs/<feature>/discovery.md`：\n\n```text\n$grill-me\n  → 澄清目标、角色、场景、边界、失败模式和取舍\n\ntdd-specs/payment-retry/discovery.md\n  → 已确认决策、开放问题、范围、假设、取舍、候选 UseCase、验收信号和反例/边界\n\n$tdd-workflow 执行 /tdd:new payment-retry\n  → 把变更分类为 standard、systemic 或 exploration\n\n$tdd-workflow 执行 /tdd:model\n  → 仅 systemic：确认术语、身份、不变量、状态、事实源、兼容与边界场景\n\n$tdd-workflow 执行 /tdd:ff\n$tdd-workflow 执行 /tdd:loop\n$tdd-workflow 执行 /tdd:e2e\n$tdd-workflow 执行 /tdd:done\n```\n\n推荐的结合点：\n\n- **`/tdd:new` 之前**：先解决需求歧义，再生成规范。\n- **`/tdd:change` 或 `/tdd:bug` 之前**：先梳理影响范围、根因假设和替代方案。\n- **Three-Strike 触发后**：重新判断是测试错了、实现路径错了，还是需求本身需要重审。\n\n不要用 `grill-me` 替代测试或 `/tdd:done`。它提升决策质量，TDD Workflow 负责实现质量和交付证据。如果已安装 `grill-me`，可以先输入 `$grill-me`；完成确认后，再输入 `$tdd-workflow` 并说明要执行的 `/tdd:*` 入口。\n\nCodex 中的 `/tdd:*` 是 skill 内部的工作流入口，不是原生项目斜杠命令。请通过 `$tdd-workflow` 或 `/skills` 选择技能，再说明要执行哪个入口。该技能已关闭 Codex 隐式调用，因此普通的“修 CI / 修 bug”请求不会自动进入 TDD Workflow。\n\n---\n\n## 一键全流程：`/tdd:auto`\n\n如果觉得一个个敲命令太繁琐，用 `/tdd:auto` 串起来。完整顺序是 `/tdd:new` → systemic 时 `/tdd:model` → `/tdd:ff` → `/tdd:loop` → `/tdd:e2e` → `/tdd:done`；standard 会跳过 Model。**如果项目已经走到一半，会自动从对应阶段续跑**，不会重跑已完成的步骤、也不会覆盖已有 spec 文档。\n\n### 自动续跑（半路接管）\n\n`/tdd:auto <name>` 启动时先扫一眼 `tdd-specs/<name>/`，决定从哪个 stage 接管：\n\n| 项目状态 | 从哪开始跑 |\n|---|---|\n| 没有 `tdd-specs/<name>/` 目录 | Stage 1 (`/tdd:new`) |\n| `change_class=exploration` | 停在 Discovery，不进入规格 |\n| systemic 且 Model 未确认 | Stage 2 (`/tdd:model`) |\n| Intake 完成但没有 `tasks.md` | Stage 3 (`/tdd:ff`) |\n| `tasks.md` 的 Phase 1/2 还有 `[ ]` / `[~]` | Stage 4 (`/tdd:loop`) |\n| Phase 1+2 全 `[x]`/`[!]`，Phase 3 还有 `[ ]` / `[~]` | Stage 5 (`/tdd:e2e`) |\n| Phase 1–3 全部终态（`[x]`/`[!]`），但 `.harness phase != deliver` | Stage 6 (`/tdd:done`) |\n| `.harness phase=deliver` | 已交付 — 提示 `/tdd:notes` 然后 `/tdd:archive`，停 |\n\n启动时会打印决策：\n\n```\n/tdd:auto: resuming from Stage 3 (/tdd:loop) — Phase 2 has 5 [ ] tasks\n```\n\n> **`[!]` 任务不会被自动重试** —— 它们之前已经升级给用户处理过了。Stage 4 跳过它们继续往下，最终报告里仍然会列出。要手动重做，先把它改回 `[ ]`，再运行 `/tdd:loop`。\n\n> **`/tdd:continue` 仍然有用** —— 当你想**手动**从某个阶段恢复、或先看一眼当前状态再决定，用 `/tdd:continue`；`/tdd:auto` 续跑是\"直接接着干完\"的意图。\n\n### 两种模式\n\n| 模式 | 阶段间确认 | Three-Strike（同测试 3 次失败） | 任务完整性扫描建议 | Reviewer 连续 2 次驳回 Coder |\n|---|---|---|---|---|\n| **默认（半自动）** | 最多 5 个检查点 | 停下问 A/B/C/D | 问用户是否接受 | 上报用户 |\n| **`--yolo`** | 跳过普通提示；保留 systemic Model 确认 | **自动选 C**：标 `[!]` + 记录原因，继续下个任务 | **自动全部接受** | 标任务为 `[!]`，继续 |\n\n### `--yolo` **不能绕过**的停止点\n\nYOLO 模式不是\"无脑往下冲\"——下面这些是**真实失败**或**安全边界**，YOLO 也必须停：\n\n| 停止点 | 为什么不能绕 |\n|---|---|\n| systemic 的 `/tdd:model` 显式确认 | 领域语义不能由 AI 从沉默或自动模式推定 |\n| `/tdd:done` 的编译错误 / 测试失败 / 覆盖率不足 | 这些就是交付门槛本身，绕过等于让坏代码交付 |\n| `/tdd:loop` 中 DB migration 执行失败 | 真实环境错误，\"跳过继续\"会让 schema 状态静默漂移 |\n| `/tdd:e2e` 的 Tester Agent 边界 | Tester 与 Coder 信息隔离是为了避免\"自己写测试自己骗自己\"——YOLO 也始终 spawn Tester |\n| `/tdd:new` 的初次需求收集 | 如果只给了 kebab-case 名字、没给描述，6 维度 Q&A 还得跑——没有\"猜你要做什么\"的捷径 |\n| 测试命令找不到 / 项目配置错误 | 真实配置错误，不是流程选择 |\n\n### YOLO 模式遗留的 `[!]` 任务\n\n下列情况会在 YOLO 模式下被标 `[!]` 而不是停下来问，但**会在最终报告里完整列出**，绝不静默吞掉：\n\n- 触发 Three-Strike 的任务（附带最后一次失败原因）\n- Reviewer 连续 2 次驳回 Coder 的任务（附带 reviewer 反馈）\n- Phase 3 中 Tester 上报 skip > 3 的 E2E 任务\n\n最终报告示例：\n\n```\nTDD Auto cycle: payment-retry      Mode: yolo\n  Stage 1 (/tdd:new)   — ✓ done\n  Stage 2 (/tdd:model) — ✓ confirmed\n  Stage 3 (/tdd:ff)    — ✓ 12 tasks generated\n  Stage 4 (/tdd:loop)  — ✓ 9 [x] / 3 [!] / 0 [ ]\n  Stage 5 (/tdd:e2e)   — ✓ 4 passed / 1 failed / 0 skipped\n  Stage 6 (/tdd:done)  — ✗ failed: coverage 72% < 80%\n\nBlocked tasks:\n  - [!] 2.3 unit test: retry on 503 — Three-Strike (last error: timeout assertion)\n  - [!] 2.7 implement: idempotency key — Reviewer 2× reject (over-abstraction)\n  - [!] 3.2 E2E: refund alt path — Tester skipped (env limitation)\n\nSuggested next:\n  - 处理上述 [!] 任务，重跑 /tdd:done\n```\n\n### 选哪个？\n\n- **默认半自动** — **生产 feature 推荐**。普通阶段检查点加上 systemic 的 Model 确认，能在实现前拦住方向和语义偏差。\n- **`--yolo`** — 一次性原型 / 探索 / 重跑已经规划好的 feature。不建议用于交付工作。\n\n---\n\n## 安装方式\n\n### 方式一：npx 直接运行（推荐）\n\n无需全局安装，在项目根目录下直接运行：\n\n```bash\nnpx tdd-workflow@latest init\n```\n\nCLI 会自动扫描项目中的 `.claude/`、`.cursor/` 等目录；Codex 会检测 `.codex/` 或 `.agents/`。随后弹出交互式多选，让你确认要安装到哪些工具。\n\n如果希望所有项目都能使用 Codex skill，而不在每个项目重复安装：\n\n```bash\nnpx tdd-workflow@latest init --tools codex --scope user\n```\n\n它只写入 `~/.agents/skills/tdd-workflow/`，不会修改当前项目，也不会在主目录创建\n`tdd-specs/`、hooks 或 `.tdd-workflow`。默认保留已有文件；更新用户级安装时显式加\n`--force`，此时会直接覆盖且不创建备份。\n\n> **为什么强烈建议加 `@latest`**：`npx tdd-workflow init`（不带 `@latest`）会优先用本机已有的全局/缓存版本，可能命中你几个月前装的旧版而不是 npm registry 上的最新版。加上 `@latest` 强制从 registry 解析，确保拿到最新代码。\n\n### 方式二：全局安装 CLI\n\n不推荐 —— 全局包不会自动升级，时间长了会落后于 registry。如果一定要装：\n\n```bash\nnpm install -g tdd-workflow@latest\ntdd-workflow init\n\n# 升级时\nnpm install -g tdd-workflow@latest\n```\n\n### 方式三：从源码构建\n\n```bash\ngit clone <repo-url>\ncd tdd\nnpm install && npm run build\n```\n\n然后在目标项目中运行：\n\n```bash\nnode /path/to/tdd/bin/tdd.js init\n```\n\n> **要求**: Node.js >= 20\n\n---\n\n## CLI 命令参考\n\n### `tdd-workflow init`\n\n在当前项目安装 TDD workflow 技能文件，以及宿主支持的斜杠命令。\n\n```bash\ntdd-workflow init [options]\n```\n\n| 选项 | 说明 | 默认值 |\n|------|------|--------|\n| `--tools <tools>` | 逗号分隔的工具 ID：`claude,codex,cursor,cline,windsurf,codebuddy,copilot` | 项目：自动检测；用户：`codex` |\n| `--scope <scope>` | 安装到当前 `project`，或当前 `user` 的 Codex skills | `project` |\n| `--delivery <mode>` | 安装模式：`skills`、`commands` 或 `both` | `both` |\n| `--force` | 覆盖已有文件 | `false` |\n| `--dry-run` | 只展示计划变更，不写入文件 | `false` |\n\n#### 示例\n\n```bash\n# 只为 Claude Code 安装\ntdd-workflow init --tools claude\n\n# 同时为 Claude Code 和 Cursor 安装\ntdd-workflow init --tools claude,cursor\n\n# 只为 OpenAI Codex 安装\ntdd-workflow init --tools codex\n\n# 为当前用户全局安装 Codex skill\ntdd-workflow init --tools codex --scope user\n\n# 只安装命令内容（Codex 会同时保留技能发现所需的 SKILL.md）\ntdd-workflow init --delivery commands\n\n# 只安装技能文件（不安装斜杠命令）\ntdd-workflow init --delivery skills\n\n# 覆盖已有文件\ntdd-workflow init --force\n```\n\n#### 安装内容\n\n| 类型 | 文件 | 安装位置 |\n|------|------|----------|\n| 技能文档 | `SKILL.md` | Claude/Cursor 等：`.{tool}/skills/tdd-workflow/SKILL.md`；Codex：`.agents/skills/tdd-workflow/SKILL.md` |\n| 规范模板 | `discovery.md`、`usecases.md`、`requirements.md`、`design.md`、`tasks.md`、`review-checklist.md`、`verify-project.md`、`verify-feature.md` | 对应技能目录下的 `templates/` |\n| Cleanup 预设库 | `cleanup.md` | 对应技能目录下的 `verify-presets/` |\n| 命令文档 | `/tdd:*` 工作流入口（见下方详解） | Claude/Cursor 等：`.{tool}/commands/tdd/`；Codex：技能目录内的 `commands/` 资源 |\n| Codex 用户级技能 | 按 `--delivery` 选择的 skill 资源（默认 `both` 为完整资源） | `~/.agents/skills/tdd-workflow/` |\n| Hooks 脚本 | 5 个 shell 脚本（仅 Claude Code） | `.claude/hooks/tdd/` |\n| Hooks 配置 | 自动合并到 settings.json（仅 Claude Code） | `.claude/settings.json` |\n\n项目级安装只有 `--delivery both` 会安装 Hooks。`skills` 和 `commands` 不会修改\nClaude 配置。项目级强制更新前会把旧文件备份到 `.tdd-workflow/backups/`，并在\n`.tdd-workflow/manifest.json` 记录已安装文件及哈希。\n\n项目级安装还会自动创建 `tdd-specs/` 目录（带 `.gitkeep`），用于存放生成的规范\n文件。`--scope user` 目前只支持 Codex，只安装到 Codex\n[官方用户级技能目录](https://learn.chatgpt.com/docs/build-skills)\n`~/.agents/skills/tdd-workflow/`，\n不会创建项目产物或安装 Hooks；显式 `--force` 会直接覆盖用户级文件，不创建备份。\n项目中已有的 `.agents/skills/tdd-workflow/` 是独立副本，需要单独更新或删除，\n避免项目继续使用旧版工作流指令。\n\nCodex 按官方约定从仓库的 `.agents/skills/` 发现技能。安装后输入\n`$tdd-workflow Run /tdd:new <name>`；其中 `/tdd:*` 是技能内部的工作流入口名，\n不是 Codex 的项目斜杠命令。技能会在执行前读取对应的 `commands/<id>.md` 完整契约。\n安装内容中的 `agents/openai.yaml` 设置了\n`allow_implicit_invocation: false`，选择该 skill 才表示显式采用工作流。\n\n### `tdd-workflow update`\n\n检测项目中已安装 TDD workflow 的工具，强制更新为**当前调用 CLI 所携带的版本**。\n如果明确需要 npm 上的最新版，请用 `npx --yes tdd-workflow@latest update`：\n\n```bash\ntdd-workflow update\ntdd-workflow update --delivery commands   # 只更新命令文档\ntdd-workflow update --dry-run             # 预览更新，不写入文件\n```\n\nCodex 的旧版 `.codex/skills/tdd-workflow/` 安装也能被识别；执行 `update`\n会把当前 CLI 携带的版本写入 `.agents/skills/tdd-workflow/`，完成路径迁移；旧目录不会自动删除。\n\n### `tdd-workflow verify`\n\n`init --scope user` 只安装 Codex Skill，不会安装或升级全局 CLI。手工执行模型校验时，\nCLI 必须同时提供 `model-digest` 和 `verify --model-ready`；从本仓库开发时可使用 `node bin/tdd.js ...`\n或 `npm link`。工作流命令会先探测全局/项目 CLI 是否支持这些能力，再回退到\n`npx tdd-workflow@latest`，不会直接把新参数传给旧 CLI。\n\n运行当前 spec 的确定性静态检查。默认读取 `tdd-specs/.current`，也可以用\n`--spec` 指定名称。它会检查核心文件、统计任务状态，检查每个 UseCase 是否包含成功、\n备选/失败和路径覆盖章节；如果存在 `discovery.md`，也会检查其交接结构。\n`--model-ready` 可以在正式 UseCase/任务生成前校验证据与决策台账、As-Is/To-Be/Transition、\n不变量来源、独立 Reviewer 状态、revision 和语义摘要、文档顶部 Human Review、跨文档状态和 Blocking 问题。Reviewer 接受当前 revision 后，用 `model-digest --spec <name>` 生成与当前模型内容绑定的摘要凭证。增加 `--delivery-ready` 后，只要 Phase 1–3 仍有 `[ ]` 或 `[~]` 就会失败；有明确理由的\n`[!]` 是终态，Phase 4 checklist 留给 `/tdd:done` 执行。它不会运行项目测试，也不会把\nAI 自述当作证据。\n\n```bash\ntdd-workflow verify                         # 人类可读结果\ntdd-workflow verify --format json           # 机器可读证据\ntdd-workflow verify --format markdown \\\n  --output tdd-specs/<name>/verification-report.md\ntdd-workflow verify --model-ready                  # 正式规格前的领域模型门禁\ntdd-workflow verify --delivery-ready             # 交付前任务门禁\ntdd-workflow verify --spec centralized-merchant-settlement-pilot\n```\n\n退出码为 `0` 表示静态检查通过；退出码为 `1` 表示报告包含硬失败。项目测试、构建、\n真实 HTTP 和外部服务闸门仍需由项目自己的验证步骤显式执行。`/tdd:done` 会先用\n`--delivery-ready` 运行这个 preflight，并把结果写入\n`tdd-specs/<name>/spec-verification.md`。它优先使用\n支持该门禁的全局或项目本地 CLI；旧 binary 会被跳过，随后回退到\n`npx --yes tdd-workflow@latest verify`。\n\n---\n\n## Multi-Agent 架构\n\nTDD Workflow **v3.0.0** 升级为 **Orchestrator + Coder + Tester 三角分工**，在 1.x Coder/Reviewer 分离的基础上进一步强化角色隔离。\n\n### v3.0 三角分工\n\n```\nOrchestrator (主 Agent)\n  │  读 tasks.md → 拆分任务 → 调度 → 最终评审\n  │\n  ├── spawn Coder Agent ──→ 只知道当前任务描述\n  │   └── 写测试（RED）/ 写实现（GREEN）/ 重构（REFACTOR）\n  │   └── 多 UC 并行时，每个 UC 独立一个 Coder（isolation:worktree 物理隔离）\n  │\n  ├── Orchestrator 评审 Coder 的产出：\n  │   ✗ 不通过 → 具体反馈给 Coder，重试（最多 2 次）\n  │   ✓ 通过   → 标 [x]，下一个任务\n  │   连续两次不通过 → 升级给用户\n  │\n  └── spawn Tester Agent（/tdd:e2e）\n      └── 只读 usecases.md + spec，不读实现代码\n          → 信息隔离：测试由用户视角推导，不被实现细节污染\n          → 真实服务栈优先，mock 需注释理由\n```\n\n**核心原则**：\n- **Coder 不知道评审标准**——评审标准只在 Orchestrator 读取的 `templates/review-checklist.md` 里\n- **Tester 不知道实现细节**——只能看 spec（usecases / requirements），从用户行为推导 E2E，无法为实现细节定制测试\n- **物理隔离**——多 UC 并行时 `isolation:worktree` 确保 Coder 间不互相污染\n\n### 并行 Coder（多 UC 同时推进）\n\n当 `/tdd:loop` 发现多个独立 UC 的 Phase 2 任务时，Orchestrator 可以并行 spawn 多个 Coder：\n\n```\nOrchestrator\n  ├── Coder-A (worktree-a): UC-01 所有层 (unit → impl → frontend)\n  ├── Coder-B (worktree-b): UC-02 所有层 (unit → impl → frontend)\n  └── 等待两个 Coder 完成 → 合并评审 → 全量回归\n```\n\n依赖同一模块的 UC 不并行（Orchestrator 自动检测依赖链）。\n\n### 跨工具兼容\n\n| 工具 | 模式 | 实现角色 | 测试角色 | 评审角色 |\n|------|------|---------|---------|---------|\n| Claude Code | Multi-Agent | Coder Agent | Tester Agent | Orchestrator |\n| Cursor / CodeBuddy / Cline / 其他 | Single-Agent + Self-Review | 自己 | 自己 | **强制 self-review** |\n\n非 Claude Code 工具会自动降级。Reviewer 步骤仍然强制——必须输出评审结果才能继续：\n\n```\n[Review:RED]   ✓ covers task scenario | ✓ behavior test | ✓ fails correctly | Issues: none\n[Review:GREEN] ✓ minimum code | ✓ no test mods | ✓ full suite passes | Issues: none\n```\n\n### Review Checklist\n\nOrchestrator 按 `templates/review-checklist.md` 评审，主要检查项：\n\n**测试评审（RED 阶段）：**\n- 测试描述行为而非实现\n- 测试名可读：`should <行为> when <条件>`\n- 覆盖 tasks.md 中描述的场景\n- 测试因「功能未实现」而失败，而非语法错误\n\n**实现评审（GREEN 阶段）：**\n- 最小代码——无提前抽象或过度设计\n- 未修改测试文件\n- 全量测试通过（无回归）\n\n---\n\n## 框架无关设计（v3.0）\n\nv3.0 移除了所有项目特有假设，命令文档对任何技术栈都适用：\n\n| 维度 | v2.x（项目绑定） | v3.0（框架无关） |\n|------|----------------|----------------|\n| 目录结构 | `backend/` `web-admin/` `miniprogram/` | `src/**` `app/**` `lib/**` |\n| 测试框架 | `jest` / `auto-regression.sh` | 自动检测项目测试命令 |\n| 前端格式 | `.wxml` `.wxss`（微信小程序） | `.tsx` `.vue` `.svelte` `.html+js+css` |\n| 外部服务 | 微信 / 腾讯云 / COS | 通用 mock 注释策略 |\n| E2E 启动 | NestJS 固定脚本 | 从 `package.json` `scripts` 推导 |\n\nAI 助手会根据项目实际的 `package.json` / `pyproject.toml` / `go.mod` 等自动适配，不再需要手动调整命令文档。\n\n---\n\n## UseCase-First 工作流\n\nTDD Workflow 2.4.0 把 **UseCase** 提升为 `/tdd:ff` 的行为主产出。4.1.0 为 systemic 变更新增领域模型门禁；4.2.0 又把模型拆成有证据的 As-Is、已确认的 To-Be 和可回滚的 Transition，并加入矛盾审计；4.3.0 增加独立 Reviewer 收敛和文档顶部 Human Review 人工关注区。`domain.md` 是术语、身份、不变量、状态、事实源和兼容规则的语义权威；`usecases.md` 是用户可观察行为的权威。standard 和旧 spec 不强制补领域模型。\n\n### 为什么\n\n之前的问题：\n- **requirements.md** 只有声明性 AC（\"系统应支持评论\"），缺用户视角的完整交互故事\n- **`/tdd:e2e`** 让 AI 凭空发明 E2E 用例，容易漏关键路径\n- **`/tdd:change`** 影响分析跳过用户交互层，直接从 REQ 推 task\n- **PM/QA 看不懂** EARS 格式的 requirements，但能看懂 UseCase\n\n### 文档派生关系\n\n```\ndiscovery.md\n    │\n    ├─ systemic → domain.md（语义权威，需显式确认）\n    │                 │\n    └─ standard ──────┤\n                      ↓\nusecases.md (行为主产出)\n    │\n    ├─→ requirements.md  (每个 REQ 标注 \"来源 UC-01, UC-02\")\n    ├─→ design.md        (每个接口标注 \"支持 UC-01 step 2\")\n    ├─→ tasks.md         (Phase 2 按 UC 分组，每个 task 标注 \"Covers UC-N\")\n    └─→ E2E tests        (每个 UC 路径一个 E2E，命名 \"UC-N: <路径>\")\n```\n\n### 为什么 UseCase 应该是主产出\n\nUseCase 解决的问题是 **requirements.md 替代不了的**——requirements 是声明性的（\"系统应支持评论\"），UseCase 是过程性的（用户点什么 → 系统做什么 → 用户看到什么），而且不能只描述 happy path。\n\n每个 UC 都要显式检查：输入校验、身份/权限、缺失/重复/冲突状态、并发、\n数据库或外部依赖失败、超时/重试/恢复，以及空态、首尾项、最大规模和降级\n行为。适用项写成备选/失败/边界路径；不适用项也要写明理由。\n\n#### 1. UseCase 和 requirements 解决的问题不同\n\n- **requirements.md**：REQ-01 \"系统应支持用户发表评论\"（**声明性**，what）\n- **UseCase**：从用户视角的完整交互故事（**过程性**，how & when）\n\nUseCase 能表达 requirements 无法表达的东西：前端反馈、状态保留、错误恢复、用户感知。例如\"评论超长时要高亮超出部分并保留输入\"——这是用户体验，不是 AC 能说清的。\n\n#### 2. UseCase 是 E2E 测试的天然蓝图\n\n之前 `/tdd:e2e` 让 AI 自己发明 E2E 测试用例，容易漏掉关键路径。现在：\n\n```\nUC-01 的每条路径 → 一个 E2E 测试用例\n  成功路径 → 正向 E2E\n  备选 3a (内容为空) → 前端校验 E2E\n  备选 3b (内容超长) → 边界校验 E2E\n  备选 4a (DB 失败) → 错误恢复 E2E\n```\n\nE2E 测试覆盖率直接由 UseCase 决定，不再是\"AI 觉得该测什么\"。\n\n#### 3. UseCase 是 Verification System 的 flows 来源\n\nVerification System 里的 `feature_specific_flows` 其实就是 UseCase 的另一种表达。有了 usecases.md，Stage 2 验证流程可以自动从 UseCase 派生，省去手工填写 `verify.md`。\n\n#### 4. UseCase 是需求变更的影响分析载体\n\n之前 `/tdd:change` 直接从 REQ 推 task，缺少中间的用户视角桥梁。有了 UseCase：\n\n```\n变更：\"评论支持 Markdown\"\n  ↓\nUC-01 的哪些步骤变了？\n  步骤 1: 输入框 → 改为支持 Markdown 编辑器\n  步骤 6: 追加到列表 → 渲染需要解析 Markdown\n  新增备选 3c: Markdown 语法错误 → 如何反馈？\n  ↓\n自然推导出 requirements / design / tasks 的变更点\n```\n\n分析链路完整、可追溯，不会漏改文档。\n\n#### 5. UseCase 是跨角色沟通的通用语言\n\n非开发角色看不懂 EARS 格式的 requirements 或 design 的技术细节。但 UseCase 他们能看懂：\n\n| 角色 | 能看懂 requirements.md？ | 能看懂 usecases.md？ |\n|------|--------------------------|----------------------|\n| 产品经理 | ❌ EARS 语法太技术 | ✅ \"用户做 X → 系统做 Y\" |\n| QA | 部分能 | ✅ 直接能照着测 |\n| 设计师 | ❌ | ✅ 流程清晰 |\n| 新同事 | 难以快速理解 | ✅ 从用户视角入手最快 |\n\n这也是为什么 `/tdd:done` Stage 4.2 要把 UC 同步到项目全局 `docs/usecases/`——让 PM/QA/新同事都能查到最新的用户流程。\n\n### UseCase 结构\n\n```markdown\n## UC-01 用户发表评论\n\n**主角色** (Actor): 已登录用户\n**前置条件** (Precondition): 用户已登录且在文章详情页\n**触发事件** (Trigger): 用户点击\"发表评论\"按钮\n\n### 成功路径\n1. 用户输入评论内容\n2. 系统校验内容长度（≤500 字）\n3. 系统写入数据库\n4. 系统返回评论对象\n5. 前端追加到列表\n\n### 备选/失败路径\n**3a.** 内容为空 → 系统提示\"请输入内容\"，停留输入框\n**3b.** 内容超长 → 系统提示\"最多 500 字\"，高亮超出\n**4a.** 写库失败 → 显示\"提交失败，请重试\"，保留输入\n\n### 路径覆盖说明\n| 类别 | 覆盖情况 |\n|---|---|\n| 输入/校验 | 3a、3b |\n| 身份/权限 | N/A（已登录且资源公开） |\n| 状态/并发 | 4b：重复提交保持幂等 |\n| 外部依赖 | 4a：写库失败 |\n| 时间/恢复 | N/A（无异步等待） |\n| 空态/边界 | N/A（该 UC 不展示列表或分页） |\n\n### 后置条件\n新评论已写入数据库，前端列表已更新\n\n### 相关数据\n| 字段 | 类型 | 约束 |\n| content | string | 1-500 字 |\n```\n\n### 工作流\n\n```bash\n/tdd:new blog-comments\n  # 需求收集时，\"核心场景\"维度收集到步骤粒度\n  # 创建 usecases.draft.md 作为 /tdd:ff 的输入\n\n/tdd:ff\n  # Step 3: 生成 usecases.md（主产出，UC-01、UC-02...）\n  # Step 4: 生成 requirements.md（每个 REQ 标注 UC 来源）\n  # Step 5: 生成 design.md（每个接口标注支持的 UC）\n  # Step 6: 生成 tasks.md（Phase 2 按 UC 分组）\n  # Step 7: 覆盖检查（每个 UC 路径都有对应 task）\n\n/tdd:loop\n  # TDD 循环，每个 task 覆盖一个 UC 路径\n\n/tdd:e2e\n  # 从 usecases.md 派生 E2E，每个 UC 路径一个测试\n  # 测试命名：UC-01: 成功路径 / UC-01: 内容超长校验 (备选 3b)\n\n/tdd:done\n  # Stage 4.2: 交互式同步 UC 到项目全局 docs/usecases/\n  # 生成 usecases.synced.md 记录同步\n\n/tdd:archive\n  # 检查是否已同步 docs/，未同步则提示\n  # docs/usecases/ 保持不动，feature 目录整体归档\n```\n\n### UC 编号：Feature 内 vs 项目全局\n\n**Feature 内部**用局部编号 UC-01、UC-02：\n```\ntdd-specs/blog-comments/usecases.md\n  - UC-01 用户发表评论\n  - UC-02 作者删除评论\n```\n\n**同步到 `docs/usecases/`** 时自动映射为项目全局编号：\n```\ndocs/usecases/comments.md\n  - UC-025 用户发表评论   (原 UC-01)\n  - UC-026 作者删除评论   (原 UC-02)\n```\n\n映射关系记录在 `tdd-specs/<feature>/usecases.synced.md`，便于追溯。\n\n### 同步时机\n\n- **默认**：`/tdd:done` Stage 4.2 交互式同步\n- **变更**：`/tdd:change` 检测到已同步 UC 变更时，询问同步策略（待同步/立即/仅 tdd-specs）\n- **归档前**：`/tdd:archive` 如发现未同步会警告\n\n### 变更影响分析\n\n`/tdd:change` 的影响分析把 **UseCase 维度放最前面**：\n\n```\n## Change Impact Assessment\n\n### Affected UseCases（主维度）\n| UseCase | Affected Step | Impact Type | Description |\n| UC-01 | step 2, step 6 | Modify | 评论输入改为 Markdown 编辑器 |\n| UC-01 | 新增 3c 备选 | Add | Markdown 语法错误提示 |\n\n### Affected Requirements (从 UC 推导)\n...\n\n### Affected Tasks\n...\n\n### UC 同步状态\n- usecases.synced.md 记录: 2026-04-20 → docs/usecases/comments.md\n- 推荐同步策略: 标记待同步，交付时再同步\n```\n\n---\n\n## Verification System\n\nTDD Workflow 2.3.0 引入 **分层验证系统**，解决「AI 自己跑测试、自己判断通过」的质量黑洞。\n\n### 核心问题\n\n之前 `/tdd:done` 的交付检查是通用、静态的——AI 说\"测试通过了、覆盖率达标\"，但：\n- 这个**具体项目**怎么跑测试？（`npm test` 还是 `pytest`？）\n- 这个**具体 feature** 要怎么验证？（登录能成功？JWT claims 对不对？）\n- **业务侧验收**靠什么？（手动点？脚本？人工确认？）\n\n### 解决方案：两层配置 + 四阶段执行\n\n```\n┌─ 项目级 (tdd-specs/.verify/project.md) ──────────────────────┐\n│  团队共享配置：commands / environments / common_flows          │\n│  - 怎么跑单测/集成/E2E？覆盖率目标？                             │\n│  - dev 环境怎么启动？健康检查怎么做？                            │\n│  - staging 怎么部署？部署后怎么冒烟？                            │\n│  - pre/post cleanup 清什么？（端口、容器、数据库）              │\n└──────────────────────────────────────────────────────────────┘\n┌─ 个人参数 (tdd-specs/.verify/project.local.md, gitignored) ─┐\n│  每人不同的参数：MY_USER / DEV_PORT / 测试账号密码            │\n│  敏感参数建议从 shell env 或 1Password 读                     │\n└──────────────────────────────────────────────────────────────┘\n┌─ Feature 级 (tdd-specs/<name>/verify.md) ──────────────────┐\n│  只写项目级没覆盖的部分                                       │\n│  - feature 特有的流程                                        │\n│  - 依赖的项目级验证                                          │\n└──────────────────────────────────────────────────────────────┘\n```\n\n### 4 阶段执行（`/tdd:done`）\n\n```\nStage 1: 本地代码验证（全自动）\n  typecheck → lint → build → unit → integration → coverage\n  全过才继续\n\nStage 2: 本地 E2E 验证（人机交互）\n  pre_verify_cleanup\n    → 杀占用端口的进程\n    → 停 Docker Compose\n    → 重置数据库\n  启动 dev server + 等待 readiness\n  跑 common_flows（登录、创建资源...）\n    → 每个 flow 展示给用户，等待\"通过\"或问题描述\n  跑 feature_specific_flows\n  post_verify_cleanup\n\nStage 3: 测试环境验证（可选）\n  执行 deploy 脚本\n  等待 staging readiness\n  跑 post_deploy_smoke\n\nStage 4: 交付确认\n  生成 verification-report.md\n  输出监控链接\n  提示 /tdd:notes 和 /tdd:archive\n```\n\n### 工作流\n\n```bash\n# 首次使用（项目生命周期一次）\n/tdd:verify-setup     # 交互式配置项目级验证，帮你生成 deploy 脚本骨架\n/tdd:verify-local     # 填你的个人参数\n\n# 每个 feature\n/tdd:new xxx          # 需求收集最后一步询问 feature 特有的验证需求\n/tdd:ff               # 生成规范\n/tdd:loop             # TDD 循环\n/tdd:done             # 4 阶段验证\n/tdd:archive          # 归档（verification-report.md 随之归档）\n\n# 手动\n/tdd:cleanup dev      # 验证跑崩后手动清理\n```\n\n### Cleanup 预设库\n\n内置 8 个 cleanup 预设，`/tdd:verify-setup` 根据项目技术栈自动推荐：\n\n| 预设 | 用途 |\n|------|------|\n| `kill_port` | 杀占用端口的进程 |\n| `kill_node_process` | 按模式杀进程 |\n| `docker_compose_down` | 停 Docker Compose（可选清 volumes） |\n| `docker_container_rm` | 删匹配名的容器 |\n| `reset_db` | 重置数据库 |\n| `clean_tmp_files` | 清临时文件 |\n| `clear_redis` | 清 Redis |\n| `git_clean` | 清 git 未跟踪文件 |\n\n每个步骤支持 `on_fail`（continue/abort/ask）、`timeout`、`condition`、`parallel` 字段。\n\n### 参数化\n\n配置文件用 `${VAR}` 和 `${VAR:-default}` 语法。解析优先级：\n\n1. 命令行 `--var VAR=xxx`\n2. Shell 环境变量（推荐用于敏感参数）\n3. `project.local.md`（个人参数）\n4. `project.md` 的默认值\n5. 必填但未提供 → 报错\n\n敏感参数（`*_TOKEN` / `*_PASSWORD` / `*_SECRET` 等）建议从 shell env 或 1Password CLI 读，不写入任何文件。\n\n---\n\n## 自定义文档路径\n\n**不是所有项目都用 `docs/usecases/` 和 `docs/issues/`**。有些项目用 `documentation/`、`spec/`，有些团队干脆把 UseCase 管在 Confluence、把 Issue 管在 Jira。TDD Workflow 2.4.1 起支持在 `tdd-specs/.verify/project.md` 统一配置这些路径。\n\n### 配置方式\n\n`/tdd:verify-setup` 的 Phase F 会交互式问：\n\n```\n🤖 UseCase 要放在哪？\n   [A] docs/usecases/（默认）\n   [B] documentation/usecases/\n   [C] spec/usecases/\n   [D] 自定义路径\n   [E] 外部工具（Confluence / Notion / 飞书 / 语雀）\n   [F] 不需要\n\n🤖 Issue 要放在哪？\n   [A] docs/issues/（默认）\n   [B] documentation/issues/\n   [C] 自定义\n   [D] 外部工具（Jira / GitHub Issues / Linear）\n   [E] 不需要\n```\n\n结果写入 `tdd-specs/.verify/project.md`：\n\n```yaml\npaths:\n  usecases:\n    enabled: true\n    dir: \"documentation/usecases\"\n    index_file: \"documentation/usecases/README.md\"\n    numbering: \"auto\"            # auto | feature_local | manual\n\n  issues:\n    enabled: true\n    dir: \"documentation/issues\"\n    index_file: \"documentation/issues/README.md\"\n    numbering: \"auto\"\n    filename_pattern: \"<NNN>-<module>-<keyword>.md\"\n```\n\n### 外部工具模式\n\n如果 UseCase 由 Confluence 管理、Issue 由 Jira 管理，选 `enabled: false` + 填 `external_tool` / `external_url`：\n\n```yaml\npaths:\n  usecases:\n    enabled: false\n    external_tool: \"Confluence\"\n    external_url: \"https://company.atlassian.net/wiki/spaces/PROD/pages/123456\"\n\n  issues:\n    enabled: false\n    external_tool: \"Jira\"\n    external_url: \"https://company.atlassian.net/jira/projects/PROJ\"\n```\n\n这时：\n- `/tdd:bug` 分流到 Full（或项目策略要求 Issue）时不创建本地文件，而是输出 Issue 内容让你粘贴到 Jira，然后记录返回的 Issue ID（如 `PROJ-1234`）到追溯链\n- `/tdd:done` Stage 4.2 不写本地文件，而是输出 UC 内容 + 提示你打开 Confluence 链接手动更新\n- `/tdd:change` 对已同步 UC 的变更默认走\"待同步\"策略，交付时再人工更新外部\n\n**为什么不自动调 Jira/Confluence API？** 团队的权限、审批、模板各不相同，自动化容易踩坑。输出内容 + 提示是最稳的做法。\n\n### 向后兼容\n\n没配 `paths:` 节或没有 `project.md` 的项目会自动用 `docs/usecases/` 和 `docs/issues/` 作为默认，不会 break。\n\n---\n\n## 完整工作流示例\n\n下面用一个「给博客系统添加评论功能」的例子，演示从零到交付的完整流程。\n\n### 第 1 步：启动新功能\n\n```\n> /tdd:new blog-comments\n```\n\nAI 助手会逐步问你 6 个维度的问题：\n\n```\n🤖 谁会使用这个功能？\n👤 已登录用户可以发表评论，文章作者可以删除评论\n\n🤖 最重要的 1-3 个使用场景？\n👤 1. 用户在文章底部提交评论  2. 作者删除不当评论  3. 访客查看评论列表\n\n🤖 输入和输出分别是什么？\n👤 输入：评论文本（最长 500 字）、文章 ID。输出：评论对象（含作者、时间、内容）\n\n🤖 哪些情况会失败？\n👤 未登录提交、文章不存在、评论内容为空或超长\n\n🤖 什么明确不做？\n👤 不做嵌套回复、不做评论编辑、不做点赞\n\n🤖 怎样算完成？\n👤 能发评论、能看列表、能删评论、有权限控制\n```\n\n确认后，AI 创建 `tdd-specs/blog-comments/` 目录。\n\n### 第 2 步：一键生成规范文档\n\n```\n> /tdd:ff\n```\n\nAI 自动生成三份文档：\n\n```\nOK requirements.md — 4 requirements, 8 acceptance criteria\nOK design.md       — 3 modules, 5 interfaces\nOK tasks.md        — Phase 1: 3 items / Phase 2: 17 items (by UC, all layers) / Phase 3: 3 E2E items\nIssues reviewed: none\n\nReady! Run /tdd:loop to start TDD implementation.\n```\n\n生成的 `tasks.md` **按 UC 纵切**（每个 UC 包含它触及的所有技术层：DB / 后端 / 前端 / Client），Phase 1 只放跨 UC 的基础设施：\n\n```markdown\n## Phase 1: Infrastructure (跨 UC 共享)\n\n- [ ] 1.1 DB migration: create `comments` table (execute on local dev DB + SHOW TABLES 验证)\n- [ ] 1.2 CommentEntity 骨架 + module 注册\n- [ ] 1.3 schema:dump\n\n## Phase 2: Unit Tests + Implementation (按 UC 纵切)\n\n### UC-01 用户发表评论\n- [ ] 2.1 backend unit test — CommentService.create happy path\n- [ ] 2.2 backend impl — CommentService.create\n- [ ] 2.3 backend unit test — 输入校验（空、超长）\n- [ ] 2.4 backend impl — validation\n- [ ] 2.5 integration test — POST /api/comments 完整链路（含 DB 写入校验）\n- [ ] 2.6 frontend page — 评论输入框 + 提交按钮（js/wxml/wxss/json 或 tsx）\n\n### UC-02 作者删除评论\n- [ ] 2.7 backend unit test — CommentService.delete by author\n- [ ] 2.8 backend impl — delete with permission check\n- [ ] 2.9 integration test — DELETE /api/comments/:id 权限 4xx\n- [ ] 2.10 frontend — 删除按钮 + 确认对话框\n\n### UC-03 访客查看列表\n- [ ] 2.11 backend unit test — CommentRepo.listByPost 分页\n- [ ] 2.12 integration test — GET /api/posts/:id/comments\n- [ ] 2.13 frontend — 列表渲染 + 加载更多\n\n## Phase 3: E2E Acceptance\n\n- [ ] 3.1 E2E: user submits comment and sees it in list\n- [ ] 3.2 E2E: author deletes comment\n- [ ] 3.3 E2E: unauthenticated user sees comments but cannot post\n```\n\n**关键约束**（由 `/tdd:ff` 和 `/tdd:loop` 强制）：\n- **禁止单独 Phase 4 前端** — 前端页面 task 必须归到它实现的那个 UC 下的 Phase 2\n- **DB migration 必须真跑** — Phase 1 的 migration task 不只是写 SQL，还要真执行到本地 dev DB 并用 `SHOW TABLES` 验证\n- **[x] 必须有证据** — 禁止\"待后续 / TODO / skip\"同行标 `[x]`，未完成改为 `[!]` + blocker 理由\n\n### 第 3 步：TDD 自动循环\n\n```\n> /tdd:loop\n```\n\nAI 自动循环执行（Claude Code 中 Orchestrator 调度 Coder 子 agent，支持多 UC 并行）：\n\n1. **RED** — Coder 写一个失败的测试 → Orchestrator 评审测试质量\n2. **GREEN** — Coder 写最少代码让测试通过 → Orchestrator 评审实现 + 按 `/tdd:loop` 配置跑全量回归（不套用到 `/tdd:bug` Standard）\n3. **REFACTOR** — 消除重复、改善命名\n\n```\n[Orchestrator] UC-01 & UC-02 互相独立，并行启动 Coder-A / Coder-B\n[Coder-A]      writing test: comment-service.test.ts: createComment\n[Review:RED]   ✓ covers task scenario | ✓ behavior test | ✓ fails correctly\n[Coder-A]      writing impl: comment-service.ts: createComment\n[Review:GREEN] ✓ minimum code | ✓ no test mods | ✓ 5/5 tests pass\n[Coder-B]      writing test: comment-delete.test.ts: deleteByAuthor\n...\nPhase 1 + 2 complete: 20/20 tasks, 28 tests, 3.2s elapsed\nRun /tdd:e2e for E2E acceptance.\n```\n\n如果某个测试连续失败 3 次，触发 [Three-Strike Protocol](#three-strike-protocol)，暂停并等你决策。\n\n### 第 4 步：E2E 验收\n\n```\n> /tdd:e2e\n```\n\nAI 检测项目的 E2E 框架（Playwright / Cypress 等），编写并运行端到端测试。\n\n### 第 5 步：交付\n\n```\n> /tdd:done\n```\n\nAI 执行完整交付检查清单：\n\n```\n✓ Compilation clean\n✓ All tests passing (28 unit + 3 integration + 3 E2E), coverage 91%\n✓ Full regression passing\n✓ Issues logged: none (not required)\n✓ tdd-specs/blog-comments/tasks.md Phase 1–3 terminal (blocked items: none)\n\n## Delivery Report — blog-comments\n- Added: src/services/comment-service.ts, src/routes/comments.ts, ...\n- Modified: src/routes/index.ts\n- Tests: 28 unit PASS, 3 integration PASS, 3 E2E PASS\n- Issues: none (no Full bug or project requirement)\n\nRun /tdd:archive to archive specs.\n```\n\n### 第 6 步：归档\n\n```\n> /tdd:archive\n```\n\n将已完成的规范移入 `tdd-specs/archive/2026-04/blog-comments/`，清空 `.current`。\n\n---\n\n## 斜杠命令详解\n\n### `/tdd:auto <name> [--yolo]` — 一键全流程\n\n按 `new → model（仅 systemic）→ ff → loop → e2e → done` 顺序代理；`--yolo` 可以跳过普通阶段提示，但不能跳过 systemic 的 Model 显式确认。详细规则见顶部 [一键全流程：`/tdd:auto`](#一键全流程tddauto) 章节。\n\n### `/tdd:new <name>` — 启动新功能\n\n交互式收集需求，覆盖 6 个维度：目标用户、核心场景、输入输出、错误处理、范围边界、验收标准；然后分类为 `standard`、`systemic` 或 `exploration`。\n\n```\n> /tdd:new payment-retry\n```\n\n只创建目录 `tdd-specs/payment-retry/`，不生成文档——确保需求确认后再动笔。\n\n### `/tdd:model [feature]` — 领域模型确认\n\n仅 systemic 必须执行；`feature` 可省略，默认读取 `tdd-specs/.current`。它先把信息分成已验证事实 `FACT-*`、已确认决策 `DEC-*`、假设 `ASM-*` 和提案 `PROP-*`，再分别建立 As-Is、To-Be、Transition 三层模型。完整草稿完成后，Author 会启动只读独立 Reviewer，双方先自动解决可由证据判断的问题；连续两轮仍有分歧或需要产品权衡的问题才进入 `domain.md` 顶部 Human Review 区。用户确认后再做增量复审；只有阻塞决策为 0、Reviewer verdict 为 pass、模型与评审 revision 一致、语义摘要仍匹配且 `verify --model-ready` 通过，才进入正式 UseCase；`--yolo` 不能代替确认。\n\n### `/tdd:ff` — 快速前进（UseCase-First）\n\n**一次性产出四份行为与技术规范**。systemic 先读取已确认的 `domain.md`，再以 `usecases.md` 为行为权威，其余三份从 UC 和适用不变量派生：\n\n| 产出 | 角色 |\n|---|---|\n| `usecases.md` | **主产出**（Actor / 前置 / 触发 / 成功路径 / 备选路径 / 后置 / 相关数据），PM/QA 的权威文档 |\n| `requirements.md` | EARS 格式需求，**每条引用 UC 编号** |\n| `design.md` | 架构/接口，标注\"支持的 UseCase\" |\n| `tasks.md` | **按 UC 纵切**（每个 UC 含它触及的所有层：DB / 后端 / 前端）；Phase 1 放跨 UC 基础设施；Phase 2 每 task 标注 `Covers UC-N step M`；Phase 3 是 E2E |\n\n`usecases.md` 详见 [UseCase-First 工作流](#usecase-first-工作流) 章节。\n\n自动执行的检查（cannot skip）：\n- **前置上下文** — 如果存在 `discovery.md`，先读取已确认决策、开放问题和候选反例，不重复询问已知信息\n- **反例/边界覆盖** — 每个 UC 检查输入、权限、状态/并发、依赖失败、超时/恢复和空态/边界；适用项必须落成路径，不适用项写明理由\n- **测试覆盖检查** — 单元/集成/E2E 三层任何一层 task 为 0 时主动补\n- **Vertical Slice Rule** — Phase 2 里每个 UC 必须包含它涉及的所有技术层（禁止单独的\"Phase 4 前端\"）\n- **DB migration 执行** — 有 migration 的 Phase 1 必须**真跑到本地 dev DB** + `SHOW TABLES` 验证，不是只写 SQL\n\n如果项目启用了 [截图验证](#截图验证视觉证据)，`/tdd:ff` 会在 UC 生成时主动为成功路径/错误态打 `@screenshot:<label>` 标注。\n\n### `/tdd:spec` — 单独生成或更新规范\n\n只处理规范产物，不启动实现。它会读取可选的\n`tdd-specs/<feature>/discovery.md`、`usecases.draft.md` 和已有规范，生成或\n更新 `usecases.md`、`requirements.md`、`design.md`、`tasks.md`，并在覆盖前\n提示用户确认。\n\n### `/tdd:loop` — TDD 自动循环（Phase 1 + Phase 2）\n\n自动循环直到 `tasks.md` 的 Phase 1（基础设施）+ Phase 2（代码实现）不再有\n`[ ]` / `[~]`；正常完成标 `[x]`，经升级后明确跳过的任务标 `[!]` 并保留到最终报告。\n\n**循环伪代码**：\n```\nWHILE tasks.md 有任何 [ ] 或 [~] task:\n  IF Phase 1 任务 (migration / scaffolding):\n    直接执行 + 验证（例：SHOW TABLES）→ 标 [x]\n  ELSE IF Phase 2 \"unit test\" 任务:\n    RED phase      — 写 failing test\n  ELSE IF Phase 2 \"implement\" 任务:\n    GREEN phase    — 写最小实现（查 issues 目录防重犯）\n  ELSE IF Phase 2 前端页面任务:\n    直接写页面文件（js/wxml/wxss/json 或 tsx）+ app 注册 → 标 [x]\n  REFACTOR phase — 去重改名（可选）\n\n  IF 同测试失败 3 次:\n    Three-Strike Protocol → 停下问用户\n```\n\n> 说明：上面的 **RED / GREEN / REFACTOR** 是 `/tdd:loop` 内部的阶段标记，**不是独立的斜杠命令**。不用也不能手工敲 `/tdd:red`——loop 会按任务类型自动进入对应阶段。\n\n**关键行为**：loop 按 UC 纵切处理 —— 先把 UC-01 的所有层（backend test → backend impl → frontend page）跑完，再进 UC-02，保证每个 UC 随它的任务完成**整体可交付**。\n\n**标 [x] 必须有证据**（MANDATORY）：\n\n| 任务类型 | 标 [x] 前必须验证 |\n|---|---|\n| Unit test | 测试文件存在 + 运行框架显示它通过 |\n| Implementation | 源文件存在 + 相关测试通过 |\n| Frontend page | 所有页面文件齐 + 在 app config 注册 |\n| DB migration | `SHOW TABLES` 确认新表存在 |\n| **任意** | **禁止**同行带\"待后续 / TODO / skip\"；阻塞的任务改用 `[!]` + 理由 |\n\n每轮循环开始前执行 **任务完整性扫描**，检查是否遗漏：migration 执行、真实 DB 集成测试、错误响应解析、崩溃恢复、超时处理、HTTP 集成测试等场景。\n\n#### 为什么 `/tdd:loop` 和 `/tdd:e2e` 分开\n\n`/tdd:loop` 跑 **Phase 1 + Phase 2**（基础设施、单测、集成、前端页面），`/tdd:e2e` 跑 **Phase 3**（端到端）。分开是因为两者的**速度、依赖、失败语义、触发频率**完全不同：\n\n| 维度 | `/tdd:loop` (Phase 1 + 2) | `/tdd:e2e` (Phase 3) |\n|------|----------------------|----------------------|\n| **速度** | 秒级（单测几秒，集成几十秒） | 分钟级（E2E 动辄几分钟） |\n| **依赖** | 纯代码 + 本地 DB，可 mock 外部 | 需要跑起来真实服务、浏览器自动化 |\n| **失败语义** | 实现有 bug，改代码 | 可能是 bug / 集成问题 / 环境问题 |\n| **触发频率** | 每个 task 一轮（十几次～几十次） | Phase 1 + 2 都完成后一次 |\n| **硬规则** | 测试行为而非实现 | 必须经过真实网络层、关键字段断言 |\n\n**速度是最关键的**。TDD 的核心价值是**快速反馈循环**——写个测试立刻看它失败、改代码立刻看它通过。如果每轮循环要等 5 分钟 E2E，TDD 就废了。\n\n**合并的代价**：每 loop 一轮就重启环境、拉浏览器、跑 E2E，大部分 E2E 是重复在跑（因为底层代码没变就只是加了下一个单测）。单测覆盖的场景，E2E 再跑一遍没价值。\n\n**分开的好处**：\n- `/tdd:loop` 保持快速紧凑反馈\n- `/tdd:e2e` 集中在 Phase 1 + Phase 2 都完成后一次性验收所有用户路径（从 `usecases.md` 派生，见 [UseCase-First 工作流](#usecase-first-工作流)）\n- 失败排查路径清晰——单测失败看 assertion，E2E 失败查日志/浏览器/数据库\n\n### `/tdd:bug` — 自动分流的 Bug 修复流程\n\n`/tdd:bug` 需要显式调用，但模式选择是自动的。这里的“自动”是指 Agent 在任何\n写操作前先做有边界的只读诊断，再按固定决策表分流；不是新增一个分类器或 CLI，\n也不会只看“是否在 CI”或“用了多少分钟”。\n\n| 模式 | 判定证据 | 默认范围 |\n|---|---|---|\n| **Fast** | 已确认是 CI、环境、配置、依赖、构建、命令、权限、缓存或工具链问题，且不改变产品行为契约 | 最小修复 + 重跑原始失败检查 |\n| **Standard** | 可稳定复现的产品行为回归，影响有限且没有高风险标志 | RED 复现测试 + 最小 GREEN + 定向和受影响回归 |\n| **Full** | 安全、鉴权、支付/资金、数据损坏、迁移、并发/幂等、生产事故；修复后再次逃逸；或跨独立系统边界/多消费者且影响面广、涉及外部契约 | Issue + RED/GREEN + 全量回归 + 相关 E2E + 逃逸原因分析/相称预防 |\n\n分流前先输出：\n\n```text\n[Triage] Mode: Fast | Standard | Full | Unresolved\nEvidence: <已观察到的事实>\nBehavior contract: <无，或被违反的行为契约>\nRisk flags: <无，或风险列表>\nVerification: <必须通过的精确命令/测试/证据>\n```\n\nCI 只是问题出现的位置，不是类型。例如缺少 secret、Node 版本不符、缓存、\nlockfile、runner 权限或命令路径通常是 Fast；CI 断言如果证明支付或鉴权行为回归，\n则仍是 Full。有限诊断后仍无法确认根因时，流程会报告已检查内容并询问下一步，\n不会因为“不确定”自动跑完整流程。只要证据能明确判定为 Fast、Standard 或 Full，\n输出分流结果后就直接执行，不再额外询问模式确认。\n\n可以用 `/tdd:bug --fast`、`--standard` 或 `--full` 表达意图；如果证据与指定模式\n冲突，Agent 会报告原因并自动采用证据支持的模式；同时指定多个模式则视为\n`Unresolved` 并询问用户。Fast 默认不创建 Issue、测试、预防项或 E2E；Standard\n默认不创建 Issue/预防项；只有 Full 或项目显式策略要求时才进入完整追溯链路。\n\n### `/tdd:change` — 中途变更需求\n\n安全地修改进行中的需求，自动分析影响范围：\n\n```\n> /tdd:change\n\n🤖 请描述变更内容：\n👤 评论需要支持 Markdown 格式\n\n## Change Impact Assessment\n\n### Affected Spec Entries\n| Document | Entry | Impact Type | Description |\n|----------|-------|-------------|-------------|\n| requirements.md | REQ-01 | Modify | Comment input supports Markdown |\n| design.md | CommentService | Modify | Add markdown parsing step |\n\n### Affected Tasks\n| Task | Current Status | Action Needed |\n|------|---------------|---------------|\n| 2.1 createComment test | [x] Completed | WARNING: needs redo |\n| 2.2 createComment impl | [x] Completed | WARNING: needs redo |\n| 2.N markdown parsing | — | New task |\n\n### Risk Notes\n- Completed tasks affected: 2\n- Estimated additional work: medium\n\nConfirm to proceed? [A] Confirm  [B] Adjust  [C] Cancel\n```\n\n**安全机制**：如果变更导致 10+ 个已完成任务需要回退，建议重新跑 `/tdd:ff`。\n\n### `/tdd:continue` — 恢复进度\n\n从上次中断处继续。自动定位第一个 `[ ]` / `[~]` 任务；不会静默重试已有决策记录的\n`[!]`。如果只剩 `[!]`，先报告 blocker，再根据剩余阶段进入 `/tdd:e2e` 或 `/tdd:done`：\n\n```\n> /tdd:continue blog-comments\n\nResumed: tdd-specs/blog-comments/\nCompleted: 8/12 tasks\nCurrent phase: Phase 2\nNext step: 2.9 integration test — GET /api/posts/:id/comments pagination\nRun /tdd:loop to continue.\n```\n\n### `/tdd:e2e` — E2E 验收测试\n\n自动检测项目的 E2E 框架，编写并运行端到端测试。\n\n**硬规则**：\n- 必须经过真实网络层（不允许直接操作 store）\n- 跳过的测试必须写明原因（累计超过 3 个必须搭建 mock 环境解决）\n- 每个关键动作后必须断言结果\n- 关键业务字段必须断言具体值\n\n### `/tdd:done` — 交付检查\n\n每一项检查必须通过才能继续：\n\n```\n[ ] 编译通过（编译型语言必检）\n[ ] 全量测试通过，覆盖率 >= 80%\n[ ] 全量回归通过\n[ ] E2E 通过\n[ ] 功能文档已更新\n[ ] Issue 已记录（Full Bug 或项目显式策略要求时）\n[ ] 环境变量示例已同步\n[ ] tasks.md 的 Phase 1–3 无 [ ]/[~]；每个 [!] 的 blocker 已进入最终报告\n```\n\n### `/tdd:archive` — 归档规范\n\n确认 `phase=deliver` 且 Phase 1–3 已终态后，移入\n`tdd-specs/archive/YYYY-MM/`；旧 spec 遗留的 4.x 行仅作历史记录。\n\n---\n\n## Harness Hooks\n\n> 仅 Claude Code 支持。其他工具的质量约束靠 Prompt 层 + self-review。\n\n`tdd-workflow init --tools claude` 会自动安装 5 个 hook 脚本到 `.claude/hooks/tdd/` 并注入 `.claude/settings.json`：\n\n| Hook | 触发时机 | 作用 |\n|------|---------|------|\n| `pre-write-edit.sh` | 写/编辑文件前 | **RED 阶段阻止 Write/Edit 修改实现文件**；不覆盖其他可写工具 |\n| `pre-bash.sh` | 执行命令前 | 只在调试日志记录“代码比最近测试更新”的提醒 |\n| `post-write-edit.sh` | 写/编辑文件后 | 记录 `last_edit_time` 到 `.harness` |\n| `post-bash.sh` | 执行命令后 | 根据测试类命令输出启发式追踪连续失败数 |\n| `user-prompt-submit.sh` | 用户发消息时 | 注入经过校验的 phase/strikes 状态到 Claude 上下文 |\n\n### `.harness` 状态文件\n\n每个功能目录下有独立的 `.harness` 文件（`tdd-specs/<name>/.harness`）。Hook\n把它当作不可信数据读取，只接受已知字段和合法枚举：\n\n```\nphase=red              # 当前阶段 (requirements/spec/red/green/refactor/e2e/deliver)\nstrikes=0              # GREEN 阶段连续失败次数\nlast_test_time=1713234567    # 上次跑测试的时间戳\nlast_edit_time=1713234500    # 上次编辑代码的时间戳\n```\n\n多功能并行开发时，每个功能的状态独立——切换 `.current` 就切换了 harness 上下文。\n\n### 注意事项\n\n- **init 后需要重启 Claude Code session**，hooks 才会被加载（settings.json 只在启动时读取）\n- 已有的 `.claude/settings.json` 不会被覆盖，TDD hooks 是追加合并的\n- hooks 使用 `sed -i''` 语法，兼容 macOS 和 Linux\n- Three-Strike 的停止由工作流指令执行；Hook 只提供连续失败计数，不会封锁后续 Bash\n\n---\n\n## Issue 追踪机制\n\nTDD Workflow 内置轻量级 Issue 追踪，为高风险、修复后再次逃逸或跨独立边界且影响面广的 Full Bug 保留完整追溯。\n\n### 何时必须创建 Issue\n\n满足以下**任一条件**即必须创建：\n\n- `/tdd:bug` 自动分流为 Full\n- 项目的显式 Issue 策略要求记录\n\nFull 风险包括安全/鉴权、支付与资金、数据损坏、迁移、并发/幂等、生产事故、\n修复后再次逃逸，或跨独立系统边界/多消费者且影响面广、涉及外部契约。普通模块\n调用链和为诊断而重复运行同一失败都不自动算 Full。耗时和修改文件数只用于估算\n成本，不能单独把 Fast/Standard 提升为 Full。\n\n### Issue 文档格式\n\nIssue 存放在 `docs/issues/` 目录（如果项目有该目录）：\n\n```markdown\n# Issue #012 — 评论验证边界条件未处理\n\n## Basic Info\n| Field | Content |\n|-------|---------|\n| Discovered | 2026-04-08 |\n| Module | `src/services/comment-service.ts` |\n| Severity | Medium |\n| Status | Fixed |\n\n## Symptoms\n提交 501 字评论时返回 500 而非 400\n\n## Root Cause Analysis\nvalidateComment() 使用 > 而非 >= 比较，500 字恰好绕过校验，\n导致数据库 VARCHAR(500) 约束抛出未处理异常。\n\n## Fix\n| File | Change |\n|------|--------|\n| src/services/comment-service.ts | `> 500` → `>= 500` |\n| test/comment-service.test.ts | Added boundary test for 500/501 chars |\n\n## Verification Steps\nnpm test -- --testPathPattern=\"comment-service\"\n\n## Prevention Measures\n- 数值边界检查统一使用 >= 比较\n- 所有字段长度限制必须有边界值测试\n```\n\n### Issue 何时被查阅\n\n| 时机 | 方式 |\n|------|------|\n| `/tdd:ff` 生成规范前 | 浏览项目 issues 目录，关联已知问题 |\n| 每次 GREEN 阶段（`/tdd:loop` 内部）写实现前 | 搜索相关错误关键词，避免重复踩坑 |\n| Three-Strike Protocol 触发后 | 全文搜索 + 模块过滤 |\n\n---\n\n## Three-Strike Protocol\n\n当同一个测试连续失败 3 次时，自动触发暂停机制：\n\n```\n⚠️ WARNING: Three-Strike Protocol\n\nTest: comment-service.createComment.should-handle-concurrent-requests\nAttempt history:\n  1. Added mutex lock -> \"deadlock detected\"\n  2. Switched to optimistic locking -> \"version conflict not handled\"\n  3. Added retry logic -> \"max retries exceeded in test\"\n\nIssues search: found #009-database-connection-pool (similar concurrency issue)\n\nPlease choose:\n  A. Try a different approach (describe your idea)\n  B. Split into smaller test granularity\n  C. Mark [!] skip, move to next task\n  D. Need more context\n```\n\n这个机制防止 AI 在同一个问题上无限循环，把决策权交还给你。\n\n---\n\n## 目录结构约定\n\n安装后，项目中会出现以下结构：\n\n```\nyour-project/\n├── .tdd-workflow/                    # 安装记录与强制更新备份\n│   ├── manifest.json\n│   └── backups/\n├── .claude/                          # (或 .cursor/ .cline/ 等)\n│   ├── settings.json                 # hooks 配置（仅 Claude Code，自动合并）\n│   ├── hooks/tdd/                    # harness hook 脚本（仅 Claude Code）\n│   │   ├── pre-write-edit.sh\n│   │   ├── pre-bash.sh\n│   │   ├── post-write-edit.sh\n│   │   ├── post-bash.sh\n│   │   └── user-prompt-submit.sh\n│   ├── skills/tdd-workflow/\n│   │   ├── SKILL.md                  # 完整技能定义\n│   │   ├── templates/                # 规范文档模板\n│   │   │   ├── discovery.md          # 可选的前置决策交接\n│   │   │   ├── domain.md             # systemic 领域模型模板\n│   │   │   ├── requirements.md\n│   │   │   ├── design.md\n│   │   │   ├── tasks.md\n│   │   │   ├── review-checklist.md   # Reviewer 评审标准\n│   │   │   ├── verify-project.md     # 项目级验证模板\n│   │   │   └── verify-feature.md     # Feature 级验证模板\n│   │   └── verify-presets/           # Cleanup 预设库\n│   │       └── cleanup.md\n│   └── commands/tdd/\n│       ├── new.md                    # /tdd:new\n│       ├── model.md                  # /tdd:model\n│       ├── ff.md                     # /tdd:ff\n│       ├── loop.md                   # /tdd:loop\n│       ├── bug.md                    # /tdd:bug\n│       ├── change.md                 # /tdd:change\n│       ├── continue.md              # /tdd:continue\n│       ├── e2e.md                    # /tdd:e2e\n│       ├── verify-setup.md          # /tdd:verify-setup\n│       ├── verify-local.md          # /tdd:verify-local\n│       ├── cleanup.md               # /tdd:cleanup\n│       ├── done.md                   # /tdd:done (4 阶段验证)\n│       ├── notes.md                  # /tdd:notes\n│       ├── spec.md                   # /tdd:spec\n│       ├── manifest.json             # 命令资源清单\n│       └── archive.md               # /tdd:archive\n└── tdd-specs/                        # 规范文件存放目录\n    ├── .current                      # 当前活跃的功能名\n    ├── .verify/                      # 项目级验证配置\n    │   ├── project.md                # 团队共享（提交 git）\n    │   └── project.local.md          # 个人参数（gitignored）\n    ├── blog-comments/                # 进行中的功能\n    │   ├── .harness                  # harness 状态\n    │   ├── discovery.md              # 可选的前置决策与反例记录\n    │   ├── domain.md                 # systemic 的已确认语义契约\n    │   ├── usecases.draft.md\n    │   ├── usecases.md\n    │   ├── requirements.md\n    │   ├── design.md\n    │   ├── tasks.md\n    │   ├── verify.md                 # feature 级验证（独有部分）\n    │   └── verification-report.md   # /tdd:done 生成的验证报告\n    └── archive/                      # 已完成的功能\n        └── 2026-04/\n            └── user-auth/\n```\n\n### 任务状态标记\n\n| 标记 | 含义 |\n|------|------|\n| `- [ ]` | 未开始 |\n| `- [~]` | 进行中（RED 已写，GREEN 未完成） |\n| `- [x]` | 已完成 |\n| `- [!]` | 阻塞或明确跳过；只有记录决策与原因后才是终态 |\n\n---\n\n## 支持的工具\n\n| 工具 | ID | 技能目录 | 调用方式 / 命令目录 |\n|------|----|----------|---------------------|\n| Claude Code | `claude` | `.claude/skills/tdd-workflow/` | `.claude/commands/tdd/` |\n| OpenAI Codex | `codex` | 项目：`.agents/skills/tdd-workflow/`；用户：`~/.agents/skills/tdd-workflow/` | `$tdd-workflow`（命令资源在 `commands/`） |\n| Cursor | `cursor` | `.cursor/skills/tdd-workflow/` | `.cursor/commands/tdd/` |\n| Cline | `cline` | `.cline/skills/tdd-workflow/` | `.cline/commands/tdd/` |\n| Windsurf | `windsurf` | `.windsurf/skills/tdd-workflow/` | `.windsurf/commands/tdd/` |\n| CodeBuddy | `codebuddy` | `.codebuddy/skills/tdd-workflow/` | `.codebuddy/commands/tdd/` |\n| GitHub Copilot | `copilot` | `.github/skills/tdd-workflow/` | `.github/commands/tdd/` |\n\n工具检测逻辑：扫描项目根目录下是否存在对应的配置目录（`.claude/`、`.cursor/` 等）；Codex 检测 `.codex/` 或 `.agents/`。\n\n---\n\n## 与 OpenSpec 的对比\n\n[OpenSpec](https://github.com/SilentOverflow03/OpenSpec) 是另一个流行的规范驱动开发工具。两者解决的问题不同：\n\n> **OpenSpec 解决「AI 不知道该做什么」——让 AI 按规范写代码。**\n>\n> **TDD Workflow 解决「AI 写的代码不靠谱」——用测试驱动 + 质量门禁确保代码真正能用。**\n\n### 流程对比\n\n```\nOpenSpec:    Propose → Review specs → Apply (AI 自由发挥写代码) → Archive\nTDD Workflow: 需求收集 → 规范生成 → RED → GREEN → REFACTOR → E2E → 交付检查 → 归档\n                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n                                     OpenSpec 没有覆盖的部分\n```\n\nOpenSpec 的 Apply 就是一句 `/opsx:apply`——怎么写代码、怎么测试、质量如何，全靠 AI 自由发挥。TDD Workflow 的规范生成只是起点，重点在后面整个 TDD 循环和质量门禁。\n\n### TDD Workflow 有而 OpenSpec 没有的\n\n| 能力 | TDD Workflow | OpenSpec |\n|------|-------------|---------|\n| **强制测试先行** | RED 必须先看到测试失败才能写实现代码 | 无测试约束，Apply 直接生成代码 |\n| **自动 TDD 循环** | `/tdd:loop` 自动 red→green→refactor 直到完成 | 无对应机制 |\n| **Three-Strike Protocol** | 同一测试失败 3 次自动暂停，等人决策 | 无失败熔断，AI 可能无限循环 |\n| **测试覆盖检查** | 生成 tasks 后自动检查单元/集成/E2E 三层是否都有任务，缺了自动补 | 不关心测试分层 |\n| **回归保护** | `/tdd:loop` 每次 GREEN 跑当前/受影响测试、收尾跑全量；`/tdd:bug` 按 Fast/Standard/Full 选择验证范围 | 无回归机制 |\n| **Issue 追踪** | Full Bug 或项目显式策略要求时生成 Issue；不按耗时/文件数机械升级 | 无 |\n| **Bug 修复流程** | `/tdd:bug` 先自动分流 Fast/Standard/Full，再执行相称的修复与验证 | 无专门 bug 流程 |\n| **交付门禁** | `/tdd:done` 8 项检查必须全过才能交付 | 无交付验证 |\n| **中途变更管理** | `/tdd:change` 自动影响分析 + 已完成任务自动回退 | 可以改规范但没有影响分析和任务回退 |\n| **任务状态跟踪** | `[ ]` `[~]` `[x]` `[!]` 四种状态实时更新 | tasks.md 有 checklist 但无进行中/阻塞状态 |\n| **Multi-Agent** | Orchestrator / Coder / Tester 三角分工：写代码、E2E 测试、评审三个角色物理隔离；多 UC 支持并行 Coder（isolation:worktree） | 单 Agent 自写自审 |\n| **Bug 回顾机制** | Full Bug 执行相称的根因回顾、预防措施和危险模式扫描 | 无 |\n\n### OpenSpec 有而 TDD Workflow 没有的\n\n| 能力 | OpenSpec | TDD Workflow |\n|------|---------|-------------|\n| **系统级规范** | `specs/` 维护「当前系统全貌」活文档，变更是 delta | 只有功能级规范，没有系统全貌 |\n| **Delta 规范格式** | ADDED/MODIFIED/REMOVED 结构化标记 | 无 delta 格式 |\n| **CLI 管理命令** | `list`、`view`、`validate`、`show` 等 | `init`、`update`、`verify` |\n| **支持工具数量** | 17+（含 Codex、Amazon Q、Augment 等） | 7 个 |\n| **Brownfield 优化** | 专门为改造存量项目设计 | 更偏新功能开发 |\n\n### 实际场景对比\n\n用一个例子说明区别——「给 API 添加分页功能」：\n\n**OpenSpec 的做法：**\n\n```\n/opsx:propose add-pagination\n→ 生成 proposal.md、design.md、tasks.md（delta spec 标记哪些接口要改）\n→ 人工 review 规范\n/opsx:apply\n→ AI 按规范写代码（怎么测试？不知道。写对了吗？希望吧。）\n/opsx:archive\n→ 完成\n```\n\n**TDD Workflow 的做法：**\n\n下面是功能开发的 `/tdd:loop` 示例；`/tdd:bug` Standard 只跑复现测试和受影响回归。\n\n```\n/tdd:new add-pagination\n→ 交互式收集：分页参数格式？默认每页几条？总数怎么算？超出范围返回什么？\n/tdd:ff\n→ 生成四份规范（usecases.md 主产出 → requirements / design / tasks），自动检查：UC 覆盖了错误路径吗？单元测试有吗？集成测试覆盖 HTTP 链路了吗？每个 UC 都含它的所有层（DB / 后端 / 前端）吗？E2E 有吗？缺了自动补\n/tdd:loop\n→ RED:  写测试 — GET /api/posts?page=2&limit=10 应返回第 11-20 条 — 运行，失败 ✓\n→ GREEN: 写最少实现 — 跑全量回归确认没有破坏已有功能 ✓\n→ RED:  写测试 — page=0 应返回 400 — 运行，失败 ✓\n→ GREEN: 加参数校验 — 全量回归 ✓\n→ RED:  写测试 — page 超出总页数应返回空数组 — 运行，失败 ✓\n→ GREEN: 加边界处理 — 全量回归 ✓\n  （某个测试连续失败 3 次 → Three-Strike Protocol 暂停，你来决定怎么办）\n→ ... N 轮后 Phase 1 + Phase 2 全部终态（[x] 或有记录的 [!]）\n/tdd:e2e\n→ 用 Playwright 写端到端测试，跑真实网络请求\n/tdd:done\n→ 8 项检查：编译 ✓ 覆盖率 92% ✓ 回归 ✓ E2E ✓ Issue: none (not required) ...\n→ 全过才算交付\n```\n\n### 能组合使用吗？\n\n可以。两者不冲突：\n\n- 用 **OpenSpec** 管理系统级规范（`specs/` 描述系统全貌）\n- 用 **TDD Workflow** 管理每个功能的实现质量（测试驱动 + 质量门禁）\n\n但如果只选一个：**规范写得再好，没有测试验证就只是「希望 AI 做对」**。TDD Workflow 确保每一行代码都有测试背书。\n\n---\n\n## 发布前 Codex 全流程验收\n\n仓库提供一个完整、隔离、可重试的 Codex live runner：它会打包当前候选、安装到临时\nNode.js 工程，逐步执行 new → ff → loop → e2e → done → continue → archive，并用独立\nHTTP oracle 复核 Agent 自写测试之外的行为。失败时可从最后成功 checkpoint 重放，不会\n覆盖失败 attempt 的日志。\n\n运行要求、`setup / run / check / retry / resume / cleanup` 命令和人工审计检查点见\n[4.0.1 Codex 全流程验收 Case](./docs/acceptance-4.0.1.md)。真实 Codex 调用有模型成本，\n因此该验收是发布前显式门禁，不会被默认 `npm test` 自动执行。\n\n## 常见问题\n\n### 这个工具适合什么项目？\n\n任何需要 TDD 流程的项目——前端、后端、CLI 工具、库。支持的语言和测试框架不受限制，AI 助手会根据项目实际的 `package.json` / `pyproject.toml` / `go.mod` 等自动适配。\n\n### 什么不适合用 TDD Workflow？\n\n- 未显式采用工作流的普通 CI / 环境 / 依赖 / 构建 / 工具链诊断\n- 单行 typo 修复\n- 纯文档修改\n- 简单样式调整\n- 只要求定位根因、不要求实现修复的任务\n\n这些按改动范围直接处理并做相称验证即可。如果已经显式调用 `/tdd:bug`，确认是\n配置或操作性根因时通常自动落到 Fast，不会进入完整 TDD。\n\n### 我只用 Claude Code，需要装其他工具的文件吗？\n\n不需要。`--tools claude` 只安装 Claude Code 对应的文件。交互模式下也可以只勾选一个工具。\n\n### Codex 安装后为什么没有 `/tdd:new` 项目斜杠命令？\n\nCodex 版通过 skill 调用。输入 `$tdd-workflow Run /tdd:new <name>`，或先用\n`/skills` 选择 `tdd-workflow` 再描述要执行的流程。安装器会把技能放到 Codex\n会自动发现的 `.agents/skills/tdd-workflow/`；但技能本身关闭了隐式调用，因此普通\n修复请求不会自动采用它。若技能未立即出现，重启 Codex。\n\n如果之前安装在旧路径 `.codex/skills/tdd-workflow/`，运行：\n\n```bash\nnpx tdd-workflow@latest update\n```\n\n会将最新版迁移到 `.agents/skills/tdd-workflow/`。\n\n### 文件已存在会覆盖吗？\n\n默认不会。已存在的文件会跳过，CLI 会提示 `⚠ N files skipped (use --force to overwrite)`。加 `--force` 覆盖。\n\n### 如何更新到新版本？\n\n```bash\n# 项目级安装\nnpx tdd-workflow@latest update\n\n# Codex 用户级安装\nnpx tdd-workflow@latest init --tools codex --scope user --force\n```\n\n第一条命令自动检测并更新当前项目中的安装；第二条直接刷新当前用户的 Codex skill。\n\n### `npx tdd-workflow init` 装上的版本不是最新的？\n\n`npx` 默认会优先用本机已经全局安装或缓存里的版本，**不会主动去 registry 拉最新**。如果你以前 `npm i -g tdd-workflow` 装过，全局那个会被无限期复用。\n\n**永久修法**（推荐）：始终带 `@latest`：\n\n```bash\nnpx tdd-workflow@latest init\nnpx tdd-workflow@latest update\n```\n\n**也可以**：删掉全局安装，未来 `npx` 就不会被它劫持：\n\n```bash\nnpm uninstall -g tdd-workflow\n```\n\n### init 后 hooks 没有生效？\n\nClaude Code 的 `settings.json` 只在 session 启动时加载。`tdd-workflow init` 之后需要 **退出并重新进入 Claude Code**，hooks 才会生效。\n\n### Multi-Agent 在 Cursor/CodeBuddy 里能用吗？\n\n会自动降级为单 Agent + 强制 self-review。Coder/Reviewer 分离是 Claude Code 特有的（依赖 Agent tool），其他工具写完代码后会强制按 review-checklist.md 自检，输出 `[Review:RED]` / `[Review:GREEN]` 评审结果。\n\n### Hooks 会影响我已有的 settings.json 吗？\n\n不会覆盖有效 JSON 中的其他配置。TDD hooks 是追加合并的——你已有的\npermissions、env、其他 hooks 都会保留。重复 init 会先移除旧的 TDD hooks\n再写入新的，不会重复。如果 `settings.json` 本身不是有效 JSON，安装会中止\n并保留原文件，不会用空配置覆盖它。\n","readmeFilename":"README.zh-CN.md"}