@paths.design/caws-cli 10.1.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/README.md +125 -374
  2. package/dist/index.js +43 -756
  3. package/dist/shell/binding/resolve-binding.d.ts +4 -0
  4. package/dist/shell/binding/resolve-binding.d.ts.map +1 -0
  5. package/dist/shell/binding/resolve-binding.js +228 -0
  6. package/dist/shell/binding/resolve-binding.js.map +1 -0
  7. package/dist/shell/binding/types.d.ts +42 -0
  8. package/dist/shell/binding/types.d.ts.map +1 -0
  9. package/dist/shell/binding/types.js +21 -0
  10. package/dist/shell/binding/types.js.map +1 -0
  11. package/dist/shell/commands/claim.d.ts +14 -0
  12. package/dist/shell/commands/claim.d.ts.map +1 -0
  13. package/dist/shell/commands/claim.js +197 -0
  14. package/dist/shell/commands/claim.js.map +1 -0
  15. package/dist/shell/commands/doctor.d.ts +13 -0
  16. package/dist/shell/commands/doctor.d.ts.map +1 -0
  17. package/dist/shell/commands/doctor.js +97 -0
  18. package/dist/shell/commands/doctor.js.map +1 -0
  19. package/dist/shell/commands/evidence.d.ts +28 -0
  20. package/dist/shell/commands/evidence.d.ts.map +1 -0
  21. package/dist/shell/commands/evidence.js +166 -0
  22. package/dist/shell/commands/evidence.js.map +1 -0
  23. package/dist/shell/commands/gates.d.ts +19 -0
  24. package/dist/shell/commands/gates.d.ts.map +1 -0
  25. package/dist/shell/commands/gates.js +181 -0
  26. package/dist/shell/commands/gates.js.map +1 -0
  27. package/dist/shell/commands/init.d.ts +8 -0
  28. package/dist/shell/commands/init.d.ts.map +1 -0
  29. package/dist/shell/commands/init.js +64 -0
  30. package/dist/shell/commands/init.js.map +1 -0
  31. package/dist/shell/commands/scope.d.ts +11 -0
  32. package/dist/shell/commands/scope.d.ts.map +1 -0
  33. package/dist/shell/commands/scope.js +92 -0
  34. package/dist/shell/commands/scope.js.map +1 -0
  35. package/dist/shell/commands/status.d.ts +15 -0
  36. package/dist/shell/commands/status.d.ts.map +1 -0
  37. package/dist/shell/commands/status.js +106 -0
  38. package/dist/shell/commands/status.js.map +1 -0
  39. package/dist/shell/commands/waiver.d.ts +38 -0
  40. package/dist/shell/commands/waiver.d.ts.map +1 -0
  41. package/dist/shell/commands/waiver.js +240 -0
  42. package/dist/shell/commands/waiver.js.map +1 -0
  43. package/dist/shell/gates/disposition.d.ts +23 -0
  44. package/dist/shell/gates/disposition.d.ts.map +1 -0
  45. package/dist/shell/gates/disposition.js +87 -0
  46. package/dist/shell/gates/disposition.js.map +1 -0
  47. package/dist/shell/gates/gate-result-contract.d.ts +39 -0
  48. package/dist/shell/gates/gate-result-contract.d.ts.map +1 -0
  49. package/dist/shell/gates/gate-result-contract.js +150 -0
  50. package/dist/shell/gates/gate-result-contract.js.map +1 -0
  51. package/dist/shell/gates/quality-gates-adapter.d.ts +55 -0
  52. package/dist/shell/gates/quality-gates-adapter.d.ts.map +1 -0
  53. package/dist/shell/gates/quality-gates-adapter.js +161 -0
  54. package/dist/shell/gates/quality-gates-adapter.js.map +1 -0
  55. package/dist/shell/gates/waiver-filter.d.ts +58 -0
  56. package/dist/shell/gates/waiver-filter.d.ts.map +1 -0
  57. package/dist/shell/gates/waiver-filter.js +119 -0
  58. package/dist/shell/gates/waiver-filter.js.map +1 -0
  59. package/dist/shell/index.d.ts +50 -0
  60. package/dist/shell/index.d.ts.map +1 -0
  61. package/dist/shell/index.js +73 -0
  62. package/dist/shell/index.js.map +1 -0
  63. package/dist/shell/register.d.ts +11 -0
  64. package/dist/shell/register.d.ts.map +1 -0
  65. package/dist/shell/register.js +274 -0
  66. package/dist/shell/register.js.map +1 -0
  67. package/dist/shell/render/claim.d.ts +22 -0
  68. package/dist/shell/render/claim.d.ts.map +1 -0
  69. package/dist/shell/render/claim.js +75 -0
  70. package/dist/shell/render/claim.js.map +1 -0
  71. package/dist/shell/render/decision.d.ts +15 -0
  72. package/dist/shell/render/decision.d.ts.map +1 -0
  73. package/dist/shell/render/decision.js +66 -0
  74. package/dist/shell/render/decision.js.map +1 -0
  75. package/dist/shell/render/diagnostic.d.ts +19 -0
  76. package/dist/shell/render/diagnostic.d.ts.map +1 -0
  77. package/dist/shell/render/diagnostic.js +76 -0
  78. package/dist/shell/render/diagnostic.js.map +1 -0
  79. package/dist/shell/render/finding.d.ts +15 -0
  80. package/dist/shell/render/finding.d.ts.map +1 -0
  81. package/dist/shell/render/finding.js +57 -0
  82. package/dist/shell/render/finding.js.map +1 -0
  83. package/dist/shell/render/gates.d.ts +3 -0
  84. package/dist/shell/render/gates.d.ts.map +1 -0
  85. package/dist/shell/render/gates.js +56 -0
  86. package/dist/shell/render/gates.js.map +1 -0
  87. package/dist/shell/render/init.d.ts +11 -0
  88. package/dist/shell/render/init.d.ts.map +1 -0
  89. package/dist/shell/render/init.js +32 -0
  90. package/dist/shell/render/init.js.map +1 -0
  91. package/dist/shell/render/status.d.ts +26 -0
  92. package/dist/shell/render/status.d.ts.map +1 -0
  93. package/dist/shell/render/status.js +143 -0
  94. package/dist/shell/render/status.js.map +1 -0
  95. package/dist/shell/render/waiver.d.ts +21 -0
  96. package/dist/shell/render/waiver.d.ts.map +1 -0
  97. package/dist/shell/render/waiver.js +94 -0
  98. package/dist/shell/render/waiver.js.map +1 -0
  99. package/dist/shell/rules.d.ts +37 -0
  100. package/dist/shell/rules.d.ts.map +1 -0
  101. package/dist/shell/rules.js +51 -0
  102. package/dist/shell/rules.js.map +1 -0
  103. package/dist/shell/session/actor.d.ts +14 -0
  104. package/dist/shell/session/actor.d.ts.map +1 -0
  105. package/dist/shell/session/actor.js +34 -0
  106. package/dist/shell/session/actor.js.map +1 -0
  107. package/dist/shell/session/resolve-session.d.ts +5 -0
  108. package/dist/shell/session/resolve-session.d.ts.map +1 -0
  109. package/dist/shell/session/resolve-session.js +239 -0
  110. package/dist/shell/session/resolve-session.js.map +1 -0
  111. package/dist/shell/session/types.d.ts +56 -0
  112. package/dist/shell/session/types.d.ts.map +1 -0
  113. package/dist/shell/session/types.js +15 -0
  114. package/dist/shell/session/types.js.map +1 -0
  115. package/dist/store/agents-store.d.ts +3 -0
  116. package/dist/store/agents-store.d.ts.map +1 -0
  117. package/dist/store/agents-store.js +63 -0
  118. package/dist/store/agents-store.js.map +1 -0
  119. package/dist/store/apply-patch.d.ts +16 -0
  120. package/dist/store/apply-patch.d.ts.map +1 -0
  121. package/dist/store/apply-patch.js +191 -0
  122. package/dist/store/apply-patch.js.map +1 -0
  123. package/dist/store/atomic-write.d.ts +16 -0
  124. package/dist/store/atomic-write.d.ts.map +1 -0
  125. package/dist/store/atomic-write.js +132 -0
  126. package/dist/store/atomic-write.js.map +1 -0
  127. package/dist/store/doctor-snapshot.d.ts +20 -0
  128. package/dist/store/doctor-snapshot.d.ts.map +1 -0
  129. package/dist/store/doctor-snapshot.js +176 -0
  130. package/dist/store/doctor-snapshot.js.map +1 -0
  131. package/dist/store/events-store.d.ts +33 -0
  132. package/dist/store/events-store.d.ts.map +1 -0
  133. package/dist/store/events-store.js +297 -0
  134. package/dist/store/events-store.js.map +1 -0
  135. package/dist/store/index.d.ts +21 -0
  136. package/dist/store/index.d.ts.map +1 -0
  137. package/dist/store/index.js +47 -0
  138. package/dist/store/index.js.map +1 -0
  139. package/dist/store/init-store.d.ts +21 -0
  140. package/dist/store/init-store.d.ts.map +1 -0
  141. package/dist/store/init-store.js +295 -0
  142. package/dist/store/init-store.js.map +1 -0
  143. package/dist/store/json-store.d.ts +3 -0
  144. package/dist/store/json-store.d.ts.map +1 -0
  145. package/dist/store/json-store.js +65 -0
  146. package/dist/store/json-store.js.map +1 -0
  147. package/dist/store/policy-store.d.ts +3 -0
  148. package/dist/store/policy-store.d.ts.map +1 -0
  149. package/dist/store/policy-store.js +65 -0
  150. package/dist/store/policy-store.js.map +1 -0
  151. package/dist/store/repo-root.d.ts +46 -0
  152. package/dist/store/repo-root.d.ts.map +1 -0
  153. package/dist/store/repo-root.js +145 -0
  154. package/dist/store/repo-root.js.map +1 -0
  155. package/dist/store/rules.d.ts +53 -0
  156. package/dist/store/rules.d.ts.map +1 -0
  157. package/dist/store/rules.js +78 -0
  158. package/dist/store/rules.js.map +1 -0
  159. package/dist/store/specs-store.d.ts +3 -0
  160. package/dist/store/specs-store.d.ts.map +1 -0
  161. package/dist/store/specs-store.js +131 -0
  162. package/dist/store/specs-store.js.map +1 -0
  163. package/dist/store/types.d.ts +84 -0
  164. package/dist/store/types.d.ts.map +1 -0
  165. package/dist/store/types.js +14 -0
  166. package/dist/store/types.js.map +1 -0
  167. package/dist/store/waivers-store.d.ts +25 -0
  168. package/dist/store/waivers-store.d.ts.map +1 -0
  169. package/dist/store/waivers-store.js +232 -0
  170. package/dist/store/waivers-store.js.map +1 -0
  171. package/dist/store/worktrees-store.d.ts +3 -0
  172. package/dist/store/worktrees-store.d.ts.map +1 -0
  173. package/dist/store/worktrees-store.js +62 -0
  174. package/dist/store/worktrees-store.js.map +1 -0
  175. package/dist/store/yaml-store.d.ts +9 -0
  176. package/dist/store/yaml-store.d.ts.map +1 -0
  177. package/dist/store/yaml-store.js +121 -0
  178. package/dist/store/yaml-store.js.map +1 -0
  179. package/package.json +15 -13
  180. package/dist/budget-derivation.js +0 -751
  181. package/dist/cicd-optimizer.js +0 -504
  182. package/dist/commands/archive.js +0 -500
  183. package/dist/commands/burnup.js +0 -198
  184. package/dist/commands/diagnose.js +0 -525
  185. package/dist/commands/evaluate.js +0 -314
  186. package/dist/commands/gates.js +0 -149
  187. package/dist/commands/init.js +0 -857
  188. package/dist/commands/iterate.js +0 -417
  189. package/dist/commands/mode.js +0 -269
  190. package/dist/commands/parallel.js +0 -242
  191. package/dist/commands/plan.js +0 -438
  192. package/dist/commands/provenance.js +0 -1143
  193. package/dist/commands/quality-monitor.js +0 -284
  194. package/dist/commands/scope.js +0 -264
  195. package/dist/commands/session.js +0 -312
  196. package/dist/commands/sidecar.js +0 -74
  197. package/dist/commands/specs.js +0 -1448
  198. package/dist/commands/status.js +0 -1151
  199. package/dist/commands/templates.js +0 -237
  200. package/dist/commands/tool.js +0 -136
  201. package/dist/commands/tutorial.js +0 -480
  202. package/dist/commands/validate.js +0 -357
  203. package/dist/commands/verify-acs.js +0 -443
  204. package/dist/commands/waivers.js +0 -599
  205. package/dist/commands/workflow.js +0 -243
  206. package/dist/commands/worktree.js +0 -386
  207. package/dist/config/lite-scope.js +0 -158
  208. package/dist/config/modes.js +0 -347
  209. package/dist/constants/spec-types.js +0 -65
  210. package/dist/gates/budget-limit.js +0 -121
  211. package/dist/gates/feedback.js +0 -260
  212. package/dist/gates/format.js +0 -179
  213. package/dist/gates/god-object.js +0 -117
  214. package/dist/gates/pipeline.js +0 -167
  215. package/dist/gates/scope-boundary.js +0 -93
  216. package/dist/gates/spec-completeness.js +0 -109
  217. package/dist/gates/todo-detection.js +0 -205
  218. package/dist/generators/jest-config-generator.js +0 -242
  219. package/dist/generators/working-spec.js +0 -237
  220. package/dist/minimal-cli.js +0 -88
  221. package/dist/parallel/parallel-manager.js +0 -433
  222. package/dist/policy/PolicyManager.js +0 -465
  223. package/dist/scaffold/claude-hooks.js +0 -443
  224. package/dist/scaffold/cursor-hooks.js +0 -177
  225. package/dist/scaffold/git-hooks.js +0 -928
  226. package/dist/scaffold/index.js +0 -794
  227. package/dist/session/session-manager.js +0 -653
  228. package/dist/sidecars/index.js +0 -33
  229. package/dist/sidecars/listeners.js +0 -40
  230. package/dist/sidecars/provenance-summary.js +0 -238
  231. package/dist/sidecars/quality-gaps.js +0 -258
  232. package/dist/sidecars/schema.js +0 -149
  233. package/dist/sidecars/spec-drift.js +0 -151
  234. package/dist/sidecars/waiver-draft.js +0 -176
  235. package/dist/spec/SpecFileManager.js +0 -419
  236. package/dist/templates/.caws/schemas/policy.schema.json +0 -112
  237. package/dist/templates/.caws/schemas/scope.schema.json +0 -52
  238. package/dist/templates/.caws/schemas/waivers.schema.json +0 -106
  239. package/dist/templates/.caws/schemas/working-spec.schema.json +0 -340
  240. package/dist/templates/.caws/schemas/worktrees.schema.json +0 -38
  241. package/dist/templates/.caws/templates/working-spec.template.yml +0 -80
  242. package/dist/templates/.caws/tools/README.md +0 -18
  243. package/dist/templates/.caws/tools/scope-guard.js +0 -203
  244. package/dist/templates/.caws/tools-allow.json +0 -331
  245. package/dist/templates/.caws/waivers.yml +0 -19
  246. package/dist/templates/.claude/README.md +0 -190
  247. package/dist/templates/.claude/hooks/audit.sh +0 -121
  248. package/dist/templates/.claude/hooks/block-dangerous.sh +0 -203
  249. package/dist/templates/.claude/hooks/classify_command.py +0 -592
  250. package/dist/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  251. package/dist/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  252. package/dist/templates/.claude/hooks/naming-check.sh +0 -100
  253. package/dist/templates/.claude/hooks/protected-paths.sh +0 -39
  254. package/dist/templates/.claude/hooks/quality-check.sh +0 -81
  255. package/dist/templates/.claude/hooks/scan-secrets.sh +0 -85
  256. package/dist/templates/.claude/hooks/scope-guard.sh +0 -381
  257. package/dist/templates/.claude/hooks/session-caws-status.sh +0 -117
  258. package/dist/templates/.claude/hooks/session-log.sh +0 -634
  259. package/dist/templates/.claude/hooks/simplification-guard.sh +0 -92
  260. package/dist/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  261. package/dist/templates/.claude/hooks/test_classify_command.py +0 -370
  262. package/dist/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  263. package/dist/templates/.claude/hooks/validate-spec.sh +0 -76
  264. package/dist/templates/.claude/hooks/worktree-guard.sh +0 -220
  265. package/dist/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  266. package/dist/templates/.claude/rules/git-safety.md +0 -26
  267. package/dist/templates/.claude/rules/worktree-isolation.md +0 -83
  268. package/dist/templates/.claude/settings.json +0 -141
  269. package/dist/templates/.cursor/README.md +0 -299
  270. package/dist/templates/.cursor/hooks/audit.sh +0 -55
  271. package/dist/templates/.cursor/hooks/block-dangerous.sh +0 -84
  272. package/dist/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  273. package/dist/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  274. package/dist/templates/.cursor/hooks/format.sh +0 -38
  275. package/dist/templates/.cursor/hooks/naming-check.sh +0 -64
  276. package/dist/templates/.cursor/hooks/scan-secrets.sh +0 -51
  277. package/dist/templates/.cursor/hooks/scope-guard.sh +0 -52
  278. package/dist/templates/.cursor/hooks/session-log.sh +0 -924
  279. package/dist/templates/.cursor/hooks/validate-spec.sh +0 -83
  280. package/dist/templates/.cursor/hooks.json +0 -76
  281. package/dist/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  282. package/dist/templates/.cursor/rules/01-working-style.mdc +0 -50
  283. package/dist/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  284. package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  285. package/dist/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  286. package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  287. package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  288. package/dist/templates/.cursor/rules/07-process-ops.mdc +0 -20
  289. package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  290. package/dist/templates/.cursor/rules/09-docstrings.mdc +0 -89
  291. package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  292. package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  293. package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  294. package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  295. package/dist/templates/.cursor/rules/README.md +0 -148
  296. package/dist/templates/.github/copilot-instructions.md +0 -82
  297. package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  298. package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  299. package/dist/templates/.junie/guidelines.md +0 -73
  300. package/dist/templates/.vscode/launch.json +0 -17
  301. package/dist/templates/.vscode/settings.json +0 -95
  302. package/dist/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  303. package/dist/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  304. package/dist/templates/CLAUDE.md +0 -174
  305. package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
  306. package/dist/templates/OIDC_SETUP.md +0 -300
  307. package/dist/templates/agents.md +0 -145
  308. package/dist/templates/codemod/README.md +0 -1
  309. package/dist/templates/codemod/test.js +0 -93
  310. package/dist/templates/docs/README.md +0 -151
  311. package/dist/templates/scripts/new_feature.sh +0 -80
  312. package/dist/templates/scripts/quality-gates/check-god-objects.js +0 -146
  313. package/dist/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  314. package/dist/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
  315. package/dist/test-analysis.js +0 -786
  316. package/dist/tool-interface.js +0 -314
  317. package/dist/tool-loader.js +0 -303
  318. package/dist/tool-validator.js +0 -393
  319. package/dist/utils/agent-session.js +0 -202
  320. package/dist/utils/async-utils.js +0 -188
  321. package/dist/utils/command-wrapper.js +0 -200
  322. package/dist/utils/event-log.js +0 -584
  323. package/dist/utils/event-renderer.js +0 -521
  324. package/dist/utils/finalization.js +0 -230
  325. package/dist/utils/git-lock.js +0 -119
  326. package/dist/utils/gitignore-updater.js +0 -158
  327. package/dist/utils/ide-detection.js +0 -133
  328. package/dist/utils/lifecycle-events.js +0 -94
  329. package/dist/utils/project-analysis.js +0 -367
  330. package/dist/utils/promise-utils.js +0 -72
  331. package/dist/utils/quality-gates-errors.js +0 -520
  332. package/dist/utils/quality-gates-utils.js +0 -387
  333. package/dist/utils/schema-validator.js +0 -50
  334. package/dist/utils/spec-resolver.js +0 -711
  335. package/dist/utils/typescript-detector.js +0 -369
  336. package/dist/utils/working-state.js +0 -530
  337. package/dist/utils/yaml-validation.js +0 -156
  338. package/dist/validation/spec-validation.js +0 -921
  339. package/dist/waivers-manager.js +0 -732
  340. package/dist/worktree/worktree-manager.js +0 -1374
  341. package/templates/.caws/schemas/policy.schema.json +0 -112
  342. package/templates/.caws/schemas/scope.schema.json +0 -52
  343. package/templates/.caws/schemas/waivers.schema.json +0 -106
  344. package/templates/.caws/schemas/working-spec.schema.json +0 -340
  345. package/templates/.caws/schemas/worktrees.schema.json +0 -38
  346. package/templates/.caws/templates/working-spec.template.yml +0 -80
  347. package/templates/.caws/tools/README.md +0 -18
  348. package/templates/.caws/tools/scope-guard.js +0 -203
  349. package/templates/.caws/tools-allow.json +0 -331
  350. package/templates/.caws/waivers.yml +0 -19
  351. package/templates/.claude/README.md +0 -190
  352. package/templates/.claude/hooks/audit.sh +0 -121
  353. package/templates/.claude/hooks/block-dangerous.sh +0 -203
  354. package/templates/.claude/hooks/classify_command.py +0 -592
  355. package/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  356. package/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  357. package/templates/.claude/hooks/naming-check.sh +0 -100
  358. package/templates/.claude/hooks/protected-paths.sh +0 -39
  359. package/templates/.claude/hooks/quality-check.sh +0 -81
  360. package/templates/.claude/hooks/scan-secrets.sh +0 -85
  361. package/templates/.claude/hooks/scope-guard.sh +0 -381
  362. package/templates/.claude/hooks/session-caws-status.sh +0 -117
  363. package/templates/.claude/hooks/session-log.sh +0 -634
  364. package/templates/.claude/hooks/simplification-guard.sh +0 -92
  365. package/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  366. package/templates/.claude/hooks/test_classify_command.py +0 -370
  367. package/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  368. package/templates/.claude/hooks/validate-spec.sh +0 -76
  369. package/templates/.claude/hooks/worktree-guard.sh +0 -220
  370. package/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  371. package/templates/.claude/rules/git-safety.md +0 -26
  372. package/templates/.claude/rules/worktree-isolation.md +0 -83
  373. package/templates/.claude/settings.json +0 -141
  374. package/templates/.cursor/README.md +0 -299
  375. package/templates/.cursor/hooks/audit.sh +0 -55
  376. package/templates/.cursor/hooks/block-dangerous.sh +0 -84
  377. package/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  378. package/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  379. package/templates/.cursor/hooks/format.sh +0 -38
  380. package/templates/.cursor/hooks/naming-check.sh +0 -64
  381. package/templates/.cursor/hooks/scan-secrets.sh +0 -51
  382. package/templates/.cursor/hooks/scope-guard.sh +0 -52
  383. package/templates/.cursor/hooks/session-log.sh +0 -924
  384. package/templates/.cursor/hooks/validate-spec.sh +0 -83
  385. package/templates/.cursor/hooks.json +0 -76
  386. package/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  387. package/templates/.cursor/rules/01-working-style.mdc +0 -50
  388. package/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  389. package/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  390. package/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  391. package/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  392. package/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  393. package/templates/.cursor/rules/07-process-ops.mdc +0 -20
  394. package/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  395. package/templates/.cursor/rules/09-docstrings.mdc +0 -89
  396. package/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  397. package/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  398. package/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  399. package/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  400. package/templates/.cursor/rules/README.md +0 -148
  401. package/templates/.github/copilot-instructions.md +0 -82
  402. package/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  403. package/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  404. package/templates/.junie/guidelines.md +0 -73
  405. package/templates/.vscode/launch.json +0 -17
  406. package/templates/.vscode/settings.json +0 -95
  407. package/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  408. package/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  409. package/templates/CLAUDE.md +0 -174
  410. package/templates/COMMIT_CONVENTIONS.md +0 -86
  411. package/templates/OIDC_SETUP.md +0 -300
  412. package/templates/agents.md +0 -145
  413. package/templates/codemod/README.md +0 -1
  414. package/templates/codemod/test.js +0 -93
  415. package/templates/docs/README.md +0 -151
  416. package/templates/scripts/new_feature.sh +0 -80
  417. package/templates/scripts/quality-gates/check-god-objects.js +0 -146
  418. package/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  419. package/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
