@paths.design/caws-cli 10.1.0 → 11.0.0

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