@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.
- package/README.md +2 -2
- package/dist/index.js +2 -2
- package/dist/init/harness-detect.d.ts +18 -0
- package/dist/init/harness-detect.d.ts.map +1 -0
- package/dist/init/harness-detect.js +90 -0
- package/dist/init/harness-detect.js.map +1 -0
- package/dist/init/hook-install.d.ts +53 -0
- package/dist/init/hook-install.d.ts.map +1 -0
- package/dist/init/hook-install.js +421 -0
- package/dist/init/hook-install.js.map +1 -0
- package/dist/init/hook-packs/manifest-claude-code.d.ts +4 -0
- package/dist/init/hook-packs/manifest-claude-code.d.ts.map +1 -0
- package/dist/init/hook-packs/manifest-claude-code.js +190 -0
- package/dist/init/hook-packs/manifest-claude-code.js.map +1 -0
- package/dist/init/hook-packs/register.d.ts +19 -0
- package/dist/init/hook-packs/register.d.ts.map +1 -0
- package/dist/init/hook-packs/register.js +37 -0
- package/dist/init/hook-packs/register.js.map +1 -0
- package/dist/init/hook-packs/types.d.ts +123 -0
- package/dist/init/hook-packs/types.d.ts.map +1 -0
- package/dist/init/hook-packs/types.js +29 -0
- package/dist/init/hook-packs/types.js.map +1 -0
- package/dist/shell/commands/gates.d.ts.map +1 -1
- package/dist/shell/commands/gates.js +28 -1
- package/dist/shell/commands/gates.js.map +1 -1
- package/dist/shell/commands/init.d.ts +9 -0
- package/dist/shell/commands/init.d.ts.map +1 -1
- package/dist/shell/commands/init.js +131 -27
- package/dist/shell/commands/init.js.map +1 -1
- package/dist/shell/commands/specs.d.ts +41 -0
- package/dist/shell/commands/specs.d.ts.map +1 -0
- package/dist/shell/commands/specs.js +264 -0
- package/dist/shell/commands/specs.js.map +1 -0
- package/dist/shell/commands/worktree.d.ts +38 -0
- package/dist/shell/commands/worktree.d.ts.map +1 -0
- package/dist/shell/commands/worktree.js +286 -0
- package/dist/shell/commands/worktree.js.map +1 -0
- package/dist/shell/gates/disposition.d.ts.map +1 -1
- package/dist/shell/gates/disposition.js +33 -3
- package/dist/shell/gates/disposition.js.map +1 -1
- package/dist/shell/gates/local-evaluators/budget-limit.d.ts +24 -0
- package/dist/shell/gates/local-evaluators/budget-limit.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/budget-limit.js +67 -0
- package/dist/shell/gates/local-evaluators/budget-limit.js.map +1 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.d.ts +25 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.js +74 -0
- package/dist/shell/gates/local-evaluators/diff-helpers.js.map +1 -0
- package/dist/shell/gates/local-evaluators/index.d.ts +28 -0
- package/dist/shell/gates/local-evaluators/index.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/index.js +67 -0
- package/dist/shell/gates/local-evaluators/index.js.map +1 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.d.ts +23 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.js +67 -0
- package/dist/shell/gates/local-evaluators/scope-boundary.js.map +1 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.d.ts +12 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.d.ts.map +1 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.js +73 -0
- package/dist/shell/gates/local-evaluators/spec-completeness.js.map +1 -0
- package/dist/shell/index.d.ts +4 -0
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +13 -1
- package/dist/shell/index.js.map +1 -1
- package/dist/shell/register.d.ts.map +1 -1
- package/dist/shell/register.js +192 -2
- package/dist/shell/register.js.map +1 -1
- package/dist/shell/render/init-hook-pack.d.ts +16 -0
- package/dist/shell/render/init-hook-pack.d.ts.map +1 -0
- package/dist/shell/render/init-hook-pack.js +206 -0
- package/dist/shell/render/init-hook-pack.js.map +1 -0
- package/dist/store/atomic-write.d.ts +20 -2
- package/dist/store/atomic-write.d.ts.map +1 -1
- package/dist/store/atomic-write.js +44 -2
- package/dist/store/atomic-write.js.map +1 -1
- package/dist/store/lifecycle-lock.d.ts +34 -0
- package/dist/store/lifecycle-lock.d.ts.map +1 -0
- package/dist/store/lifecycle-lock.js +168 -0
- package/dist/store/lifecycle-lock.js.map +1 -0
- package/dist/store/lifecycle-transaction.d.ts +79 -0
- package/dist/store/lifecycle-transaction.d.ts.map +1 -0
- package/dist/store/lifecycle-transaction.js +319 -0
- package/dist/store/lifecycle-transaction.js.map +1 -0
- package/dist/store/rules.d.ts +16 -0
- package/dist/store/rules.d.ts.map +1 -1
- package/dist/store/rules.js +17 -0
- package/dist/store/rules.js.map +1 -1
- package/dist/store/specs-writer.d.ts +61 -0
- package/dist/store/specs-writer.d.ts.map +1 -0
- package/dist/store/specs-writer.js +506 -0
- package/dist/store/specs-writer.js.map +1 -0
- package/dist/store/worktrees-writer.d.ts +77 -0
- package/dist/store/worktrees-writer.d.ts.map +1 -0
- package/dist/store/worktrees-writer.js +674 -0
- package/dist/store/worktrees-writer.js.map +1 -0
- package/dist/store/yaml-patch.d.ts +7 -0
- package/dist/store/yaml-patch.d.ts.map +1 -0
- package/dist/store/yaml-patch.js +250 -0
- package/dist/store/yaml-patch.js.map +1 -0
- package/package.json +7 -4
- package/templates/hook-packs/claude-code/CLAUDE.md +172 -0
- package/templates/hook-packs/claude-code/audit.sh +121 -0
- package/templates/hook-packs/claude-code/block-dangerous.sh +158 -0
- package/templates/hook-packs/claude-code/classify_command.py +1064 -0
- package/templates/hook-packs/claude-code/dispatch/post_tool_use.sh +63 -0
- package/templates/hook-packs/claude-code/dispatch/pre_tool_use.sh +50 -0
- package/templates/hook-packs/claude-code/dispatch/session_start.sh +41 -0
- package/templates/hook-packs/claude-code/dispatch/stop.sh +37 -0
- package/templates/hook-packs/claude-code/guard-strikes.sh +140 -0
- package/templates/hook-packs/claude-code/lib/parse-input.sh +127 -0
- package/templates/hook-packs/claude-code/lib/run-handlers.sh +212 -0
- package/templates/hook-packs/claude-code/reset-danger-latch.sh +21 -0
- package/templates/hook-packs/claude-code/reset-strikes.sh +243 -0
- package/templates/hook-packs/claude-code/runtime-paths.sh +80 -0
- package/templates/hook-packs/claude-code/scope-guard.sh +392 -0
- package/templates/hook-packs/claude-code/session-caws-status.sh +171 -0
- package/templates/hook-packs/claude-code/session-log.sh +180 -0
- package/templates/hook-packs/claude-code/worktree-guard.sh +240 -0
- 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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"}
|