@@ -1,242 +0,0 @@
1
- /**
2
- * @fileoverview CAWS Parallel CLI Command
3
- * Orchestrates parallel multi-agent workspaces
4
- * @author @darianrosebrook
5
- */
6
-
7
- const chalk = require('chalk');
8
- const path = require('path');
9
- const {
10
- loadPlan,
11
- setupParallel,
12
- getParallelStatus,
13
- mergeParallel,
14
- teardownParallel,
15
- } = require('../parallel/parallel-manager');
16
-
17
- /**
18
- * Handle parallel subcommands
19
- * @param {string} subcommand - Subcommand name
20
- * @param {Object} options - Command options
21
- */
22
- async function parallelCommand(subcommand, options = {}) {
23
- try {
24
- switch (subcommand) {
25
- case 'setup':
26
- return handleSetup(options);
27
- case 'status':
28
- return handleStatus();
29
- case 'merge':
30
- return handleMerge(options);
31
- case 'teardown':
32
- return handleTeardown(options);
33
- default:
34
- console.error(chalk.red(`Unknown parallel subcommand: ${subcommand}`));
35
- console.log(chalk.blue('Available: setup, status, merge, teardown'));
36
- process.exit(1);
37
- }
38
- } catch (error) {
39
- console.error(chalk.red(`${error.message}`));
40
- process.exit(1);
41
- }
42
- }
43
-
44
- function handleSetup(options) {
45
- const { planFile, baseBranch } = options;
46
-
47
- if (!planFile) {
48
- console.error(chalk.red('Plan file is required'));
49
- console.log(chalk.blue('Usage: caws parallel setup <plan-file> [--base-branch <branch>]'));
50
- process.exit(1);
51
- }
52
-
53
- const planPath = path.resolve(planFile);
54
- console.log(chalk.cyan(`Loading plan: ${planFile}`));
55
-
56
- const plan = loadPlan(planPath);
57
-
58
- // Allow CLI --base-branch to override plan file
59
- if (baseBranch) {
60
- plan.baseBranch = baseBranch;
61
- }
62
-
63
- console.log(chalk.cyan(`Setting up ${plan.agents.length} parallel worktree(s)...`));
64
- const results = setupParallel(plan);
65
-
66
- console.log(chalk.green(`\nParallel workspace created`));
67
- console.log(chalk.gray(` Base branch: ${results[0] ? results[0].baseBranch : plan.baseBranch || 'main'}`));
68
- console.log(chalk.gray(` Strategy: ${plan.mergeStrategy}`));
69
- console.log('');
70
-
71
- // Print table
72
- console.log(
73
- chalk.bold(
74
- 'Agent'.padEnd(20) +
75
- 'Branch'.padEnd(25) +
76
- 'Scope'
77
- )
78
- );
79
- console.log(chalk.gray('-'.repeat(70)));
80
-
81
- for (const entry of results) {
82
- console.log(
83
- entry.name.padEnd(20) +
84
- chalk.cyan(entry.branch.padEnd(25)) +
85
- chalk.gray(entry.scope || '(all)')
86
- );
87
- }
88
-
89
- console.log('');
90
- console.log(chalk.blue('Direct each agent to its worktree:'));
91
- for (const entry of results) {
92
- console.log(chalk.gray(` ${entry.name}: cd ${entry.path}`));
93
- }
94
- console.log('');
95
- console.log(chalk.blue('Monitor progress: caws parallel status'));
96
- }
97
-
98
- function handleStatus() {
99
- const status = getParallelStatus();
100
-
101
- if (!status) {
102
- console.log(chalk.gray('No active parallel run.'));
103
- console.log(chalk.blue('Start one with: caws parallel setup <plan-file>'));
104
- return;
105
- }
106
-
107
- console.log(chalk.bold.cyan('CAWS Parallel Status'));
108
- console.log(chalk.cyan('='.repeat(70)));
109
- console.log(chalk.gray(` Base branch: ${status.baseBranch}`));
110
- console.log(chalk.gray(` Strategy: ${status.mergeStrategy}`));
111
- console.log(chalk.gray(` Created: ${status.createdAt}`));
112
- console.log('');
113
-
114
- // Agent table
115
- console.log(
116
- chalk.bold(
117
- 'Agent'.padEnd(18) +
118
- 'Status'.padEnd(10) +
119
- 'Branch'.padEnd(22) +
120
- 'Commits'.padEnd(9) +
121
- 'Dirty'.padEnd(7) +
122
- 'Scope'
123
- )
124
- );
125
- console.log(chalk.gray('-'.repeat(80)));
126
-
127
- for (const agent of status.agents) {
128
- const statusColor =
129
- agent.status === 'active'
130
- ? chalk.green
131
- : agent.status === 'fresh'
132
- ? chalk.cyan
133
- : agent.status === 'merged'
134
- ? chalk.blue
135
- : agent.status === 'missing'
136
- ? chalk.red
137
- : chalk.yellow;
138
-
139
- console.log(
140
- agent.name.padEnd(18) +
141
- statusColor(agent.status.padEnd(10)) +
142
- agent.branch.padEnd(22) +
143
- String(agent.commitCount).padEnd(9) +
144
- (agent.dirty ? chalk.yellow('yes') : chalk.gray('no')).padEnd(7 + 10) + // +10 for chalk color codes
145
- chalk.gray(agent.scope || '(all)')
146
- );
147
- }
148
-
149
- // Show conflicts
150
- if (status.conflicts.length > 0) {
151
- console.log('');
152
- console.log(chalk.yellow(`WARNING: ${status.conflicts.length} file-level conflict(s) detected:`));
153
- for (const conflict of status.conflicts) {
154
- console.log(chalk.yellow(` ${conflict.file} -- modified by: ${conflict.agents.join(', ')}`));
155
- }
156
- console.log(chalk.blue(' These files were modified by multiple agents and may cause merge conflicts.'));
157
- }
158
-
159
- console.log('');
160
- }
161
-
162
- function handleMerge(options) {
163
- const { strategy, dryRun, force } = options;
164
-
165
- if (dryRun) {
166
- console.log(chalk.cyan('Dry run: previewing merge...'));
167
- } else {
168
- console.log(chalk.cyan('Merging parallel branches back to base...'));
169
- }
170
-
171
- const result = mergeParallel({ strategy, dryRun, force });
172
-
173
- // Show conflicts
174
- if (result.conflicts.length > 0) {
175
- console.log(chalk.yellow(`\n${result.conflicts.length} file-level conflict(s) detected:`));
176
- for (const conflict of result.conflicts) {
177
- console.log(chalk.yellow(` ${conflict.file} -- ${conflict.agents.join(', ')}`));
178
- }
179
-
180
- if (!force && !dryRun) {
181
- console.log('');
182
- console.log(chalk.red('Merge aborted due to conflicts.'));
183
- console.log(chalk.blue(' Review conflicts, then: caws parallel merge --force'));
184
- return;
185
- }
186
- }
187
-
188
- if (dryRun) {
189
- console.log(chalk.green(`\nWould merge ${result.merged.length} branch(es):`));
190
- for (const name of result.merged) {
191
- console.log(chalk.gray(` - ${name}`));
192
- }
193
- return;
194
- }
195
-
196
- if (result.merged.length > 0) {
197
- console.log(chalk.green(`\nMerged ${result.merged.length} branch(es):`));
198
- for (const name of result.merged) {
199
- console.log(chalk.gray(` - ${name}`));
200
- }
201
- }
202
-
203
- if (result.failed.length > 0) {
204
- console.log(chalk.red(`\nFailed to merge ${result.failed.length} branch(es):`));
205
- for (const fail of result.failed) {
206
- console.log(chalk.red(` - ${fail.name}: ${fail.error}`));
207
- }
208
- }
209
-
210
- if (result.merged.length > 0 && result.failed.length === 0) {
211
- console.log('');
212
- console.log(chalk.blue('Clean up with: caws parallel teardown --delete-branches'));
213
- }
214
- }
215
-
216
- function handleTeardown(options) {
217
- const { deleteBranches, force } = options;
218
-
219
- console.log(chalk.cyan('Tearing down parallel worktrees...'));
220
- const result = teardownParallel({ deleteBranches, force });
221
-
222
- if (result.destroyed.length > 0) {
223
- console.log(chalk.green(`Destroyed ${result.destroyed.length} worktree(s):`));
224
- for (const name of result.destroyed) {
225
- console.log(chalk.gray(` - ${name}`));
226
- }
227
- }
228
-
229
- if (result.failed.length > 0) {
230
- console.log(chalk.red(`Failed to destroy ${result.failed.length} worktree(s):`));
231
- for (const fail of result.failed) {
232
- console.log(chalk.red(` - ${fail.name}: ${fail.error}`));
233
- }
234
- console.log(chalk.blue(' Use --force to override'));
235
- }
236
-
237
- if (deleteBranches) {
238
- console.log(chalk.gray(' Branches also deleted'));
239
- }
240
- }
241
-
242
- module.exports = { parallelCommand };
@@ -1,438 +0,0 @@
1
- /**
2
- * @fileoverview CAWS Plan Command
3
- * Automated plan generation from specifications (multi-spec aware)
4
- * @author @darianrosebrook
5
- */
6
-
7
- const fs = require('fs-extra');
8
- const path = require('path');
9
- const chalk = require('chalk');
10
- const { safeAsync, outputResult } = require('../error-handler');
11
-
12
- // Import spec resolution system
13
- const { resolveSpec, loadSpecsRegistry } = require('../utils/spec-resolver');
14
-
15
- /**
16
- * Plan templates for different spec types
17
- */
18
- const PLAN_TEMPLATES = {
19
- feature: {
20
- sections: [
21
- 'Overview',
22
- 'Acceptance Criteria Analysis',
23
- 'Implementation Strategy',
24
- 'Testing Strategy',
25
- 'Risk Assessment',
26
- 'Dependencies',
27
- 'Timeline',
28
- 'Success Metrics',
29
- ],
30
- defaultTasks: [
31
- 'Set up development environment',
32
- 'Implement core functionality',
33
- 'Add error handling',
34
- 'Write comprehensive tests',
35
- 'Update documentation',
36
- 'Performance optimization',
37
- 'Security review',
38
- 'Final validation',
39
- ],
40
- },
41
- fix: {
42
- sections: [
43
- 'Problem Analysis',
44
- 'Root Cause Investigation',
45
- 'Solution Design',
46
- 'Implementation Plan',
47
- 'Testing Strategy',
48
- 'Rollback Plan',
49
- 'Verification',
50
- ],
51
- defaultTasks: [
52
- 'Reproduce the issue',
53
- 'Identify root cause',
54
- 'Design fix approach',
55
- 'Implement solution',
56
- 'Write regression tests',
57
- 'Update documentation',
58
- 'Deploy and verify',
59
- ],
60
- },
61
- refactor: {
62
- sections: [
63
- 'Current State Analysis',
64
- 'Refactoring Goals',
65
- 'Approach Strategy',
66
- 'Implementation Plan',
67
- 'Testing Strategy',
68
- 'Performance Impact',
69
- 'Migration Plan',
70
- ],
71
- defaultTasks: [
72
- 'Analyze current code',
73
- 'Design new architecture',
74
- 'Plan incremental changes',
75
- 'Implement refactoring',
76
- 'Update tests',
77
- 'Performance validation',
78
- 'Documentation update',
79
- ],
80
- },
81
- };
82
-
83
- /**
84
- * Load spec for plan generation
85
- * @param {string} specId - Spec identifier
86
- * @returns {Promise<Object|null>} Spec data or null
87
- */
88
- async function loadSpecForPlanning(specId) {
89
- const resolved = await resolveSpec({
90
- specId,
91
- warnLegacy: false,
92
- });
93
- return resolved.spec;
94
- }
95
-
96
- /**
97
- * Generate and display implementation plan
98
- * @param {Object} spec - Spec data
99
- * @param {string} specId - Spec identifier
100
- * @param {Object} options - Command options
101
- */
102
- async function generateAndDisplayPlan(spec, specId, options) {
103
- // Generate plan
104
- const plan = generateImplementationPlan(spec);
105
-
106
- // Determine output path
107
- const outputPath = options.output || `.caws/plans/${specId}-plan.md`;
108
-
109
- // Write plan to file
110
- await writePlanToFile(plan, outputPath);
111
-
112
- // Display plan summary
113
- displayGeneratedPlan(plan);
114
-
115
- console.log(chalk.green(`Plan generated: ${outputPath}`));
116
-
117
- return outputResult({
118
- command: 'plan generate',
119
- specId,
120
- outputPath,
121
- planSections: plan.sections.length,
122
- tasks: plan.tasks.length,
123
- });
124
- }
125
-
126
- /**
127
- * Generate implementation tasks from acceptance criteria
128
- * @param {Array} criteria - Acceptance criteria
129
- * @returns {Array} Generated tasks
130
- */
131
- function generateTasksFromCriteria(criteria) {
132
- const tasks = [];
133
-
134
- criteria.forEach((criterion, index) => {
135
- const criterionId = criterion.id || `A${index + 1}`;
136
- const description = criterion.description || criterion.title || `Implement ${criterionId}`;
137
-
138
- // Break down complex criteria into multiple tasks
139
- if (description.includes('and') || description.includes('then') || description.length > 100) {
140
- // Split into multiple tasks
141
- const parts = description.split(/[.;]/).filter((part) => part.trim().length > 0);
142
- parts.forEach((part, partIndex) => {
143
- tasks.push({
144
- id: `${criterionId}.${partIndex + 1}`,
145
- title: part.trim(),
146
- criterion: criterionId,
147
- type: 'implementation',
148
- estimatedHours: 2,
149
- dependencies: partIndex > 0 ? [`${criterionId}.${partIndex}`] : [],
150
- });
151
- });
152
- } else {
153
- // Single task for simple criteria
154
- tasks.push({
155
- id: criterionId,
156
- title: description,
157
- criterion: criterionId,
158
- type: 'implementation',
159
- estimatedHours: 3,
160
- dependencies: [],
161
- });
162
- }
163
- });
164
-
165
- return tasks;
166
- }
167
-
168
- /**
169
- * Generate testing tasks for acceptance criteria
170
- * @param {Array} criteria - Acceptance criteria
171
- * @returns {Array} Generated test tasks
172
- */
173
- function generateTestTasks(criteria) {
174
- const tasks = [];
175
-
176
- criteria.forEach((criterion, index) => {
177
- const criterionId = criterion.id || `A${index + 1}`;
178
-
179
- tasks.push({
180
- id: `test-${criterionId}`,
181
- title: `Write tests for ${criterionId}`,
182
- criterion: criterionId,
183
- type: 'testing',
184
- estimatedHours: 2,
185
- dependencies: [criterionId],
186
- });
187
-
188
- tasks.push({
189
- id: `integration-${criterionId}`,
190
- title: `Integration tests for ${criterionId}`,
191
- criterion: criterionId,
192
- type: 'testing',
193
- estimatedHours: 1,
194
- dependencies: [`test-${criterionId}`],
195
- });
196
- });
197
-
198
- return tasks;
199
- }
200
-
201
- /**
202
- * Generate implementation plan from spec
203
- * @param {Object} spec - Spec data
204
- * @returns {Object} Generated plan
205
- */
206
- function generateImplementationPlan(spec) {
207
- const template = PLAN_TEMPLATES[spec.type] || PLAN_TEMPLATES.feature;
208
-
209
- // Generate tasks from acceptance criteria
210
- const implementationTasks = generateTasksFromCriteria(spec.acceptance_criteria || []);
211
- const testTasks = generateTestTasks(spec.acceptance_criteria || []);
212
-
213
- // Combine all tasks
214
- const allTasks = [
215
- ...template.defaultTasks.map((task, index) => ({
216
- id: `setup-${index + 1}`,
217
- title: task,
218
- type: 'setup',
219
- estimatedHours: 1,
220
- dependencies: [],
221
- })),
222
- ...implementationTasks,
223
- ...testTasks,
224
- ];
225
-
226
- // Calculate timeline
227
- const totalHours = allTasks.reduce((sum, task) => sum + task.estimatedHours, 0);
228
- const estimatedDays = Math.ceil(totalHours / 8); // Assuming 8-hour work days
229
-
230
- // Generate plan content
231
- const planContent = {
232
- spec_id: spec.id,
233
- title: `Implementation Plan: ${spec.title}`,
234
- generated_at: new Date().toISOString(),
235
- sections: template.sections,
236
- tasks: allTasks,
237
- timeline: {
238
- total_hours: totalHours,
239
- estimated_days: estimatedDays,
240
- parallel_execution: true,
241
- },
242
- risks: [
243
- {
244
- level: 'low',
245
- description: 'Standard implementation risks',
246
- mitigation: 'Follow established patterns and conduct thorough testing',
247
- },
248
- ],
249
- };
250
-
251
- return planContent;
252
- }
253
-
254
- /**
255
- * Write plan to file
256
- * @param {Object} plan - Plan data
257
- * @param {string} outputPath - Output file path
258
- * @returns {Promise<void>}
259
- */
260
- async function writePlanToFile(plan, outputPath) {
261
- const planDir = path.dirname(outputPath);
262
- await fs.ensureDir(planDir);
263
-
264
- const markdownContent = generatePlanMarkdown(plan);
265
- await fs.writeFile(outputPath, markdownContent);
266
- }
267
-
268
- /**
269
- * Generate markdown content from plan
270
- * @param {Object} plan - Plan data
271
- * @returns {string} Markdown content
272
- */
273
- function generatePlanMarkdown(plan) {
274
- let content = `# ${plan.title}\n\n`;
275
- content += `**Generated:** ${new Date(plan.generated_at).toLocaleString()}\n`;
276
- content += `**Spec ID:** ${plan.spec_id}\n\n`;
277
-
278
- // Overview section
279
- content += `## Overview\n\n`;
280
- content += `This plan outlines the implementation strategy for the specified requirements.\n`;
281
- content += `**Timeline:** ${plan.timeline.estimated_days} days (${plan.timeline.total_hours} hours)\n\n`;
282
-
283
- // Tasks section
284
- content += `## Implementation Tasks\n\n`;
285
-
286
- // Group tasks by type
287
- const setupTasks = plan.tasks.filter((task) => task.type === 'setup');
288
- const implementationTasks = plan.tasks.filter((task) => task.type === 'implementation');
289
- const testTasks = plan.tasks.filter((task) => task.type === 'testing');
290
-
291
- if (setupTasks.length > 0) {
292
- content += `### Setup (${setupTasks.length} tasks)\n\n`;
293
- setupTasks.forEach((task) => {
294
- content += `- [ ] **${task.id}** - ${task.title} (${task.estimatedHours}h)\n`;
295
- });
296
- content += '\n';
297
- }
298
-
299
- if (implementationTasks.length > 0) {
300
- content += `### Implementation (${implementationTasks.length} tasks)\n\n`;
301
- implementationTasks.forEach((task) => {
302
- const deps =
303
- task.dependencies.length > 0 ? ` (depends on: ${task.dependencies.join(', ')})` : '';
304
- content += `- [ ] **${task.id}** - ${task.title} (${task.estimatedHours}h)${deps}\n`;
305
- });
306
- content += '\n';
307
- }
308
-
309
- if (testTasks.length > 0) {
310
- content += `### Testing (${testTasks.length} tasks)\n\n`;
311
- testTasks.forEach((task) => {
312
- const deps =
313
- task.dependencies.length > 0 ? ` (depends on: ${task.dependencies.join(', ')})` : '';
314
- content += `- [ ] **${task.id}** - ${task.title} (${task.estimatedHours}h)${deps}\n`;
315
- });
316
- content += '\n';
317
- }
318
-
319
- // Risk assessment
320
- content += `## Risk Assessment\n\n`;
321
- plan.risks.forEach((risk, index) => {
322
- content += `### ${risk.level.toUpperCase()} Risk ${index + 1}\n`;
323
- content += `${risk.description}\n\n`;
324
- content += `**Mitigation:** ${risk.mitigation}\n\n`;
325
- });
326
-
327
- // Success metrics
328
- content += `## Success Metrics\n\n`;
329
- content += `- All acceptance criteria implemented and tested\n`;
330
- content += `- Code coverage meets project standards\n`;
331
- content += `- Performance requirements satisfied\n`;
332
- content += `- No breaking changes to existing functionality\n`;
333
- content += `- Documentation updated\n\n`;
334
-
335
- return content;
336
- }
337
-
338
- /**
339
- * Display generated plan
340
- * @param {Object} plan - Plan data
341
- */
342
- function displayGeneratedPlan(plan) {
343
- console.log(chalk.bold.cyan(`\nGenerated Implementation Plan`));
344
- console.log(chalk.cyan('===================================================\n'));
345
-
346
- console.log(chalk.bold(`Title: ${plan.title}`));
347
- console.log(chalk.gray(`Spec: ${plan.spec_id}`));
348
- console.log(chalk.gray(`Generated: ${new Date(plan.generated_at).toLocaleString()}`));
349
- console.log('');
350
-
351
- // Task summary
352
- const setupTasks = plan.tasks.filter((task) => task.type === 'setup').length;
353
- const implementationTasks = plan.tasks.filter((task) => task.type === 'implementation').length;
354
- const testTasks = plan.tasks.filter((task) => task.type === 'testing').length;
355
-
356
- console.log(chalk.bold('Task Breakdown:'));
357
- if (setupTasks > 0) console.log(chalk.gray(` Setup: ${setupTasks} tasks`));
358
- if (implementationTasks > 0)
359
- console.log(chalk.gray(` Implementation: ${implementationTasks} tasks`));
360
- if (testTasks > 0) console.log(chalk.gray(` Testing: ${testTasks} tasks`));
361
-
362
- console.log(
363
- chalk.gray(
364
- ` Total: ${plan.tasks.length} tasks, ${plan.timeline.total_hours} hours, ${plan.timeline.estimated_days} days`
365
- )
366
- );
367
- console.log('');
368
-
369
- // Next steps
370
- console.log(chalk.bold.yellow('Next Steps:'));
371
- console.log(chalk.yellow(' 1. Review and customize the generated plan'));
372
- console.log(chalk.yellow(' 2. Update task priorities and dependencies'));
373
- console.log(chalk.yellow(' 3. Start implementation following the task order'));
374
- console.log(chalk.yellow(' 4. Update progress: caws progress update --criterion-id A1'));
375
- console.log('');
376
- }
377
-
378
- /**
379
- * Plan command handler
380
- * @param {string} action - Action to perform (generate)
381
- * @param {Object} options - Command options
382
- */
383
- async function planCommand(action, options = {}) {
384
- return safeAsync(
385
- async () => {
386
- switch (action) {
387
- case 'generate': {
388
- const specId = options.specId || options.spec;
389
-
390
- if (!specId) {
391
- // Try to auto-detect single spec
392
- const { checkMultiSpecStatus } = require('../utils/spec-resolver');
393
- const status = await checkMultiSpecStatus();
394
-
395
- if (status.specCount === 1) {
396
- // Use the single spec automatically
397
- const registry = await loadSpecsRegistry();
398
- const singleSpecId = Object.keys(registry.specs)[0];
399
- console.log(chalk.blue(`Auto-detected single spec: ${singleSpecId}`));
400
-
401
- const spec = await loadSpecForPlanning(singleSpecId);
402
- await generateAndDisplayPlan(spec, singleSpecId, options);
403
- } else if (status.specCount > 1) {
404
- const registry = await loadSpecsRegistry();
405
- throw new Error(
406
- 'Multiple specs detected. Please specify which one: caws plan generate --spec-id <id>\n' +
407
- 'Available specs: ' +
408
- Object.keys(registry.specs || {}).join(', ')
409
- );
410
- } else {
411
- throw new Error('No specs found. Create a spec first: caws specs create <id>');
412
- }
413
- } else {
414
- // Load spec for planning
415
- const spec = await loadSpecForPlanning(specId);
416
-
417
- return await generateAndDisplayPlan(spec, specId, options);
418
- }
419
- break;
420
- }
421
-
422
- default:
423
- throw new Error(`Unknown plan action: ${action}. Use: generate`);
424
- }
425
- },
426
- `plan ${action}`,
427
- true
428
- );
429
- }
430
-
431
- module.exports = {
432
- planCommand,
433
- generateImplementationPlan,
434
- writePlanToFile,
435
- generatePlanMarkdown,
436
- displayGeneratedPlan,
437
- PLAN_TEMPLATES,
438
- };