@paths.design/caws-cli 10.2.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 (421) hide show
  1. package/README.md +125 -374
  2. package/dist/index.js +43 -785
  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/agents.js +0 -124
  183. package/dist/commands/archive.js +0 -500
  184. package/dist/commands/burnup.js +0 -198
  185. package/dist/commands/diagnose.js +0 -525
  186. package/dist/commands/evaluate.js +0 -314
  187. package/dist/commands/gates.js +0 -149
  188. package/dist/commands/init.js +0 -857
  189. package/dist/commands/iterate.js +0 -417
  190. package/dist/commands/mode.js +0 -269
  191. package/dist/commands/parallel.js +0 -242
  192. package/dist/commands/plan.js +0 -438
  193. package/dist/commands/provenance.js +0 -1143
  194. package/dist/commands/quality-monitor.js +0 -284
  195. package/dist/commands/scope.js +0 -264
  196. package/dist/commands/session.js +0 -312
  197. package/dist/commands/sidecar.js +0 -74
  198. package/dist/commands/specs.js +0 -1656
  199. package/dist/commands/status.js +0 -1172
  200. package/dist/commands/templates.js +0 -237
  201. package/dist/commands/tool.js +0 -136
  202. package/dist/commands/tutorial.js +0 -480
  203. package/dist/commands/validate.js +0 -357
  204. package/dist/commands/verify-acs.js +0 -443
  205. package/dist/commands/waivers.js +0 -599
  206. package/dist/commands/workflow.js +0 -243
  207. package/dist/commands/worktree.js +0 -502
  208. package/dist/config/lite-scope.js +0 -158
  209. package/dist/config/modes.js +0 -347
  210. package/dist/constants/spec-types.js +0 -65
  211. package/dist/gates/budget-limit.js +0 -121
  212. package/dist/gates/feedback.js +0 -260
  213. package/dist/gates/format.js +0 -179
  214. package/dist/gates/god-object.js +0 -117
  215. package/dist/gates/pipeline.js +0 -167
  216. package/dist/gates/scope-boundary.js +0 -112
  217. package/dist/gates/spec-completeness.js +0 -109
  218. package/dist/gates/todo-detection.js +0 -205
  219. package/dist/generators/jest-config-generator.js +0 -242
  220. package/dist/generators/working-spec.js +0 -237
  221. package/dist/minimal-cli.js +0 -88
  222. package/dist/parallel/parallel-manager.js +0 -433
  223. package/dist/policy/PolicyManager.js +0 -470
  224. package/dist/scaffold/claude-hooks.js +0 -443
  225. package/dist/scaffold/cursor-hooks.js +0 -177
  226. package/dist/scaffold/git-hooks.js +0 -928
  227. package/dist/scaffold/index.js +0 -794
  228. package/dist/session/session-manager.js +0 -653
  229. package/dist/sidecars/index.js +0 -33
  230. package/dist/sidecars/listeners.js +0 -40
  231. package/dist/sidecars/provenance-summary.js +0 -238
  232. package/dist/sidecars/quality-gaps.js +0 -258
  233. package/dist/sidecars/schema.js +0 -149
  234. package/dist/sidecars/spec-drift.js +0 -151
  235. package/dist/sidecars/waiver-draft.js +0 -176
  236. package/dist/spec/SpecFileManager.js +0 -419
  237. package/dist/templates/.caws/schemas/policy.schema.json +0 -117
  238. package/dist/templates/.caws/schemas/scope.schema.json +0 -52
  239. package/dist/templates/.caws/schemas/waivers.schema.json +0 -106
  240. package/dist/templates/.caws/schemas/working-spec.schema.json +0 -340
  241. package/dist/templates/.caws/schemas/worktrees.schema.json +0 -38
  242. package/dist/templates/.caws/templates/working-spec.template.yml +0 -80
  243. package/dist/templates/.caws/tools/README.md +0 -18
  244. package/dist/templates/.caws/tools/scope-guard.js +0 -203
  245. package/dist/templates/.caws/tools-allow.json +0 -331
  246. package/dist/templates/.caws/waivers.yml +0 -19
  247. package/dist/templates/.claude/README.md +0 -190
  248. package/dist/templates/.claude/hooks/audit.sh +0 -121
  249. package/dist/templates/.claude/hooks/block-dangerous.sh +0 -203
  250. package/dist/templates/.claude/hooks/classify_command.py +0 -592
  251. package/dist/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  252. package/dist/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  253. package/dist/templates/.claude/hooks/naming-check.sh +0 -100
  254. package/dist/templates/.claude/hooks/protected-paths.sh +0 -39
  255. package/dist/templates/.claude/hooks/quality-check.sh +0 -81
  256. package/dist/templates/.claude/hooks/scan-secrets.sh +0 -85
  257. package/dist/templates/.claude/hooks/scope-guard.sh +0 -381
  258. package/dist/templates/.claude/hooks/session-caws-status.sh +0 -117
  259. package/dist/templates/.claude/hooks/session-log.sh +0 -634
  260. package/dist/templates/.claude/hooks/simplification-guard.sh +0 -92
  261. package/dist/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  262. package/dist/templates/.claude/hooks/test_classify_command.py +0 -370
  263. package/dist/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  264. package/dist/templates/.claude/hooks/validate-spec.sh +0 -76
  265. package/dist/templates/.claude/hooks/worktree-guard.sh +0 -220
  266. package/dist/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  267. package/dist/templates/.claude/rules/git-safety.md +0 -26
  268. package/dist/templates/.claude/rules/worktree-isolation.md +0 -101
  269. package/dist/templates/.claude/settings.json +0 -141
  270. package/dist/templates/.cursor/README.md +0 -299
  271. package/dist/templates/.cursor/hooks/audit.sh +0 -55
  272. package/dist/templates/.cursor/hooks/block-dangerous.sh +0 -84
  273. package/dist/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  274. package/dist/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  275. package/dist/templates/.cursor/hooks/format.sh +0 -38
  276. package/dist/templates/.cursor/hooks/naming-check.sh +0 -64
  277. package/dist/templates/.cursor/hooks/scan-secrets.sh +0 -51
  278. package/dist/templates/.cursor/hooks/scope-guard.sh +0 -52
  279. package/dist/templates/.cursor/hooks/session-log.sh +0 -924
  280. package/dist/templates/.cursor/hooks/validate-spec.sh +0 -83
  281. package/dist/templates/.cursor/hooks.json +0 -76
  282. package/dist/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  283. package/dist/templates/.cursor/rules/01-working-style.mdc +0 -50
  284. package/dist/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  285. package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  286. package/dist/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  287. package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  288. package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  289. package/dist/templates/.cursor/rules/07-process-ops.mdc +0 -20
  290. package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  291. package/dist/templates/.cursor/rules/09-docstrings.mdc +0 -89
  292. package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  293. package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  294. package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  295. package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  296. package/dist/templates/.cursor/rules/README.md +0 -148
  297. package/dist/templates/.github/copilot-instructions.md +0 -82
  298. package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  299. package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  300. package/dist/templates/.junie/guidelines.md +0 -73
  301. package/dist/templates/.vscode/launch.json +0 -17
  302. package/dist/templates/.vscode/settings.json +0 -95
  303. package/dist/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  304. package/dist/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  305. package/dist/templates/CLAUDE.md +0 -196
  306. package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
  307. package/dist/templates/OIDC_SETUP.md +0 -300
  308. package/dist/templates/agents.md +0 -171
  309. package/dist/templates/codemod/README.md +0 -1
  310. package/dist/templates/codemod/test.js +0 -93
  311. package/dist/templates/docs/README.md +0 -151
  312. package/dist/templates/scripts/new_feature.sh +0 -80
  313. package/dist/templates/scripts/quality-gates/check-god-objects.js +0 -146
  314. package/dist/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  315. package/dist/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
  316. package/dist/test-analysis.js +0 -786
  317. package/dist/tool-interface.js +0 -314
  318. package/dist/tool-loader.js +0 -303
  319. package/dist/tool-validator.js +0 -393
  320. package/dist/utils/agent-display.js +0 -210
  321. package/dist/utils/agent-session.js +0 -344
  322. package/dist/utils/async-utils.js +0 -188
  323. package/dist/utils/command-wrapper.js +0 -200
  324. package/dist/utils/event-log.js +0 -584
  325. package/dist/utils/event-renderer.js +0 -521
  326. package/dist/utils/finalization.js +0 -230
  327. package/dist/utils/git-lock.js +0 -119
  328. package/dist/utils/gitignore-updater.js +0 -158
  329. package/dist/utils/ide-detection.js +0 -133
  330. package/dist/utils/lifecycle-events.js +0 -94
  331. package/dist/utils/project-analysis.js +0 -367
  332. package/dist/utils/promise-utils.js +0 -72
  333. package/dist/utils/quality-gates-errors.js +0 -520
  334. package/dist/utils/quality-gates-utils.js +0 -387
  335. package/dist/utils/schema-validator.js +0 -50
  336. package/dist/utils/spec-resolver.js +0 -711
  337. package/dist/utils/typescript-detector.js +0 -369
  338. package/dist/utils/working-state.js +0 -530
  339. package/dist/utils/yaml-validation.js +0 -156
  340. package/dist/validation/spec-validation.js +0 -924
  341. package/dist/waivers-manager.js +0 -732
  342. package/dist/worktree/worktree-manager.js +0 -1735
  343. package/templates/.caws/schemas/policy.schema.json +0 -117
  344. package/templates/.caws/schemas/scope.schema.json +0 -52
  345. package/templates/.caws/schemas/waivers.schema.json +0 -106
  346. package/templates/.caws/schemas/working-spec.schema.json +0 -340
  347. package/templates/.caws/schemas/worktrees.schema.json +0 -38
  348. package/templates/.caws/templates/working-spec.template.yml +0 -80
  349. package/templates/.caws/tools/README.md +0 -18
  350. package/templates/.caws/tools/scope-guard.js +0 -203
  351. package/templates/.caws/tools-allow.json +0 -331
  352. package/templates/.caws/waivers.yml +0 -19
  353. package/templates/.claude/README.md +0 -190
  354. package/templates/.claude/hooks/audit.sh +0 -121
  355. package/templates/.claude/hooks/block-dangerous.sh +0 -203
  356. package/templates/.claude/hooks/classify_command.py +0 -592
  357. package/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  358. package/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  359. package/templates/.claude/hooks/naming-check.sh +0 -100
  360. package/templates/.claude/hooks/protected-paths.sh +0 -39
  361. package/templates/.claude/hooks/quality-check.sh +0 -81
  362. package/templates/.claude/hooks/scan-secrets.sh +0 -85
  363. package/templates/.claude/hooks/scope-guard.sh +0 -381
  364. package/templates/.claude/hooks/session-caws-status.sh +0 -117
  365. package/templates/.claude/hooks/session-log.sh +0 -634
  366. package/templates/.claude/hooks/simplification-guard.sh +0 -92
  367. package/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  368. package/templates/.claude/hooks/test_classify_command.py +0 -370
  369. package/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  370. package/templates/.claude/hooks/validate-spec.sh +0 -76
  371. package/templates/.claude/hooks/worktree-guard.sh +0 -220
  372. package/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  373. package/templates/.claude/rules/git-safety.md +0 -26
  374. package/templates/.claude/rules/worktree-isolation.md +0 -101
  375. package/templates/.claude/settings.json +0 -141
  376. package/templates/.cursor/README.md +0 -299
  377. package/templates/.cursor/hooks/audit.sh +0 -55
  378. package/templates/.cursor/hooks/block-dangerous.sh +0 -84
  379. package/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  380. package/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  381. package/templates/.cursor/hooks/format.sh +0 -38
  382. package/templates/.cursor/hooks/naming-check.sh +0 -64
  383. package/templates/.cursor/hooks/scan-secrets.sh +0 -51
  384. package/templates/.cursor/hooks/scope-guard.sh +0 -52
  385. package/templates/.cursor/hooks/session-log.sh +0 -924
  386. package/templates/.cursor/hooks/validate-spec.sh +0 -83
  387. package/templates/.cursor/hooks.json +0 -76
  388. package/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  389. package/templates/.cursor/rules/01-working-style.mdc +0 -50
  390. package/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  391. package/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  392. package/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  393. package/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  394. package/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  395. package/templates/.cursor/rules/07-process-ops.mdc +0 -20
  396. package/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  397. package/templates/.cursor/rules/09-docstrings.mdc +0 -89
  398. package/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  399. package/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  400. package/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  401. package/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  402. package/templates/.cursor/rules/README.md +0 -148
  403. package/templates/.github/copilot-instructions.md +0 -82
  404. package/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  405. package/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  406. package/templates/.junie/guidelines.md +0 -73
  407. package/templates/.vscode/launch.json +0 -17
  408. package/templates/.vscode/settings.json +0 -95
  409. package/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  410. package/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  411. package/templates/CLAUDE.md +0 -196
  412. package/templates/COMMIT_CONVENTIONS.md +0 -86
  413. package/templates/OIDC_SETUP.md +0 -300
  414. package/templates/agents.md +0 -171
  415. package/templates/codemod/README.md +0 -1
  416. package/templates/codemod/test.js +0 -93
  417. package/templates/docs/README.md +0 -151
  418. package/templates/scripts/new_feature.sh +0 -80
  419. package/templates/scripts/quality-gates/check-god-objects.js +0 -146
  420. package/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  421. 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
- };