@warpgogol/forge 0.28.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +16 -0
- package/README.md +4 -4
- package/README.uk.md +4 -4
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +34 -0
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/program/discovery.d.ts +61 -0
- package/dist/os/program/discovery.d.ts.map +1 -0
- package/dist/os/program/discovery.js +236 -0
- package/dist/os/program/discovery.js.map +1 -0
- package/dist/os/program/handlers/complete.d.ts +12 -0
- package/dist/os/program/handlers/complete.d.ts.map +1 -0
- package/dist/os/program/handlers/complete.js +344 -0
- package/dist/os/program/handlers/complete.js.map +1 -0
- package/dist/os/program/handlers/lease.d.ts +13 -0
- package/dist/os/program/handlers/lease.d.ts.map +1 -0
- package/dist/os/program/handlers/lease.js +322 -0
- package/dist/os/program/handlers/lease.js.map +1 -0
- package/dist/os/program/handlers/seal.d.ts +12 -0
- package/dist/os/program/handlers/seal.d.ts.map +1 -0
- package/dist/os/program/handlers/seal.js +265 -0
- package/dist/os/program/handlers/seal.js.map +1 -0
- package/dist/os/program/handlers/validate.d.ts +14 -0
- package/dist/os/program/handlers/validate.d.ts.map +1 -0
- package/dist/os/program/handlers/validate.js +164 -0
- package/dist/os/program/handlers/validate.js.map +1 -0
- package/dist/os/program/lease.d.ts +39 -0
- package/dist/os/program/lease.d.ts.map +1 -0
- package/dist/os/program/lease.js +129 -0
- package/dist/os/program/lease.js.map +1 -0
- package/dist/os/program/program.module.d.ts +3 -0
- package/dist/os/program/program.module.d.ts.map +1 -0
- package/dist/os/program/program.module.js +201 -0
- package/dist/os/program/program.module.js.map +1 -0
- package/dist/os/program/schemas.d.ts +225 -0
- package/dist/os/program/schemas.d.ts.map +1 -0
- package/dist/os/program/schemas.js +174 -0
- package/dist/os/program/schemas.js.map +1 -0
- package/dist/os/program/state.d.ts +38 -0
- package/dist/os/program/state.d.ts.map +1 -0
- package/dist/os/program/state.js +189 -0
- package/dist/os/program/state.js.map +1 -0
- package/dist/os/rfc/handlers/archive.d.ts +1 -0
- package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
- package/dist/os/rfc/handlers/archive.js +54 -0
- package/dist/os/rfc/handlers/archive.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/package.json +15 -15
- package/profiles/astro-typescript-turborepo.yaml +1 -1
- package/profiles/editframe.yaml +2 -2
- package/profiles/forge-shell.yaml +1 -1
- package/profiles/godot-csharp.yaml +388 -0
- package/profiles/phaser-turborepo.yaml +1 -1
- package/skills/fo/ef-onboard/SKILL.md +1 -1
- package/skills/fo/fo-idea/SKILL.md +2 -2
- package/skills/fo/fo-idea-implement/SKILL.md +1 -1
- package/skills/fo/fo-step-commit/SKILL.md +7 -5
- package/skills/shared/grilling/learned-principles.archive.md +212 -0
- package/skills/shared/grilling/learned-principles.md +0 -13
- package/skills/shared/grilling/qa-log.md +624 -0
- package/skills/shared/knowledge/learned-principles.md +99 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>Command handler for program.packet.lease — manages the exclusive
|
|
4
|
+
local executor lease for a sealed packet. Supports start, heartbeat, release,
|
|
5
|
+
and recover actions (RFC-0856).</purpose>
|
|
6
|
+
<non-goals>
|
|
7
|
+
<item>Do not store raw lease tokens — only the hash is persisted.</item>
|
|
8
|
+
<item>Do not commit — lease files are untracked.</item>
|
|
9
|
+
<item>Do not import from @warpgogol/* — forge must remain dependency-free.</item>
|
|
10
|
+
</non-goals>
|
|
11
|
+
</MODULE_CONTRACT>
|
|
12
|
+
<CHANGE_SUMMARY>
|
|
13
|
+
<item>RFC-0856: initial lease command handler.</item>
|
|
14
|
+
</CHANGE_SUMMARY>
|
|
15
|
+
*/
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
19
|
+
import { writeFileAtomic } from "../../../src/utils/fs-atomic.js";
|
|
20
|
+
import { discoverProgram, findPacketEntry, resolvePacketPath, parsePacketFile, gitHead, } from "../discovery.js";
|
|
21
|
+
import { generateLeaseToken, hashLeaseToken, readLease, writeLease, deleteLease, findActiveLeases, isLeaseStale, updateHeartbeat, } from "../lease.js";
|
|
22
|
+
import { validateLeaseStartTransition } from "../state.js";
|
|
23
|
+
const DEFAULT_TIMEOUT_SECONDS = 3600; // 1 hour
|
|
24
|
+
export async function runLease(input, context) {
|
|
25
|
+
const program = input.flags.program;
|
|
26
|
+
const packetId = input.flags.packet;
|
|
27
|
+
const action = input.flags.action;
|
|
28
|
+
if (!program || !packetId || !action) {
|
|
29
|
+
return leaseFail(program ?? "<missing>", packetId ?? "<missing>", action ?? "<missing>", [
|
|
30
|
+
{ rule: "PROGRAM-PACKET-01", message: "--program, --packet, and --action are required" },
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
switch (action) {
|
|
34
|
+
case "start":
|
|
35
|
+
return leaseStart(input, context, program, packetId);
|
|
36
|
+
case "heartbeat":
|
|
37
|
+
return leaseHeartbeat(context, program, packetId, input);
|
|
38
|
+
case "release":
|
|
39
|
+
return leaseRelease(context, program, packetId, input);
|
|
40
|
+
case "recover":
|
|
41
|
+
return leaseRecover(input, context, program, packetId);
|
|
42
|
+
default:
|
|
43
|
+
return leaseFail(program, packetId, action, [
|
|
44
|
+
{ rule: "PROGRAM-PACKET-01", message: `unknown action: ${action}` },
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// start
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
async function leaseStart(input, context, program, packetId) {
|
|
52
|
+
const executor = input.flags.executor;
|
|
53
|
+
if (!executor) {
|
|
54
|
+
return leaseFail(program, packetId, "start", [
|
|
55
|
+
{ rule: "PROGRAM-PACKET-01", message: "--executor is required for --action=start" },
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
const phase = input.flags.phase ?? "execution";
|
|
59
|
+
const { workspaceRoot } = context;
|
|
60
|
+
// Discover program
|
|
61
|
+
let programLocation;
|
|
62
|
+
try {
|
|
63
|
+
programLocation = discoverProgram(workspaceRoot, program);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return leaseFail(program, packetId, "start", [
|
|
67
|
+
{ rule: "PROGRAM-PACKET-01", message: String(err.message) },
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
if (!programLocation) {
|
|
71
|
+
return leaseFail(program, packetId, "start", [
|
|
72
|
+
{ rule: "PROGRAM-PACKET-01", message: `program ${program} not found` },
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
const { manifest, programDir } = programLocation;
|
|
76
|
+
const entry = findPacketEntry(manifest, packetId);
|
|
77
|
+
if (!entry) {
|
|
78
|
+
return leaseFail(program, packetId, "start", [
|
|
79
|
+
{ rule: "PROGRAM-PACKET-01", message: `packet ${packetId} not found` },
|
|
80
|
+
]);
|
|
81
|
+
}
|
|
82
|
+
let packet;
|
|
83
|
+
try {
|
|
84
|
+
packet = parsePacketFile(resolvePacketPath(programDir, entry));
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return leaseFail(program, packetId, "start", [
|
|
88
|
+
{ rule: "PROGRAM-PACKET-01", message: String(err.message) },
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
// Check for existing leases
|
|
92
|
+
const activeLeases = findActiveLeases(workspaceRoot, program);
|
|
93
|
+
const hasActiveLease = activeLeases.some((l) => l.packetId === packetId && !isLeaseStale(l.lease));
|
|
94
|
+
let head = "";
|
|
95
|
+
try {
|
|
96
|
+
head = gitHead(workspaceRoot);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return leaseFail(program, packetId, "start", [
|
|
100
|
+
{ rule: "PROGRAM-PACKET-02", message: "failed to read git HEAD" },
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
const violations = validateLeaseStartTransition(manifest, entry, packet, {
|
|
104
|
+
head,
|
|
105
|
+
steward: packet.steward,
|
|
106
|
+
actor: executor,
|
|
107
|
+
hasActiveLease,
|
|
108
|
+
});
|
|
109
|
+
if (violations.length > 0) {
|
|
110
|
+
return leaseFail(program, packetId, "start", violations);
|
|
111
|
+
}
|
|
112
|
+
// Generate lease
|
|
113
|
+
const rawToken = generateLeaseToken();
|
|
114
|
+
const tokenHash = hashLeaseToken(rawToken);
|
|
115
|
+
const now = new Date().toISOString();
|
|
116
|
+
const lease = {
|
|
117
|
+
schema: "forge/program-packet-lease@1",
|
|
118
|
+
program,
|
|
119
|
+
packetId,
|
|
120
|
+
phase: phase,
|
|
121
|
+
actor: executor,
|
|
122
|
+
baseCommit: head,
|
|
123
|
+
sealCommit: entry.sealCommit ?? null,
|
|
124
|
+
tokenHash,
|
|
125
|
+
startedAt: now,
|
|
126
|
+
heartbeatAt: now,
|
|
127
|
+
timeoutSeconds: DEFAULT_TIMEOUT_SECONDS,
|
|
128
|
+
};
|
|
129
|
+
writeLease(workspaceRoot, program, lease);
|
|
130
|
+
// Return raw token ONLY in data.leaseToken — never in logs.
|
|
131
|
+
return {
|
|
132
|
+
data: {
|
|
133
|
+
command: "program.packet.lease",
|
|
134
|
+
status: "pass",
|
|
135
|
+
program,
|
|
136
|
+
packetId,
|
|
137
|
+
action: "start",
|
|
138
|
+
leaseToken: rawToken,
|
|
139
|
+
violations: [],
|
|
140
|
+
},
|
|
141
|
+
exitCode: 0,
|
|
142
|
+
summary: `program.packet.lease: ${packetId} lease started for ${executor}`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// heartbeat
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
async function leaseHeartbeat(context, program, packetId, input) {
|
|
149
|
+
const leaseToken = input.flags["lease-token"];
|
|
150
|
+
if (!leaseToken) {
|
|
151
|
+
return leaseFail(program, packetId, "heartbeat", [
|
|
152
|
+
{ rule: "PROGRAM-PACKET-01", message: "--lease-token is required for --action=heartbeat" },
|
|
153
|
+
]);
|
|
154
|
+
}
|
|
155
|
+
const { workspaceRoot } = context;
|
|
156
|
+
const existing = readLease(workspaceRoot, program, packetId);
|
|
157
|
+
if (!existing) {
|
|
158
|
+
return leaseFail(program, packetId, "heartbeat", [
|
|
159
|
+
{ rule: "PROGRAM-PACKET-05", message: "no lease found" },
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
const tokenHash = hashLeaseToken(leaseToken);
|
|
163
|
+
if (tokenHash !== existing.tokenHash) {
|
|
164
|
+
return leaseFail(program, packetId, "heartbeat", [
|
|
165
|
+
{ rule: "PROGRAM-PACKET-11", message: "token mismatch" },
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
updateHeartbeat(workspaceRoot, program, packetId);
|
|
169
|
+
return {
|
|
170
|
+
data: {
|
|
171
|
+
command: "program.packet.lease",
|
|
172
|
+
status: "pass",
|
|
173
|
+
program,
|
|
174
|
+
packetId,
|
|
175
|
+
action: "heartbeat",
|
|
176
|
+
violations: [],
|
|
177
|
+
},
|
|
178
|
+
exitCode: 0,
|
|
179
|
+
summary: `program.packet.lease: ${packetId} heartbeat updated`,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// release
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
async function leaseRelease(context, program, packetId, input) {
|
|
186
|
+
const leaseToken = input.flags["lease-token"];
|
|
187
|
+
if (!leaseToken) {
|
|
188
|
+
return leaseFail(program, packetId, "release", [
|
|
189
|
+
{ rule: "PROGRAM-PACKET-01", message: "--lease-token is required for --action=release" },
|
|
190
|
+
]);
|
|
191
|
+
}
|
|
192
|
+
const { workspaceRoot } = context;
|
|
193
|
+
const existing = readLease(workspaceRoot, program, packetId);
|
|
194
|
+
if (!existing) {
|
|
195
|
+
return leaseFail(program, packetId, "release", [
|
|
196
|
+
{ rule: "PROGRAM-PACKET-05", message: "no lease found" },
|
|
197
|
+
]);
|
|
198
|
+
}
|
|
199
|
+
const tokenHash = hashLeaseToken(leaseToken);
|
|
200
|
+
if (tokenHash !== existing.tokenHash) {
|
|
201
|
+
return leaseFail(program, packetId, "release", [
|
|
202
|
+
{ rule: "PROGRAM-PACKET-11", message: "token mismatch" },
|
|
203
|
+
]);
|
|
204
|
+
}
|
|
205
|
+
deleteLease(workspaceRoot, program, packetId);
|
|
206
|
+
return {
|
|
207
|
+
data: {
|
|
208
|
+
command: "program.packet.lease",
|
|
209
|
+
status: "pass",
|
|
210
|
+
program,
|
|
211
|
+
packetId,
|
|
212
|
+
action: "release",
|
|
213
|
+
violations: [],
|
|
214
|
+
},
|
|
215
|
+
exitCode: 0,
|
|
216
|
+
summary: `program.packet.lease: ${packetId} lease released`,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// recover
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
async function leaseRecover(input, context, program, packetId) {
|
|
223
|
+
const steward = input.flags.steward;
|
|
224
|
+
const reason = input.flags.reason;
|
|
225
|
+
if (!steward || !reason) {
|
|
226
|
+
return leaseFail(program, packetId, "recover", [
|
|
227
|
+
{
|
|
228
|
+
rule: "PROGRAM-PACKET-01",
|
|
229
|
+
message: "--steward and --reason are required for --action=recover",
|
|
230
|
+
},
|
|
231
|
+
]);
|
|
232
|
+
}
|
|
233
|
+
const { workspaceRoot } = context;
|
|
234
|
+
const existing = readLease(workspaceRoot, program, packetId);
|
|
235
|
+
if (!existing) {
|
|
236
|
+
return leaseFail(program, packetId, "recover", [
|
|
237
|
+
{ rule: "PROGRAM-PACKET-05", message: "no lease to recover" },
|
|
238
|
+
]);
|
|
239
|
+
}
|
|
240
|
+
// Only recover stale leases
|
|
241
|
+
if (!isLeaseStale(existing)) {
|
|
242
|
+
return leaseFail(program, packetId, "recover", [
|
|
243
|
+
{ rule: "PROGRAM-PACKET-05", message: "lease is not stale — cannot recover active lease" },
|
|
244
|
+
]);
|
|
245
|
+
}
|
|
246
|
+
// Write recovery record
|
|
247
|
+
const recoveryDir = path.join(workspaceRoot, "docs", "plans", programLocationDir(workspaceRoot, program), "recoveries");
|
|
248
|
+
fs.mkdirSync(recoveryDir, { recursive: true });
|
|
249
|
+
const head = gitHead(workspaceRoot);
|
|
250
|
+
const recovery = {
|
|
251
|
+
schema: "forge/program-packet-recovery@1",
|
|
252
|
+
program,
|
|
253
|
+
packetId,
|
|
254
|
+
previousLeaseDigest: existing.tokenHash,
|
|
255
|
+
reason,
|
|
256
|
+
actor: steward,
|
|
257
|
+
observedHead: head,
|
|
258
|
+
target: "blocked",
|
|
259
|
+
recoveredAt: new Date().toISOString(),
|
|
260
|
+
};
|
|
261
|
+
const recoveryPath = path.join(recoveryDir, `${packetId}-${Date.now()}.json`);
|
|
262
|
+
writeFileAtomic(recoveryPath, JSON.stringify(recovery, null, 2) + "\n");
|
|
263
|
+
// Delete the stale lease
|
|
264
|
+
deleteLease(workspaceRoot, program, packetId);
|
|
265
|
+
// Update manifest: packet state → blocked
|
|
266
|
+
const manifestPath = path.join(workspaceRoot, "docs", "plans", programLocationDir(workspaceRoot, program), "program.yaml");
|
|
267
|
+
const manifestRaw = fs.readFileSync(manifestPath, "utf8");
|
|
268
|
+
const manifestParsed = parseYaml(manifestRaw);
|
|
269
|
+
const idx = manifestParsed.packets.findIndex((p) => p.packetId === packetId);
|
|
270
|
+
if (idx !== -1) {
|
|
271
|
+
manifestParsed.packets[idx].state = "blocked";
|
|
272
|
+
writeFileAtomic(manifestPath, stringifyYaml(manifestParsed));
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
data: {
|
|
276
|
+
command: "program.packet.lease",
|
|
277
|
+
status: "pass",
|
|
278
|
+
program,
|
|
279
|
+
packetId,
|
|
280
|
+
action: "recover",
|
|
281
|
+
violations: [],
|
|
282
|
+
},
|
|
283
|
+
exitCode: 0,
|
|
284
|
+
summary: `program.packet.lease: ${packetId} recovered (stale lease cleared, recovery record written)`,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
// Helpers
|
|
289
|
+
// ---------------------------------------------------------------------------
|
|
290
|
+
function programLocationDir(workspaceRoot, program) {
|
|
291
|
+
// Find the directory name under docs/plans/ that contains this program
|
|
292
|
+
const plansDir = path.join(workspaceRoot, "docs", "plans");
|
|
293
|
+
if (!fs.existsSync(plansDir))
|
|
294
|
+
return program;
|
|
295
|
+
for (const entry of fs.readdirSync(plansDir, { withFileTypes: true })) {
|
|
296
|
+
if (!entry.isDirectory())
|
|
297
|
+
continue;
|
|
298
|
+
const manifestPath = path.join(plansDir, entry.name, "program.yaml");
|
|
299
|
+
if (!fs.existsSync(manifestPath))
|
|
300
|
+
continue;
|
|
301
|
+
const raw = fs.readFileSync(manifestPath, "utf8");
|
|
302
|
+
const parsed = parseYaml(raw);
|
|
303
|
+
if (parsed.program === program)
|
|
304
|
+
return entry.name;
|
|
305
|
+
}
|
|
306
|
+
return program;
|
|
307
|
+
}
|
|
308
|
+
function leaseFail(program, packetId, action, violations) {
|
|
309
|
+
return {
|
|
310
|
+
data: {
|
|
311
|
+
command: "program.packet.lease",
|
|
312
|
+
status: "fail",
|
|
313
|
+
program,
|
|
314
|
+
packetId,
|
|
315
|
+
action,
|
|
316
|
+
violations,
|
|
317
|
+
},
|
|
318
|
+
exitCode: 1,
|
|
319
|
+
summary: `program.packet.lease: ${packetId} ${action} failed with ${violations.length} violation(s)`,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.js","sourceRoot":"","sources":["../../../../os/program/handlers/lease.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../../../src/types.ts";
|
|
2
|
+
import { type PacketViolation } from "../state.ts";
|
|
3
|
+
export interface SealResultData {
|
|
4
|
+
command: string;
|
|
5
|
+
status: "pass" | "fail";
|
|
6
|
+
program: string;
|
|
7
|
+
packetId: string;
|
|
8
|
+
filesModified: string[];
|
|
9
|
+
violations: PacketViolation[];
|
|
10
|
+
}
|
|
11
|
+
export declare function runSeal(input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<SealResultData>>;
|
|
12
|
+
//# sourceMappingURL=seal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal.d.ts","sourceRoot":"","sources":["../../../../os/program/handlers/seal.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAa/B,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAG3E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,wBAAsB,OAAO,CAC3B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAgL7C"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>Command handler for program.packet.seal — Steward finalizes a packet
|
|
4
|
+
against the predecessor's completion commit, updates packet state from draft
|
|
5
|
+
to sealed, and records the seal in the program manifest (RFC-0856).</purpose>
|
|
6
|
+
<non-goals>
|
|
7
|
+
<item>Do not commit — seal writes files only; canonical commit is separate.</item>
|
|
8
|
+
<item>Do not import from @warpgogol/* — forge must remain dependency-free.</item>
|
|
9
|
+
</non-goals>
|
|
10
|
+
</MODULE_CONTRACT>
|
|
11
|
+
<CHANGE_SUMMARY>
|
|
12
|
+
<item>RFC-0856: initial seal command handler.</item>
|
|
13
|
+
<item>RFC-0857: reciprocal specRef/materializedAs mapping verification for spec-node packets (AC-7).</item>
|
|
14
|
+
</CHANGE_SUMMARY>
|
|
15
|
+
*/
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
19
|
+
import { writeFileAtomic } from "../../../src/utils/fs-atomic.js";
|
|
20
|
+
import { discoverProgram, findPacketEntry, resolvePacketPath, parsePacketFile, verifyNormativeSources, gitBranch, gitHead, gitIsClean, } from "../discovery.js";
|
|
21
|
+
import { findActiveLeases, isLeaseStale } from "../lease.js";
|
|
22
|
+
import { validateSealTransition } from "../state.js";
|
|
23
|
+
export async function runSeal(input, context) {
|
|
24
|
+
const program = input.flags.program;
|
|
25
|
+
const packetId = input.flags.packet;
|
|
26
|
+
const steward = input.flags.steward;
|
|
27
|
+
const idempotencyKey = input.flags["idempotency-key"];
|
|
28
|
+
if (!program || !packetId || !steward) {
|
|
29
|
+
return {
|
|
30
|
+
data: {
|
|
31
|
+
command: "program.packet.seal",
|
|
32
|
+
status: "fail",
|
|
33
|
+
program: program ?? "<missing>",
|
|
34
|
+
packetId: packetId ?? "<missing>",
|
|
35
|
+
filesModified: [],
|
|
36
|
+
violations: [
|
|
37
|
+
{
|
|
38
|
+
rule: "PROGRAM-PACKET-01",
|
|
39
|
+
message: "--program, --packet, and --steward are required",
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
exitCode: 1,
|
|
44
|
+
summary: "program.packet.seal: missing required flags",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const { workspaceRoot } = context;
|
|
48
|
+
// Discover program
|
|
49
|
+
let programLocation;
|
|
50
|
+
try {
|
|
51
|
+
programLocation = discoverProgram(workspaceRoot, program);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
return sealFail(program, packetId, [
|
|
55
|
+
{ rule: "PROGRAM-PACKET-01", message: String(err.message) },
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
if (!programLocation) {
|
|
59
|
+
return sealFail(program, packetId, [
|
|
60
|
+
{ rule: "PROGRAM-PACKET-01", message: `program ${program} not found` },
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
const { manifest, manifestPath, programDir } = programLocation;
|
|
64
|
+
// Find packet entry
|
|
65
|
+
const entry = findPacketEntry(manifest, packetId);
|
|
66
|
+
if (!entry) {
|
|
67
|
+
return sealFail(program, packetId, [
|
|
68
|
+
{ rule: "PROGRAM-PACKET-01", message: `packet ${packetId} not found` },
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
71
|
+
// Parse packet file
|
|
72
|
+
let packet;
|
|
73
|
+
try {
|
|
74
|
+
packet = parsePacketFile(resolvePacketPath(programDir, entry));
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return sealFail(program, packetId, [
|
|
78
|
+
{ rule: "PROGRAM-PACKET-01", message: String(err.message) },
|
|
79
|
+
]);
|
|
80
|
+
}
|
|
81
|
+
// Verify normative source hashes
|
|
82
|
+
const hashViolations = verifyNormativeSources(workspaceRoot, packet);
|
|
83
|
+
if (hashViolations.length > 0) {
|
|
84
|
+
return sealFail(program, packetId, hashViolations.map((v) => ({
|
|
85
|
+
rule: "PROGRAM-PACKET-07",
|
|
86
|
+
path: v.path,
|
|
87
|
+
message: `normative source hash mismatch: expected ${v.expected}, got ${v.actual}`,
|
|
88
|
+
})));
|
|
89
|
+
}
|
|
90
|
+
// Git state
|
|
91
|
+
let branch = "";
|
|
92
|
+
let head = "";
|
|
93
|
+
try {
|
|
94
|
+
branch = gitBranch(workspaceRoot);
|
|
95
|
+
head = gitHead(workspaceRoot);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return sealFail(program, packetId, [
|
|
99
|
+
{ rule: "PROGRAM-PACKET-02", message: "failed to read git state" },
|
|
100
|
+
]);
|
|
101
|
+
}
|
|
102
|
+
// Check for active leases
|
|
103
|
+
const activeLeases = findActiveLeases(workspaceRoot, program);
|
|
104
|
+
const hasActiveLease = activeLeases.some((l) => l.packetId === packetId && !isLeaseStale(l.lease));
|
|
105
|
+
let isClean = false;
|
|
106
|
+
try {
|
|
107
|
+
isClean = gitIsClean(workspaceRoot);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// ignore
|
|
111
|
+
}
|
|
112
|
+
// Validate transition
|
|
113
|
+
const violations = validateSealTransition(manifest, entry, packet, {
|
|
114
|
+
branch,
|
|
115
|
+
head,
|
|
116
|
+
isClean,
|
|
117
|
+
hasActiveLease,
|
|
118
|
+
});
|
|
119
|
+
if (violations.length > 0) {
|
|
120
|
+
return sealFail(program, packetId, violations);
|
|
121
|
+
}
|
|
122
|
+
// RFC-0857 AC-7: For spec-node packets, verify reciprocal specRef/materializedAs mapping
|
|
123
|
+
if (entry.decisionKind === "spec-node" && entry.resolvedRfc) {
|
|
124
|
+
const specViolation = verifySpecNodeMapping(workspaceRoot, entry);
|
|
125
|
+
if (specViolation) {
|
|
126
|
+
return sealFail(program, packetId, [specViolation]);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// --- Perform seal ---
|
|
130
|
+
const filesModified = [];
|
|
131
|
+
// 1. Update packet file: state → sealed, baseCommit → head (for non-bootstrap)
|
|
132
|
+
const packetPath = resolvePacketPath(programDir, entry);
|
|
133
|
+
const packetRaw = fs.readFileSync(packetPath, "utf8");
|
|
134
|
+
const packetFmMatch = packetRaw.match(/^---\n([\s\S]*?)\n---/);
|
|
135
|
+
if (!packetFmMatch) {
|
|
136
|
+
return sealFail(program, packetId, [
|
|
137
|
+
{ rule: "PROGRAM-PACKET-01", message: "missing frontmatter in packet file" },
|
|
138
|
+
]);
|
|
139
|
+
}
|
|
140
|
+
const packetFm = parseYaml(packetFmMatch[1]);
|
|
141
|
+
packetFm.state = "sealed";
|
|
142
|
+
if (entry.dependsOnPacket === null) {
|
|
143
|
+
// Bootstrap packet: baseCommit stays null (set by completion)
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
packetFm.baseCommit = head;
|
|
147
|
+
}
|
|
148
|
+
const newPacketFm = stringifyYaml(packetFm);
|
|
149
|
+
const newPacketRaw = `---\n${newPacketFm}---\n${packetRaw.slice(packetFmMatch[0].length)}`;
|
|
150
|
+
writeFileAtomic(packetPath, newPacketRaw);
|
|
151
|
+
filesModified.push(path.relative(workspaceRoot, packetPath));
|
|
152
|
+
// 2. Update program manifest: packet state → sealed
|
|
153
|
+
const manifestRaw = fs.readFileSync(manifestPath, "utf8");
|
|
154
|
+
const manifestParsed = parseYaml(manifestRaw);
|
|
155
|
+
const packetIdx = manifestParsed.packets.findIndex((p) => p.packetId === packetId);
|
|
156
|
+
if (packetIdx === -1) {
|
|
157
|
+
return sealFail(program, packetId, [
|
|
158
|
+
{ rule: "PROGRAM-PACKET-01", message: "packet not found in manifest" },
|
|
159
|
+
]);
|
|
160
|
+
}
|
|
161
|
+
manifestParsed.packets[packetIdx].state = "sealed";
|
|
162
|
+
if (entry.dependsOnPacket !== null) {
|
|
163
|
+
manifestParsed.packets[packetIdx].baseCommit = head;
|
|
164
|
+
}
|
|
165
|
+
const newManifestRaw = stringifyYaml(manifestParsed);
|
|
166
|
+
writeFileAtomic(manifestPath, newManifestRaw);
|
|
167
|
+
filesModified.push(path.relative(workspaceRoot, manifestPath));
|
|
168
|
+
return {
|
|
169
|
+
data: {
|
|
170
|
+
command: "program.packet.seal",
|
|
171
|
+
status: "pass",
|
|
172
|
+
program,
|
|
173
|
+
packetId,
|
|
174
|
+
filesModified,
|
|
175
|
+
violations: [],
|
|
176
|
+
},
|
|
177
|
+
exitCode: 0,
|
|
178
|
+
summary: `program.packet.seal: ${packetId} sealed on ${branch}@${head.slice(0, 8)}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function sealFail(program, packetId, violations) {
|
|
182
|
+
return {
|
|
183
|
+
data: {
|
|
184
|
+
command: "program.packet.seal",
|
|
185
|
+
status: "fail",
|
|
186
|
+
program,
|
|
187
|
+
packetId,
|
|
188
|
+
filesModified: [],
|
|
189
|
+
violations,
|
|
190
|
+
},
|
|
191
|
+
exitCode: 1,
|
|
192
|
+
summary: `program.packet.seal: ${packetId} failed with ${violations.length} violation(s)`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// RFC-0857 AC-7: Reciprocal specRef/materializedAs mapping verification
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
function verifySpecNodeMapping(workspaceRoot, entry) {
|
|
199
|
+
const governingDecision = entry.governingDecision;
|
|
200
|
+
const slashIdx = governingDecision.indexOf("/");
|
|
201
|
+
if (slashIdx === -1) {
|
|
202
|
+
return {
|
|
203
|
+
rule: "PROGRAM-PACKET-12",
|
|
204
|
+
message: `spec-node governingDecision "${governingDecision}" is not in <spec-id>/<node-id> format`,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
const specId = governingDecision.slice(0, slashIdx);
|
|
208
|
+
const nodeId = governingDecision.slice(slashIdx + 1);
|
|
209
|
+
// Check forge-spec.yaml for materializedAs matching resolvedRfc
|
|
210
|
+
const specPath = path.join(workspaceRoot, "docs", "specs", specId, "forge-spec.yaml");
|
|
211
|
+
if (!fs.existsSync(specPath)) {
|
|
212
|
+
return {
|
|
213
|
+
rule: "PROGRAM-PACKET-12",
|
|
214
|
+
message: `spec file not found: docs/specs/${specId}/forge-spec.yaml`,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const specRaw = fs.readFileSync(specPath, "utf8");
|
|
218
|
+
const specParsed = parseYaml(specRaw);
|
|
219
|
+
const specNode = specParsed.rfcs?.find((r) => r.id === nodeId);
|
|
220
|
+
if (!specNode) {
|
|
221
|
+
return {
|
|
222
|
+
rule: "PROGRAM-PACKET-12",
|
|
223
|
+
message: `spec node ${nodeId} not found in docs/specs/${specId}/forge-spec.yaml`,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
if (specNode.materializedAs !== entry.resolvedRfc) {
|
|
227
|
+
return {
|
|
228
|
+
rule: "PROGRAM-PACKET-12",
|
|
229
|
+
message: `materializedAs (${specNode.materializedAs ?? "null"}) does not match resolvedRfc (${entry.resolvedRfc}) for ${nodeId}`,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
// Check RFC file for reciprocal specRef
|
|
233
|
+
const rfcPath = path.join(workspaceRoot, "docs", "rfcs", `${entry.resolvedRfc.toLowerCase()}.md`);
|
|
234
|
+
if (!fs.existsSync(rfcPath)) {
|
|
235
|
+
return {
|
|
236
|
+
rule: "PROGRAM-PACKET-12",
|
|
237
|
+
message: `RFC file not found: docs/rfcs/${entry.resolvedRfc.toLowerCase()}.md`,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const rfcRaw = fs.readFileSync(rfcPath, "utf8");
|
|
241
|
+
const rfcFmMatch = rfcRaw.match(/^---\n([\s\S]*?)\n---/);
|
|
242
|
+
if (!rfcFmMatch) {
|
|
243
|
+
return {
|
|
244
|
+
rule: "PROGRAM-PACKET-12",
|
|
245
|
+
message: `missing frontmatter in ${entry.resolvedRfc}`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
const rfcFm = parseYaml(rfcFmMatch[1]);
|
|
249
|
+
const expectedSpecRef = `${specId}/${nodeId}`;
|
|
250
|
+
if (rfcFm.specRef !== expectedSpecRef) {
|
|
251
|
+
return {
|
|
252
|
+
rule: "PROGRAM-PACKET-12",
|
|
253
|
+
message: `specRef (${rfcFm.specRef ?? "null"}) does not match expected ${expectedSpecRef} in ${entry.resolvedRfc}`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
// RFC must be accepted or implemented
|
|
257
|
+
if (rfcFm.status !== "accepted" && rfcFm.status !== "implemented") {
|
|
258
|
+
return {
|
|
259
|
+
rule: "PROGRAM-PACKET-12",
|
|
260
|
+
message: `${entry.resolvedRfc} status is "${rfcFm.status}", expected "accepted" or "implemented"`,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=seal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal.js","sourceRoot":"","sources":["../../../../os/program/handlers/seal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext } from "../../../src/types.ts";
|
|
2
|
+
import { type PacketViolation } from "../state.ts";
|
|
3
|
+
export interface ValidateResultData {
|
|
4
|
+
command: string;
|
|
5
|
+
status: "pass" | "fail";
|
|
6
|
+
program: string;
|
|
7
|
+
packetId: string;
|
|
8
|
+
phase: string;
|
|
9
|
+
branch: string;
|
|
10
|
+
head: string;
|
|
11
|
+
violations: PacketViolation[];
|
|
12
|
+
}
|
|
13
|
+
export declare function runValidate(input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<ValidateResultData>>;
|
|
14
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../os/program/handlers/validate.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAY/B,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CA+IjD"}
|