@paths.design/caws-cli 11.0.0 → 11.1.1

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 (119) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +2 -2
  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/commands/gates.d.ts.map +1 -1
  24. package/dist/shell/commands/gates.js +28 -1
  25. package/dist/shell/commands/gates.js.map +1 -1
  26. package/dist/shell/commands/init.d.ts +9 -0
  27. package/dist/shell/commands/init.d.ts.map +1 -1
  28. package/dist/shell/commands/init.js +131 -27
  29. package/dist/shell/commands/init.js.map +1 -1
  30. package/dist/shell/commands/specs.d.ts +41 -0
  31. package/dist/shell/commands/specs.d.ts.map +1 -0
  32. package/dist/shell/commands/specs.js +264 -0
  33. package/dist/shell/commands/specs.js.map +1 -0
  34. package/dist/shell/commands/worktree.d.ts +38 -0
  35. package/dist/shell/commands/worktree.d.ts.map +1 -0
  36. package/dist/shell/commands/worktree.js +286 -0
  37. package/dist/shell/commands/worktree.js.map +1 -0
  38. package/dist/shell/gates/disposition.d.ts.map +1 -1
  39. package/dist/shell/gates/disposition.js +33 -3
  40. package/dist/shell/gates/disposition.js.map +1 -1
  41. package/dist/shell/gates/local-evaluators/budget-limit.d.ts +24 -0
  42. package/dist/shell/gates/local-evaluators/budget-limit.d.ts.map +1 -0
  43. package/dist/shell/gates/local-evaluators/budget-limit.js +67 -0
  44. package/dist/shell/gates/local-evaluators/budget-limit.js.map +1 -0
  45. package/dist/shell/gates/local-evaluators/diff-helpers.d.ts +25 -0
  46. package/dist/shell/gates/local-evaluators/diff-helpers.d.ts.map +1 -0
  47. package/dist/shell/gates/local-evaluators/diff-helpers.js +74 -0
  48. package/dist/shell/gates/local-evaluators/diff-helpers.js.map +1 -0
  49. package/dist/shell/gates/local-evaluators/index.d.ts +28 -0
  50. package/dist/shell/gates/local-evaluators/index.d.ts.map +1 -0
  51. package/dist/shell/gates/local-evaluators/index.js +67 -0
  52. package/dist/shell/gates/local-evaluators/index.js.map +1 -0
  53. package/dist/shell/gates/local-evaluators/scope-boundary.d.ts +23 -0
  54. package/dist/shell/gates/local-evaluators/scope-boundary.d.ts.map +1 -0
  55. package/dist/shell/gates/local-evaluators/scope-boundary.js +67 -0
  56. package/dist/shell/gates/local-evaluators/scope-boundary.js.map +1 -0
  57. package/dist/shell/gates/local-evaluators/spec-completeness.d.ts +12 -0
  58. package/dist/shell/gates/local-evaluators/spec-completeness.d.ts.map +1 -0
  59. package/dist/shell/gates/local-evaluators/spec-completeness.js +73 -0
  60. package/dist/shell/gates/local-evaluators/spec-completeness.js.map +1 -0
  61. package/dist/shell/index.d.ts +4 -0
  62. package/dist/shell/index.d.ts.map +1 -1
  63. package/dist/shell/index.js +13 -1
  64. package/dist/shell/index.js.map +1 -1
  65. package/dist/shell/register.d.ts.map +1 -1
  66. package/dist/shell/register.js +192 -2
  67. package/dist/shell/register.js.map +1 -1
  68. package/dist/shell/render/init-hook-pack.d.ts +16 -0
  69. package/dist/shell/render/init-hook-pack.d.ts.map +1 -0
  70. package/dist/shell/render/init-hook-pack.js +206 -0
  71. package/dist/shell/render/init-hook-pack.js.map +1 -0
  72. package/dist/store/atomic-write.d.ts +20 -2
  73. package/dist/store/atomic-write.d.ts.map +1 -1
  74. package/dist/store/atomic-write.js +44 -2
  75. package/dist/store/atomic-write.js.map +1 -1
  76. package/dist/store/lifecycle-lock.d.ts +34 -0
  77. package/dist/store/lifecycle-lock.d.ts.map +1 -0
  78. package/dist/store/lifecycle-lock.js +168 -0
  79. package/dist/store/lifecycle-lock.js.map +1 -0
  80. package/dist/store/lifecycle-transaction.d.ts +79 -0
  81. package/dist/store/lifecycle-transaction.d.ts.map +1 -0
  82. package/dist/store/lifecycle-transaction.js +319 -0
  83. package/dist/store/lifecycle-transaction.js.map +1 -0
  84. package/dist/store/rules.d.ts +16 -0
  85. package/dist/store/rules.d.ts.map +1 -1
  86. package/dist/store/rules.js +17 -0
  87. package/dist/store/rules.js.map +1 -1
  88. package/dist/store/specs-writer.d.ts +61 -0
  89. package/dist/store/specs-writer.d.ts.map +1 -0
  90. package/dist/store/specs-writer.js +506 -0
  91. package/dist/store/specs-writer.js.map +1 -0
  92. package/dist/store/worktrees-writer.d.ts +77 -0
  93. package/dist/store/worktrees-writer.d.ts.map +1 -0
  94. package/dist/store/worktrees-writer.js +674 -0
  95. package/dist/store/worktrees-writer.js.map +1 -0
  96. package/dist/store/yaml-patch.d.ts +7 -0
  97. package/dist/store/yaml-patch.d.ts.map +1 -0
  98. package/dist/store/yaml-patch.js +250 -0
  99. package/dist/store/yaml-patch.js.map +1 -0
  100. package/package.json +7 -4
  101. package/templates/hook-packs/claude-code/CLAUDE.md +172 -0
  102. package/templates/hook-packs/claude-code/audit.sh +121 -0
  103. package/templates/hook-packs/claude-code/block-dangerous.sh +158 -0
  104. package/templates/hook-packs/claude-code/classify_command.py +1064 -0
  105. package/templates/hook-packs/claude-code/dispatch/post_tool_use.sh +63 -0
  106. package/templates/hook-packs/claude-code/dispatch/pre_tool_use.sh +50 -0
  107. package/templates/hook-packs/claude-code/dispatch/session_start.sh +41 -0
  108. package/templates/hook-packs/claude-code/dispatch/stop.sh +37 -0
  109. package/templates/hook-packs/claude-code/guard-strikes.sh +140 -0
  110. package/templates/hook-packs/claude-code/lib/parse-input.sh +127 -0
  111. package/templates/hook-packs/claude-code/lib/run-handlers.sh +212 -0
  112. package/templates/hook-packs/claude-code/reset-danger-latch.sh +21 -0
  113. package/templates/hook-packs/claude-code/reset-strikes.sh +243 -0
  114. package/templates/hook-packs/claude-code/runtime-paths.sh +80 -0
  115. package/templates/hook-packs/claude-code/scope-guard.sh +392 -0
  116. package/templates/hook-packs/claude-code/session-caws-status.sh +171 -0
  117. package/templates/hook-packs/claude-code/session-log.sh +180 -0
  118. package/templates/hook-packs/claude-code/worktree-guard.sh +240 -0
  119. package/templates/hook-packs/claude-code/worktree-write-guard.sh +77 -0
