@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disposition.js","sourceRoot":"","sources":["../../../src/shell/gates/disposition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type Result } from '@paths.design/caws-kernel';
2
+ export interface GatesViolation {
3
+ /** The gate that detected this violation. May be any string. */
4
+ readonly gate: string;
5
+ /** Optional violation type id (e.g. 'banned_modifier', 'timeout'). */
6
+ readonly type?: string;
7
+ readonly message?: string;
8
+ readonly file?: string;
9
+ readonly line?: number;
10
+ readonly rule?: string;
11
+ /** Subprocess-reported severity. NOT trusted for blocking — policy decides. */
12
+ readonly severity?: string;
13
+ }
14
+ export interface GatesWarning {
15
+ readonly gate?: string;
16
+ readonly type?: string;
17
+ readonly message?: string;
18
+ }
19
+ export interface GatesReport {
20
+ readonly timestamp: string;
21
+ readonly context: string;
22
+ readonly files_scoped: number;
23
+ readonly warnings: readonly GatesWarning[];
24
+ readonly violations: readonly GatesViolation[];
25
+ readonly waivers?: {
26
+ readonly active: number;
27
+ readonly applied: number;
28
+ };
29
+ readonly performance?: {
30
+ readonly total_execution_time_ms?: number;
31
+ };
32
+ }
33
+ /**
34
+ * Parse + validate the subprocess JSON. Returns Ok(GatesReport) only when
35
+ * EVERY required field is present and well-typed. Returns Err with a
36
+ * specific shell.gates.* rule otherwise. Never throws on bad input.
37
+ */
38
+ export declare function validateGatesReport(raw: string): Result<GatesReport>;
39
+ //# sourceMappingURL=gate-result-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-result-contract.d.ts","sourceRoot":"","sources":["../../../src/shell/gates/gate-result-contract.ts"],"names":[],"mappings":"AAwBA,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAIlF,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAC3C,CAAC;CACH;AAiED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CA0GpE"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ // Runtime validator for `caws-quality-gates --json` output.
3
+ //
4
+ // The subprocess emits a SINGLE aggregated JSON payload describing the full
5
+ // gate run. We do NOT trust the shape — TypeScript types do not survive
6
+ // `JSON.parse`. The validator below enforces the minimal contract the
7
+ // vNext command needs to make a policy-derived decision.
8
+ //
9
+ // Accepted shape (narrowed; the real payload may carry more fields, which
10
+ // we ignore):
11
+ //
12
+ // {
13
+ // timestamp: string (ISO-8601)
14
+ // context: string (e.g. 'cli', 'commit', 'ci')
15
+ // files_scoped: number
16
+ // warnings: Array<{ gate?: string; ... }>
17
+ // violations: Array<{ gate: string; ... }>
18
+ // waivers?: { active: number; applied: number; details: ... }
19
+ // performance?: { total_execution_time_ms?: number; ... }
20
+ // }
21
+ //
22
+ // Anything else is rejected. The contract is intentionally tighter than the
23
+ // subprocess's actual payload — the command should only consume fields it
24
+ // has validated.
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.validateGatesReport = validateGatesReport;
27
+ const caws_kernel_1 = require("@paths.design/caws-kernel");
28
+ const rules_1 = require("../rules");
29
+ function diag(rule, message, data) {
30
+ const base = {
31
+ rule,
32
+ authority: 'kernel/diagnostics',
33
+ severity: 'error',
34
+ message,
35
+ };
36
+ return data !== undefined ? { ...base, data } : base;
37
+ }
38
+ function isObject(v) {
39
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
40
+ }
41
+ function validateViolation(value, idx) {
42
+ if (!isObject(value)) {
43
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, `violations[${idx}] is not an object.`, { index: idx }));
44
+ }
45
+ if (typeof value['gate'] !== 'string' || value['gate'].length === 0) {
46
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, `violations[${idx}] is missing required string field 'gate'.`, { index: idx }));
47
+ }
48
+ const out = { gate: value['gate'] };
49
+ if (typeof value['type'] === 'string')
50
+ out.type = value['type'];
51
+ if (typeof value['message'] === 'string')
52
+ out.message = value['message'];
53
+ if (typeof value['file'] === 'string')
54
+ out.file = value['file'];
55
+ if (typeof value['line'] === 'number')
56
+ out.line = value['line'];
57
+ if (typeof value['rule'] === 'string')
58
+ out.rule = value['rule'];
59
+ if (typeof value['severity'] === 'string')
60
+ out.severity = value['severity'];
61
+ return (0, caws_kernel_1.ok)(out);
62
+ }
63
+ function validateWarning(value, idx) {
64
+ if (!isObject(value)) {
65
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, `warnings[${idx}] is not an object.`, { index: idx }));
66
+ }
67
+ const out = {};
68
+ if (typeof value['gate'] === 'string')
69
+ out.gate = value['gate'];
70
+ if (typeof value['type'] === 'string')
71
+ out.type = value['type'];
72
+ if (typeof value['message'] === 'string')
73
+ out.message = value['message'];
74
+ return (0, caws_kernel_1.ok)(out);
75
+ }
76
+ /**
77
+ * Parse + validate the subprocess JSON. Returns Ok(GatesReport) only when
78
+ * EVERY required field is present and well-typed. Returns Err with a
79
+ * specific shell.gates.* rule otherwise. Never throws on bad input.
80
+ */
81
+ function validateGatesReport(raw) {
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(raw);
85
+ }
86
+ catch (e) {
87
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_NOT_JSON, `quality-gates output is not valid JSON: ${e.message}`));
88
+ }
89
+ if (!isObject(parsed)) {
90
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output is not a JSON object.'));
91
+ }
92
+ if (typeof parsed['timestamp'] !== 'string') {
93
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required string field `timestamp`.'));
94
+ }
95
+ if (typeof parsed['context'] !== 'string') {
96
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required string field `context`.'));
97
+ }
98
+ if (typeof parsed['files_scoped'] !== 'number') {
99
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required number field `files_scoped`.'));
100
+ }
101
+ const rawViolations = parsed['violations'];
102
+ if (!Array.isArray(rawViolations)) {
103
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required array field `violations`.'));
104
+ }
105
+ const violations = [];
106
+ for (let i = 0; i < rawViolations.length; i++) {
107
+ const r = validateViolation(rawViolations[i], i);
108
+ if (!r.ok)
109
+ return r;
110
+ violations.push(r.value);
111
+ }
112
+ const rawWarnings = parsed['warnings'];
113
+ if (!Array.isArray(rawWarnings)) {
114
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_REPORT_INVALID_SHAPE, 'quality-gates output missing required array field `warnings`.'));
115
+ }
116
+ const warnings = [];
117
+ for (let i = 0; i < rawWarnings.length; i++) {
118
+ const r = validateWarning(rawWarnings[i], i);
119
+ if (!r.ok)
120
+ return r;
121
+ warnings.push(r.value);
122
+ }
123
+ const out = {
124
+ timestamp: parsed['timestamp'],
125
+ context: parsed['context'],
126
+ files_scoped: parsed['files_scoped'],
127
+ warnings,
128
+ violations,
129
+ };
130
+ // Optional fields — defensive: accept if shaped right, ignore otherwise.
131
+ if (isObject(parsed['waivers'])) {
132
+ const w = parsed['waivers'];
133
+ if (typeof w['active'] === 'number' && typeof w['applied'] === 'number') {
134
+ out.waivers = {
135
+ active: w['active'],
136
+ applied: w['applied'],
137
+ };
138
+ }
139
+ }
140
+ if (isObject(parsed['performance'])) {
141
+ const p = parsed['performance'];
142
+ if (typeof p['total_execution_time_ms'] === 'number') {
143
+ out.performance = {
144
+ total_execution_time_ms: p['total_execution_time_ms'],
145
+ };
146
+ }
147
+ }
148
+ return (0, caws_kernel_1.ok)(out);
149
+ }
150
+ //# sourceMappingURL=gate-result-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-result-contract.js","sourceRoot":"","sources":["../../../src/shell/gates/gate-result-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type Result } from '@paths.design/caws-kernel';
2
+ import { type GatesReport } from './gate-result-contract';
3
+ /**
4
+ * Pure resolver: given the CLI install directory and the consumer project
5
+ * cwd, decide which on-disk path to spawn. Walks up from each starting
6
+ * point looking for `node_modules/.bin/<BIN_NAME>`.
7
+ *
8
+ * Resolution order (documented per CLI-GATES-003 A4):
9
+ * 1. CLI-install-local — walk up from cliDir. This wins when caws-cli is
10
+ * installed globally or in a separate sandbox: caws-quality-gates
11
+ * ships as a runtime dep of caws-cli, so it lives beside the caws
12
+ * binary, not beside the consumer project.
13
+ * 2. Project-local — walk up from projectCwd. Preserves the prior
14
+ * behavior for the project-local install pattern (CLI-GATES-002 A1).
15
+ *
16
+ * The CLI-install-local check wins when both exist. That ordering is by
17
+ * design: a global caws install was a deliberate choice to use one CLI
18
+ * version everywhere, and we want that single subprocess version too —
19
+ * not whatever happens to be in the consumer's node_modules from an older
20
+ * project-local install.
21
+ *
22
+ * Returns the resolved path on success, or { tried: string[] } so the
23
+ * adapter can surface both attempted paths in the GATES_SUBPROCESS_NOT_FOUND
24
+ * diagnostic.
25
+ */
26
+ export declare function resolveQualityGatesBin(cliDir: string, projectCwd: string, fsCheck?: (p: string) => boolean): {
27
+ resolved: string;
28
+ source: 'cli-local' | 'project-local';
29
+ } | {
30
+ tried: string[];
31
+ };
32
+ export interface SubprocessResult {
33
+ /** Exit code of the subprocess. */
34
+ readonly status: number | null;
35
+ /** stdout captured as UTF-8. */
36
+ readonly stdout: string;
37
+ /** stderr captured as UTF-8. */
38
+ readonly stderr: string;
39
+ /** Any error thrown by the spawn itself (ENOENT, etc.). */
40
+ readonly error?: Error;
41
+ }
42
+ export interface QualityGatesRunnerInput {
43
+ readonly cwd: string;
44
+ /** Extra CLI args after `--json` (e.g. ['--context=cli', '--quiet']). */
45
+ readonly args: readonly string[];
46
+ }
47
+ export type QualityGatesRunner = (input: QualityGatesRunnerInput) => SubprocessResult;
48
+ export interface RunQualityGatesOptions {
49
+ readonly cwd: string;
50
+ readonly args?: readonly string[];
51
+ /** Inject a custom runner. Tests use this; production omits. */
52
+ readonly runner?: QualityGatesRunner;
53
+ }
54
+ export declare function runQualityGates(opts: RunQualityGatesOptions): Result<GatesReport>;
55
+ //# sourceMappingURL=quality-gates-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-gates-adapter.d.ts","sourceRoot":"","sources":["../../../src/shell/gates/quality-gates-adapter.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGlF,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI/E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAuB,GAC9C;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAmBnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,gBAAgB,CAAC;AAgDtF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAAC,WAAW,CAAC,CAqCjF"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ // Adapter for the `caws-quality-gates` subprocess.
3
+ //
4
+ // Single responsibility: invoke the subprocess in `--json` mode, capture
5
+ // stdout, validate the JSON shape against `gate-result-contract`, and
6
+ // return Ok(GatesReport) or Err(diagnostic).
7
+ //
8
+ // What this adapter does NOT do:
9
+ // - it does not interpret violations
10
+ // - it does not decide pass/fail/skip
11
+ // - it does not append events
12
+ // - it does not write to any file
13
+ //
14
+ // The runner is pluggable so tests can inject canned JSON without spawning
15
+ // real subprocesses. Production uses a default child_process runner.
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.resolveQualityGatesBin = resolveQualityGatesBin;
51
+ exports.runQualityGates = runQualityGates;
52
+ const fs = __importStar(require("node:fs"));
53
+ const path = __importStar(require("node:path"));
54
+ const node_child_process_1 = require("node:child_process");
55
+ const caws_kernel_1 = require("@paths.design/caws-kernel");
56
+ const rules_1 = require("../rules");
57
+ const gate_result_contract_1 = require("./gate-result-contract");
58
+ const BIN_NAME = 'caws-quality-gates';
59
+ /**
60
+ * Pure resolver: given the CLI install directory and the consumer project
61
+ * cwd, decide which on-disk path to spawn. Walks up from each starting
62
+ * point looking for `node_modules/.bin/<BIN_NAME>`.
63
+ *
64
+ * Resolution order (documented per CLI-GATES-003 A4):
65
+ * 1. CLI-install-local — walk up from cliDir. This wins when caws-cli is
66
+ * installed globally or in a separate sandbox: caws-quality-gates
67
+ * ships as a runtime dep of caws-cli, so it lives beside the caws
68
+ * binary, not beside the consumer project.
69
+ * 2. Project-local — walk up from projectCwd. Preserves the prior
70
+ * behavior for the project-local install pattern (CLI-GATES-002 A1).
71
+ *
72
+ * The CLI-install-local check wins when both exist. That ordering is by
73
+ * design: a global caws install was a deliberate choice to use one CLI
74
+ * version everywhere, and we want that single subprocess version too —
75
+ * not whatever happens to be in the consumer's node_modules from an older
76
+ * project-local install.
77
+ *
78
+ * Returns the resolved path on success, or { tried: string[] } so the
79
+ * adapter can surface both attempted paths in the GATES_SUBPROCESS_NOT_FOUND
80
+ * diagnostic.
81
+ */
82
+ function resolveQualityGatesBin(cliDir, projectCwd, fsCheck = fs.existsSync) {
83
+ const tried = [];
84
+ for (const [source, start] of [
85
+ ['cli-local', cliDir],
86
+ ['project-local', projectCwd],
87
+ ]) {
88
+ let dir = path.resolve(start);
89
+ while (true) {
90
+ const candidate = path.join(dir, 'node_modules', '.bin', BIN_NAME);
91
+ tried.push(candidate);
92
+ if (fsCheck(candidate)) {
93
+ return { resolved: candidate, source };
94
+ }
95
+ const parent = path.dirname(dir);
96
+ if (parent === dir)
97
+ break;
98
+ dir = parent;
99
+ }
100
+ }
101
+ return { tried };
102
+ }
103
+ function diag(rule, message, data) {
104
+ const base = {
105
+ rule,
106
+ authority: 'kernel/diagnostics',
107
+ severity: 'error',
108
+ message,
109
+ };
110
+ return data !== undefined ? { ...base, data } : base;
111
+ }
112
+ function defaultRunner(input) {
113
+ // CLI-GATES-003: resolve the subprocess from the installed CLI package
114
+ // location first (covers global / sandboxed install), then fall back to
115
+ // the consumer project (covers project-local install — CLI-GATES-002 A1).
116
+ // No PATH fallback — explicit failure beats a hijacked binary.
117
+ //
118
+ // Spawn cwd stays as input.cwd (CLI-GATES-003 A3): the analyzed files
119
+ // come from the consumer project, never from the CLI's install dir.
120
+ const resolution = resolveQualityGatesBin(__dirname, input.cwd);
121
+ if ('tried' in resolution) {
122
+ return {
123
+ status: null,
124
+ stdout: '',
125
+ stderr: '',
126
+ error: Object.assign(new Error(`caws-quality-gates not found. Tried ${resolution.tried.length} location(s): ${resolution.tried.join(', ')}`), { code: 'ENOENT' }),
127
+ };
128
+ }
129
+ const r = (0, node_child_process_1.spawnSync)(resolution.resolved, ['--json', ...input.args], { cwd: input.cwd, encoding: 'utf8' });
130
+ const out = {
131
+ status: r.status,
132
+ stdout: typeof r.stdout === 'string' ? r.stdout : '',
133
+ stderr: typeof r.stderr === 'string' ? r.stderr : '',
134
+ ...(r.error !== undefined ? { error: r.error } : {}),
135
+ };
136
+ return out;
137
+ }
138
+ function runQualityGates(opts) {
139
+ const runner = opts.runner ?? defaultRunner;
140
+ const result = runner({ cwd: opts.cwd, args: opts.args ?? [] });
141
+ // Subprocess could not be spawned (ENOENT, permission, etc.).
142
+ if (result.error !== undefined) {
143
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_SUBPROCESS_NOT_FOUND, `Failed to spawn caws-quality-gates: ${result.error.message}`, { errno: result.error.code }));
144
+ }
145
+ // Nonzero exit is acceptable IF we still got valid JSON: violations
146
+ // routinely produce nonzero exit. We do NOT treat exit code as the
147
+ // disposition source — policy does. But if the subprocess didn't
148
+ // produce JSON at all, that's an integration failure.
149
+ if (result.stdout.trim().length === 0) {
150
+ return (0, caws_kernel_1.err)(diag(rules_1.SHELL_RULES.GATES_SUBPROCESS_FAILED, `caws-quality-gates produced no stdout (exit=${result.status}).`, {
151
+ exit: result.status,
152
+ stderr: result.stderr.slice(0, 4000),
153
+ }));
154
+ }
155
+ // Validate the JSON shape before trusting it. This is the contract gate.
156
+ const reportResult = (0, gate_result_contract_1.validateGatesReport)(result.stdout);
157
+ if (!reportResult.ok)
158
+ return reportResult;
159
+ return (0, caws_kernel_1.ok)(reportResult.value);
160
+ }
161
+ //# sourceMappingURL=quality-gates-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-gates-adapter.js","sourceRoot":"","sources":["../../../src/shell/gates/quality-gates-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type Waiver } from '@paths.design/caws-kernel';
2
+ import type { GatesReport } from './gate-result-contract';
3
+ export interface WaiverFilterInput {
4
+ readonly report: GatesReport;
5
+ readonly waivers: readonly Waiver[];
6
+ readonly specId: string;
7
+ readonly now: Date;
8
+ /**
9
+ * Gate ids the policy declares. Violations targeting any other gate
10
+ * pass through the filter unmodified — waivers MUST NOT promote an
11
+ * unmatched (subprocess-only) violation to a policy-suppressed state,
12
+ * because policy doesn't own that gate. Treating waivers as scoped to
13
+ * policy-declared gates keeps the unmatched bucket purely
14
+ * observational, which is the contract `deriveDispositions` relies on.
15
+ *
16
+ * If omitted, every gate is considered policy-declared (legacy / test
17
+ * convenience). Production callers should always pass this.
18
+ */
19
+ readonly policyGateIds?: readonly string[];
20
+ }
21
+ export interface WaiverEvidence {
22
+ /** Number of violations on this gate that an effective waiver suppressed. */
23
+ readonly waived_count: number;
24
+ /** Stable ids of the waivers credited with the suppression, deduped + sorted. */
25
+ readonly waiver_ids: readonly string[];
26
+ }
27
+ export interface WaiverFilterResult {
28
+ /**
29
+ * The same report shape, but with `violations` reduced to those NOT
30
+ * suppressed by an effective waiver. `warnings`, `timestamp`,
31
+ * `context`, `files_scoped`, and the optional `waivers` / `performance`
32
+ * blocks are passed through unchanged.
33
+ */
34
+ readonly reportForDisposition: GatesReport;
35
+ /**
36
+ * Per-gate evidence keyed by the violation's `gate` field. Only gates
37
+ * that actually had at least one suppression appear here. Gates with
38
+ * zero suppressions are intentionally omitted: callers should default
39
+ * them to `{ waived_count: 0, waiver_ids: [] }` if they need a uniform
40
+ * shape, but the canonical form is "absent means zero".
41
+ */
42
+ readonly waivedByGate: Readonly<Record<string, WaiverEvidence>>;
43
+ }
44
+ /**
45
+ * Filter `report.violations` against the supplied effective waivers.
46
+ *
47
+ * For each violation:
48
+ * - look up the effective waivers for that violation's gate (kernel call)
49
+ * - if any are effective, the violation is suppressed and the waivers'
50
+ * ids are recorded as evidence on that gate's bucket
51
+ * - if none are effective, the violation passes through unchanged
52
+ *
53
+ * The kernel's effectiveness rule (active && not expired && gate matches
54
+ * && (no spec_id OR matches input.specId)) is the only applicability
55
+ * decision. Path scoping is not consulted (see file header).
56
+ */
57
+ export declare function filterWaivedViolations(input: WaiverFilterInput): WaiverFilterResult;
58
+ //# sourceMappingURL=waiver-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waiver-filter.d.ts","sourceRoot":"","sources":["../../../src/shell/gates/waiver-filter.ts"],"names":[],"mappings":"AAiCA,OAAO,EAEL,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,wBAAwB,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;CACjE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CAuEpB"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ // Waiver filter — shell-level helper that removes effective-waiver-suppressed
3
+ // violations from a GatesReport before disposition.
4
+ //
5
+ // Discipline:
6
+ //
7
+ // 1. This helper does NOT mutate `policy.gates[gate].mode`. A waived
8
+ // violation is removed from the blocking calculation, but the gate's
9
+ // block/warn/skip meaning still comes only from policy. After filtering,
10
+ // `deriveDispositions(filteredReport, policy)` is run unchanged.
11
+ //
12
+ // 2. Applicability is delegated to the kernel
13
+ // (`effectiveWaiversForGate`) so kernel rules stay the single source
14
+ // of truth. The shell only knows: "given the per-gate effective
15
+ // waivers, drop the violations that match this gate."
16
+ //
17
+ // 3. Path scoping (`scope.paths`) is intentionally absent. The kernel
18
+ // type does not include it. Doing it half-way here would be worse
19
+ // than deferring it to a later slice.
20
+ //
21
+ // 4. The "violation matched this gate" rule is the same as
22
+ // `deriveDispositions`'s grouping rule: violations whose `gate`
23
+ // field equals a gate in the waiver's `gates` list. We do NOT use
24
+ // the violation's `severity` field for matching — policy and waivers
25
+ // are both gate-level constructs in this slice; per-violation
26
+ // identity (e.g. by rule + subject) is not yet a thing waivers
27
+ // address.
28
+ //
29
+ // 5. Subprocess "unmatched" gates (gates the subprocess reports but
30
+ // policy doesn't declare) are never waiver-suppressed: waivers
31
+ // filter violations that policy can act on, and unmatched gates
32
+ // are observational by construction. Leaving them untouched here
33
+ // preserves the existing `unmatchedViolations` surface.
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.filterWaivedViolations = filterWaivedViolations;
36
+ const caws_kernel_1 = require("@paths.design/caws-kernel");
37
+ /**
38
+ * Filter `report.violations` against the supplied effective waivers.
39
+ *
40
+ * For each violation:
41
+ * - look up the effective waivers for that violation's gate (kernel call)
42
+ * - if any are effective, the violation is suppressed and the waivers'
43
+ * ids are recorded as evidence on that gate's bucket
44
+ * - if none are effective, the violation passes through unchanged
45
+ *
46
+ * The kernel's effectiveness rule (active && not expired && gate matches
47
+ * && (no spec_id OR matches input.specId)) is the only applicability
48
+ * decision. Path scoping is not consulted (see file header).
49
+ */
50
+ function filterWaivedViolations(input) {
51
+ // Per-gate effective waivers, computed lazily so we don't pay the cost
52
+ // for gates that have no violations in this report.
53
+ const effectiveByGate = new Map();
54
+ const policyGateSet = input.policyGateIds === undefined
55
+ ? undefined
56
+ : new Set(input.policyGateIds);
57
+ function effectiveFor(gate) {
58
+ // Waivers only touch policy-declared gates. An unmatched (subprocess-
59
+ // only) violation is observational by construction; letting waivers
60
+ // suppress it would break that contract and confuse the unmatched
61
+ // surface in `deriveDispositions`.
62
+ if (policyGateSet !== undefined && !policyGateSet.has(gate)) {
63
+ return [];
64
+ }
65
+ const cached = effectiveByGate.get(gate);
66
+ if (cached !== undefined)
67
+ return cached;
68
+ const computed = (0, caws_kernel_1.effectiveWaiversForGate)({
69
+ waivers: input.waivers,
70
+ gate,
71
+ specId: input.specId,
72
+ now: input.now,
73
+ });
74
+ effectiveByGate.set(gate, computed);
75
+ return computed;
76
+ }
77
+ const survivors = [];
78
+ const evidenceByGate = new Map();
79
+ for (const v of input.report.violations) {
80
+ const effective = effectiveFor(v.gate);
81
+ if (effective.length === 0) {
82
+ survivors.push(v);
83
+ continue;
84
+ }
85
+ // Suppressed. Credit every effective waiver — overlapping coverage is
86
+ // fine; the audit record names every authorized exception.
87
+ let bucket = evidenceByGate.get(v.gate);
88
+ if (bucket === undefined) {
89
+ bucket = new Set();
90
+ evidenceByGate.set(v.gate, bucket);
91
+ }
92
+ for (const w of effective)
93
+ bucket.add(w.id);
94
+ }
95
+ const waivedByGate = {};
96
+ for (const [gate, ids] of evidenceByGate) {
97
+ const sorted = Array.from(ids).sort();
98
+ // waived_count counts violations on this gate that were suppressed,
99
+ // not waivers credited. Recompute by re-walking; cheaper than carrying
100
+ // a parallel counter and keeps the meaning explicit.
101
+ let count = 0;
102
+ for (const v of input.report.violations) {
103
+ if (v.gate !== gate)
104
+ continue;
105
+ if (effectiveFor(v.gate).length > 0)
106
+ count++;
107
+ }
108
+ waivedByGate[gate] = {
109
+ waived_count: count,
110
+ waiver_ids: sorted,
111
+ };
112
+ }
113
+ const reportForDisposition = {
114
+ ...input.report,
115
+ violations: survivors,
116
+ };
117
+ return { reportForDisposition, waivedByGate };
118
+ }
119
+ //# sourceMappingURL=waiver-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waiver-filter.js","sourceRoot":"","sources":["../../../src/shell/gates/waiver-filter.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,oDAAoD;AACpD,EAAE;AACF,cAAc;AACd,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E,8EAA8E;AAC9E,sEAAsE;AACtE,EAAE;AACF,gDAAgD;AAChD,0EAA0E;AAC1E,qEAAqE;AACrE,2DAA2D;AAC3D,EAAE;AACF,wEAAwE;AACxE,uEAAuE;AACvE,2CAA2C;AAC3C,EAAE;AACF,6DAA6D;AAC7D,qEAAqE;AACrE,uEAAuE;AACvE,0EAA0E;AAC1E,mEAAmE;AACnE,oEAAoE;AACpE,gBAAgB;AAChB,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,qEAAqE;AACrE,sEAAsE;AACtE,6DAA6D;;AAkE7D,wDAyEC;AAzID,2DAGmC;AAgDnC;;;;;;;;;;;;GAYG;AACH,SAAgB,sBAAsB,CACpC,KAAwB;IAExB,uEAAuE;IACvE,oDAAoD;IACpD,MAAM,eAAe,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC7D,MAAM,aAAa,GACjB,KAAK,CAAC,aAAa,KAAK,SAAS;QAC/B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,GAAG,CAAS,KAAK,CAAC,aAAa,CAAC,CAAC;IAE3C,SAAS,YAAY,CAAC,IAAY;QAChC,sEAAsE;QACtE,oEAAoE;QACpE,kEAAkE;QAClE,mCAAmC;QACnC,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAA,qCAAuB,EAAC;YACvC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI;YACJ,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC,CAAC;QACH,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEtD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,sEAAsE;QACtE,2DAA2D;QAC3D,IAAI,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;YAC3B,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,YAAY,GAAmC,EAAE,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,oEAAoE;QACpE,uEAAuE;QACvE,qDAAqD;QACrD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACxC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;gBAAE,SAAS;YAC9B,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,EAAE,CAAC;QAC/C,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,GAAG;YACnB,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,MAAM;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAgB;QACxC,GAAG,KAAK,CAAC,MAAM;QACf,UAAU,EAAE,SAAS;KACtB,CAAC;IAEF,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAChD,CAAC"}