@paths.design/caws-cli 10.2.0 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/README.md +125 -374
  2. package/dist/index.js +45 -787
  3. package/dist/init/harness-detect.d.ts +18 -0
  4. package/dist/init/harness-detect.d.ts.map +1 -0
  5. package/dist/init/harness-detect.js +90 -0
  6. package/dist/init/harness-detect.js.map +1 -0
  7. package/dist/init/hook-install.d.ts +53 -0
  8. package/dist/init/hook-install.d.ts.map +1 -0
  9. package/dist/init/hook-install.js +421 -0
  10. package/dist/init/hook-install.js.map +1 -0
  11. package/dist/init/hook-packs/manifest-claude-code.d.ts +4 -0
  12. package/dist/init/hook-packs/manifest-claude-code.d.ts.map +1 -0
  13. package/dist/init/hook-packs/manifest-claude-code.js +190 -0
  14. package/dist/init/hook-packs/manifest-claude-code.js.map +1 -0
  15. package/dist/init/hook-packs/register.d.ts +19 -0
  16. package/dist/init/hook-packs/register.d.ts.map +1 -0
  17. package/dist/init/hook-packs/register.js +37 -0
  18. package/dist/init/hook-packs/register.js.map +1 -0
  19. package/dist/init/hook-packs/types.d.ts +123 -0
  20. package/dist/init/hook-packs/types.d.ts.map +1 -0
  21. package/dist/init/hook-packs/types.js +29 -0
  22. package/dist/init/hook-packs/types.js.map +1 -0
  23. package/dist/shell/binding/resolve-binding.d.ts +4 -0
  24. package/dist/shell/binding/resolve-binding.d.ts.map +1 -0
  25. package/dist/shell/binding/resolve-binding.js +228 -0
  26. package/dist/shell/binding/resolve-binding.js.map +1 -0
  27. package/dist/shell/binding/types.d.ts +42 -0
  28. package/dist/shell/binding/types.d.ts.map +1 -0
  29. package/dist/shell/binding/types.js +21 -0
  30. package/dist/shell/binding/types.js.map +1 -0
  31. package/dist/shell/commands/claim.d.ts +14 -0
  32. package/dist/shell/commands/claim.d.ts.map +1 -0
  33. package/dist/shell/commands/claim.js +197 -0
  34. package/dist/shell/commands/claim.js.map +1 -0
  35. package/dist/shell/commands/doctor.d.ts +13 -0
  36. package/dist/shell/commands/doctor.d.ts.map +1 -0
  37. package/dist/shell/commands/doctor.js +97 -0
  38. package/dist/shell/commands/doctor.js.map +1 -0
  39. package/dist/shell/commands/evidence.d.ts +28 -0
  40. package/dist/shell/commands/evidence.d.ts.map +1 -0
  41. package/dist/shell/commands/evidence.js +166 -0
  42. package/dist/shell/commands/evidence.js.map +1 -0
  43. package/dist/shell/commands/gates.d.ts +19 -0
  44. package/dist/shell/commands/gates.d.ts.map +1 -0
  45. package/dist/shell/commands/gates.js +208 -0
  46. package/dist/shell/commands/gates.js.map +1 -0
  47. package/dist/shell/commands/init.d.ts +17 -0
  48. package/dist/shell/commands/init.d.ts.map +1 -0
  49. package/dist/shell/commands/init.js +168 -0
  50. package/dist/shell/commands/init.js.map +1 -0
  51. package/dist/shell/commands/scope.d.ts +11 -0
  52. package/dist/shell/commands/scope.d.ts.map +1 -0
  53. package/dist/shell/commands/scope.js +92 -0
  54. package/dist/shell/commands/scope.js.map +1 -0
  55. package/dist/shell/commands/specs.d.ts +41 -0
  56. package/dist/shell/commands/specs.d.ts.map +1 -0
  57. package/dist/shell/commands/specs.js +264 -0
  58. package/dist/shell/commands/specs.js.map +1 -0
  59. package/dist/shell/commands/status.d.ts +15 -0
  60. package/dist/shell/commands/status.d.ts.map +1 -0
  61. package/dist/shell/commands/status.js +106 -0
  62. package/dist/shell/commands/status.js.map +1 -0
  63. package/dist/shell/commands/waiver.d.ts +38 -0
  64. package/dist/shell/commands/waiver.d.ts.map +1 -0
  65. package/dist/shell/commands/waiver.js +240 -0
  66. package/dist/shell/commands/waiver.js.map +1 -0
  67. package/dist/shell/commands/worktree.d.ts +38 -0
  68. package/dist/shell/commands/worktree.d.ts.map +1 -0
  69. package/dist/shell/commands/worktree.js +286 -0
  70. package/dist/shell/commands/worktree.js.map +1 -0
  71. package/dist/shell/gates/disposition.d.ts +23 -0
  72. package/dist/shell/gates/disposition.d.ts.map +1 -0
  73. package/dist/shell/gates/disposition.js +117 -0
  74. package/dist/shell/gates/disposition.js.map +1 -0
  75. package/dist/shell/gates/gate-result-contract.d.ts +39 -0
  76. package/dist/shell/gates/gate-result-contract.d.ts.map +1 -0
  77. package/dist/shell/gates/gate-result-contract.js +150 -0
  78. package/dist/shell/gates/gate-result-contract.js.map +1 -0
  79. package/dist/shell/gates/local-evaluators/budget-limit.d.ts +24 -0
  80. package/dist/shell/gates/local-evaluators/budget-limit.d.ts.map +1 -0
  81. package/dist/shell/gates/local-evaluators/budget-limit.js +67 -0
  82. package/dist/shell/gates/local-evaluators/budget-limit.js.map +1 -0
  83. package/dist/shell/gates/local-evaluators/diff-helpers.d.ts +25 -0
  84. package/dist/shell/gates/local-evaluators/diff-helpers.d.ts.map +1 -0
  85. package/dist/shell/gates/local-evaluators/diff-helpers.js +74 -0
  86. package/dist/shell/gates/local-evaluators/diff-helpers.js.map +1 -0
  87. package/dist/shell/gates/local-evaluators/index.d.ts +28 -0
  88. package/dist/shell/gates/local-evaluators/index.d.ts.map +1 -0
  89. package/dist/shell/gates/local-evaluators/index.js +67 -0
  90. package/dist/shell/gates/local-evaluators/index.js.map +1 -0
  91. package/dist/shell/gates/local-evaluators/scope-boundary.d.ts +23 -0
  92. package/dist/shell/gates/local-evaluators/scope-boundary.d.ts.map +1 -0
  93. package/dist/shell/gates/local-evaluators/scope-boundary.js +67 -0
  94. package/dist/shell/gates/local-evaluators/scope-boundary.js.map +1 -0
  95. package/dist/shell/gates/local-evaluators/spec-completeness.d.ts +12 -0
  96. package/dist/shell/gates/local-evaluators/spec-completeness.d.ts.map +1 -0
  97. package/dist/shell/gates/local-evaluators/spec-completeness.js +73 -0
  98. package/dist/shell/gates/local-evaluators/spec-completeness.js.map +1 -0
  99. package/dist/shell/gates/quality-gates-adapter.d.ts +55 -0
  100. package/dist/shell/gates/quality-gates-adapter.d.ts.map +1 -0
  101. package/dist/shell/gates/quality-gates-adapter.js +161 -0
  102. package/dist/shell/gates/quality-gates-adapter.js.map +1 -0
  103. package/dist/shell/gates/waiver-filter.d.ts +58 -0
  104. package/dist/shell/gates/waiver-filter.d.ts.map +1 -0
  105. package/dist/shell/gates/waiver-filter.js +119 -0
  106. package/dist/shell/gates/waiver-filter.js.map +1 -0
  107. package/dist/shell/index.d.ts +54 -0
  108. package/dist/shell/index.d.ts.map +1 -0
  109. package/dist/shell/index.js +85 -0
  110. package/dist/shell/index.js.map +1 -0
  111. package/dist/shell/register.d.ts +11 -0
  112. package/dist/shell/register.d.ts.map +1 -0
  113. package/dist/shell/register.js +464 -0
  114. package/dist/shell/register.js.map +1 -0
  115. package/dist/shell/render/claim.d.ts +22 -0
  116. package/dist/shell/render/claim.d.ts.map +1 -0
  117. package/dist/shell/render/claim.js +75 -0
  118. package/dist/shell/render/claim.js.map +1 -0
  119. package/dist/shell/render/decision.d.ts +15 -0
  120. package/dist/shell/render/decision.d.ts.map +1 -0
  121. package/dist/shell/render/decision.js +66 -0
  122. package/dist/shell/render/decision.js.map +1 -0
  123. package/dist/shell/render/diagnostic.d.ts +19 -0
  124. package/dist/shell/render/diagnostic.d.ts.map +1 -0
  125. package/dist/shell/render/diagnostic.js +76 -0
  126. package/dist/shell/render/diagnostic.js.map +1 -0
  127. package/dist/shell/render/finding.d.ts +15 -0
  128. package/dist/shell/render/finding.d.ts.map +1 -0
  129. package/dist/shell/render/finding.js +57 -0
  130. package/dist/shell/render/finding.js.map +1 -0
  131. package/dist/shell/render/gates.d.ts +3 -0
  132. package/dist/shell/render/gates.d.ts.map +1 -0
  133. package/dist/shell/render/gates.js +56 -0
  134. package/dist/shell/render/gates.js.map +1 -0
  135. package/dist/shell/render/init-hook-pack.d.ts +16 -0
  136. package/dist/shell/render/init-hook-pack.d.ts.map +1 -0
  137. package/dist/shell/render/init-hook-pack.js +206 -0
  138. package/dist/shell/render/init-hook-pack.js.map +1 -0
  139. package/dist/shell/render/init.d.ts +11 -0
  140. package/dist/shell/render/init.d.ts.map +1 -0
  141. package/dist/shell/render/init.js +32 -0
  142. package/dist/shell/render/init.js.map +1 -0
  143. package/dist/shell/render/status.d.ts +26 -0
  144. package/dist/shell/render/status.d.ts.map +1 -0
  145. package/dist/shell/render/status.js +143 -0
  146. package/dist/shell/render/status.js.map +1 -0
  147. package/dist/shell/render/waiver.d.ts +21 -0
  148. package/dist/shell/render/waiver.d.ts.map +1 -0
  149. package/dist/shell/render/waiver.js +94 -0
  150. package/dist/shell/render/waiver.js.map +1 -0
  151. package/dist/shell/rules.d.ts +37 -0
  152. package/dist/shell/rules.d.ts.map +1 -0
  153. package/dist/shell/rules.js +51 -0
  154. package/dist/shell/rules.js.map +1 -0
  155. package/dist/shell/session/actor.d.ts +14 -0
  156. package/dist/shell/session/actor.d.ts.map +1 -0
  157. package/dist/shell/session/actor.js +34 -0
  158. package/dist/shell/session/actor.js.map +1 -0
  159. package/dist/shell/session/resolve-session.d.ts +5 -0
  160. package/dist/shell/session/resolve-session.d.ts.map +1 -0
  161. package/dist/shell/session/resolve-session.js +239 -0
  162. package/dist/shell/session/resolve-session.js.map +1 -0
  163. package/dist/shell/session/types.d.ts +56 -0
  164. package/dist/shell/session/types.d.ts.map +1 -0
  165. package/dist/shell/session/types.js +15 -0
  166. package/dist/shell/session/types.js.map +1 -0
  167. package/dist/store/agents-store.d.ts +3 -0
  168. package/dist/store/agents-store.d.ts.map +1 -0
  169. package/dist/store/agents-store.js +63 -0
  170. package/dist/store/agents-store.js.map +1 -0
  171. package/dist/store/apply-patch.d.ts +16 -0
  172. package/dist/store/apply-patch.d.ts.map +1 -0
  173. package/dist/store/apply-patch.js +191 -0
  174. package/dist/store/apply-patch.js.map +1 -0
  175. package/dist/store/atomic-write.d.ts +34 -0
  176. package/dist/store/atomic-write.d.ts.map +1 -0
  177. package/dist/store/atomic-write.js +174 -0
  178. package/dist/store/atomic-write.js.map +1 -0
  179. package/dist/store/doctor-snapshot.d.ts +20 -0
  180. package/dist/store/doctor-snapshot.d.ts.map +1 -0
  181. package/dist/store/doctor-snapshot.js +176 -0
  182. package/dist/store/doctor-snapshot.js.map +1 -0
  183. package/dist/store/events-store.d.ts +33 -0
  184. package/dist/store/events-store.d.ts.map +1 -0
  185. package/dist/store/events-store.js +297 -0
  186. package/dist/store/events-store.js.map +1 -0
  187. package/dist/store/index.d.ts +21 -0
  188. package/dist/store/index.d.ts.map +1 -0
  189. package/dist/store/index.js +47 -0
  190. package/dist/store/index.js.map +1 -0
  191. package/dist/store/init-store.d.ts +21 -0
  192. package/dist/store/init-store.d.ts.map +1 -0
  193. package/dist/store/init-store.js +295 -0
  194. package/dist/store/init-store.js.map +1 -0
  195. package/dist/store/json-store.d.ts +3 -0
  196. package/dist/store/json-store.d.ts.map +1 -0
  197. package/dist/store/json-store.js +65 -0
  198. package/dist/store/json-store.js.map +1 -0
  199. package/dist/store/lifecycle-lock.d.ts +34 -0
  200. package/dist/store/lifecycle-lock.d.ts.map +1 -0
  201. package/dist/store/lifecycle-lock.js +168 -0
  202. package/dist/store/lifecycle-lock.js.map +1 -0
  203. package/dist/store/lifecycle-transaction.d.ts +79 -0
  204. package/dist/store/lifecycle-transaction.d.ts.map +1 -0
  205. package/dist/store/lifecycle-transaction.js +319 -0
  206. package/dist/store/lifecycle-transaction.js.map +1 -0
  207. package/dist/store/policy-store.d.ts +3 -0
  208. package/dist/store/policy-store.d.ts.map +1 -0
  209. package/dist/store/policy-store.js +65 -0
  210. package/dist/store/policy-store.js.map +1 -0
  211. package/dist/store/repo-root.d.ts +46 -0
  212. package/dist/store/repo-root.d.ts.map +1 -0
  213. package/dist/store/repo-root.js +145 -0
  214. package/dist/store/repo-root.js.map +1 -0
  215. package/dist/store/rules.d.ts +69 -0
  216. package/dist/store/rules.d.ts.map +1 -0
  217. package/dist/store/rules.js +95 -0
  218. package/dist/store/rules.js.map +1 -0
  219. package/dist/store/specs-store.d.ts +3 -0
  220. package/dist/store/specs-store.d.ts.map +1 -0
  221. package/dist/store/specs-store.js +131 -0
  222. package/dist/store/specs-store.js.map +1 -0
  223. package/dist/store/specs-writer.d.ts +61 -0
  224. package/dist/store/specs-writer.d.ts.map +1 -0
  225. package/dist/store/specs-writer.js +506 -0
  226. package/dist/store/specs-writer.js.map +1 -0
  227. package/dist/store/types.d.ts +84 -0
  228. package/dist/store/types.d.ts.map +1 -0
  229. package/dist/store/types.js +14 -0
  230. package/dist/store/types.js.map +1 -0
  231. package/dist/store/waivers-store.d.ts +25 -0
  232. package/dist/store/waivers-store.d.ts.map +1 -0
  233. package/dist/store/waivers-store.js +232 -0
  234. package/dist/store/waivers-store.js.map +1 -0
  235. package/dist/store/worktrees-store.d.ts +3 -0
  236. package/dist/store/worktrees-store.d.ts.map +1 -0
  237. package/dist/store/worktrees-store.js +62 -0
  238. package/dist/store/worktrees-store.js.map +1 -0
  239. package/dist/store/worktrees-writer.d.ts +77 -0
  240. package/dist/store/worktrees-writer.d.ts.map +1 -0
  241. package/dist/store/worktrees-writer.js +674 -0
  242. package/dist/store/worktrees-writer.js.map +1 -0
  243. package/dist/store/yaml-patch.d.ts +7 -0
  244. package/dist/store/yaml-patch.d.ts.map +1 -0
  245. package/dist/store/yaml-patch.js +250 -0
  246. package/dist/store/yaml-patch.js.map +1 -0
  247. package/dist/store/yaml-store.d.ts +9 -0
  248. package/dist/store/yaml-store.d.ts.map +1 -0
  249. package/dist/store/yaml-store.js +121 -0
  250. package/dist/store/yaml-store.js.map +1 -0
  251. package/package.json +15 -13
  252. package/dist/budget-derivation.js +0 -751
  253. package/dist/cicd-optimizer.js +0 -504
  254. package/dist/commands/agents.js +0 -124
  255. package/dist/commands/archive.js +0 -500
  256. package/dist/commands/burnup.js +0 -198
  257. package/dist/commands/diagnose.js +0 -525
  258. package/dist/commands/evaluate.js +0 -314
  259. package/dist/commands/gates.js +0 -149
  260. package/dist/commands/init.js +0 -857
  261. package/dist/commands/iterate.js +0 -417
  262. package/dist/commands/mode.js +0 -269
  263. package/dist/commands/parallel.js +0 -242
  264. package/dist/commands/plan.js +0 -438
  265. package/dist/commands/provenance.js +0 -1143
  266. package/dist/commands/quality-monitor.js +0 -284
  267. package/dist/commands/scope.js +0 -264
  268. package/dist/commands/session.js +0 -312
  269. package/dist/commands/sidecar.js +0 -74
  270. package/dist/commands/specs.js +0 -1656
  271. package/dist/commands/status.js +0 -1172
  272. package/dist/commands/templates.js +0 -237
  273. package/dist/commands/tool.js +0 -136
  274. package/dist/commands/tutorial.js +0 -480
  275. package/dist/commands/validate.js +0 -357
  276. package/dist/commands/verify-acs.js +0 -443
  277. package/dist/commands/waivers.js +0 -599
  278. package/dist/commands/workflow.js +0 -243
  279. package/dist/commands/worktree.js +0 -502
  280. package/dist/config/lite-scope.js +0 -158
  281. package/dist/config/modes.js +0 -347
  282. package/dist/constants/spec-types.js +0 -65
  283. package/dist/gates/budget-limit.js +0 -121
  284. package/dist/gates/feedback.js +0 -260
  285. package/dist/gates/format.js +0 -179
  286. package/dist/gates/god-object.js +0 -117
  287. package/dist/gates/pipeline.js +0 -167
  288. package/dist/gates/scope-boundary.js +0 -112
  289. package/dist/gates/spec-completeness.js +0 -109
  290. package/dist/gates/todo-detection.js +0 -205
  291. package/dist/generators/jest-config-generator.js +0 -242
  292. package/dist/generators/working-spec.js +0 -237
  293. package/dist/minimal-cli.js +0 -88
  294. package/dist/parallel/parallel-manager.js +0 -433
  295. package/dist/policy/PolicyManager.js +0 -470
  296. package/dist/scaffold/claude-hooks.js +0 -443
  297. package/dist/scaffold/cursor-hooks.js +0 -177
  298. package/dist/scaffold/git-hooks.js +0 -928
  299. package/dist/scaffold/index.js +0 -794
  300. package/dist/session/session-manager.js +0 -653
  301. package/dist/sidecars/index.js +0 -33
  302. package/dist/sidecars/listeners.js +0 -40
  303. package/dist/sidecars/provenance-summary.js +0 -238
  304. package/dist/sidecars/quality-gaps.js +0 -258
  305. package/dist/sidecars/schema.js +0 -149
  306. package/dist/sidecars/spec-drift.js +0 -151
  307. package/dist/sidecars/waiver-draft.js +0 -176
  308. package/dist/spec/SpecFileManager.js +0 -419
  309. package/dist/templates/.caws/schemas/policy.schema.json +0 -117
  310. package/dist/templates/.caws/schemas/scope.schema.json +0 -52
  311. package/dist/templates/.caws/schemas/waivers.schema.json +0 -106
  312. package/dist/templates/.caws/schemas/working-spec.schema.json +0 -340
  313. package/dist/templates/.caws/schemas/worktrees.schema.json +0 -38
  314. package/dist/templates/.caws/templates/working-spec.template.yml +0 -80
  315. package/dist/templates/.caws/tools/README.md +0 -18
  316. package/dist/templates/.caws/tools/scope-guard.js +0 -203
  317. package/dist/templates/.caws/tools-allow.json +0 -331
  318. package/dist/templates/.caws/waivers.yml +0 -19
  319. package/dist/templates/.claude/README.md +0 -190
  320. package/dist/templates/.claude/hooks/audit.sh +0 -121
  321. package/dist/templates/.claude/hooks/block-dangerous.sh +0 -203
  322. package/dist/templates/.claude/hooks/classify_command.py +0 -592
  323. package/dist/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  324. package/dist/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  325. package/dist/templates/.claude/hooks/naming-check.sh +0 -100
  326. package/dist/templates/.claude/hooks/protected-paths.sh +0 -39
  327. package/dist/templates/.claude/hooks/quality-check.sh +0 -81
  328. package/dist/templates/.claude/hooks/scan-secrets.sh +0 -85
  329. package/dist/templates/.claude/hooks/scope-guard.sh +0 -381
  330. package/dist/templates/.claude/hooks/session-caws-status.sh +0 -117
  331. package/dist/templates/.claude/hooks/session-log.sh +0 -634
  332. package/dist/templates/.claude/hooks/simplification-guard.sh +0 -92
  333. package/dist/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  334. package/dist/templates/.claude/hooks/test_classify_command.py +0 -370
  335. package/dist/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  336. package/dist/templates/.claude/hooks/validate-spec.sh +0 -76
  337. package/dist/templates/.claude/hooks/worktree-guard.sh +0 -220
  338. package/dist/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  339. package/dist/templates/.claude/rules/git-safety.md +0 -26
  340. package/dist/templates/.claude/rules/worktree-isolation.md +0 -101
  341. package/dist/templates/.claude/settings.json +0 -141
  342. package/dist/templates/.cursor/README.md +0 -299
  343. package/dist/templates/.cursor/hooks/audit.sh +0 -55
  344. package/dist/templates/.cursor/hooks/block-dangerous.sh +0 -84
  345. package/dist/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  346. package/dist/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  347. package/dist/templates/.cursor/hooks/format.sh +0 -38
  348. package/dist/templates/.cursor/hooks/naming-check.sh +0 -64
  349. package/dist/templates/.cursor/hooks/scan-secrets.sh +0 -51
  350. package/dist/templates/.cursor/hooks/scope-guard.sh +0 -52
  351. package/dist/templates/.cursor/hooks/session-log.sh +0 -924
  352. package/dist/templates/.cursor/hooks/validate-spec.sh +0 -83
  353. package/dist/templates/.cursor/hooks.json +0 -76
  354. package/dist/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  355. package/dist/templates/.cursor/rules/01-working-style.mdc +0 -50
  356. package/dist/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  357. package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  358. package/dist/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  359. package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  360. package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  361. package/dist/templates/.cursor/rules/07-process-ops.mdc +0 -20
  362. package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  363. package/dist/templates/.cursor/rules/09-docstrings.mdc +0 -89
  364. package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  365. package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  366. package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  367. package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  368. package/dist/templates/.cursor/rules/README.md +0 -148
  369. package/dist/templates/.github/copilot-instructions.md +0 -82
  370. package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  371. package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  372. package/dist/templates/.junie/guidelines.md +0 -73
  373. package/dist/templates/.vscode/launch.json +0 -17
  374. package/dist/templates/.vscode/settings.json +0 -95
  375. package/dist/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  376. package/dist/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  377. package/dist/templates/CLAUDE.md +0 -196
  378. package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
  379. package/dist/templates/OIDC_SETUP.md +0 -300
  380. package/dist/templates/agents.md +0 -171
  381. package/dist/templates/codemod/README.md +0 -1
  382. package/dist/templates/codemod/test.js +0 -93
  383. package/dist/templates/docs/README.md +0 -151
  384. package/dist/templates/scripts/new_feature.sh +0 -80
  385. package/dist/templates/scripts/quality-gates/check-god-objects.js +0 -146
  386. package/dist/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  387. package/dist/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
  388. package/dist/test-analysis.js +0 -786
  389. package/dist/tool-interface.js +0 -314
  390. package/dist/tool-loader.js +0 -303
  391. package/dist/tool-validator.js +0 -393
  392. package/dist/utils/agent-display.js +0 -210
  393. package/dist/utils/agent-session.js +0 -344
  394. package/dist/utils/async-utils.js +0 -188
  395. package/dist/utils/command-wrapper.js +0 -200
  396. package/dist/utils/event-log.js +0 -584
  397. package/dist/utils/event-renderer.js +0 -521
  398. package/dist/utils/finalization.js +0 -230
  399. package/dist/utils/git-lock.js +0 -119
  400. package/dist/utils/gitignore-updater.js +0 -158
  401. package/dist/utils/ide-detection.js +0 -133
  402. package/dist/utils/lifecycle-events.js +0 -94
  403. package/dist/utils/project-analysis.js +0 -367
  404. package/dist/utils/promise-utils.js +0 -72
  405. package/dist/utils/quality-gates-errors.js +0 -520
  406. package/dist/utils/quality-gates-utils.js +0 -387
  407. package/dist/utils/schema-validator.js +0 -50
  408. package/dist/utils/spec-resolver.js +0 -711
  409. package/dist/utils/typescript-detector.js +0 -369
  410. package/dist/utils/working-state.js +0 -530
  411. package/dist/utils/yaml-validation.js +0 -156
  412. package/dist/validation/spec-validation.js +0 -924
  413. package/dist/waivers-manager.js +0 -732
  414. package/dist/worktree/worktree-manager.js +0 -1735
  415. package/templates/.caws/schemas/policy.schema.json +0 -117
  416. package/templates/.caws/schemas/scope.schema.json +0 -52
  417. package/templates/.caws/schemas/waivers.schema.json +0 -106
  418. package/templates/.caws/schemas/working-spec.schema.json +0 -340
  419. package/templates/.caws/schemas/worktrees.schema.json +0 -38
  420. package/templates/.caws/templates/working-spec.template.yml +0 -80
  421. package/templates/.caws/tools/README.md +0 -18
  422. package/templates/.caws/tools/scope-guard.js +0 -203
  423. package/templates/.caws/tools-allow.json +0 -331
  424. package/templates/.caws/waivers.yml +0 -19
  425. package/templates/.claude/README.md +0 -190
  426. package/templates/.claude/hooks/audit.sh +0 -121
  427. package/templates/.claude/hooks/block-dangerous.sh +0 -203
  428. package/templates/.claude/hooks/classify_command.py +0 -592
  429. package/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  430. package/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  431. package/templates/.claude/hooks/naming-check.sh +0 -100
  432. package/templates/.claude/hooks/protected-paths.sh +0 -39
  433. package/templates/.claude/hooks/quality-check.sh +0 -81
  434. package/templates/.claude/hooks/scan-secrets.sh +0 -85
  435. package/templates/.claude/hooks/scope-guard.sh +0 -381
  436. package/templates/.claude/hooks/session-caws-status.sh +0 -117
  437. package/templates/.claude/hooks/session-log.sh +0 -634
  438. package/templates/.claude/hooks/simplification-guard.sh +0 -92
  439. package/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  440. package/templates/.claude/hooks/test_classify_command.py +0 -370
  441. package/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  442. package/templates/.claude/hooks/validate-spec.sh +0 -76
  443. package/templates/.claude/hooks/worktree-guard.sh +0 -220
  444. package/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  445. package/templates/.claude/rules/git-safety.md +0 -26
  446. package/templates/.claude/rules/worktree-isolation.md +0 -101
  447. package/templates/.claude/settings.json +0 -141
  448. package/templates/.cursor/README.md +0 -299
  449. package/templates/.cursor/hooks/audit.sh +0 -55
  450. package/templates/.cursor/hooks/block-dangerous.sh +0 -84
  451. package/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  452. package/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  453. package/templates/.cursor/hooks/format.sh +0 -38
  454. package/templates/.cursor/hooks/naming-check.sh +0 -64
  455. package/templates/.cursor/hooks/scan-secrets.sh +0 -51
  456. package/templates/.cursor/hooks/scope-guard.sh +0 -52
  457. package/templates/.cursor/hooks/session-log.sh +0 -924
  458. package/templates/.cursor/hooks/validate-spec.sh +0 -83
  459. package/templates/.cursor/hooks.json +0 -76
  460. package/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  461. package/templates/.cursor/rules/01-working-style.mdc +0 -50
  462. package/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  463. package/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  464. package/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  465. package/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  466. package/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  467. package/templates/.cursor/rules/07-process-ops.mdc +0 -20
  468. package/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  469. package/templates/.cursor/rules/09-docstrings.mdc +0 -89
  470. package/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  471. package/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  472. package/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  473. package/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  474. package/templates/.cursor/rules/README.md +0 -148
  475. package/templates/.github/copilot-instructions.md +0 -82
  476. package/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  477. package/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  478. package/templates/.junie/guidelines.md +0 -73
  479. package/templates/.vscode/launch.json +0 -17
  480. package/templates/.vscode/settings.json +0 -95
  481. package/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  482. package/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  483. package/templates/CLAUDE.md +0 -196
  484. package/templates/COMMIT_CONVENTIONS.md +0 -86
  485. package/templates/OIDC_SETUP.md +0 -300
  486. package/templates/agents.md +0 -171
  487. package/templates/codemod/README.md +0 -1
  488. package/templates/codemod/test.js +0 -93
  489. package/templates/docs/README.md +0 -151
  490. package/templates/scripts/new_feature.sh +0 -80
  491. package/templates/scripts/quality-gates/check-god-objects.js +0 -146
  492. package/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  493. package/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ // Apply kernel-emitted RegistryPatch envelopes to on-disk registries.
