@paths.design/caws-cli 10.2.0 → 11.0.0

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