@@ -0,0 +1,506 @@
1
+ "use strict";
2
+ // Spec lifecycle writer.
3
+ //
4
+ // CLI-SPECS-001: store-layer mutations for spec lifecycle. Composes
5
+ // lifecycle-transaction + yaml-patch + appendEvent into typed lifecycle
6
+ // operations:
7
+ //
8
+ // createSpec — write a new .caws/specs/<id>.yaml (active) + spec_created
9
+ // closeSpec — raw-byte patch lifecycle_state/resolution/closure_notes
10
+ // /updated_at on existing spec + spec_closed
11
+ // archiveSpec — move .caws/specs/<id>.yaml → .caws/specs/.archive/<id>.yaml,
12
+ // patch lifecycle_state → archived + spec_archived
13
+ //
14
+ // Every operation:
15
+ // - acquires the lifecycle lock
16
+ // - validates plan via kernel (parseAndValidateSpec on planned bytes)
17
+ // - performs writes through atomicWrite with preserveMode
18
+ // - appends events through appendEvent (the SOLE v11 events writer)
19
+ // - rolls back on failure with typed partial-failure outcomes
20
+ //
21
+ // What this module does NOT do:
22
+ // - CLI argument parsing (that's in shell/commands/specs.ts)
23
+ // - Rendering (shell layer)
24
+ // - Concurrent worktree mutations (Slice 6 surface)
25
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ var desc = Object.getOwnPropertyDescriptor(m, k);
28
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
29
+ desc = { enumerable: true, get: function() { return m[k]; } };
30
+ }
31
+ Object.defineProperty(o, k2, desc);
32
+ }) : (function(o, m, k, k2) {
33
+ if (k2 === undefined) k2 = k;
34
+ o[k2] = m[k];
35
+ }));
36
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
37
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
38
+ }) : function(o, v) {
39
+ o["default"] = v;
40
+ });
41
+ var __importStar = (this && this.__importStar) || (function () {
42
+ var ownKeys = function(o) {
43
+ ownKeys = Object.getOwnPropertyNames || function (o) {
44
+ var ar = [];
45
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
46
+ return ar;
47
+ };
48
+ return ownKeys(o);
49
+ };
50
+ return function (mod) {
51
+ if (mod && mod.__esModule) return mod;
52
+ var result = {};
53
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
54
+ __setModuleDefault(result, mod);
55
+ return result;
56
+ };
57
+ })();
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.createSpec = createSpec;
60
+ exports.closeSpec = closeSpec;
61
+ exports.archiveSpec = archiveSpec;
62
+ exports.listSpecs = listSpecs;
63
+ exports.showSpec = showSpec;
64
+ const fs = __importStar(require("fs"));
65
+ const path = __importStar(require("path"));
66
+ const caws_kernel_1 = require("@paths.design/caws-kernel");
67
+ const events_store_1 = require("./events-store");
68
+ const lifecycle_transaction_1 = require("./lifecycle-transaction");
69
+ const lifecycle_lock_1 = require("./lifecycle-lock");
70
+ const repo_root_1 = require("./repo-root");
71
+ const rules_1 = require("./rules");
72
+ const specs_store_1 = require("./specs-store");
73
+ const yaml_patch_1 = require("./yaml-patch");
74
+ const yaml_store_1 = require("./yaml-store");
75
+ // ─── Path helpers ────────────────────────────────────────────────────────
76
+ function specPath(cawsDir, id) {
77
+ return path.join(cawsDir, 'specs', `${id}.yaml`);
78
+ }
79
+ function archivedSpecPath(cawsDir, id) {
80
+ return path.join(cawsDir, 'specs', '.archive', `${id}.yaml`);
81
+ }
82
+ /** Find a spec on disk under either active or archived locations. */
83
+ function findSpecPath(cawsDir, id) {
84
+ const active = specPath(cawsDir, id);
85
+ if (fs.existsSync(active))
86
+ return active;
87
+ const archived = archivedSpecPath(cawsDir, id);
88
+ if (fs.existsSync(archived))
89
+ return archived;
90
+ return null;
91
+ }
92
+ // ─── ID validation (mirrors kernel regex) ────────────────────────────────
93
+ const SPEC_ID_PATTERN = /^[A-Z][A-Z0-9]*(-[A-Z0-9]+)*-\d+[a-z]*$/;
94
+ function validateSpecId(id) {
95
+ if (typeof id !== 'string' || id.length === 0) {
96
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, 'Spec id is required.', { subject: 'id' }));
97
+ }
98
+ if (!SPEC_ID_PATTERN.test(id)) {
99
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec id "${id}" does not match the v11 pattern (e.g., FEAT-001, CLI-SPECS-001).`, { subject: id, data: { pattern: SPEC_ID_PATTERN.source } }));
100
+ }
101
+ return (0, caws_kernel_1.ok)(true);
102
+ }
103
+ // ─── Spec rendering for create ───────────────────────────────────────────
104
+ function renderInitialSpecYaml(input) {
105
+ const now = (input.now ?? (() => new Date()))().toISOString();
106
+ const state = input.initialState ?? 'active';
107
+ // Render a minimum-viable v11 spec. Plain-string fields are
108
+ // single-quoted to be defensive against embedded colons. The body
109
+ // is intentionally minimal but satisfies the kernel's structural
110
+ // requirements (non-empty arrays where the schema demands them).
111
+ // The user fills in concrete values before iteration.
112
+ return [
113
+ `id: ${input.id}`,
114
+ `title: '${input.title.replace(/'/g, "''")}'`,
115
+ `risk_tier: ${input.riskTier}`,
116
+ `mode: ${input.mode}`,
117
+ `lifecycle_state: ${state}`,
118
+ `created_at: '${now}'`,
119
+ `updated_at: '${now}'`,
120
+ `blast_radius:`,
121
+ ` modules:`,
122
+ ` - 'TODO: list one or more modules this spec touches.'`,
123
+ ` data_migration: false`,
124
+ `operational_rollback_slo: 5m`,
125
+ `scope:`,
126
+ ` in:`,
127
+ ` - 'TODO: list the file(s) or directories this spec authorizes.'`,
128
+ ` out: []`,
129
+ `invariants:`,
130
+ ` - 'TODO: describe one invariant this spec guarantees.'`,
131
+ `acceptance:`,
132
+ ` - id: A1`,
133
+ ` given: 'TODO'`,
134
+ ` when: 'TODO'`,
135
+ ` then: 'TODO'`,
136
+ `non_functional: {}`,
137
+ `contracts: []`,
138
+ ``,
139
+ ].join('\n');
140
+ }
141
+ // ─── createSpec ──────────────────────────────────────────────────────────
142
+ function createSpec(cawsDir, input) {
143
+ const idValidation = validateSpecId(input.id);
144
+ if (!idValidation.ok)
145
+ return idValidation;
146
+ // Refuse duplicate ids (in either active or archived location).
147
+ const existing = findSpecPath(cawsDir, input.id);
148
+ if (existing !== null) {
149
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" already exists at ${existing}.`, { subject: input.id, data: { existing_path: existing } }));
150
+ }
151
+ const targetPath = specPath(cawsDir, input.id);
152
+ const newBytes = renderInitialSpecYaml(input);
153
+ // Validate the planned YAML through the kernel BEFORE we write or
154
+ // append events.
155
+ const parsed = (0, caws_kernel_1.parseAndValidateSpec)(newBytes);
156
+ if (!(0, caws_kernel_1.isOk)(parsed)) {
157
+ return (0, caws_kernel_1.err)(parsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
158
+ subject: d.subject ?? input.id,
159
+ data: { source_rule: d.rule },
160
+ })));
161
+ }
162
+ const now = (input.now ?? (() => new Date()))().toISOString();
163
+ const event = {
164
+ event: 'spec_created',
165
+ ts: now,
166
+ actor: input.actor,
167
+ spec_id: input.id,
168
+ data: {
169
+ title: input.title,
170
+ risk_tier: input.riskTier,
171
+ mode: input.mode,
172
+ lifecycle_state: input.initialState ?? 'active',
173
+ },
174
+ };
175
+ const txnResult = (0, lifecycle_lock_1.withLifecycleLock)(cawsDir, () => (0, lifecycle_transaction_1.runLifecycleTransaction)({
176
+ cawsDir,
177
+ plannedWrites: [{ path: targetPath, contents: newBytes }],
178
+ events: [event],
179
+ }));
180
+ if (!txnResult.ok) {
181
+ return (0, caws_kernel_1.err)(txnResult.errors);
182
+ }
183
+ return mapTxnToOutcome(txnResult.value, input.id, targetPath);
184
+ }
185
+ // ─── closeSpec ───────────────────────────────────────────────────────────
186
+ function closeSpec(cawsDir, input) {
187
+ const idValidation = validateSpecId(input.id);
188
+ if (!idValidation.ok)
189
+ return idValidation;
190
+ const targetPath = specPath(cawsDir, input.id);
191
+ if (!fs.existsSync(targetPath)) {
192
+ // Check archive too — if it's already archived, this is a different
193
+ // kind of error than "not found."
194
+ const archived = archivedSpecPath(cawsDir, input.id);
195
+ if (fs.existsSync(archived)) {
196
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" is archived; cannot close (legal transitions: active → closed → archived).`, { subject: input.id }));
197
+ }
198
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" not found at ${targetPath}.`, { subject: input.id }));
199
+ }
200
+ // Load and verify the current state.
201
+ const sourceResult = (0, yaml_store_1.readYamlSource)(targetPath);
202
+ if (!(0, caws_kernel_1.isOk)(sourceResult))
203
+ return (0, caws_kernel_1.err)(sourceResult.errors);
204
+ const originalBytes = sourceResult.value;
205
+ const parsed = (0, caws_kernel_1.parseAndValidateSpec)(originalBytes);
206
+ if (!(0, caws_kernel_1.isOk)(parsed)) {
207
+ return (0, caws_kernel_1.err)(parsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
208
+ subject: d.subject ?? input.id,
209
+ data: { source_rule: d.rule },
210
+ })));
211
+ }
212
+ const spec = parsed.value;
213
+ if (spec.lifecycle_state !== 'active') {
214
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" is in lifecycle_state "${spec.lifecycle_state}"; only active specs can be closed.`, { subject: input.id, data: { current_state: spec.lifecycle_state } }));
215
+ }
216
+ // Raw-byte patch sequence:
217
+ // 1. lifecycle_state → closed
218
+ // 2. insert resolution after lifecycle_state
219
+ // 3. if reason: insert closure_notes after resolution
220
+ // 4. updated_at → now
221
+ const now = (input.now ?? (() => new Date()))().toISOString();
222
+ let patched = originalBytes;
223
+ const step1 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'lifecycle_state', 'closed');
224
+ if (!step1.ok)
225
+ return (0, caws_kernel_1.err)(step1.errors);
226
+ patched = step1.value;
227
+ // Insert resolution after lifecycle_state. If resolution already
228
+ // exists (e.g., from a prior failed transaction), update it instead.
229
+ const hasResolution = /^resolution:/m.test(patched);
230
+ if (hasResolution) {
231
+ const step2 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'resolution', input.resolution);
232
+ if (!step2.ok)
233
+ return (0, caws_kernel_1.err)(step2.errors);
234
+ patched = step2.value;
235
+ }
236
+ else {
237
+ const step2 = (0, yaml_patch_1.insertTopLevelScalarAfter)(patched, 'lifecycle_state', 'resolution', input.resolution);
238
+ if (!step2.ok)
239
+ return (0, caws_kernel_1.err)(step2.errors);
240
+ patched = step2.value;
241
+ }
242
+ if (input.reason !== undefined && input.reason.length > 0) {
243
+ const escaped = `'${input.reason.replace(/'/g, "''")}'`;
244
+ const hasNotes = /^closure_notes:/m.test(patched);
245
+ if (hasNotes) {
246
+ const step3 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'closure_notes', escaped);
247
+ if (!step3.ok)
248
+ return (0, caws_kernel_1.err)(step3.errors);
249
+ patched = step3.value;
250
+ }
251
+ else {
252
+ const step3 = (0, yaml_patch_1.insertTopLevelScalarAfter)(patched, 'resolution', 'closure_notes', escaped);
253
+ if (!step3.ok)
254
+ return (0, caws_kernel_1.err)(step3.errors);
255
+ patched = step3.value;
256
+ }
257
+ }
258
+ const step4 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'updated_at', `'${now}'`);
259
+ if (!step4.ok)
260
+ return (0, caws_kernel_1.err)(step4.errors);
261
+ patched = step4.value;
262
+ // Validate the patched bytes through the kernel before write.
263
+ const reparsed = (0, caws_kernel_1.parseAndValidateSpec)(patched);
264
+ if (!(0, caws_kernel_1.isOk)(reparsed)) {
265
+ return (0, caws_kernel_1.err)(reparsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
266
+ subject: d.subject ?? input.id,
267
+ data: { source_rule: d.rule, hint: 'planned-bytes validation failed' },
268
+ })));
269
+ }
270
+ const eventData = { resolution: input.resolution };
271
+ if (input.reason !== undefined && input.reason.length > 0) {
272
+ eventData.closure_notes = input.reason;
273
+ }
274
+ if (input.mergeCommit !== undefined)
275
+ eventData.merge_commit = input.mergeCommit;
276
+ if (input.supersededBy !== undefined)
277
+ eventData.superseded_by = input.supersededBy;
278
+ const event = {
279
+ event: 'spec_closed',
280
+ ts: now,
281
+ actor: input.actor,
282
+ spec_id: input.id,
283
+ data: eventData,
284
+ };
285
+ const txnResult = (0, lifecycle_lock_1.withLifecycleLock)(cawsDir, () => (0, lifecycle_transaction_1.runLifecycleTransaction)({
286
+ cawsDir,
287
+ plannedWrites: [{ path: targetPath, contents: patched }],
288
+ events: [event],
289
+ }));
290
+ if (!txnResult.ok) {
291
+ return (0, caws_kernel_1.err)(txnResult.errors);
292
+ }
293
+ return mapTxnToOutcome(txnResult.value, input.id, targetPath);
294
+ }
295
+ // ─── archiveSpec ─────────────────────────────────────────────────────────
296
+ function archiveSpec(cawsDir, input) {
297
+ const idValidation = validateSpecId(input.id);
298
+ if (!idValidation.ok)
299
+ return idValidation;
300
+ const fromPath = specPath(cawsDir, input.id);
301
+ if (!fs.existsSync(fromPath)) {
302
+ const archived = archivedSpecPath(cawsDir, input.id);
303
+ if (fs.existsSync(archived)) {
304
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" is already archived at ${archived}.`, { subject: input.id }));
305
+ }
306
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" not found at ${fromPath}.`, { subject: input.id }));
307
+ }
308
+ // Validate current state: must be closed.
309
+ const sourceResult = (0, yaml_store_1.readYamlSource)(fromPath);
310
+ if (!(0, caws_kernel_1.isOk)(sourceResult))
311
+ return (0, caws_kernel_1.err)(sourceResult.errors);
312
+ const originalBytes = sourceResult.value;
313
+ const parsed = (0, caws_kernel_1.parseAndValidateSpec)(originalBytes);
314
+ if (!(0, caws_kernel_1.isOk)(parsed)) {
315
+ return (0, caws_kernel_1.err)(parsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
316
+ subject: d.subject ?? input.id,
317
+ data: { source_rule: d.rule },
318
+ })));
319
+ }
320
+ const spec = parsed.value;
321
+ if (spec.lifecycle_state !== 'closed') {
322
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${input.id}" is in lifecycle_state "${spec.lifecycle_state}"; only closed specs can be archived.`, { subject: input.id, data: { current_state: spec.lifecycle_state } }));
323
+ }
324
+ const now = (input.now ?? (() => new Date()))().toISOString();
325
+ const toPath = archivedSpecPath(cawsDir, input.id);
326
+ // Patch lifecycle_state → archived and bump updated_at on a copy.
327
+ let patched = originalBytes;
328
+ const s1 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'lifecycle_state', 'archived');
329
+ if (!s1.ok)
330
+ return (0, caws_kernel_1.err)(s1.errors);
331
+ patched = s1.value;
332
+ const s2 = (0, yaml_patch_1.setTopLevelScalar)(patched, 'updated_at', `'${now}'`);
333
+ if (!s2.ok)
334
+ return (0, caws_kernel_1.err)(s2.errors);
335
+ patched = s2.value;
336
+ // Validate.
337
+ const reparsed = (0, caws_kernel_1.parseAndValidateSpec)(patched);
338
+ if (!(0, caws_kernel_1.isOk)(reparsed)) {
339
+ return (0, caws_kernel_1.err)(reparsed.errors.map((d) => (0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, d.message, {
340
+ subject: d.subject ?? input.id,
341
+ data: { source_rule: d.rule, hint: 'planned-bytes validation failed' },
342
+ })));
343
+ }
344
+ // Ensure the archive dir exists. fs.renameSync requires it.
345
+ try {
346
+ fs.mkdirSync(path.dirname(toPath), { recursive: true });
347
+ }
348
+ catch (e) {
349
+ const cause = e;
350
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_WRITE_FAILED, `Failed to create archive directory: ${cause.message ?? 'unknown'}.`, { subject: path.dirname(toPath) }));
351
+ }
352
+ // Filesystem-move pattern: we write the patched bytes to the new
353
+ // path via the transaction, then delete the source. The transaction
354
+ // doesn't model moves natively, so we do this in two phases inside
355
+ // the same lock:
356
+ // 1. lifecycle-transaction: write toPath + append spec_archived
357
+ // 2. AFTER transaction success: unlink fromPath
358
+ //
359
+ // If step 2 fails, we surface the partial-failure but the audit log
360
+ // already records the move intent. The next doctor pass will see
361
+ // the spec in BOTH locations and surface that as a doctor finding.
362
+ const fromRel = path.relative(path.join(cawsDir, '..'), fromPath);
363
+ const toRel = path.relative(path.join(cawsDir, '..'), toPath);
364
+ const event = {
365
+ event: 'spec_archived',
366
+ ts: now,
367
+ actor: input.actor,
368
+ spec_id: input.id,
369
+ data: { from_path: fromRel, to_path: toRel },
370
+ };
371
+ // Capture original bytes so we can roll back the unlink in
372
+ // emergencies (rare but worth tracking).
373
+ let unlinkOk = false;
374
+ let unlinkError = null;
375
+ const txnResult = (0, lifecycle_lock_1.withLifecycleLock)(cawsDir, () => {
376
+ const r = (0, lifecycle_transaction_1.runLifecycleTransaction)({
377
+ cawsDir,
378
+ plannedWrites: [{ path: toPath, contents: patched }],
379
+ events: [event],
380
+ });
381
+ if (!r.ok)
382
+ return r;
383
+ if (r.value.kind !== 'success')
384
+ return r;
385
+ // Transaction wrote toPath + appended event. Now remove fromPath.
386
+ try {
387
+ fs.unlinkSync(fromPath);
388
+ unlinkOk = true;
389
+ }
390
+ catch (e) {
391
+ const cause = e;
392
+ unlinkError = cause.message ?? 'unknown unlink error';
393
+ }
394
+ return r;
395
+ });
396
+ // Reason flows into closure_notes ONLY if the user passed one; archive
397
+ // event schema does NOT take closure_notes, but we attach the reason
398
+ // to a follow-up evidence record path in future versions. For v11.1
399
+ // archive, we accept the --reason for parity with close but the
400
+ // schema does not carry it.
401
+ void input.reason;
402
+ if (!txnResult.ok) {
403
+ return (0, caws_kernel_1.err)(txnResult.errors);
404
+ }
405
+ if (txnResult.value.kind !== 'success') {
406
+ return (0, caws_kernel_1.ok)({
407
+ kind: 'partial_failure_recovered',
408
+ cause: txnResult.value.cause,
409
+ });
410
+ }
411
+ if (!unlinkOk) {
412
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PARTIAL_FAILURE_UNRECOVERED, `Archive write succeeded and spec_archived event appended, but original file unlink failed (${unlinkError}). Spec now exists in BOTH active and archived locations.`, {
413
+ subject: input.id,
414
+ data: {
415
+ from_path: fromPath,
416
+ to_path: toPath,
417
+ recovery_instruction: `Manually remove ${fromPath} once you've confirmed ${toPath} is intact.`,
418
+ },
419
+ }));
420
+ }
421
+ return (0, caws_kernel_1.ok)({ kind: 'success', id: input.id, path: toPath });
422
+ }
423
+ // ─── Outcome mapper ──────────────────────────────────────────────────────
424
+ function mapTxnToOutcome(result, id, targetPath) {
425
+ if (result.kind === 'success') {
426
+ return (0, caws_kernel_1.ok)({ kind: 'success', id, path: targetPath });
427
+ }
428
+ if (result.kind === 'partial_failure_recovered') {
429
+ return (0, caws_kernel_1.ok)({ kind: 'partial_failure_recovered', cause: result.cause });
430
+ }
431
+ // partial_failure_unrecovered: this should already have surfaced as
432
+ // an Err from runLifecycleTransaction, but we map defensively.
433
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PARTIAL_FAILURE_UNRECOVERED, `Spec "${id}" lifecycle transaction left partial state.`, {
434
+ subject: id,
435
+ data: {
436
+ writes_completed: result.writesCompleted,
437
+ rolled_back: result.rolledBack,
438
+ rollback_failed: result.rollbackFailed,
439
+ recovery_instruction: result.recoveryInstruction,
440
+ },
441
+ }));
442
+ }
443
+ /** List specs by lifecycle state, optionally including archived ones. */
444
+ function listSpecs(cawsDir, options = {}) {
445
+ const activeResult = (0, specs_store_1.loadSpecs)(cawsDir);
446
+ const active = activeResult.specs.map((spec) => ({
447
+ id: spec.id,
448
+ title: spec.title,
449
+ lifecycle_state: spec.lifecycle_state,
450
+ path: specPath(cawsDir, spec.id),
451
+ }));
452
+ const archived = [];
453
+ if (options.includeArchived === true) {
454
+ const archiveDir = path.join(cawsDir, 'specs', '.archive');
455
+ if (fs.existsSync(archiveDir)) {
456
+ try {
457
+ const entries = fs.readdirSync(archiveDir, { withFileTypes: true });
458
+ for (const entry of entries) {
459
+ if (!entry.isFile())
460
+ continue;
461
+ if (!entry.name.endsWith('.yaml') && !entry.name.endsWith('.yml'))
462
+ continue;
463
+ const fullPath = path.join(archiveDir, entry.name);
464
+ const src = (0, yaml_store_1.readYamlSource)(fullPath);
465
+ if (!(0, caws_kernel_1.isOk)(src))
466
+ continue;
467
+ const parsed = (0, caws_kernel_1.parseAndValidateSpec)(src.value);
468
+ if (!(0, caws_kernel_1.isOk)(parsed))
469
+ continue;
470
+ const spec = parsed.value;
471
+ archived.push({
472
+ id: spec.id,
473
+ title: spec.title,
474
+ lifecycle_state: spec.lifecycle_state,
475
+ path: fullPath,
476
+ });
477
+ }
478
+ }
479
+ catch {
480
+ // Best-effort archive listing.
481
+ }
482
+ }
483
+ }
484
+ return (0, caws_kernel_1.ok)({ active, archived });
485
+ }
486
+ /** Find a spec by id under active or archive locations. */
487
+ function showSpec(cawsDir, id) {
488
+ const idValidation = validateSpecId(id);
489
+ if (!idValidation.ok)
490
+ return idValidation;
491
+ const fullPath = findSpecPath(cawsDir, id);
492
+ if (fullPath === null) {
493
+ return (0, caws_kernel_1.err)((0, repo_root_1.storeDiagnostic)(rules_1.STORE_RULES.LIFECYCLE_PLAN_REJECTED, `Spec "${id}" not found in .caws/specs/ or .caws/specs/.archive/.`, { subject: id }));
494
+ }
495
+ const sourceResult = (0, yaml_store_1.readYamlSource)(fullPath);
496
+ if (!(0, caws_kernel_1.isOk)(sourceResult))
497
+ return (0, caws_kernel_1.err)(sourceResult.errors);
498
+ const parsed = (0, caws_kernel_1.parseAndValidateSpec)(sourceResult.value);
499
+ if (!(0, caws_kernel_1.isOk)(parsed))
500
+ return (0, caws_kernel_1.err)(parsed.errors);
501
+ return (0, caws_kernel_1.ok)({ spec: parsed.value, path: fullPath, source: sourceResult.value });
502
+ }
503
+ // Unused import elimination: surface appendEvent so future direct-event
504
+ // flows (if any) compile against the same surface as evidence/waiver.
505
+ void events_store_1.appendEvent;
506
+ //# sourceMappingURL=specs-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs-writer.js","sourceRoot":"","sources":["../../src/store/specs-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { type EventBody, type Result, type SessionIdentity, type Diagnostic } from '@paths.design/caws-kernel';
2
+ import { loadSpecs } from './specs-store';
3
+ export interface CreateWorktreeInput {
4
+ readonly name: string;
5
+ readonly specId: string;
6
+ /** Optional: base branch for the new worktree. Defaults to repo HEAD's
7
+ * current branch. */
8
+ readonly baseBranch?: string;
9
+ /** Optional: new branch name for the worktree. Defaults to the
10
+ * worktree name. */
11
+ readonly branch?: string;
12
+ readonly session: SessionIdentity;
13
+ readonly actor: EventBody['actor'];
14
+ readonly now?: () => Date;
15
+ }
16
+ export interface BindWorktreeInput {
17
+ readonly name: string;
18
+ readonly specId: string;
19
+ readonly session: SessionIdentity;
20
+ readonly actor: EventBody['actor'];
21
+ readonly now?: () => Date;
22
+ }
23
+ export interface DestroyWorktreeInput {
24
+ readonly name: string;
25
+ readonly session: SessionIdentity;
26
+ readonly actor: EventBody['actor'];
27
+ readonly now?: () => Date;
28
+ /** Allow destruction even when the branch is not merged into base.
29
+ * Default false. There is intentionally NO --force; this is the
30
+ * one explicit override and it does not bypass ownership. */
31
+ readonly abandonUnmerged?: boolean;
32
+ }
33
+ export interface MergeWorktreeInput {
34
+ readonly name: string;
35
+ readonly session: SessionIdentity;
36
+ readonly actor: EventBody['actor'];
37
+ readonly now?: () => Date;
38
+ /** When true, perform validation only; no git operations, no file
39
+ * writes, no event appends. */
40
+ readonly dryRun?: boolean;
41
+ /** Optional commit message for the merge commit. Defaults to a
42
+ * conventional "merge(worktree): <name>" form. */
43
+ readonly message?: string;
44
+ }
45
+ export type WorktreeWriterOutcome = {
46
+ readonly kind: 'success';
47
+ readonly name: string;
48
+ readonly action: 'created' | 'bound' | 'destroyed' | 'merged';
49
+ readonly data?: Record<string, unknown>;
50
+ } | {
51
+ readonly kind: 'dry_run';
52
+ readonly name: string;
53
+ readonly canProceed: boolean;
54
+ readonly findings: readonly string[];
55
+ } | {
56
+ readonly kind: 'partial_failure_recovered';
57
+ readonly cause: readonly Diagnostic[];
58
+ };
59
+ export declare function createWorktree(cawsDir: string, input: CreateWorktreeInput): Result<WorktreeWriterOutcome>;
60
+ export declare function bindWorktreeRepair(cawsDir: string, input: BindWorktreeInput): Result<WorktreeWriterOutcome>;
61
+ export declare function destroyWorktree(cawsDir: string, input: DestroyWorktreeInput): Result<WorktreeWriterOutcome>;
62
+ export declare function mergeWorktree(cawsDir: string, input: MergeWorktreeInput): Result<WorktreeWriterOutcome>;
63
+ export interface WorktreeListEntry {
64
+ readonly name: string;
65
+ readonly path: string;
66
+ readonly branch: string;
67
+ readonly baseBranch: string;
68
+ readonly specId: string | null;
69
+ readonly owner: SessionIdentity | null;
70
+ readonly status: 'active' | 'unknown';
71
+ }
72
+ export interface WorktreeListResult {
73
+ readonly entries: readonly WorktreeListEntry[];
74
+ }
75
+ export declare function listWorktreesPretty(cawsDir: string): Result<WorktreeListResult>;
76
+ export { loadSpecs };
77
+ //# sourceMappingURL=worktrees-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktrees-writer.d.ts","sourceRoot":"","sources":["../../src/store/worktrees-writer.ts"],"names":[],"mappings":"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"}