3
+ //
4
+ // The kernel never reads or writes files — it returns typed patches
5
+ // describing exactly what the shell should do. This module is the SINGLE
6
+ // place those patches turn into atomic writes:
7
+ //
8
+ // bind_worktree → worktrees.json[name] = { specId, owner, ... }
9
+ // rebind_worktree → worktrees.json[name].specId = newSpecId
10
+ // takeover_claim → worktrees.json[name].owner = newOwner;
11
+ // worktrees.json[name].prior_owners.push(audit)
12
+ // refresh_agent → agents.json[session_id] = { last_active, ... }
13
+ //
14
+ // All writes use the existing atomic-write helper (temp + fsync + rename).
15
+ // We do NOT touch agents.json from worktree-patch paths and vice versa.
16
+ //
17
+ // Authority discipline preserved:
18
+ // - worktrees.json[name].owner is the SOLE authority for ownership.
19
+ // - agents.json updates are display/freshness only.
20
+ // - prior_owners is append-only; takeover_claim never truncates.
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ exports.applyRegistryPatch = applyRegistryPatch;
56
+ const path = __importStar(require("node:path"));
57
+ const fs = __importStar(require("node:fs"));
58
+ const caws_kernel_1 = require("@paths.design/caws-kernel");
59
+ const atomic_write_1 = require("./atomic-write");
60
+ const rules_1 = require("./rules");
61
+ const WORKTREES_FILENAME = 'worktrees.json';
62
+ const AGENTS_FILENAME = 'agents.json';
63
+ function storeErr(rule, message, data) {
64
+ const base = {
65
+ rule,
66
+ authority: 'kernel/diagnostics',
67
+ severity: 'error',
68
+ message,
69
+ };
70
+ return data !== undefined ? { ...base, data } : base;
71
+ }
72
+ function readRegistryJson(filePath, defaultValue) {
73
+ if (!fs.existsSync(filePath)) {
74
+ return (0, caws_kernel_1.ok)(defaultValue);
75
+ }
76
+ let raw;
77
+ try {
78
+ raw = fs.readFileSync(filePath, 'utf8');
79
+ }
80
+ catch (e) {
81
+ return (0, caws_kernel_1.err)(storeErr(rules_1.STORE_RULES.READ_IO_FAILED, `Failed to read ${path.basename(filePath)}: ${e.message}`, { filePath }));
82
+ }
83
+ if (raw.trim().length === 0)
84
+ return (0, caws_kernel_1.ok)(defaultValue);
85
+ try {
86
+ const parsed = JSON.parse(raw);
87
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
88
+ return (0, caws_kernel_1.err)(storeErr(rules_1.STORE_RULES.REGISTRY_NOT_OBJECT, `${path.basename(filePath)} is not a JSON object.`));
89
+ }
90
+ return (0, caws_kernel_1.ok)(parsed);
91
+ }
92
+ catch (e) {
93
+ return (0, caws_kernel_1.err)(storeErr(rules_1.STORE_RULES.READ_JSON_INVALID, `Invalid JSON in ${path.basename(filePath)}: ${e.message}`, { filePath }));
94
+ }
95
+ }
96
+ function writeRegistryJson(filePath, value) {
97
+ return (0, atomic_write_1.writeFileAtomic)(filePath, JSON.stringify(value, null, 2) + '\n');
98
+ }
99
+ /**
100
+ * Apply a single RegistryPatch to the on-disk registries.
101
+ *
102
+ * Returns Ok(true) on successful write. The patch envelope itself is the
103
+ * proof-of-intent — this function never invents fields. It only translates
104
+ * the patch into the corresponding registry mutation and persists it.
105
+ *
106
+ * Reads the existing registry from disk, applies the patch, and writes
107
+ * back atomically. If the read fails (e.g., malformed JSON on disk), the
108
+ * function returns Err and refuses to overwrite the file — silent recovery
109
+ * would erase potentially-recoverable user state.
110
+ */
111
+ function applyRegistryPatch(cawsDir, patch) {
112
+ switch (patch.kind) {
113
+ case 'bind_worktree':
114
+ return applyBindWorktree(cawsDir, patch);
115
+ case 'rebind_worktree':
116
+ return applyRebindWorktree(cawsDir, patch);
117
+ case 'takeover_claim':
118
+ return applyTakeoverClaim(cawsDir, patch);
119
+ case 'refresh_agent':
120
+ return applyRefreshAgent(cawsDir, patch);
121
+ }
122
+ }
123
+ function applyBindWorktree(cawsDir, patch) {
124
+ const filePath = path.join(cawsDir, WORKTREES_FILENAME);
125
+ const readResult = readRegistryJson(filePath, {});
126
+ if (!readResult.ok)
127
+ return readResult;
128
+ const registry = { ...readResult.value };
129
+ const prev = registry[patch.worktree_name] ?? {};
130
+ registry[patch.worktree_name] = {
131
+ ...prev,
132
+ specId: patch.spec_id,
133
+ owner: patch.owner,
134
+ last_heartbeat: patch.when,
135
+ };
136
+ return writeRegistryJson(filePath, registry);
137
+ }
138
+ function applyRebindWorktree(cawsDir, patch) {
139
+ const filePath = path.join(cawsDir, WORKTREES_FILENAME);
140
+ const readResult = readRegistryJson(filePath, {});
141
+ if (!readResult.ok)
142
+ return readResult;
143
+ const registry = { ...readResult.value };
144
+ const prev = registry[patch.worktree_name];
145
+ if (prev === undefined) {
146
+ return (0, caws_kernel_1.err)(storeErr(rules_1.STORE_RULES.WRITE_PATCH_TARGET_MISSING, `Cannot rebind worktree "${patch.worktree_name}" — no existing entry.`, { worktree_name: patch.worktree_name }));
147
+ }
148
+ registry[patch.worktree_name] = {
149
+ ...prev,
150
+ specId: patch.to_spec_id,
151
+ };
152
+ return writeRegistryJson(filePath, registry);
153
+ }
154
+ function applyTakeoverClaim(cawsDir, patch) {
155
+ const filePath = path.join(cawsDir, WORKTREES_FILENAME);
156
+ const readResult = readRegistryJson(filePath, {});
157
+ if (!readResult.ok)
158
+ return readResult;
159
+ const registry = { ...readResult.value };
160
+ const prev = registry[patch.worktree_name];
161
+ if (prev === undefined) {
162
+ return (0, caws_kernel_1.err)(storeErr(rules_1.STORE_RULES.WRITE_PATCH_TARGET_MISSING, `Cannot take over "${patch.worktree_name}" — no existing entry.`, { worktree_name: patch.worktree_name }));
163
+ }
164
+ // prior_owners is append-only. Kernel never truncates; we don't either.
165
+ const priorOwners = [...(prev.prior_owners ?? []), patch.prior_owner];
166
+ registry[patch.worktree_name] = {
167
+ ...prev,
168
+ owner: patch.owner,
169
+ last_heartbeat: patch.when,
170
+ prior_owners: priorOwners,
171
+ };
172
+ return writeRegistryJson(filePath, registry);
173
+ }
174
+ function applyRefreshAgent(cawsDir, patch) {
175
+ const filePath = path.join(cawsDir, AGENTS_FILENAME);
176
+ const readResult = readRegistryJson(filePath, {});
177
+ if (!readResult.ok)
178
+ return readResult;
179
+ const registry = { ...readResult.value };
180
+ const prev = registry[patch.session.session_id] ?? { session_id: patch.session.session_id, last_active: patch.last_active };
181
+ registry[patch.session.session_id] = {
182
+ ...prev,
183
+ session_id: patch.session.session_id,
184
+ ...(patch.session.platform !== undefined ? { platform: patch.session.platform } : {}),
185
+ last_active: patch.last_active,
186
+ ...(patch.bound_worktree !== undefined ? { bound_worktree: patch.bound_worktree } : {}),
187
+ ...(patch.bound_spec_id !== undefined ? { bound_spec_id: patch.bound_spec_id } : {}),
188
+ };
189
+ return writeRegistryJson(filePath, registry);
190
+ }
191
+ //# sourceMappingURL=apply-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-patch.js","sourceRoot":"","sources":["../../src/store/apply-patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type Result } from '@paths.design/caws-kernel';
2
+ export interface WriteFileAtomicOptions {
3
+ /**
4
+ * When true and `targetPath` exists, the temp file is created with the
5
+ * target's existing mode, and the final on-disk file has the same mode
6
+ * after rename. Used by the lifecycle substrate to preserve the
7
+ * executable bit on managed hook scripts.
8
+ *
9
+ * When false (default), the temp file is created with the standard
10
+ * `'w'` mode (0o666 masked by umask). This preserves the historical
11
+ * behavior of writeFileAtomic so existing callers are not silently
12
+ * affected.
13
+ *
14
+ * When `targetPath` does NOT exist, this option has no effect; the
15
+ * file is created with the default mode regardless.
16
+ */
17
+ readonly preserveMode?: boolean;
18
+ }
19
+ /**
20
+ * Write `contents` to `targetPath` atomically.
21
+ *
22
+ * On Err, the temp file is cleaned up. On Ok, the target file holds the
23
+ * new bytes. When `options.preserveMode` is true and the target exists,
24
+ * the new file has the same mode bits as the prior file.
25
+ */
26
+ export declare function writeFileAtomic(targetPath: string, contents: string | Buffer, options?: WriteFileAtomicOptions): Result<true>;
27
+ /**
28
+ * Best-effort parent-directory fsync. Returns true on success, false on
29
+ * failure (some filesystems / platforms don't support it). Callers that
30
+ * care about durability past crash should call this after a sequence of
31
+ * atomic writes. Never throws.
32
+ */
33
+ export declare function fsyncDir(dirPath: string): boolean;
34
+ //# sourceMappingURL=atomic-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../../src/store/atomic-write.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAajE,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAAC,IAAI,CAAC,CA4Ed;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAiBjD"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ // Atomic file write.
3
+ //
4
+ // Contract: file CONTENT atomicity. After writeFileAtomic returns Ok, the
5
+ // file at `targetPath` either contains the new bytes in full or the old
6
+ // bytes in full. There is no partial-write window for readers.
7
+ //
8
+ // Mechanism: write to a sibling temp path (`<target>.tmp.<pid>.<counter>`),
9
+ // fsync the data + descriptor, then rename onto the target. rename(2) is
10
+ // atomic on the same filesystem; the sibling location guarantees that.
11
+ //
12
+ // We do NOT guarantee crash-proof directory durability. A power loss
13
+ // between rename and a parent-directory fsync may leave the directory
14
+ // entry on disk while the new file contents are still in the page cache.
15
+ // Callers that need durability past power loss should fsync the parent
16
+ // directory themselves; events-store does this for events.jsonl.
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.writeFileAtomic = writeFileAtomic;
52
+ exports.fsyncDir = fsyncDir;
53
+ const fs = __importStar(require("fs"));
54
+ const path = __importStar(require("path"));
55
+ const caws_kernel_1 = require("@paths.design/caws-kernel");
56
+ const repo_root_1 = require("./repo-root");
57
+ const rules_1 = require("./rules");
58
+ let tmpCounter = 0;
59
+ function nextTempName(targetPath) {
60
+ const dir = path.dirname(targetPath);
61
+ const base = path.basename(targetPath);
62
+ const counter = tmpCounter++;
63
+ return path.join(dir, `${base}.tmp.${process.pid}.${counter}`);
64
+ }
65
+ /**
66
+ * Write `contents` to `targetPath` atomically.
67
+ *
68
+ * On Err, the temp file is cleaned up. On Ok, the target file holds the
69
+ * new bytes. When `options.preserveMode` is true and the target exists,
70
+ * the new file has the same mode bits as the prior file.
71
+ */
72
+ function writeFileAtomic(targetPath, contents, options = {}) {
73
+ const tmpPath = nextTempName(targetPath);
74
+ let fd;
75
+ // When preserveMode is requested, stat the target BEFORE the temp
76
+ // write so we can match the mode at creation time (reducing the
77
+ // window where the file has a wrong mode) and verify/restore after
78
+ // rename (so chmod failures on the temp file don't silently drop
79
+ // the exec bit).
80
+ let preservedMode;
81
+ if (options.preserveMode === true) {
82
+ try {
83
+ preservedMode = fs.statSync(targetPath).mode & 0o7777;
84
+ }
85
+ catch {
86
+ // Target doesn't exist; preserveMode has no effect.
87
+ }
88
+ }
89
+ try {
90
+ fd = fs.openSync(tmpPath, 'w');
91
+ fs.writeFileSync(fd, contents);
92
+ fs.fsyncSync(fd);
93
+ fs.closeSync(fd);
94
+ fd = undefined;
95
+ // Apply preserved mode to the temp file before rename so the
96
+ // window between rename and chmod is minimal.
97
+ if (preservedMode !== undefined) {
98
+ try {
99
+ fs.chmodSync(tmpPath, preservedMode);
100
+ }
101
+ catch {
102
+ // chmod on temp may fail on some filesystems (e.g., NFS);
103
+ // post-rename chmod below is the safety net.
104
+ }
105
+ }
106
+ fs.renameSync(tmpPath, targetPath);
107
+ // Post-rename verification: if preserveMode was requested, ensure
108
+ // the final file has the right bits. This is the safety net for
109
+ // pre-rename chmod failure, and a no-op when the pre-rename chmod
110
+ // succeeded.
111
+ if (preservedMode !== undefined) {
112
+ try {
113
+ const actualMode = fs.statSync(targetPath).mode & 0o7777;
114
+ if (actualMode !== preservedMode) {
115
+ fs.chmodSync(targetPath, preservedMode);
116
+ }
117
+ }
118
+ catch {
119
+ // Best-effort: if the verify or chmod itself fails, the write
120
+ // already succeeded; the caller may need to chmod manually.
121
+ }
122
+ }
123
+ return (0, caws_kernel_1.ok)(true);
124
+ }
125
+ catch (e) {
126
+ if (fd !== undefined) {
127
+ try {
128
+ fs.closeSync(fd);
129
+ }
130
+ catch {
131
+ /* swallow; we're already in an error path */
132
+ }
133
+ }
134
+ try {
135
+ fs.unlinkSync(tmpPath);
136
+ }
137
+ catch {
138
+ /* temp file may not have been created */
139
+ }
140
+ const cause = e;
141
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.WRITE_IO_FAILED, `Failed to write ${targetPath}: ${cause.message ?? 'unknown error'}.`, {
142
+ subject: targetPath,
143
+ data: { code: cause.code },
144
+ }));
145
+ }
146
+ }
147
+ /**
148
+ * Best-effort parent-directory fsync. Returns true on success, false on
149
+ * failure (some filesystems / platforms don't support it). Callers that
150
+ * care about durability past crash should call this after a sequence of
151
+ * atomic writes. Never throws.
152
+ */
153
+ function fsyncDir(dirPath) {
154
+ let fd;
155
+ try {
156
+ fd = fs.openSync(dirPath, 'r');
157
+ fs.fsyncSync(fd);
158
+ return true;
159
+ }
160
+ catch {
161
+ return false;
162
+ }
163
+ finally {
164
+ if (fd !== undefined) {
165
+ try {
166
+ fs.closeSync(fd);
167
+ }
168
+ catch {
169
+ /* ignore */
170
+ }
171
+ }
172
+ }
173
+ }
174
+ //# sourceMappingURL=atomic-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/store/atomic-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type DoctorInput, type TemplateCheck } from '@paths.design/caws-kernel';
2
+ import type { StoreSnapshot } from './types';
3
+ export interface ComposeOptions {
4
+ readonly repoRoot: string;
5
+ readonly cawsDir: string;
6
+ }
7
+ export declare function composeStoreSnapshot(options: ComposeOptions): StoreSnapshot;
8
+ export interface ComposeDoctorOptions extends ComposeOptions {
9
+ readonly now: Date;
10
+ readonly templates?: readonly TemplateCheck[];
11
+ readonly staleAgentTtlMs?: number;
12
+ readonly unboundActiveThresholdMs?: number;
13
+ readonly priorOwnersGrowthThreshold?: number;
14
+ }
15
+ export interface ComposeDoctorResult {
16
+ readonly snapshot: StoreSnapshot;
17
+ readonly doctorInput: DoctorInput;
18
+ }
19
+ export declare function composeDoctorSnapshot(options: ComposeDoctorOptions): ComposeDoctorResult;
20
+ //# sourceMappingURL=doctor-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-snapshot.d.ts","sourceRoot":"","sources":["../../src/store/doctor-snapshot.ts"],"names":[],"mappings":"AAuBA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AAKnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAQ7C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAqC3E;AA8DD,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;CAC9C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CA6BxF"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ // Doctor snapshot composition.
3
+ //
4
+ // Pulls state from each store adapter and assembles two artifacts:
5
+ // 1. StoreSnapshot — the full I/O-derived state, including load
6
+ // diagnostics. The shell uses this for separate display of
7
+ // load failures.
8
+ // 2. DoctorInput — the projection of valid state the kernel's
9
+ // `inspectProjectState` accepts.
10
+ //
11
+ // Discipline:
12
+ // - The composer does NOT invent validation. It loads, calls the
13
+ // existing kernel functions, and forwards.
14
+ // - The composer accepts `now` as input. It never reads Date.now().
15
+ // - Template-check discovery is OUT OF SCOPE in Slice 5b. If the
16
+ // caller wants template diagnostics, they pass `TemplateCheck[]`
17
+ // themselves.
18
+ // - Session capsules (.caws/sessions/<id>.json) are OUT OF SCOPE in
19
+ // Slice 5b — they're tied to identity resolution which is a Slice
20
+ // 5c concern.
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ exports.composeStoreSnapshot = composeStoreSnapshot;
56
+ exports.composeDoctorSnapshot = composeDoctorSnapshot;
57
+ const fs = __importStar(require("fs"));
58
+ const path = __importStar(require("path"));
59
+ const caws_kernel_1 = require("@paths.design/caws-kernel");
60
+ const agents_store_1 = require("./agents-store");
61
+ const events_store_1 = require("./events-store");
62
+ const policy_store_1 = require("./policy-store");
63
+ const specs_store_1 = require("./specs-store");
64
+ const waivers_store_1 = require("./waivers-store");
65
+ const worktrees_store_1 = require("./worktrees-store");
66
+ function composeStoreSnapshot(options) {
67
+ const { repoRoot, cawsDir } = options;
68
+ const specsResult = (0, specs_store_1.loadSpecs)(cawsDir);
69
+ const policyResult = (0, policy_store_1.loadPolicy)(cawsDir);
70
+ const worktreesResult = (0, worktrees_store_1.loadWorktrees)(cawsDir);
71
+ const agentsResult = (0, agents_store_1.loadAgents)(cawsDir);
72
+ const eventsResult = (0, events_store_1.loadEvents)(cawsDir);
73
+ const waiversResult = (0, waivers_store_1.loadWaivers)(cawsDir);
74
+ // Slice 7c.1 — observe vNext-shape facts the kernel cannot derive.
75
+ // The store is the only place that may stat the filesystem; doctor
76
+ // consumes the booleans below without any I/O of its own.
77
+ const initResidue = observeInitResidue(cawsDir);
78
+ const filesystem = observeFilesystem(cawsDir);
79
+ const registryDiagnostics = collectRegistryDiagnostics(worktreesResult, agentsResult);
80
+ return {
81
+ repoRoot,
82
+ cawsDir,
83
+ specs: specsResult.specs,
84
+ specDiagnostics: specsResult.diagnostics,
85
+ ...(policyResult.policy !== undefined ? { policy: policyResult.policy } : {}),
86
+ policyWarnings: policyResult.warnings,
87
+ policyErrors: policyResult.errors,
88
+ worktrees: (0, caws_kernel_1.isOk)(worktreesResult) ? worktreesResult.value : {},
89
+ agents: (0, caws_kernel_1.isOk)(agentsResult) ? agentsResult.value : {},
90
+ events: (0, caws_kernel_1.isOk)(eventsResult) ? eventsResult.value.events : [],
91
+ eventWarnings: (0, caws_kernel_1.isOk)(eventsResult) ? eventsResult.value.warnings : eventsResult.errors,
92
+ waivers: waiversResult.waivers,
93
+ waiverDiagnostics: waiversResult.diagnostics,
94
+ initResidue,
95
+ filesystem,
96
+ registryDiagnostics,
97
+ };
98
+ }
99
+ // ----------------------------------------------------------------------------
100
+ // 7c.1 helpers — file-existence observation
101
+ //
102
+ // These intentionally do NOT distinguish "not a file vs not a directory" —
103
+ // doctor's rules in 7c.2 only need "is this canonical surface present?".
104
+ // Distinguishing kind would expand the input shape with information no
105
+ // rule yet consumes.
106
+ // ----------------------------------------------------------------------------
107
+ function isFile(p) {
108
+ try {
109
+ return fs.statSync(p).isFile();
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ }
115
+ function isDir(p) {
116
+ try {
117
+ return fs.statSync(p).isDirectory();
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ }
123
+ function observeInitResidue(cawsDir) {
124
+ return {
125
+ workingSpecYaml: isFile(path.join(cawsDir, 'working-spec.yaml')),
126
+ workingSpecSchemaJson: isFile(path.join(cawsDir, 'working-spec.schema.json')),
127
+ };
128
+ }
129
+ function observeFilesystem(cawsDir) {
130
+ return {
131
+ cawsDirExists: isDir(cawsDir),
132
+ specsDirExists: isDir(path.join(cawsDir, 'specs')),
133
+ waiversDirExists: isDir(path.join(cawsDir, 'waivers')),
134
+ policyYamlExists: isFile(path.join(cawsDir, 'policy.yaml')),
135
+ worktreesJsonExists: isFile(path.join(cawsDir, 'worktrees.json')),
136
+ agentsJsonExists: isFile(path.join(cawsDir, 'agents.json')),
137
+ eventsJsonlExists: isFile(path.join(cawsDir, 'events.jsonl')),
138
+ };
139
+ }
140
+ function collectRegistryDiagnostics(worktreesResult, agentsResult) {
141
+ const out = [];
142
+ if (!(0, caws_kernel_1.isOk)(worktreesResult))
143
+ out.push(...worktreesResult.errors);
144
+ if (!(0, caws_kernel_1.isOk)(agentsResult))
145
+ out.push(...agentsResult.errors);
146
+ return out;
147
+ }
148
+ function composeDoctorSnapshot(options) {
149
+ const snapshot = composeStoreSnapshot(options);
150
+ const doctorInput = {
151
+ specs: snapshot.specs,
152
+ ...(snapshot.policy !== undefined ? { policy: snapshot.policy } : {}),
153
+ policyWarnings: snapshot.policyWarnings,
154
+ worktrees: snapshot.worktrees,
155
+ agents: snapshot.agents,
156
+ events: snapshot.events,
157
+ ...(options.templates !== undefined ? { templates: options.templates } : {}),
158
+ waivers: snapshot.waivers,
159
+ waiverDiagnostics: snapshot.waiverDiagnostics,
160
+ initResidue: snapshot.initResidue,
161
+ filesystem: snapshot.filesystem,
162
+ registryDiagnostics: snapshot.registryDiagnostics,
163
+ now: options.now,
164
+ ...(options.staleAgentTtlMs !== undefined
165
+ ? { staleAgentTtlMs: options.staleAgentTtlMs }
166
+ : {}),
167
+ ...(options.unboundActiveThresholdMs !== undefined
168
+ ? { unboundActiveThresholdMs: options.unboundActiveThresholdMs }
169
+ : {}),
170
+ ...(options.priorOwnersGrowthThreshold !== undefined
171
+ ? { priorOwnersGrowthThreshold: options.priorOwnersGrowthThreshold }
172
+ : {}),
173
+ };
174
+ return { snapshot, doctorInput };
175
+ }
176
+ //# sourceMappingURL=doctor-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-snapshot.js","sourceRoot":"","sources":["../../src/store/doctor-snapshot.ts"],"names":[],"mappings":"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"}