@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,173 +0,0 @@
1
- #!/bin/bash
2
- # Document Frontmatter Check Hook for Claude Code
3
- # Warns when docs/**/*.md files are written/edited without proper frontmatter.
4
- # Advisory only — does not block.
5
- #
6
- # Validates YAML frontmatter with required fields, authority/status enums,
7
- # governs requirements for high-authority docs, and verified_at_commit for
8
- # implementation-state claims.
9
-
10
- set -euo pipefail
11
-
12
- INPUT=$(cat)
13
-
14
- FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
15
- TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
16
-
17
- # Only check Write and Edit tools
18
- if [[ "$TOOL_NAME" != "Write" ]] && [[ "$TOOL_NAME" != "Edit" ]]; then
19
- exit 0
20
- fi
21
-
22
- if [[ -z "$FILE_PATH" ]]; then
23
- exit 0
24
- fi
25
-
26
- # Only check .md files under docs/
27
- if [[ ! "$FILE_PATH" =~ docs/.*\.md$ ]]; then
28
- exit 0
29
- fi
30
-
31
- # Skip exempt filenames
32
- BASENAME=$(basename "$FILE_PATH")
33
- if [[ "$BASENAME" == "README.md" ]] || [[ "$BASENAME" == "INDEX.md" ]] || [[ "$BASENAME" == "index.md" ]] || [[ "$BASENAME" == "00_INDEX.md" ]]; then
34
- exit 0
35
- fi
36
-
37
- # Skip archive and templates directories
38
- if [[ "$FILE_PATH" =~ docs/archive/ ]] || [[ "$FILE_PATH" =~ docs/templates/ ]]; then
39
- exit 0
40
- fi
41
-
42
- # Skip ephemeral (gitignored, not governed)
43
- if [[ "$FILE_PATH" =~ docs/ephemeral/ ]]; then
44
- exit 0
45
- fi
46
-
47
- # Check if file exists (Write creates it, Edit modifies it)
48
- if [[ ! -f "$FILE_PATH" ]]; then
49
- exit 0
50
- fi
51
-
52
- # --- Frontmatter validation ---
53
-
54
- # V1: Check for frontmatter delimiters
55
- FIRST_LINE=$(head -1 "$FILE_PATH" 2>/dev/null || echo "")
56
- if [[ "$FIRST_LINE" != "---" ]]; then
57
- echo '{
58
- "hookSpecificOutput": {
59
- "hookEventName": "PostToolUse",
60
- "additionalContext": "Doc governance (V1): '"$FILE_PATH"' is missing YAML frontmatter. All docs under docs/ (except README.md, archive/, templates/) must start with --- delimiters containing doc_id, authority, status, title, owner, and updated fields."
61
- }
62
- }'
63
- exit 0
64
- fi
65
-
66
- # Extract frontmatter block (between first and second ---)
67
- FRONTMATTER=$(awk 'NR==1 && /^---$/{found=1; next} found && /^---$/{exit} found{print}' "$FILE_PATH")
68
-
69
- if [[ -z "$FRONTMATTER" ]]; then
70
- echo '{
71
- "hookSpecificOutput": {
72
- "hookEventName": "PostToolUse",
73
- "additionalContext": "Doc governance (V1): '"$FILE_PATH"' has opening --- but no closing --- for frontmatter block."
74
- }
75
- }'
76
- exit 0
77
- fi
78
-
79
- # V2: Check required fields
80
- MISSING=""
81
- for field in doc_id authority status title owner updated; do
82
- if ! echo "$FRONTMATTER" | grep -q "^${field}:"; then
83
- MISSING="${MISSING} ${field}"
84
- fi
85
- done
86
-
87
- if [[ -n "$MISSING" ]]; then
88
- echo '{
89
- "hookSpecificOutput": {
90
- "hookEventName": "PostToolUse",
91
- "additionalContext": "Doc governance (V2): '"$FILE_PATH"' is missing required frontmatter fields:'"$MISSING"'."
92
- }
93
- }'
94
- exit 0
95
- fi
96
-
97
- # V2: Check authority value
98
- AUTHORITY=$(echo "$FRONTMATTER" | grep "^authority:" | head -1 | sed 's/^authority: *//' | tr -d '"' | tr -d "'")
99
- case "$AUTHORITY" in
100
- canonical|policy|architecture|adr|spec|roadmap|reference|working|ephemeral)
101
- ;;
102
- *)
103
- echo '{
104
- "hookSpecificOutput": {
105
- "hookEventName": "PostToolUse",
106
- "additionalContext": "Doc governance (V2): '"$FILE_PATH"' has invalid authority '"'"''"$AUTHORITY"''"'"'. Must be one of: canonical, policy, architecture, adr, spec, roadmap, reference, working, ephemeral."
107
- }
108
- }'
109
- exit 0
110
- ;;
111
- esac
112
-
113
- # V2: Check status value
114
- STATUS=$(echo "$FRONTMATTER" | grep "^status:" | head -1 | sed 's/^status: *//' | tr -d '"' | tr -d "'")
115
- case "$STATUS" in
116
- draft|active|implemented|proven|superseded|archived)
117
- ;;
118
- *)
119
- echo '{
120
- "hookSpecificOutput": {
121
- "hookEventName": "PostToolUse",
122
- "additionalContext": "Doc governance (V2): '"$FILE_PATH"' has invalid status '"'"''"$STATUS"''"'"'. Must be one of: draft, active, implemented, proven, superseded, archived."
123
- }
124
- }'
125
- exit 0
126
- ;;
127
- esac
128
-
129
- # V3: Check governs for high-authority docs
130
- case "$AUTHORITY" in
131
- canonical|architecture|adr|spec)
132
- if ! echo "$FRONTMATTER" | grep -q "^governs:"; then
133
- echo '{
134
- "hookSpecificOutput": {
135
- "hookEventName": "PostToolUse",
136
- "additionalContext": "Doc governance (V3): '"$FILE_PATH"' has authority '"'"''"$AUTHORITY"''"'"' but no governs section. Docs with authority canonical/architecture/adr/spec must declare what they govern (modules, schemas, or specs)."
137
- }
138
- }'
139
- exit 0
140
- fi
141
- ;;
142
- esac
143
-
144
- # V4: Check verified_at_commit for implementation-state claims
145
- case "$STATUS" in
146
- implemented|proven)
147
- if ! echo "$FRONTMATTER" | grep -q "^verified_at_commit:"; then
148
- echo '{
149
- "hookSpecificOutput": {
150
- "hookEventName": "PostToolUse",
151
- "additionalContext": "Doc governance (V4): '"$FILE_PATH"' has status '"'"''"$STATUS"''"'"' but no verified_at_commit. Docs claiming implementation state must declare the commit SHA where claims were verified."
152
- }
153
- }'
154
- exit 0
155
- fi
156
- ;;
157
- esac
158
-
159
- # V5: Check superseded_by for superseded docs
160
- if [[ "$STATUS" == "superseded" ]]; then
161
- if ! echo "$FRONTMATTER" | grep -q "^superseded_by:"; then
162
- echo '{
163
- "hookSpecificOutput": {
164
- "hookEventName": "PostToolUse",
165
- "additionalContext": "Doc governance (V5): '"$FILE_PATH"' has status '"'"'superseded'"'"' but no superseded_by. Superseded docs must declare their replacement doc_id."
166
- }
167
- }'
168
- exit 0
169
- fi
170
- fi
171
-
172
- # All checks passed
173
- exit 0
@@ -1,145 +0,0 @@
1
- #!/bin/bash
2
- # CAWS Lite-Mode Sprawl Check Hook
3
- # Checks for file sprawl patterns (banned names, venv dirs, doc sprawl)
4
- # @author @darianrosebrook
5
-
6
- set -euo pipefail
7
-
8
- # Read JSON input from Claude Code
9
- INPUT=$(cat)
10
-
11
- # Extract tool info
12
- TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
13
- FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
14
-
15
- # Only check Write operations (new file creation)
16
- if [[ "$TOOL_NAME" != "Write" ]]; then
17
- exit 0
18
- fi
19
-
20
- if [[ -z "$FILE_PATH" ]]; then
21
- exit 0
22
- fi
23
-
24
- PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
25
- SCOPE_FILE="$PROJECT_DIR/.caws/scope.json"
26
-
27
- # Only active in lite mode (scope.json present, no working-spec.yaml)
28
- if [[ ! -f "$SCOPE_FILE" ]]; then
29
- exit 0
30
- fi
31
-
32
- # Get relative path
33
- # Get relative path (portable — macOS realpath lacks --relative-to)
34
- if [[ "$FILE_PATH" == "$PROJECT_DIR"/* ]]; then
35
- REL_PATH="${FILE_PATH#$PROJECT_DIR/}"
36
- else
37
- REL_PATH="$FILE_PATH"
38
- fi
39
- BASENAME=$(basename "$REL_PATH")
40
-
41
- # Use Node.js to check banned patterns
42
- if command -v node >/dev/null 2>&1; then
43
- SPRAWL_CHECK=$(node -e "
44
- const fs = require('fs');
45
- const path = require('path');
46
- try {
47
- const scope = JSON.parse(fs.readFileSync('$SCOPE_FILE', 'utf8'));
48
- const filePath = '$REL_PATH';
49
- const basename = '$BASENAME';
50
- const banned = scope.bannedPatterns || {};
51
-
52
- function globToRegex(pattern) {
53
- let i = 0, re = '';
54
- while (i < pattern.length) {
55
- const c = pattern[i];
56
- if (c === '*' && pattern[i+1] === '*') {
57
- re += '.*'; i += 2;
58
- if (pattern[i] === '/') i++;
59
- } else if (c === '*') {
60
- re += '[^/]*'; i++;
61
- } else if (c === '?') {
62
- re += '[^/]'; i++;
63
- } else if (c === '[') {
64
- const end = pattern.indexOf(']', i);
65
- if (end > i) { re += pattern.slice(i, end + 1); i = end + 1; }
66
- else { re += '\\\\['; i++; }
67
- } else if (c === '{') {
68
- const end = pattern.indexOf('}', i);
69
- if (end > i) {
70
- const alts = pattern.slice(i + 1, end).split(',').map(a => a.trim());
71
- re += '(?:' + alts.join('|') + ')'; i = end + 1;
72
- } else { re += '\\\\{'; i++; }
73
- } else if ('.+^$|()'.includes(c)) {
74
- re += '\\\\' + c; i++;
75
- } else {
76
- re += c; i++;
77
- }
78
- }
79
- return new RegExp('^' + re + '$');
80
- }
81
- function matchGlob(str, pattern) {
82
- return globToRegex(pattern).test(str);
83
- }
84
-
85
- // Check banned file patterns
86
- for (const p of (banned.files || [])) {
87
- if (matchGlob(basename, p)) {
88
- console.log('banned_file:' + p);
89
- process.exit(0);
90
- }
91
- }
92
-
93
- // Check banned doc patterns
94
- for (const p of (banned.docs || [])) {
95
- if (matchGlob(basename, p)) {
96
- console.log('banned_doc:' + p);
97
- process.exit(0);
98
- }
99
- }
100
-
101
- // Check banned directory patterns
102
- const parts = filePath.split('/');
103
- for (const part of parts) {
104
- for (const p of (banned.directories || [])) {
105
- if (matchGlob(part, p)) {
106
- console.log('banned_dir:' + p + ':' + part);
107
- process.exit(0);
108
- }
109
- }
110
- }
111
-
112
- console.log('ok');
113
- } catch (error) {
114
- console.log('error:' + error.message);
115
- }
116
- " 2>&1)
117
-
118
- if [[ "$SPRAWL_CHECK" == banned_file:* ]]; then
119
- PATTERN="${SPRAWL_CHECK#banned_file:}"
120
- echo "BLOCKED: File name matches banned sprawl pattern: $PATTERN" >&2
121
- echo "File: $REL_PATH" >&2
122
- echo "Banned patterns prevent shadow files like *-enhanced.*, *-final.*, *-v2.*, *-copy.*" >&2
123
- echo "Instead, modify the original file directly." >&2
124
- exit 2
125
- fi
126
-
127
- if [[ "$SPRAWL_CHECK" == banned_doc:* ]]; then
128
- PATTERN="${SPRAWL_CHECK#banned_doc:}"
129
- echo "BLOCKED: Doc file matches banned sprawl pattern: $PATTERN" >&2
130
- echo "File: $REL_PATH" >&2
131
- echo "Avoid creating many summary/recap/plan files. Update existing documentation instead." >&2
132
- exit 2
133
- fi
134
-
135
- if [[ "$SPRAWL_CHECK" == banned_dir:* ]]; then
136
- IFS=':' read -r _ PATTERN DIR_NAME <<< "$SPRAWL_CHECK"
137
- echo "BLOCKED: Directory matches banned pattern: $PATTERN (directory: $DIR_NAME)" >&2
138
- echo "File: $REL_PATH" >&2
139
- echo "Use the designated venv path instead of creating new virtual environments." >&2
140
- exit 2
141
- fi
142
- fi
143
-
144
- # Allow the operation
145
- exit 0
@@ -1,100 +0,0 @@
1
- #!/bin/bash
2
- # CAWS Naming Convention Check Hook for Claude Code
3
- # Validates file naming against CAWS conventions
4
- # @author @darianrosebrook
5
-
6
- set -euo pipefail
7
-
8
- # Read JSON input from Claude Code
9
- INPUT=$(cat)
10
-
11
- # Extract file path from PostToolUse input
12
- FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
13
- TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
14
-
15
- # Only check Write tool (new files)
16
- if [[ "$TOOL_NAME" != "Write" ]]; then
17
- exit 0
18
- fi
19
-
20
- if [[ -z "$FILE_PATH" ]]; then
21
- exit 0
22
- fi
23
-
24
- # Get filename
25
- FILENAME=$(basename "$FILE_PATH")
26
-
27
- # Banned modifiers that indicate incomplete/temporary naming
28
- BANNED_MODIFIERS=(
29
- "enhanced"
30
- "unified"
31
- "simplified"
32
- "better"
33
- "new"
34
- "next"
35
- "final"
36
- "copy"
37
- "revamp"
38
- "improved"
39
- "alt"
40
- "tmp"
41
- "scratch"
42
- "wip"
43
- "test-"
44
- "-test"
45
- "_test"
46
- "temp"
47
- "old"
48
- "backup"
49
- )
50
-
51
- # Convert filename to lowercase for checking
52
- FILENAME_LOWER=$(echo "$FILENAME" | tr '[:upper:]' '[:lower:]')
53
-
54
- # Check for banned modifiers (word-boundary aware)
55
- for modifier in "${BANNED_MODIFIERS[@]}"; do
56
- # Match modifier preceded by start-of-string, hyphen, underscore, or dot
57
- # and followed by end-of-string, hyphen, underscore, or dot
58
- # Prevents false positives like "old" in "gold_oracle" or "new" in "renewable"
59
- if [[ "$FILENAME_LOWER" =~ (^|[-_.])"$modifier"([-_.]|$) ]]; then
60
- # Special case: allow test files that follow conventions
61
- if [[ "$modifier" == "test-" ]] || [[ "$modifier" == "-test" ]] || [[ "$modifier" == "_test" ]]; then
62
- if [[ "$FILENAME_LOWER" =~ \.(test|spec)\.(js|ts|jsx|tsx|py|go|rs)$ ]]; then
63
- continue
64
- fi
65
- fi
66
-
67
- echo '{
68
- "hookSpecificOutput": {
69
- "hookEventName": "PostToolUse",
70
- "additionalContext": "Warning: The filename '\'''"$FILENAME"''\'' contains the modifier '\'''"$modifier"''\'' which may indicate temporary or non-canonical naming. Consider using a more descriptive, permanent name. See CAWS naming conventions in .caws/canonical-map.yaml or run '\''caws naming check'\''."
71
- }
72
- }'
73
- exit 0
74
- fi
75
- done
76
-
77
- # Check for version suffixes (e.g., file-v2.js, file_v3.ts)
78
- if [[ "$FILENAME_LOWER" =~ [-_]v[0-9]+\. ]]; then
79
- echo '{
80
- "hookSpecificOutput": {
81
- "hookEventName": "PostToolUse",
82
- "additionalContext": "Warning: The filename '\'''"$FILENAME"''\'' contains a version suffix. Version control should be handled by git, not file names. Consider removing the version suffix."
83
- }
84
- }'
85
- exit 0
86
- fi
87
-
88
- # Check for date stamps (e.g., file-2024-01-15.js)
89
- if [[ "$FILENAME_LOWER" =~ [0-9]{4}[-_][0-9]{2}[-_][0-9]{2} ]]; then
90
- echo '{
91
- "hookSpecificOutput": {
92
- "hookEventName": "PostToolUse",
93
- "additionalContext": "Warning: The filename '\'''"$FILENAME"''\'' contains a date stamp. Version control should be handled by git, not file names. Consider removing the date."
94
- }
95
- }'
96
- exit 0
97
- fi
98
-
99
- # File naming is OK
100
- exit 0
@@ -1,39 +0,0 @@
1
- #!/bin/bash
2
- # CAWS Protected Paths Guard for Claude Code
3
- # Blocks direct Write/Edit access to guard code and guard state.
4
- # @author @darianrosebrook
5
-
6
- set -euo pipefail
7
-
8
- INPUT=$(cat)
9
-
10
- TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
11
- FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
12
-
13
- case "$TOOL_NAME" in
14
- Write|Edit) ;;
15
- *) exit 0 ;;
16
- esac
17
-
18
- if [[ -z "$FILE_PATH" ]]; then
19
- exit 0
20
- fi
21
-
22
- # If you are reading this because a write was blocked, do not edit hook files or
23
- # strike-state files to bypass a guard. Switch into the correct worktree, fix the
24
- # active spec scope, or ask the user if the guard itself is wrong.
25
- case "$FILE_PATH" in
26
- */.claude/hooks/*)
27
- echo "BLOCKED: $FILE_PATH is protected." >&2
28
- echo "Ask the user for permission before editing Claude hook scripts." >&2
29
- exit 1
30
- ;;
31
- */.claude/logs/guard-strikes-*.json)
32
- echo "BLOCKED: $FILE_PATH is protected guard state." >&2
33
- echo "Do not reset or edit strike counters to bypass enforcement." >&2
34
- echo "Switch into the correct worktree, update the active CAWS spec scope, or ask the user for direction instead." >&2
35
- exit 2
36
- ;;
37
- esac
38
-
39
- exit 0
@@ -1,81 +0,0 @@
1
- #!/bin/bash
2
- # CAWS Quality Check Hook for Claude Code
3
- # Runs CAWS quality validation after file edits
4
- # @author @darianrosebrook
5
-
6
- set -euo pipefail
7
-
8
- # Read JSON input from Claude Code
9
- INPUT=$(cat)
10
-
11
- # Extract file info from PostToolUse input
12
- FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
13
- TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
14
-
15
- # Only run on Write/Edit of source files
16
- if [[ "$TOOL_NAME" != "Write" ]] && [[ "$TOOL_NAME" != "Edit" ]]; then
17
- exit 0
18
- fi
19
-
20
- # Skip non-source files and node_modules/dist
21
- if [[ ! "$FILE_PATH" =~ \.(js|ts|jsx|tsx|py|go|rs|java|mjs|cjs)$ ]] || \
22
- [[ "$FILE_PATH" =~ node_modules ]] || \
23
- [[ "$FILE_PATH" =~ dist/ ]] || \
24
- [[ "$FILE_PATH" =~ build/ ]]; then
25
- exit 0
26
- fi
27
-
28
- # Determine project directory
29
- PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
30
-
31
- # Check if we're in a CAWS project
32
- if [[ ! -f "$PROJECT_DIR/.caws/working-spec.yaml" ]] && [[ ! -d "$PROJECT_DIR/.caws/specs" ]]; then
33
- exit 0
34
- fi
35
-
36
- # Check if CAWS CLI is available
37
- if ! command -v caws &> /dev/null; then
38
- echo '{
39
- "hookSpecificOutput": {
40
- "hookEventName": "PostToolUse",
41
- "additionalContext": "CAWS CLI not available. Consider installing with: npm install -g @paths.design/caws-cli"
42
- }
43
- }'
44
- exit 0
45
- fi
46
-
47
- # Run quality gates via the unified pipeline
48
- RESULT=$(caws gates run --context=edit --file "$FILE_PATH" --json --quiet 2>&1) || GATE_EXIT=$?
49
-
50
- if [ -z "$RESULT" ]; then
51
- # No output — gates command not available or errored
52
- echo '{
53
- "hookSpecificOutput": {
54
- "hookEventName": "PostToolUse",
55
- "additionalContext": "Quality gates did not produce output (exit '"${GATE_EXIT:-0}"'). Run '\''caws gates run'\'' for details."
56
- }
57
- }'
58
- exit 0
59
- fi
60
-
61
- # Check if gates passed
62
- PASSED=$(echo "$RESULT" | jq -r '.passed // true' 2>/dev/null)
63
-
64
- if [ "$PASSED" = "true" ]; then
65
- echo '{
66
- "hookSpecificOutput": {
67
- "hookEventName": "PostToolUse",
68
- "additionalContext": "Quality gates passed for this change."
69
- }
70
- }'
71
- else
72
- # Extract top 3 gate failure messages
73
- VIOLATIONS=$(echo "$RESULT" | jq -r '[.gates[] | select(.status == "fail") | "- \(.name): \(.messages[0] // "failed")"] | .[0:3] | .[]' 2>/dev/null || echo "Run 'caws gates run' for details")
74
-
75
- echo '{
76
- "decision": "block",
77
- "reason": "Quality gate violations detected. Please address the following issues before continuing:\n'"$VIOLATIONS"'\n\nRun '\''caws gates run'\'' for full details."
78
- }'
79
- fi
80
-
81
- exit 0
@@ -1,85 +0,0 @@
1
- #!/bin/bash
2
- # CAWS Secret Scanner for Claude Code
3
- # Warns when reading files that may contain secrets
4
- # @author @darianrosebrook
5
-
6
- set -euo pipefail
7
-
8
- # Read JSON input from Claude Code
9
- INPUT=$(cat)
10
-
11
- # Extract file path
12
- FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')
13
-
14
- if [[ -z "$FILE_PATH" ]]; then
15
- exit 0
16
- fi
17
-
18
- # Get just the filename for pattern matching
19
- FILENAME=$(basename "$FILE_PATH")
20
-
21
- # Files that commonly contain secrets
22
- SECRET_FILE_PATTERNS=(
23
- '.env'
24
- '.env.local'
25
- '.env.production'
26
- '.env.development'
27
- '.env.*'
28
- 'credentials.json'
29
- 'service-account.json'
30
- 'secrets.yaml'
31
- 'secrets.yml'
32
- 'secrets.json'
33
- '.netrc'
34
- '.npmrc'
35
- '.pypirc'
36
- 'id_rsa'
37
- 'id_ed25519'
38
- 'id_ecdsa'
39
- '*.pem'
40
- '*.key'
41
- '*.p12'
42
- '*.pfx'
43
- 'htpasswd'
44
- 'shadow'
45
- )
46
-
47
- # Directories that commonly contain secrets
48
- SECRET_DIRS=(
49
- '.ssh'
50
- '.aws'
51
- '.azure'
52
- '.gcloud'
53
- '.kube'
54
- '.gnupg'
55
- )
56
-
57
- # Check if file matches secret patterns
58
- for pattern in "${SECRET_FILE_PATTERNS[@]}"; do
59
- if [[ "$FILENAME" == $pattern ]]; then
60
- # Output JSON with warning for Claude
61
- echo '{
62
- "hookSpecificOutput": {
63
- "hookEventName": "PreToolUse",
64
- "additionalContext": "WARNING: This file may contain secrets. Do not include sensitive values in your response. If you need to reference credentials, use placeholders like <API_KEY> instead of actual values."
65
- }
66
- }'
67
- exit 0
68
- fi
69
- done
70
-
71
- # Check if file is in a sensitive directory
72
- for dir in "${SECRET_DIRS[@]}"; do
73
- if [[ "$FILE_PATH" == *"/$dir/"* ]] || [[ "$FILE_PATH" == *"/$dir" ]]; then
74
- echo '{
75
- "hookSpecificOutput": {
76
- "hookEventName": "PreToolUse",
77
- "additionalContext": "WARNING: This file is in a sensitive directory that may contain secrets. Do not include any sensitive values in your response."
78
- }
79
- }'
80
- exit 0
81
- fi
82
- done
83
-
84
- # Allow the read
85
- exit 0