@paths.design/caws-cli 10.2.0 → 11.1.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 (493) hide show
  1. package/README.md +125 -374
  2. package/dist/index.js +45 -787
  3. package/dist/init/harness-detect.d.ts +18 -0
  4. package/dist/init/harness-detect.d.ts.map +1 -0
  5. package/dist/init/harness-detect.js +90 -0
  6. package/dist/init/harness-detect.js.map +1 -0
  7. package/dist/init/hook-install.d.ts +53 -0
  8. package/dist/init/hook-install.d.ts.map +1 -0
  9. package/dist/init/hook-install.js +421 -0
  10. package/dist/init/hook-install.js.map +1 -0
  11. package/dist/init/hook-packs/manifest-claude-code.d.ts +4 -0
  12. package/dist/init/hook-packs/manifest-claude-code.d.ts.map +1 -0
  13. package/dist/init/hook-packs/manifest-claude-code.js +190 -0
  14. package/dist/init/hook-packs/manifest-claude-code.js.map +1 -0
  15. package/dist/init/hook-packs/register.d.ts +19 -0
  16. package/dist/init/hook-packs/register.d.ts.map +1 -0
  17. package/dist/init/hook-packs/register.js +37 -0
  18. package/dist/init/hook-packs/register.js.map +1 -0
  19. package/dist/init/hook-packs/types.d.ts +123 -0
  20. package/dist/init/hook-packs/types.d.ts.map +1 -0
  21. package/dist/init/hook-packs/types.js +29 -0
  22. package/dist/init/hook-packs/types.js.map +1 -0
  23. package/dist/shell/binding/resolve-binding.d.ts +4 -0
  24. package/dist/shell/binding/resolve-binding.d.ts.map +1 -0
  25. package/dist/shell/binding/resolve-binding.js +228 -0
  26. package/dist/shell/binding/resolve-binding.js.map +1 -0
  27. package/dist/shell/binding/types.d.ts +42 -0
  28. package/dist/shell/binding/types.d.ts.map +1 -0
  29. package/dist/shell/binding/types.js +21 -0
  30. package/dist/shell/binding/types.js.map +1 -0
  31. package/dist/shell/commands/claim.d.ts +14 -0
  32. package/dist/shell/commands/claim.d.ts.map +1 -0
  33. package/dist/shell/commands/claim.js +197 -0
  34. package/dist/shell/commands/claim.js.map +1 -0
  35. package/dist/shell/commands/doctor.d.ts +13 -0
  36. package/dist/shell/commands/doctor.d.ts.map +1 -0
  37. package/dist/shell/commands/doctor.js +97 -0
  38. package/dist/shell/commands/doctor.js.map +1 -0
  39. package/dist/shell/commands/evidence.d.ts +28 -0
  40. package/dist/shell/commands/evidence.d.ts.map +1 -0
  41. package/dist/shell/commands/evidence.js +166 -0
  42. package/dist/shell/commands/evidence.js.map +1 -0
  43. package/dist/shell/commands/gates.d.ts +19 -0
  44. package/dist/shell/commands/gates.d.ts.map +1 -0
  45. package/dist/shell/commands/gates.js +208 -0
  46. package/dist/shell/commands/gates.js.map +1 -0
  47. package/dist/shell/commands/init.d.ts +17 -0
  48. package/dist/shell/commands/init.d.ts.map +1 -0
  49. package/dist/shell/commands/init.js +168 -0
  50. package/dist/shell/commands/init.js.map +1 -0
  51. package/dist/shell/commands/scope.d.ts +11 -0
  52. package/dist/shell/commands/scope.d.ts.map +1 -0
  53. package/dist/shell/commands/scope.js +92 -0
  54. package/dist/shell/commands/scope.js.map +1 -0
  55. package/dist/shell/commands/specs.d.ts +41 -0
  56. package/dist/shell/commands/specs.d.ts.map +1 -0
  57. package/dist/shell/commands/specs.js +264 -0
  58. package/dist/shell/commands/specs.js.map +1 -0
  59. package/dist/shell/commands/status.d.ts +15 -0
  60. package/dist/shell/commands/status.d.ts.map +1 -0
  61. package/dist/shell/commands/status.js +106 -0
  62. package/dist/shell/commands/status.js.map +1 -0
  63. package/dist/shell/commands/waiver.d.ts +38 -0
  64. package/dist/shell/commands/waiver.d.ts.map +1 -0
  65. package/dist/shell/commands/waiver.js +240 -0
  66. package/dist/shell/commands/waiver.js.map +1 -0
  67. package/dist/shell/commands/worktree.d.ts +38 -0
  68. package/dist/shell/commands/worktree.d.ts.map +1 -0
  69. package/dist/shell/commands/worktree.js +286 -0
  70. package/dist/shell/commands/worktree.js.map +1 -0
  71. package/dist/shell/gates/disposition.d.ts +23 -0
  72. package/dist/shell/gates/disposition.d.ts.map +1 -0
  73. package/dist/shell/gates/disposition.js +117 -0
  74. package/dist/shell/gates/disposition.js.map +1 -0
  75. package/dist/shell/gates/gate-result-contract.d.ts +39 -0
  76. package/dist/shell/gates/gate-result-contract.d.ts.map +1 -0
  77. package/dist/shell/gates/gate-result-contract.js +150 -0
  78. package/dist/shell/gates/gate-result-contract.js.map +1 -0
  79. package/dist/shell/gates/local-evaluators/budget-limit.d.ts +24 -0
  80. package/dist/shell/gates/local-evaluators/budget-limit.d.ts.map +1 -0
  81. package/dist/shell/gates/local-evaluators/budget-limit.js +67 -0
  82. package/dist/shell/gates/local-evaluators/budget-limit.js.map +1 -0
  83. package/dist/shell/gates/local-evaluators/diff-helpers.d.ts +25 -0
  84. package/dist/shell/gates/local-evaluators/diff-helpers.d.ts.map +1 -0
  85. package/dist/shell/gates/local-evaluators/diff-helpers.js +74 -0
  86. package/dist/shell/gates/local-evaluators/diff-helpers.js.map +1 -0
  87. package/dist/shell/gates/local-evaluators/index.d.ts +28 -0
  88. package/dist/shell/gates/local-evaluators/index.d.ts.map +1 -0
  89. package/dist/shell/gates/local-evaluators/index.js +67 -0
  90. package/dist/shell/gates/local-evaluators/index.js.map +1 -0
  91. package/dist/shell/gates/local-evaluators/scope-boundary.d.ts +23 -0
  92. package/dist/shell/gates/local-evaluators/scope-boundary.d.ts.map +1 -0
  93. package/dist/shell/gates/local-evaluators/scope-boundary.js +67 -0
  94. package/dist/shell/gates/local-evaluators/scope-boundary.js.map +1 -0
  95. package/dist/shell/gates/local-evaluators/spec-completeness.d.ts +12 -0
  96. package/dist/shell/gates/local-evaluators/spec-completeness.d.ts.map +1 -0
  97. package/dist/shell/gates/local-evaluators/spec-completeness.js +73 -0
  98. package/dist/shell/gates/local-evaluators/spec-completeness.js.map +1 -0
  99. package/dist/shell/gates/quality-gates-adapter.d.ts +55 -0
  100. package/dist/shell/gates/quality-gates-adapter.d.ts.map +1 -0
  101. package/dist/shell/gates/quality-gates-adapter.js +161 -0
  102. package/dist/shell/gates/quality-gates-adapter.js.map +1 -0
  103. package/dist/shell/gates/waiver-filter.d.ts +58 -0
  104. package/dist/shell/gates/waiver-filter.d.ts.map +1 -0
  105. package/dist/shell/gates/waiver-filter.js +119 -0
  106. package/dist/shell/gates/waiver-filter.js.map +1 -0
  107. package/dist/shell/index.d.ts +54 -0
  108. package/dist/shell/index.d.ts.map +1 -0
  109. package/dist/shell/index.js +85 -0
  110. package/dist/shell/index.js.map +1 -0
  111. package/dist/shell/register.d.ts +11 -0
  112. package/dist/shell/register.d.ts.map +1 -0
  113. package/dist/shell/register.js +464 -0
  114. package/dist/shell/register.js.map +1 -0
  115. package/dist/shell/render/claim.d.ts +22 -0
  116. package/dist/shell/render/claim.d.ts.map +1 -0
  117. package/dist/shell/render/claim.js +75 -0
  118. package/dist/shell/render/claim.js.map +1 -0
  119. package/dist/shell/render/decision.d.ts +15 -0
  120. package/dist/shell/render/decision.d.ts.map +1 -0
  121. package/dist/shell/render/decision.js +66 -0
  122. package/dist/shell/render/decision.js.map +1 -0
  123. package/dist/shell/render/diagnostic.d.ts +19 -0
  124. package/dist/shell/render/diagnostic.d.ts.map +1 -0
  125. package/dist/shell/render/diagnostic.js +76 -0
  126. package/dist/shell/render/diagnostic.js.map +1 -0
  127. package/dist/shell/render/finding.d.ts +15 -0
  128. package/dist/shell/render/finding.d.ts.map +1 -0
  129. package/dist/shell/render/finding.js +57 -0
  130. package/dist/shell/render/finding.js.map +1 -0
  131. package/dist/shell/render/gates.d.ts +3 -0
  132. package/dist/shell/render/gates.d.ts.map +1 -0
  133. package/dist/shell/render/gates.js +56 -0
  134. package/dist/shell/render/gates.js.map +1 -0
  135. package/dist/shell/render/init-hook-pack.d.ts +16 -0
  136. package/dist/shell/render/init-hook-pack.d.ts.map +1 -0
  137. package/dist/shell/render/init-hook-pack.js +206 -0
  138. package/dist/shell/render/init-hook-pack.js.map +1 -0
  139. package/dist/shell/render/init.d.ts +11 -0
  140. package/dist/shell/render/init.d.ts.map +1 -0
  141. package/dist/shell/render/init.js +32 -0
  142. package/dist/shell/render/init.js.map +1 -0
  143. package/dist/shell/render/status.d.ts +26 -0
  144. package/dist/shell/render/status.d.ts.map +1 -0
  145. package/dist/shell/render/status.js +143 -0
  146. package/dist/shell/render/status.js.map +1 -0
  147. package/dist/shell/render/waiver.d.ts +21 -0
  148. package/dist/shell/render/waiver.d.ts.map +1 -0
  149. package/dist/shell/render/waiver.js +94 -0
  150. package/dist/shell/render/waiver.js.map +1 -0
  151. package/dist/shell/rules.d.ts +37 -0
  152. package/dist/shell/rules.d.ts.map +1 -0
  153. package/dist/shell/rules.js +51 -0
  154. package/dist/shell/rules.js.map +1 -0
  155. package/dist/shell/session/actor.d.ts +14 -0
  156. package/dist/shell/session/actor.d.ts.map +1 -0
  157. package/dist/shell/session/actor.js +34 -0
  158. package/dist/shell/session/actor.js.map +1 -0
  159. package/dist/shell/session/resolve-session.d.ts +5 -0
  160. package/dist/shell/session/resolve-session.d.ts.map +1 -0
  161. package/dist/shell/session/resolve-session.js +239 -0
  162. package/dist/shell/session/resolve-session.js.map +1 -0
  163. package/dist/shell/session/types.d.ts +56 -0
  164. package/dist/shell/session/types.d.ts.map +1 -0
  165. package/dist/shell/session/types.js +15 -0
  166. package/dist/shell/session/types.js.map +1 -0
  167. package/dist/store/agents-store.d.ts +3 -0
  168. package/dist/store/agents-store.d.ts.map +1 -0
  169. package/dist/store/agents-store.js +63 -0
  170. package/dist/store/agents-store.js.map +1 -0
  171. package/dist/store/apply-patch.d.ts +16 -0
  172. package/dist/store/apply-patch.d.ts.map +1 -0
  173. package/dist/store/apply-patch.js +191 -0
  174. package/dist/store/apply-patch.js.map +1 -0
  175. package/dist/store/atomic-write.d.ts +34 -0
  176. package/dist/store/atomic-write.d.ts.map +1 -0
  177. package/dist/store/atomic-write.js +174 -0
  178. package/dist/store/atomic-write.js.map +1 -0
  179. package/dist/store/doctor-snapshot.d.ts +20 -0
  180. package/dist/store/doctor-snapshot.d.ts.map +1 -0
  181. package/dist/store/doctor-snapshot.js +176 -0
  182. package/dist/store/doctor-snapshot.js.map +1 -0
  183. package/dist/store/events-store.d.ts +33 -0
  184. package/dist/store/events-store.d.ts.map +1 -0
  185. package/dist/store/events-store.js +297 -0
  186. package/dist/store/events-store.js.map +1 -0
  187. package/dist/store/index.d.ts +21 -0
  188. package/dist/store/index.d.ts.map +1 -0
  189. package/dist/store/index.js +47 -0
  190. package/dist/store/index.js.map +1 -0
  191. package/dist/store/init-store.d.ts +21 -0
  192. package/dist/store/init-store.d.ts.map +1 -0
  193. package/dist/store/init-store.js +295 -0
  194. package/dist/store/init-store.js.map +1 -0
  195. package/dist/store/json-store.d.ts +3 -0
  196. package/dist/store/json-store.d.ts.map +1 -0
  197. package/dist/store/json-store.js +65 -0
  198. package/dist/store/json-store.js.map +1 -0
  199. package/dist/store/lifecycle-lock.d.ts +34 -0
  200. package/dist/store/lifecycle-lock.d.ts.map +1 -0
  201. package/dist/store/lifecycle-lock.js +168 -0
  202. package/dist/store/lifecycle-lock.js.map +1 -0
  203. package/dist/store/lifecycle-transaction.d.ts +79 -0
  204. package/dist/store/lifecycle-transaction.d.ts.map +1 -0
  205. package/dist/store/lifecycle-transaction.js +319 -0
  206. package/dist/store/lifecycle-transaction.js.map +1 -0
  207. package/dist/store/policy-store.d.ts +3 -0
  208. package/dist/store/policy-store.d.ts.map +1 -0
  209. package/dist/store/policy-store.js +65 -0
  210. package/dist/store/policy-store.js.map +1 -0
  211. package/dist/store/repo-root.d.ts +46 -0
  212. package/dist/store/repo-root.d.ts.map +1 -0
  213. package/dist/store/repo-root.js +145 -0
  214. package/dist/store/repo-root.js.map +1 -0
  215. package/dist/store/rules.d.ts +69 -0
  216. package/dist/store/rules.d.ts.map +1 -0
  217. package/dist/store/rules.js +95 -0
  218. package/dist/store/rules.js.map +1 -0
  219. package/dist/store/specs-store.d.ts +3 -0
  220. package/dist/store/specs-store.d.ts.map +1 -0
  221. package/dist/store/specs-store.js +131 -0
  222. package/dist/store/specs-store.js.map +1 -0
  223. package/dist/store/specs-writer.d.ts +61 -0
  224. package/dist/store/specs-writer.d.ts.map +1 -0
  225. package/dist/store/specs-writer.js +506 -0
  226. package/dist/store/specs-writer.js.map +1 -0
  227. package/dist/store/types.d.ts +84 -0
  228. package/dist/store/types.d.ts.map +1 -0
  229. package/dist/store/types.js +14 -0
  230. package/dist/store/types.js.map +1 -0
  231. package/dist/store/waivers-store.d.ts +25 -0
  232. package/dist/store/waivers-store.d.ts.map +1 -0
  233. package/dist/store/waivers-store.js +232 -0
  234. package/dist/store/waivers-store.js.map +1 -0
  235. package/dist/store/worktrees-store.d.ts +3 -0
  236. package/dist/store/worktrees-store.d.ts.map +1 -0
  237. package/dist/store/worktrees-store.js +62 -0
  238. package/dist/store/worktrees-store.js.map +1 -0
  239. package/dist/store/worktrees-writer.d.ts +77 -0
  240. package/dist/store/worktrees-writer.d.ts.map +1 -0
  241. package/dist/store/worktrees-writer.js +674 -0
  242. package/dist/store/worktrees-writer.js.map +1 -0
  243. package/dist/store/yaml-patch.d.ts +7 -0
  244. package/dist/store/yaml-patch.d.ts.map +1 -0
  245. package/dist/store/yaml-patch.js +250 -0
  246. package/dist/store/yaml-patch.js.map +1 -0
  247. package/dist/store/yaml-store.d.ts +9 -0
  248. package/dist/store/yaml-store.d.ts.map +1 -0
  249. package/dist/store/yaml-store.js +121 -0
  250. package/dist/store/yaml-store.js.map +1 -0
  251. package/package.json +15 -13
  252. package/dist/budget-derivation.js +0 -751
  253. package/dist/cicd-optimizer.js +0 -504
  254. package/dist/commands/agents.js +0 -124
  255. package/dist/commands/archive.js +0 -500
  256. package/dist/commands/burnup.js +0 -198
  257. package/dist/commands/diagnose.js +0 -525
  258. package/dist/commands/evaluate.js +0 -314
  259. package/dist/commands/gates.js +0 -149
  260. package/dist/commands/init.js +0 -857
  261. package/dist/commands/iterate.js +0 -417
  262. package/dist/commands/mode.js +0 -269
  263. package/dist/commands/parallel.js +0 -242
  264. package/dist/commands/plan.js +0 -438
  265. package/dist/commands/provenance.js +0 -1143
  266. package/dist/commands/quality-monitor.js +0 -284
  267. package/dist/commands/scope.js +0 -264
  268. package/dist/commands/session.js +0 -312
  269. package/dist/commands/sidecar.js +0 -74
  270. package/dist/commands/specs.js +0 -1656
  271. package/dist/commands/status.js +0 -1172
  272. package/dist/commands/templates.js +0 -237
  273. package/dist/commands/tool.js +0 -136
  274. package/dist/commands/tutorial.js +0 -480
  275. package/dist/commands/validate.js +0 -357
  276. package/dist/commands/verify-acs.js +0 -443
  277. package/dist/commands/waivers.js +0 -599
  278. package/dist/commands/workflow.js +0 -243
  279. package/dist/commands/worktree.js +0 -502
  280. package/dist/config/lite-scope.js +0 -158
  281. package/dist/config/modes.js +0 -347
  282. package/dist/constants/spec-types.js +0 -65
  283. package/dist/gates/budget-limit.js +0 -121
  284. package/dist/gates/feedback.js +0 -260
  285. package/dist/gates/format.js +0 -179
  286. package/dist/gates/god-object.js +0 -117
  287. package/dist/gates/pipeline.js +0 -167
  288. package/dist/gates/scope-boundary.js +0 -112
  289. package/dist/gates/spec-completeness.js +0 -109
  290. package/dist/gates/todo-detection.js +0 -205
  291. package/dist/generators/jest-config-generator.js +0 -242
  292. package/dist/generators/working-spec.js +0 -237
  293. package/dist/minimal-cli.js +0 -88
  294. package/dist/parallel/parallel-manager.js +0 -433
  295. package/dist/policy/PolicyManager.js +0 -470
  296. package/dist/scaffold/claude-hooks.js +0 -443
  297. package/dist/scaffold/cursor-hooks.js +0 -177
  298. package/dist/scaffold/git-hooks.js +0 -928
  299. package/dist/scaffold/index.js +0 -794
  300. package/dist/session/session-manager.js +0 -653
  301. package/dist/sidecars/index.js +0 -33
  302. package/dist/sidecars/listeners.js +0 -40
  303. package/dist/sidecars/provenance-summary.js +0 -238
  304. package/dist/sidecars/quality-gaps.js +0 -258
  305. package/dist/sidecars/schema.js +0 -149
  306. package/dist/sidecars/spec-drift.js +0 -151
  307. package/dist/sidecars/waiver-draft.js +0 -176
  308. package/dist/spec/SpecFileManager.js +0 -419
  309. package/dist/templates/.caws/schemas/policy.schema.json +0 -117
  310. package/dist/templates/.caws/schemas/scope.schema.json +0 -52
  311. package/dist/templates/.caws/schemas/waivers.schema.json +0 -106
  312. package/dist/templates/.caws/schemas/working-spec.schema.json +0 -340
  313. package/dist/templates/.caws/schemas/worktrees.schema.json +0 -38
  314. package/dist/templates/.caws/templates/working-spec.template.yml +0 -80
  315. package/dist/templates/.caws/tools/README.md +0 -18
  316. package/dist/templates/.caws/tools/scope-guard.js +0 -203
  317. package/dist/templates/.caws/tools-allow.json +0 -331
  318. package/dist/templates/.caws/waivers.yml +0 -19
  319. package/dist/templates/.claude/README.md +0 -190
  320. package/dist/templates/.claude/hooks/audit.sh +0 -121
  321. package/dist/templates/.claude/hooks/block-dangerous.sh +0 -203
  322. package/dist/templates/.claude/hooks/classify_command.py +0 -592
  323. package/dist/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  324. package/dist/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  325. package/dist/templates/.claude/hooks/naming-check.sh +0 -100
  326. package/dist/templates/.claude/hooks/protected-paths.sh +0 -39
  327. package/dist/templates/.claude/hooks/quality-check.sh +0 -81
  328. package/dist/templates/.claude/hooks/scan-secrets.sh +0 -85
  329. package/dist/templates/.claude/hooks/scope-guard.sh +0 -381
  330. package/dist/templates/.claude/hooks/session-caws-status.sh +0 -117
  331. package/dist/templates/.claude/hooks/session-log.sh +0 -634
  332. package/dist/templates/.claude/hooks/simplification-guard.sh +0 -92
  333. package/dist/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  334. package/dist/templates/.claude/hooks/test_classify_command.py +0 -370
  335. package/dist/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  336. package/dist/templates/.claude/hooks/validate-spec.sh +0 -76
  337. package/dist/templates/.claude/hooks/worktree-guard.sh +0 -220
  338. package/dist/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  339. package/dist/templates/.claude/rules/git-safety.md +0 -26
  340. package/dist/templates/.claude/rules/worktree-isolation.md +0 -101
  341. package/dist/templates/.claude/settings.json +0 -141
  342. package/dist/templates/.cursor/README.md +0 -299
  343. package/dist/templates/.cursor/hooks/audit.sh +0 -55
  344. package/dist/templates/.cursor/hooks/block-dangerous.sh +0 -84
  345. package/dist/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  346. package/dist/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  347. package/dist/templates/.cursor/hooks/format.sh +0 -38
  348. package/dist/templates/.cursor/hooks/naming-check.sh +0 -64
  349. package/dist/templates/.cursor/hooks/scan-secrets.sh +0 -51
  350. package/dist/templates/.cursor/hooks/scope-guard.sh +0 -52
  351. package/dist/templates/.cursor/hooks/session-log.sh +0 -924
  352. package/dist/templates/.cursor/hooks/validate-spec.sh +0 -83
  353. package/dist/templates/.cursor/hooks.json +0 -76
  354. package/dist/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  355. package/dist/templates/.cursor/rules/01-working-style.mdc +0 -50
  356. package/dist/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  357. package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  358. package/dist/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  359. package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  360. package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  361. package/dist/templates/.cursor/rules/07-process-ops.mdc +0 -20
  362. package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  363. package/dist/templates/.cursor/rules/09-docstrings.mdc +0 -89
  364. package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  365. package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  366. package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  367. package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  368. package/dist/templates/.cursor/rules/README.md +0 -148
  369. package/dist/templates/.github/copilot-instructions.md +0 -82
  370. package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  371. package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  372. package/dist/templates/.junie/guidelines.md +0 -73
  373. package/dist/templates/.vscode/launch.json +0 -17
  374. package/dist/templates/.vscode/settings.json +0 -95
  375. package/dist/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  376. package/dist/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  377. package/dist/templates/CLAUDE.md +0 -196
  378. package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
  379. package/dist/templates/OIDC_SETUP.md +0 -300
  380. package/dist/templates/agents.md +0 -171
  381. package/dist/templates/codemod/README.md +0 -1
  382. package/dist/templates/codemod/test.js +0 -93
  383. package/dist/templates/docs/README.md +0 -151
  384. package/dist/templates/scripts/new_feature.sh +0 -80
  385. package/dist/templates/scripts/quality-gates/check-god-objects.js +0 -146
  386. package/dist/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  387. package/dist/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
  388. package/dist/test-analysis.js +0 -786
  389. package/dist/tool-interface.js +0 -314
  390. package/dist/tool-loader.js +0 -303
  391. package/dist/tool-validator.js +0 -393
  392. package/dist/utils/agent-display.js +0 -210
  393. package/dist/utils/agent-session.js +0 -344
  394. package/dist/utils/async-utils.js +0 -188
  395. package/dist/utils/command-wrapper.js +0 -200
  396. package/dist/utils/event-log.js +0 -584
  397. package/dist/utils/event-renderer.js +0 -521
  398. package/dist/utils/finalization.js +0 -230
  399. package/dist/utils/git-lock.js +0 -119
  400. package/dist/utils/gitignore-updater.js +0 -158
  401. package/dist/utils/ide-detection.js +0 -133
  402. package/dist/utils/lifecycle-events.js +0 -94
  403. package/dist/utils/project-analysis.js +0 -367
  404. package/dist/utils/promise-utils.js +0 -72
  405. package/dist/utils/quality-gates-errors.js +0 -520
  406. package/dist/utils/quality-gates-utils.js +0 -387
  407. package/dist/utils/schema-validator.js +0 -50
  408. package/dist/utils/spec-resolver.js +0 -711
  409. package/dist/utils/typescript-detector.js +0 -369
  410. package/dist/utils/working-state.js +0 -530
  411. package/dist/utils/yaml-validation.js +0 -156
  412. package/dist/validation/spec-validation.js +0 -924
  413. package/dist/waivers-manager.js +0 -732
  414. package/dist/worktree/worktree-manager.js +0 -1735
  415. package/templates/.caws/schemas/policy.schema.json +0 -117
  416. package/templates/.caws/schemas/scope.schema.json +0 -52
  417. package/templates/.caws/schemas/waivers.schema.json +0 -106
  418. package/templates/.caws/schemas/working-spec.schema.json +0 -340
  419. package/templates/.caws/schemas/worktrees.schema.json +0 -38
  420. package/templates/.caws/templates/working-spec.template.yml +0 -80
  421. package/templates/.caws/tools/README.md +0 -18
  422. package/templates/.caws/tools/scope-guard.js +0 -203
  423. package/templates/.caws/tools-allow.json +0 -331
  424. package/templates/.caws/waivers.yml +0 -19
  425. package/templates/.claude/README.md +0 -190
  426. package/templates/.claude/hooks/audit.sh +0 -121
  427. package/templates/.claude/hooks/block-dangerous.sh +0 -203
  428. package/templates/.claude/hooks/classify_command.py +0 -592
  429. package/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  430. package/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  431. package/templates/.claude/hooks/naming-check.sh +0 -100
  432. package/templates/.claude/hooks/protected-paths.sh +0 -39
  433. package/templates/.claude/hooks/quality-check.sh +0 -81
  434. package/templates/.claude/hooks/scan-secrets.sh +0 -85
  435. package/templates/.claude/hooks/scope-guard.sh +0 -381
  436. package/templates/.claude/hooks/session-caws-status.sh +0 -117
  437. package/templates/.claude/hooks/session-log.sh +0 -634
  438. package/templates/.claude/hooks/simplification-guard.sh +0 -92
  439. package/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  440. package/templates/.claude/hooks/test_classify_command.py +0 -370
  441. package/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  442. package/templates/.claude/hooks/validate-spec.sh +0 -76
  443. package/templates/.claude/hooks/worktree-guard.sh +0 -220
  444. package/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  445. package/templates/.claude/rules/git-safety.md +0 -26
  446. package/templates/.claude/rules/worktree-isolation.md +0 -101
  447. package/templates/.claude/settings.json +0 -141
  448. package/templates/.cursor/README.md +0 -299
  449. package/templates/.cursor/hooks/audit.sh +0 -55
  450. package/templates/.cursor/hooks/block-dangerous.sh +0 -84
  451. package/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  452. package/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  453. package/templates/.cursor/hooks/format.sh +0 -38
  454. package/templates/.cursor/hooks/naming-check.sh +0 -64
  455. package/templates/.cursor/hooks/scan-secrets.sh +0 -51
  456. package/templates/.cursor/hooks/scope-guard.sh +0 -52
  457. package/templates/.cursor/hooks/session-log.sh +0 -924
  458. package/templates/.cursor/hooks/validate-spec.sh +0 -83
  459. package/templates/.cursor/hooks.json +0 -76
  460. package/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  461. package/templates/.cursor/rules/01-working-style.mdc +0 -50
  462. package/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  463. package/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  464. package/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  465. package/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  466. package/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  467. package/templates/.cursor/rules/07-process-ops.mdc +0 -20
  468. package/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  469. package/templates/.cursor/rules/09-docstrings.mdc +0 -89
  470. package/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  471. package/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  472. package/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  473. package/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  474. package/templates/.cursor/rules/README.md +0 -148
  475. package/templates/.github/copilot-instructions.md +0 -82
  476. package/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  477. package/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  478. package/templates/.junie/guidelines.md +0 -73
  479. package/templates/.vscode/launch.json +0 -17
  480. package/templates/.vscode/settings.json +0 -95
  481. package/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  482. package/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  483. package/templates/CLAUDE.md +0 -196
  484. package/templates/COMMIT_CONVENTIONS.md +0 -86
  485. package/templates/OIDC_SETUP.md +0 -300
  486. package/templates/agents.md +0 -171
  487. package/templates/codemod/README.md +0 -1
  488. package/templates/codemod/test.js +0 -93
  489. package/templates/docs/README.md +0 -151
  490. package/templates/scripts/new_feature.sh +0 -80
  491. package/templates/scripts/quality-gates/check-god-objects.js +0 -146
  492. package/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  493. 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
- };