@warpgogol/forge 2.9.2 → 2.9.4
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 +14 -8
- package/README.uk.md +14 -0
- package/dist/os/adr/handlers/implement-stamp.d.ts.map +1 -1
- package/dist/os/adr/handlers/implement-stamp.js +6 -0
- package/dist/os/adr/handlers/implement-stamp.js.map +1 -1
- package/dist/os/adr/handlers/validate.d.ts.map +1 -1
- package/dist/os/adr/handlers/validate.js +8 -0
- package/dist/os/adr/handlers/validate.js.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.js +22 -0
- package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-change-summary-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-change-summary-handler.js +6 -0
- package/dist/os/compass/handlers/compass-change-summary-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-inventory-handler.js +19 -0
- package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -1
- package/dist/os/exploration/handlers/archive.d.ts.map +1 -1
- package/dist/os/exploration/handlers/archive.js +6 -0
- package/dist/os/exploration/handlers/archive.js.map +1 -1
- package/dist/os/exploration/handlers/list.d.ts.map +1 -1
- package/dist/os/exploration/handlers/list.js +8 -0
- package/dist/os/exploration/handlers/list.js.map +1 -1
- package/dist/os/exploration/handlers/show.d.ts.map +1 -1
- package/dist/os/exploration/handlers/show.js +6 -0
- package/dist/os/exploration/handlers/show.js.map +1 -1
- package/dist/os/program/handlers/complete.d.ts.map +1 -1
- package/dist/os/program/handlers/complete.js +18 -0
- package/dist/os/program/handlers/complete.js.map +1 -1
- package/dist/os/program/handlers/lease.js +6 -0
- package/dist/os/program/handlers/lease.js.map +1 -1
- package/dist/os/program/handlers/seal.d.ts.map +1 -1
- package/dist/os/program/handlers/seal.js +12 -0
- package/dist/os/program/handlers/seal.js.map +1 -1
- package/dist/os/program/handlers/validate.js +6 -0
- package/dist/os/program/handlers/validate.js.map +1 -1
- package/dist/os/rfc/acceptance.d.ts.map +1 -1
- package/dist/os/rfc/acceptance.js +8 -0
- package/dist/os/rfc/acceptance.js.map +1 -1
- package/dist/os/rfc/handlers/check.d.ts.map +1 -1
- package/dist/os/rfc/handlers/check.js +8 -0
- package/dist/os/rfc/handlers/check.js.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.js +6 -0
- package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
- package/dist/os/rfc/handlers/list-create.d.ts.map +1 -1
- package/dist/os/rfc/handlers/list-create.js +20 -0
- package/dist/os/rfc/handlers/list-create.js.map +1 -1
- package/dist/os/rfc/handlers/validate.d.ts.map +1 -1
- package/dist/os/rfc/handlers/validate.js +8 -0
- package/dist/os/rfc/handlers/validate.js.map +1 -1
- package/dist/os/session/handlers/validate.d.ts.map +1 -1
- package/dist/os/session/handlers/validate.js +8 -0
- package/dist/os/session/handlers/validate.js.map +1 -1
- package/dist/os/spec/live-spec-list.d.ts.map +1 -1
- package/dist/os/spec/live-spec-list.js +8 -0
- package/dist/os/spec/live-spec-list.js.map +1 -1
- package/dist/os/spec/live-spec-merge.js +2 -2
- package/dist/os/spec/live-spec-merge.js.map +1 -1
- package/dist/os/spec/live-spec-show.d.ts.map +1 -1
- package/dist/os/spec/live-spec-show.js +6 -0
- package/dist/os/spec/live-spec-show.js.map +1 -1
- package/dist/os/spec/spec-materialize.d.ts.map +1 -1
- package/dist/os/spec/spec-materialize.js +6 -0
- package/dist/os/spec/spec-materialize.js.map +1 -1
- package/dist/os/spec/spec-status.d.ts.map +1 -1
- package/dist/os/spec/spec-status.js +6 -0
- package/dist/os/spec/spec-status.js.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-lock-recover.d.ts.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js +8 -0
- package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-lock-status.d.ts.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-lock-status.js +8 -0
- package/dist/os/werkstatt/handlers/werkstatt-lock-status.js.map +1 -1
- package/dist/os/workflow/handlers.d.ts.map +1 -1
- package/dist/os/workflow/handlers.js +8 -0
- package/dist/os/workflow/handlers.js.map +1 -1
- package/os/adr/handlers/implement-stamp.ts +6 -0
- package/os/adr/handlers/validate.ts +8 -0
- package/os/compass/handlers/compass-audit-handler.ts +24 -0
- package/os/compass/handlers/compass-change-summary-handler.ts +6 -0
- package/os/compass/handlers/compass-inventory-handler.ts +19 -0
- package/os/exploration/handlers/archive.ts +6 -0
- package/os/exploration/handlers/list.ts +9 -0
- package/os/exploration/handlers/show.ts +6 -0
- package/os/program/handlers/complete.ts +18 -0
- package/os/program/handlers/lease.ts +6 -0
- package/os/program/handlers/seal.ts +12 -0
- package/os/program/handlers/validate.ts +6 -0
- package/os/rfc/acceptance.ts +9 -0
- package/os/rfc/handlers/check.ts +8 -0
- package/os/rfc/handlers/implement-stamp.ts +6 -0
- package/os/rfc/handlers/list-create.ts +21 -0
- package/os/rfc/handlers/validate.ts +8 -0
- package/os/session/handlers/validate.ts +8 -0
- package/os/spec/live-spec-list.ts +8 -0
- package/os/spec/live-spec-merge.ts +2 -2
- package/os/spec/live-spec-show.ts +6 -0
- package/os/spec/spec-materialize.ts +6 -0
- package/os/spec/spec-status.ts +6 -0
- package/os/werkstatt/handlers/werkstatt-lock-recover.ts +9 -0
- package/os/werkstatt/handlers/werkstatt-lock-status.ts +9 -0
- package/os/workflow/handlers.ts +9 -0
- package/package.json +2 -2
- package/skills/_shared/fo-pipeline-conventions.md +39 -0
- package/skills/_shared/fo-prerequisites.md +81 -0
- package/skills/fo/fo-idea-audit/AUDIT-AXES.md +66 -0
- package/skills/fo/fo-idea-audit/SKILL.md +2 -2
- package/skills/fo/fo-idea-enhance/SKILL.md +2 -2
- package/skills/fo/fo-idea-implement/ADR-FLOW.md +179 -0
- package/skills/fo/fo-idea-plan/SKILL.md +2 -0
- package/skills/fo/fo-review/AXES.md +70 -0
- package/skills/fo/fo-session-retro/learned-principles.md +15 -0
- package/skills/shared/windows-ai-tooling/.gitattributes.template +49 -0
- package/skills/shared/windows-ai-tooling/AGENTS_WINDOWS.md.template +42 -0
- package/skills/shared/writing-great-skills/GLOSSARY.md +201 -0
- package/src/tests/package-files.test.ts +5 -2
- package/src/tests/stack-profile.test.ts +4 -0
|
@@ -155,5 +155,11 @@ export async function runExplorationArchive(
|
|
|
155
155
|
related,
|
|
156
156
|
},
|
|
157
157
|
summary: `Archived exploration note: ${slug} (${previousStatus} → archived)`,
|
|
158
|
+
nextSteps: [
|
|
159
|
+
{
|
|
160
|
+
action: `Commit the archive: pnpm exec forge run ecosystem.commit`,
|
|
161
|
+
kind: "optional",
|
|
162
|
+
},
|
|
163
|
+
],
|
|
158
164
|
};
|
|
159
165
|
}
|
|
@@ -73,5 +73,14 @@ export async function runExplorationList(
|
|
|
73
73
|
explorations: entries,
|
|
74
74
|
},
|
|
75
75
|
summary: `${entries.length} exploration note(s) found`,
|
|
76
|
+
nextSteps:
|
|
77
|
+
entries.length === 0
|
|
78
|
+
? [
|
|
79
|
+
{
|
|
80
|
+
action: `Create an exploration note: pnpm exec forge run exploration.show --id <slug>`,
|
|
81
|
+
kind: "optional",
|
|
82
|
+
},
|
|
83
|
+
]
|
|
84
|
+
: undefined,
|
|
76
85
|
};
|
|
77
86
|
}
|
|
@@ -103,5 +103,11 @@ export async function runExplorationShow(
|
|
|
103
103
|
note,
|
|
104
104
|
},
|
|
105
105
|
summary: `Exploration note: ${note.id}`,
|
|
106
|
+
nextSteps: [
|
|
107
|
+
{
|
|
108
|
+
action: `Archive the note when done: pnpm exec forge run exploration.archive --id ${note.id}`,
|
|
109
|
+
kind: "optional",
|
|
110
|
+
},
|
|
111
|
+
],
|
|
106
112
|
};
|
|
107
113
|
}
|
|
@@ -237,6 +237,12 @@ export async function runComplete(
|
|
|
237
237
|
},
|
|
238
238
|
exitCode: 0,
|
|
239
239
|
summary: `program.packet.complete: ${packetId} completed at ${head.slice(0, 8)}`,
|
|
240
|
+
nextSteps: [
|
|
241
|
+
{
|
|
242
|
+
action: `Seal the next packet: pnpm exec forge run program.packet.seal --packet <next-packet-id>`,
|
|
243
|
+
kind: "optional",
|
|
244
|
+
},
|
|
245
|
+
],
|
|
240
246
|
};
|
|
241
247
|
}
|
|
242
248
|
|
|
@@ -390,6 +396,12 @@ async function bootstrapComplete(
|
|
|
390
396
|
},
|
|
391
397
|
exitCode: 0,
|
|
392
398
|
summary: `program.packet.complete: ${packetId} bootstrap completed — program now executing`,
|
|
399
|
+
nextSteps: [
|
|
400
|
+
{
|
|
401
|
+
action: `Seal the first execution packet: pnpm exec forge run program.packet.seal --packet <first-packet-id>`,
|
|
402
|
+
kind: "optional",
|
|
403
|
+
},
|
|
404
|
+
],
|
|
393
405
|
};
|
|
394
406
|
}
|
|
395
407
|
|
|
@@ -415,5 +427,11 @@ function completeFail(
|
|
|
415
427
|
},
|
|
416
428
|
exitCode: 1,
|
|
417
429
|
summary: `program.packet.complete: ${packetId} failed with ${violations.length} violation(s)`,
|
|
430
|
+
nextSteps: [
|
|
431
|
+
{
|
|
432
|
+
action: `Fix the ${violations.length} violation(s) above, then re-run: pnpm exec forge run program.packet.complete --packet ${packetId}`,
|
|
433
|
+
kind: "required",
|
|
434
|
+
},
|
|
435
|
+
],
|
|
418
436
|
};
|
|
419
437
|
}
|
|
@@ -199,6 +199,12 @@ async function leaseStart(
|
|
|
199
199
|
},
|
|
200
200
|
exitCode: 0,
|
|
201
201
|
summary: `program.packet.lease: ${packetId} lease started for ${executor}`,
|
|
202
|
+
nextSteps: [
|
|
203
|
+
{
|
|
204
|
+
action: `Implement the packet, then complete: pnpm exec forge run program.packet.complete --packet ${packetId}`,
|
|
205
|
+
kind: "optional",
|
|
206
|
+
},
|
|
207
|
+
],
|
|
202
208
|
};
|
|
203
209
|
}
|
|
204
210
|
|
|
@@ -224,6 +224,12 @@ export async function runSeal(
|
|
|
224
224
|
},
|
|
225
225
|
exitCode: 0,
|
|
226
226
|
summary: `program.packet.seal: ${packetId} sealed on ${branch}@${head.slice(0, 8)}`,
|
|
227
|
+
nextSteps: [
|
|
228
|
+
{
|
|
229
|
+
action: `Start the lease: pnpm exec forge run program.packet.lease --packet ${packetId} --action start --executor <executor>`,
|
|
230
|
+
kind: "optional",
|
|
231
|
+
},
|
|
232
|
+
],
|
|
227
233
|
};
|
|
228
234
|
}
|
|
229
235
|
|
|
@@ -243,6 +249,12 @@ function sealFail(
|
|
|
243
249
|
},
|
|
244
250
|
exitCode: 1,
|
|
245
251
|
summary: `program.packet.seal: ${packetId} failed with ${violations.length} violation(s)`,
|
|
252
|
+
nextSteps: [
|
|
253
|
+
{
|
|
254
|
+
action: `Fix the ${violations.length} violation(s) above, then re-run: pnpm exec forge run program.packet.seal --packet ${packetId}`,
|
|
255
|
+
kind: "required",
|
|
256
|
+
},
|
|
257
|
+
],
|
|
246
258
|
};
|
|
247
259
|
}
|
|
248
260
|
|
|
@@ -209,5 +209,11 @@ function failResult(
|
|
|
209
209
|
},
|
|
210
210
|
exitCode: 1,
|
|
211
211
|
summary: `program.packet.validate: ${packetId} failed with ${violations.length} violation(s)`,
|
|
212
|
+
nextSteps: [
|
|
213
|
+
{
|
|
214
|
+
action: `Fix the ${violations.length} violation(s) above, then re-run: pnpm exec forge run program.packet.validate --packet ${packetId}`,
|
|
215
|
+
kind: "required",
|
|
216
|
+
},
|
|
217
|
+
],
|
|
212
218
|
};
|
|
213
219
|
}
|
package/os/rfc/acceptance.ts
CHANGED
|
@@ -340,5 +340,14 @@ export async function runRfcAcceptanceRun(
|
|
|
340
340
|
data: { command: "rfc.acceptance.run", status, diagnostics, results },
|
|
341
341
|
exitCode: failedCount > 0 ? 1 : 0,
|
|
342
342
|
summary: `rfc.acceptance.run: ${results.length} RFC(s), ${failedCount} failed probe(s)`,
|
|
343
|
+
nextSteps:
|
|
344
|
+
failedCount > 0
|
|
345
|
+
? [
|
|
346
|
+
{
|
|
347
|
+
action: `Fix the ${failedCount} failed acceptance probe(s) above, then re-run: pnpm exec forge run rfc.acceptance.run`,
|
|
348
|
+
kind: "required",
|
|
349
|
+
},
|
|
350
|
+
]
|
|
351
|
+
: undefined,
|
|
343
352
|
};
|
|
344
353
|
}
|
package/os/rfc/handlers/check.ts
CHANGED
|
@@ -234,5 +234,13 @@ export async function runRfcCheck(
|
|
|
234
234
|
summary: hasErrors
|
|
235
235
|
? `${violations.length} artifact violation(s) found across ${checkedRfcs} RFC(s)`
|
|
236
236
|
: `All ${checkedRfcs} RFC(s) passed artifact check`,
|
|
237
|
+
nextSteps: hasErrors
|
|
238
|
+
? [
|
|
239
|
+
{
|
|
240
|
+
action: `Fix the ${violations.length} artifact violation(s) above, then re-run: pnpm exec forge run rfc.check`,
|
|
241
|
+
kind: "required",
|
|
242
|
+
},
|
|
243
|
+
]
|
|
244
|
+
: undefined,
|
|
237
245
|
};
|
|
238
246
|
}
|
|
@@ -485,6 +485,12 @@ export async function runRfcImplementStamp(
|
|
|
485
485
|
},
|
|
486
486
|
exitCode: 0,
|
|
487
487
|
summary: `rfc.implement.stamp: ${targetId} stamped as implemented`,
|
|
488
|
+
nextSteps: [
|
|
489
|
+
{
|
|
490
|
+
action: `Commit the stamp: pnpm exec forge run ecosystem.commit`,
|
|
491
|
+
kind: "optional",
|
|
492
|
+
},
|
|
493
|
+
],
|
|
488
494
|
};
|
|
489
495
|
} finally {
|
|
490
496
|
await releaseRfcLock(lockPath);
|
|
@@ -131,6 +131,15 @@ export async function runRfcList(
|
|
|
131
131
|
entries,
|
|
132
132
|
},
|
|
133
133
|
summary: `${entries.length} RFC(s) found`,
|
|
134
|
+
nextSteps:
|
|
135
|
+
entries.length === 0
|
|
136
|
+
? [
|
|
137
|
+
{
|
|
138
|
+
action: `Create a new RFC: pnpm exec forge run rfc.create --title "..."`,
|
|
139
|
+
kind: "optional",
|
|
140
|
+
},
|
|
141
|
+
]
|
|
142
|
+
: undefined,
|
|
134
143
|
};
|
|
135
144
|
}
|
|
136
145
|
|
|
@@ -253,6 +262,12 @@ export async function runRfcCreate(
|
|
|
253
262
|
consultedDecisions,
|
|
254
263
|
},
|
|
255
264
|
summary: `Created ${nextId}: ${title}`,
|
|
265
|
+
nextSteps: [
|
|
266
|
+
{
|
|
267
|
+
action: `Validate the RFC: pnpm exec forge run rfc.validate --file ${relativeFile}`,
|
|
268
|
+
kind: "optional",
|
|
269
|
+
},
|
|
270
|
+
],
|
|
256
271
|
};
|
|
257
272
|
}
|
|
258
273
|
|
|
@@ -292,5 +307,11 @@ export async function runRfcNextId(
|
|
|
292
307
|
scannedFiles: files.length,
|
|
293
308
|
},
|
|
294
309
|
summary: `Next RFC number: ${nextId}`,
|
|
310
|
+
nextSteps: [
|
|
311
|
+
{
|
|
312
|
+
action: `Create the RFC: pnpm exec forge run rfc.create --title "..."`,
|
|
313
|
+
kind: "optional",
|
|
314
|
+
},
|
|
315
|
+
],
|
|
295
316
|
};
|
|
296
317
|
}
|
|
@@ -162,5 +162,13 @@ export async function runRfcValidate(
|
|
|
162
162
|
summary: hasErrors
|
|
163
163
|
? `${violations.filter((v) => v.severity === "error").length} error(s) found`
|
|
164
164
|
: `All ${filesToValidate.length} RFC(s) passed validation`,
|
|
165
|
+
nextSteps: hasErrors
|
|
166
|
+
? [
|
|
167
|
+
{
|
|
168
|
+
action: `Fix the ${violations.filter((v) => v.severity === "error").length} error(s) above, then re-run: pnpm exec forge run rfc.validate`,
|
|
169
|
+
kind: "required",
|
|
170
|
+
},
|
|
171
|
+
]
|
|
172
|
+
: undefined,
|
|
165
173
|
};
|
|
166
174
|
}
|
|
@@ -246,5 +246,13 @@ export async function runSessionValidate(
|
|
|
246
246
|
summary: hasErrors
|
|
247
247
|
? `${violations.filter((v) => v.severity === "error").length} error(s) found`
|
|
248
248
|
: `All ${filesToValidate.length} session file(s) passed validation`,
|
|
249
|
+
nextSteps: hasErrors
|
|
250
|
+
? [
|
|
251
|
+
{
|
|
252
|
+
action: `Fix the ${violations.filter((v) => v.severity === "error").length} error(s) above, then re-run: pnpm exec forge run session.validate`,
|
|
253
|
+
kind: "required",
|
|
254
|
+
},
|
|
255
|
+
]
|
|
256
|
+
: undefined,
|
|
249
257
|
};
|
|
250
258
|
}
|
|
@@ -74,5 +74,13 @@ export async function runSpecLiveList(
|
|
|
74
74
|
data: result,
|
|
75
75
|
exitCode: 0,
|
|
76
76
|
summary: `spec.live.list: ${entries.length} living spec(s)`,
|
|
77
|
+
nextSteps: entries.length > 0
|
|
78
|
+
? [
|
|
79
|
+
{
|
|
80
|
+
action: `Validate living specs: pnpm exec forge run spec.live.validate`,
|
|
81
|
+
kind: "optional",
|
|
82
|
+
},
|
|
83
|
+
]
|
|
84
|
+
: undefined,
|
|
77
85
|
};
|
|
78
86
|
}
|
|
@@ -323,7 +323,7 @@ export async function runSpecLiveMerge(
|
|
|
323
323
|
);
|
|
324
324
|
}
|
|
325
325
|
|
|
326
|
-
return { data: result, exitCode: 0, summary: `spec.live.merge: created ${domain} from ${rfcId}` };
|
|
326
|
+
return { data: result, exitCode: 0, summary: `spec.live.merge: created ${domain} from ${rfcId}`, nextSteps: [{ action: `Validate the living spec: pnpm exec forge run spec.live.validate`, kind: "optional" }] };
|
|
327
327
|
}
|
|
328
328
|
|
|
329
329
|
for (const heading of rfcHeadings) {
|
|
@@ -409,5 +409,5 @@ export async function runSpecLiveMerge(
|
|
|
409
409
|
);
|
|
410
410
|
}
|
|
411
411
|
|
|
412
|
-
return { data: result, exitCode: 0, summary: `spec.live.merge: modified ${domain} from ${rfcId}` };
|
|
412
|
+
return { data: result, exitCode: 0, summary: `spec.live.merge: modified ${domain} from ${rfcId}`, nextSteps: [{ action: `Validate the living spec: pnpm exec forge run spec.live.validate`, kind: "optional" }] };
|
|
413
413
|
}
|
|
@@ -113,5 +113,11 @@ export async function runSpecLiveShow(
|
|
|
113
113
|
data: result,
|
|
114
114
|
exitCode: 0,
|
|
115
115
|
summary: `spec.live.show: ${domain}`,
|
|
116
|
+
nextSteps: [
|
|
117
|
+
{
|
|
118
|
+
action: `Validate the living spec: pnpm exec forge run spec.live.validate`,
|
|
119
|
+
kind: "optional",
|
|
120
|
+
},
|
|
121
|
+
],
|
|
116
122
|
};
|
|
117
123
|
}
|
|
@@ -386,5 +386,11 @@ export async function runSpecMaterialize(
|
|
|
386
386
|
},
|
|
387
387
|
exitCode: 0,
|
|
388
388
|
summary: `spec.materialize: created ${created.length} RFC(s) from spec '${specId}'`,
|
|
389
|
+
nextSteps: [
|
|
390
|
+
{
|
|
391
|
+
action: `Validate the created RFCs: pnpm exec forge run rfc.validate`,
|
|
392
|
+
kind: "optional",
|
|
393
|
+
},
|
|
394
|
+
],
|
|
389
395
|
};
|
|
390
396
|
}
|
package/os/spec/spec-status.ts
CHANGED
|
@@ -280,5 +280,11 @@ export async function runSpecStatus(
|
|
|
280
280
|
},
|
|
281
281
|
exitCode: 0,
|
|
282
282
|
summary: `spec.status: ${results.length} spec(s)`,
|
|
283
|
+
nextSteps: [
|
|
284
|
+
{
|
|
285
|
+
action: `Validate specs: pnpm exec forge run spec.validate`,
|
|
286
|
+
kind: "optional",
|
|
287
|
+
},
|
|
288
|
+
],
|
|
283
289
|
};
|
|
284
290
|
}
|
|
@@ -168,6 +168,15 @@ export async function runWerkstattLockRecover(
|
|
|
168
168
|
return {
|
|
169
169
|
data: { recovered, failed },
|
|
170
170
|
summary: `[werkstatt.lock.recover] ${recovered.length} artifact${recovered.length === 1 ? "" : "s"} recovered, ${failed.length} failure${failed.length === 1 ? "" : "s"}`,
|
|
171
|
+
nextSteps:
|
|
172
|
+
failed.length > 0
|
|
173
|
+
? [
|
|
174
|
+
{
|
|
175
|
+
action: `Investigate the ${failed.length} failed recovery item(s) above and retry manually`,
|
|
176
|
+
kind: "required",
|
|
177
|
+
},
|
|
178
|
+
]
|
|
179
|
+
: undefined,
|
|
171
180
|
};
|
|
172
181
|
} finally {
|
|
173
182
|
await releaseLock(workspaceRoot, "werkstatt-recovery");
|
|
@@ -69,5 +69,14 @@ export async function runWerkstattLockStatus(
|
|
|
69
69
|
staleCount,
|
|
70
70
|
},
|
|
71
71
|
summary: `[werkstatt.lock.status] ${locks.length} lock${locks.length === 1 ? "" : "s"}, ${staleCount} stale`,
|
|
72
|
+
nextSteps:
|
|
73
|
+
staleCount > 0
|
|
74
|
+
? [
|
|
75
|
+
{
|
|
76
|
+
action: `Recover stale locks: pnpm exec forge run werkstatt.lock.recover`,
|
|
77
|
+
kind: "optional",
|
|
78
|
+
},
|
|
79
|
+
]
|
|
80
|
+
: undefined,
|
|
72
81
|
};
|
|
73
82
|
}
|
package/os/workflow/handlers.ts
CHANGED
|
@@ -203,6 +203,15 @@ export async function runWorkflowList(
|
|
|
203
203
|
data: { command: "workflow.list", workflows: entries },
|
|
204
204
|
exitCode: 0,
|
|
205
205
|
summary: `workflow.list: ${entries.length} workflow file(s) found`,
|
|
206
|
+
nextSteps:
|
|
207
|
+
entries.length === 0
|
|
208
|
+
? [
|
|
209
|
+
{
|
|
210
|
+
action: `Create a workflow file in .devin/workflows/ or .windsurf/workflows/`,
|
|
211
|
+
kind: "optional",
|
|
212
|
+
},
|
|
213
|
+
]
|
|
214
|
+
: undefined,
|
|
206
215
|
};
|
|
207
216
|
}
|
|
208
217
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@warpgogol/forge",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -173,7 +173,7 @@
|
|
|
173
173
|
"devDependencies": {
|
|
174
174
|
"@types/node": "^24.0.0",
|
|
175
175
|
"@warpgogol/werkstatt-shared": "*",
|
|
176
|
-
"@warpgogol/werkstatt": "
|
|
176
|
+
"@warpgogol/werkstatt": "*",
|
|
177
177
|
"eslint": "^10.8.0",
|
|
178
178
|
"fast-check": "^4.9.0",
|
|
179
179
|
"typescript": "^6.0.3",
|
|
@@ -276,6 +276,45 @@ When a pipeline step fails and cannot be auto-fixed within 2 attempts (per §Com
|
|
|
276
276
|
|
|
277
277
|
The error checkpoint doubles as a resume marker: when resuming an interrupted session, scan for the last error checkpoint. If found, resume from the failed step using the partialState and resumePoint fields.
|
|
278
278
|
|
|
279
|
+
## Pipeline continuation
|
|
280
|
+
|
|
281
|
+
When a pipeline step completes (audit, enhance, plan), the agent MUST proactively suggest the next step and offer to proceed. This is NOT automatic chaining — the agent asks the operator first. This applies when the operator is manually driving the pipeline step by step.
|
|
282
|
+
|
|
283
|
+
### After audit completes
|
|
284
|
+
|
|
285
|
+
The audit report is persisted and committed. The agent MUST:
|
|
286
|
+
|
|
287
|
+
1. Present the audit summary.
|
|
288
|
+
2. State: "The next pipeline step is `fo-idea-enhance` — it applies the audit findings to the RFC."
|
|
289
|
+
3. Ask: "Proceed to enhance?" using `ask_user_question` with "Yes, enhance" as the recommended option.
|
|
290
|
+
4. If the operator says yes, invoke `fo-idea-enhance` via the `skill` tool.
|
|
291
|
+
|
|
292
|
+
### After enhance completes
|
|
293
|
+
|
|
294
|
+
The enhanced RFC is committed. The agent MUST:
|
|
295
|
+
|
|
296
|
+
1. Present the enhancement summary.
|
|
297
|
+
2. State: "The next pipeline step is `fo-idea-plan` — it transitions the RFC to accepted and creates the implementation plan."
|
|
298
|
+
3. Ask: "Proceed to plan?" using `ask_user_question` with "Yes, plan" as the recommended option.
|
|
299
|
+
4. If the operator says yes, invoke `fo-idea-plan` via the `skill` tool.
|
|
300
|
+
|
|
301
|
+
### After plan completes
|
|
302
|
+
|
|
303
|
+
The plan is committed. The agent MUST:
|
|
304
|
+
|
|
305
|
+
1. Present the plan summary.
|
|
306
|
+
2. State: "The next pipeline step is `fo-idea-implement` — it executes the plan and stamps the RFC as implemented."
|
|
307
|
+
3. Ask: "Proceed to implement?" using `ask_user_question` with "Yes, implement" as the recommended option.
|
|
308
|
+
4. If the operator says yes, invoke `fo-idea-implement` via the `skill` tool.
|
|
309
|
+
|
|
310
|
+
### Exception: orchestrator skills
|
|
311
|
+
|
|
312
|
+
When the pipeline is driven by `fo-idea-i-just-want-to-see-the-result` or `fo-idea-i-just-want-to-see-the-plan`, the orchestrator handles chaining automatically. The continuation suggestion is NOT emitted — the orchestrator's "no pauses between pipeline steps" rule applies.
|
|
313
|
+
|
|
314
|
+
### Exception: operator declines
|
|
315
|
+
|
|
316
|
+
If the operator declines the continuation suggestion, the agent stops. The operator can invoke the next step manually later. Do not re-ask.
|
|
317
|
+
|
|
279
318
|
## Batch plan preview
|
|
280
319
|
|
|
281
320
|
When the orchestrator skill processes multiple documents (>=2), emit a batch plan preview before starting the first document. The preview is a table showing: processing order, document id, type, complexity estimate, dependencies, and notes.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# WG Pipeline Prerequisites & Batch Processing
|
|
2
|
+
|
|
3
|
+
Reference for `fo-idea-audit`, `fo-idea-enhance`, `fo-idea-plan`, `fo-idea-implement`. These skills share identical input parsing, prerequisite checks, and batch loop behavior.
|
|
4
|
+
|
|
5
|
+
## Input parsing
|
|
6
|
+
|
|
7
|
+
The operator may provide:
|
|
8
|
+
|
|
9
|
+
- **A single id**: `RFC-0362`, `ADR-0003`, a filename, or a path.
|
|
10
|
+
- **A comma-separated list**: `RFC-0355, RFC-0356, RFC-0357` — process each in order.
|
|
11
|
+
- **A range**: `RFC-0355..RFC-0360` or `от RFC-0355 до RFC-0360` — discover all files in `docs/rfcs/` whose numeric id falls within the inclusive range, sort ascending, and process each in order. Ranges are only valid within a single document type (RFC or ADR).
|
|
12
|
+
- **Nothing**: if a document file is open in the IDE, use it. Otherwise, ask.
|
|
13
|
+
|
|
14
|
+
## Common prerequisite checks
|
|
15
|
+
|
|
16
|
+
Run these **in order** for each document. If any check fails, record the document as **skipped** in the batch summary with the reason, and immediately proceed to the next document. Do not stop the entire batch — skip and report.
|
|
17
|
+
|
|
18
|
+
1. **Prefix check** — if the id starts with `ADR-` and this skill handles RFCs only, skip with: `ADR-XXXX is an ADR, not an RFC. ADRs do not have <this step>. The ADR pipeline is: create → implement (includes review → fix). Run /fo-idea-implement ADR-XXXX to implement.`
|
|
19
|
+
|
|
20
|
+
If the id starts with `RFC-` and this skill handles ADRs only, skip with: `RFC-XXXX is an RFC, not an ADR. Use the RFC pipeline: create → audit → enhance → plan → implement (includes review → fix).`
|
|
21
|
+
|
|
22
|
+
2. **File exists** — look for `docs/rfcs/rfc-XXXX-*.md` (or `docs/adrs/adr-XXXX-*.md` for ADRs). If no file is found, skip with: `RFC-XXXX not found in docs/rfcs/. Run /fo-idea-create-rfc first.`
|
|
23
|
+
|
|
24
|
+
3. **Terminal status check** — read the document's `status` frontmatter. If the status is `implemented`, skip with: `RFC-XXXX is already implemented. Nothing to do.` If the status is `rejected` or `superseded`, skip with: `RFC-XXXX is <status> (terminal). Terminal RFCs cannot be <this action>. To change this decision, create a new RFC with supersedes: [RFC-XXXX] via /fo-idea-create-rfc.`
|
|
25
|
+
|
|
26
|
+
## Skill-specific prerequisite checks
|
|
27
|
+
|
|
28
|
+
After the common checks, each skill adds its own:
|
|
29
|
+
|
|
30
|
+
### fo-idea-audit
|
|
31
|
+
|
|
32
|
+
No additional checks.
|
|
33
|
+
|
|
34
|
+
### fo-idea-enhance
|
|
35
|
+
|
|
36
|
+
4. **Accepted status check** — if the status is `accepted`, skip with: `RFC-XXXX is accepted. Accepted RFCs cannot be edited in place. Run /fo-idea-create-rfc with amends: [RFC-XXXX] to create an amending RFC, or supersedes: [RFC-XXXX] to create a superseding RFC.`
|
|
37
|
+
|
|
38
|
+
### fo-idea-plan
|
|
39
|
+
|
|
40
|
+
4. **Audit check** — look for `docs/audits/audit-rfc-XXXX-*.md`. If no audit file exists, skip with: `No audit report found for RFC-XXXX in docs/audits/. Run /fo-idea-audit RFC-XXXX first. The pipeline is: create → audit → enhance → plan → implement (includes review → fix).`
|
|
41
|
+
|
|
42
|
+
5. **Enhance check** — read the RFC's frontmatter and look for the `enhancedAt` field. If `enhancedAt` is absent, skip with: `RFC-XXXX has not been enhanced (no enhancedAt in frontmatter). Run /fo-idea-enhance RFC-XXXX first. The pipeline is: create → audit → enhance → plan → implement (includes review → fix).`
|
|
43
|
+
|
|
44
|
+
6. **Accepted status check** — if the status is `accepted` and both audit and enhance are done, prerequisites are met. If the status is `draft` or `reviewing` and has `enhancedAt`, the user's instruction to plan IS the architecture acceptance — proceed to the draft→accepted transition.
|
|
45
|
+
|
|
46
|
+
### fo-idea-implement
|
|
47
|
+
|
|
48
|
+
4. **Audit check** — look for `docs/audits/audit-rfc-XXXX-*.md`. If no audit file exists, skip with: `No audit report found for RFC-XXXX in docs/audits/. Run /fo-idea-audit RFC-XXXX first. The pipeline is: create → audit → enhance → plan → implement (includes review → fix).`
|
|
49
|
+
|
|
50
|
+
5. **Enhance check** — read the RFC's frontmatter and look for the `enhancedAt` field. If `enhancedAt` is absent, skip with: `RFC-XXXX has not been enhanced (no enhancedAt in frontmatter). Run /fo-idea-enhance RFC-XXXX first. The pipeline is: create → audit → enhance → plan → implement (includes review → fix).`
|
|
51
|
+
|
|
52
|
+
6. **Accepted status check** — if the status is not `accepted` (e.g. `draft` or `reviewing`), skip with: `RFC-XXXX is <status>, not accepted. Run /fo-idea-plan RFC-XXXX first — it will transition the RFC to accepted and create the plan. The pipeline is: create → audit → enhance → plan → implement (includes review → fix).`
|
|
53
|
+
|
|
54
|
+
7. **Plan check** — look for `docs/plans/plan-rfc-XXXX-*.md`. If no plan file exists, skip with: `No plan file found for RFC-XXXX in docs/plans/. Run /fo-idea-plan RFC-XXXX first. The pipeline is: create → audit → enhance → plan → implement (includes review → fix).`
|
|
55
|
+
|
|
56
|
+
## Batch processing
|
|
57
|
+
|
|
58
|
+
When multiple documents are identified, **loop through each one** and run the full skill process for each sequentially **without pauses between documents**. Do not stop, present a summary, or ask the user between documents — once the work for one document is committed (or it is skipped), immediately proceed to the next document. **Do not emit transition messages such as "Moving to RFC-XXXX next" or per-document status reports during the loop.** Internal status is fine, but nothing is shown to the user until the very end. Only after all documents are processed, print a single final batch summary.
|
|
59
|
+
|
|
60
|
+
**Exception:** Interactive steps within a skill (grilling, resolving open questions) are inherently interactive — they may require user responses. This is not a "pause between documents" but a required step within one document's processing. Resolve all interactions for the current document before proceeding to the next.
|
|
61
|
+
|
|
62
|
+
## Batch summary format
|
|
63
|
+
|
|
64
|
+
After all documents are processed, present a single batch summary:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
## Batch <Action> Summary
|
|
68
|
+
|
|
69
|
+
### Documents requested: <N>
|
|
70
|
+
### Documents processed: <N>
|
|
71
|
+
### Documents skipped: <list with reason>
|
|
72
|
+
|
|
73
|
+
| ID | Type | Status | <action-specific columns> |
|
|
74
|
+
|---|---|---|---|
|
|
75
|
+
| RFC-0355 | RFC | <result> | ... |
|
|
76
|
+
| ADR-0003 | ADR | <result> | ... |
|
|
77
|
+
|
|
78
|
+
### Total commits: <count>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Do not output per-document summaries or "Moving to XXXX next" messages during the loop; they belong here, at the very end.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Audit Axes
|
|
2
|
+
|
|
3
|
+
Load this file when running step 4 of `fo-idea-audit`. For each axis, check every item. An item either **passes**, **fails** (specific finding with evidence), or is **not applicable** (state why). Skip N/A items silently — do not pad the report.
|
|
4
|
+
|
|
5
|
+
## Axis A — Structural completeness
|
|
6
|
+
|
|
7
|
+
Beyond V-13 (required sections exist) and V-14 (≥3 acceptance items), check that each section contains real content, not template placeholders or empty HTML comments:
|
|
8
|
+
|
|
9
|
+
- **Decision** is a single decision in present tense ("The kernel gains…"), not a wishlist or "we should".
|
|
10
|
+
- **CLI surface** shows exact `pnpm exec werkstatt run …` invocations with flags and scope.
|
|
11
|
+
- **TypeScript contracts** are minimal type signatures, not full implementations.
|
|
12
|
+
- **File system responsibilities** table names concrete paths the RFC touches.
|
|
13
|
+
- **Output format** documents the `--json` shape.
|
|
14
|
+
- **Failure modes** specifies exit codes and warn-vs-fail behavior.
|
|
15
|
+
- **Rollout** describes default behavior, adoption path for existing apps, and new-app compliance.
|
|
16
|
+
- **Alternatives considered** is honest — at least one real alternative with a rejection reason.
|
|
17
|
+
- **Risks** includes agent misinterpretation risk and false-positive rate for validators.
|
|
18
|
+
- **Acceptance criteria** items are checkable (can an agent or human verify each one?) and sufficient (do they cover the decision's full scope?).
|
|
19
|
+
- **Implementation notes for agents** are explicit behavioral rules, not vague guidance.
|
|
20
|
+
|
|
21
|
+
## Axis B — DNA alignment
|
|
22
|
+
|
|
23
|
+
- Each entry in `satisfies[]` is a real DNA invariant in `docs/architecture-dna.md`, and the RFC body explains **how** it enforces, protects, or extends that invariant — not just that it's "related".
|
|
24
|
+
- If the RFC establishes a new DNA invariant (body says "DNA-N established by this RFC"), the audit confirms `docs/architecture-dna.md` will need a new `## DNA-N` entry and the RFC's `satisfies[]` includes it.
|
|
25
|
+
- The RFC does not silently conflict with any existing DNA invariant. If it changes a DNA invariant, it must `supersede` the establishing RFC — not amend it.
|
|
26
|
+
- `related[]` DNA references are relevant and not decorative.
|
|
27
|
+
|
|
28
|
+
## Axis C — Ecosystem fit
|
|
29
|
+
|
|
30
|
+
- **Package boundaries**: imports flow `apps/* → packages/*` and `services/* → packages/*`, never `apps/* → apps/*` or `apps/* → services/*` (DNA-1). If the RFC proposes a new package, it belongs in `packages/*`.
|
|
31
|
+
- **Pipeline placement**: the RFC names the correct pipeline for each new check — `build.prepare`, `build.check`, `sites-check`, `sites-check-postbuild` — and the choice is justified (blocking vs. advisory).
|
|
32
|
+
- **Compass sync**: if the RFC changes repository-wide requirements, shared package contracts, or app-package relationships, it identifies which `docs/*.xml` files need synchronization (root AGENTS.md Compass document duties).
|
|
33
|
+
- **AGENTS.md updates**: the RFC identifies which `AGENTS.md` files need rule updates (root, `apps/`, `packages/`, `services/`, or site-specific).
|
|
34
|
+
- **Cosmic naming**: if the RFC touches manifests or component/section/page contracts, it addresses the three-way alignment (manifest `cosmicName` ↔ `PLANET_IMPORT_PATHS`/`MOON_IMPORT_PATHS` ↔ `system.md` pins).
|
|
35
|
+
- **Command lifecycle**: `commands.proposed/added/changed/removed` buckets are internally consistent — proposed commands that the RFC introduces will land in `added` upon implementation; changed commands are existing registered commands; removed commands are explicitly deprecated.
|
|
36
|
+
|
|
37
|
+
## Axis D — Forward-only compliance
|
|
38
|
+
|
|
39
|
+
This ecosystem is forward-only — no backward compatibility layers, no expand-then-contract migrations. Check:
|
|
40
|
+
|
|
41
|
+
- The RFC does not propose a compatibility shim, bridge, or dual-path that keeps legacy behavior alive alongside the new one.
|
|
42
|
+
- Deprecation means removal in the same RFC wave, not an indefinite grace period.
|
|
43
|
+
- If the RFC amends another RFC, it changes the amended RFC's contract directly — it does not add a parallel interpretation.
|
|
44
|
+
- Legacy code paths are deleted, not maintained behind a flag.
|
|
45
|
+
|
|
46
|
+
## Axis E — Agent-facing policy
|
|
47
|
+
|
|
48
|
+
- **Status gate**: the RFC does not contain self-authorizing language ("may proceed while draft", "implementation can start before acceptance"). Draft RFCs cannot grant implementation permission.
|
|
49
|
+
- **Implementation notes** reference the correct governance rules: RFC-0224 (accepted→implemented transition), RFC-0230 (if touching agent surface), RFC-0334 (supersede escalation on invariant conflict), RFC-0330 (verification evidence for probe-bearing RFCs).
|
|
50
|
+
- **Anti-fabrication**: if the RFC's acceptance criteria include content authoring (prose, business records, claims), the criteria distinguish between code changes an agent can make and content that requires human authoring. The RFC must not claim content will be "auto-generated" when it requires human authoring.
|
|
51
|
+
- **Storage policy**: if the RFC touches persistence, it does not introduce cookies (`document.cookie`, `Set-Cookie`). Client-side persistence is `localStorage` only; server-side is `unstorage`.
|
|
52
|
+
|
|
53
|
+
## Axis F — Pragmatism
|
|
54
|
+
|
|
55
|
+
- **Minimal command surface**: each proposed command earns its existence — no command that could be a flag on an existing command, no command that duplicates an existing command's scope.
|
|
56
|
+
- **Lean contracts**: TypeScript types are the minimum needed to understand the shape — no speculative generality, no unused optional fields, no abstraction for needs the RFC doesn't have.
|
|
57
|
+
- **Existing patterns**: the RFC checks whether an existing command, schema, or pattern can be extended before proposing a new one. If a new one is proposed, the alternatives section explains why extension was insufficient.
|
|
58
|
+
- **Scope discipline**: `appsImpacted` and `packagesImpacted` list only what's actually impacted. `nonGoals` are explicit and meaningful, not boilerplate.
|
|
59
|
+
|
|
60
|
+
## Axis G — Blind spots
|
|
61
|
+
|
|
62
|
+
- **Performance**: build-time commands specify their cost (file scan count, regex complexity, I/O patterns). A command that scans all `apps/**` on every `build.check` is a bottleneck.
|
|
63
|
+
- **False positives**: validators estimate their false-positive rate and describe how to suppress noise during migration.
|
|
64
|
+
- **Edge cases**: the RFC considers empty states (new app with no content, package with no manifests), concurrent execution (two builds, two agents), and interrupted operations (crash mid-write).
|
|
65
|
+
- **Migration path**: existing apps' path to compliance is documented — do they pass without changes, or is there a documented migration window?
|
|
66
|
+
- **Security/privacy**: if the RFC touches user data, PII, or external services, it addresses GDPR/privacy implications and secret management (no hardcoded keys, env vars documented in `.env.example` per DNA-40).
|
|
@@ -236,9 +236,9 @@ Semantic audit of RFC-XXXX (<title>). Verdict: <approved | needs-revision | reje
|
|
|
236
236
|
|
|
237
237
|
Stage only the audit file — do not stage unrelated changes. Another agent may be working in a different session; `git add -A` or `git add .` is forbidden.
|
|
238
238
|
|
|
239
|
-
### 8. Stop
|
|
239
|
+
### 8. Stop and suggest next step
|
|
240
240
|
|
|
241
|
-
Do not modify the RFC or any other file.
|
|
241
|
+
Do not modify the RFC or any other file. Present the report. Then follow the pipeline continuation protocol per `_shared/fo-pipeline-conventions.md` §Pipeline continuation — proactively suggest the next step (`fo-idea-enhance`) and offer to proceed via `ask_user_question`. Do not automatically run the next skill — ask the operator first. The full pipeline is: create → audit → enhance → plan → implement.
|
|
242
242
|
|
|
243
243
|
## Constraints
|
|
244
244
|
|
|
@@ -204,9 +204,9 @@ Integrate audit findings into RFC-XXXX (<title>). <count> direct fixes,
|
|
|
204
204
|
|
|
205
205
|
Stage only the RFC files and audit files touched by this enhancement — do not stage unrelated changes.
|
|
206
206
|
|
|
207
|
-
### 11. Stop
|
|
207
|
+
### 11. Stop and suggest next step
|
|
208
208
|
|
|
209
|
-
|
|
209
|
+
Follow the pipeline continuation protocol per `_shared/fo-pipeline-conventions.md` §Pipeline continuation — proactively suggest the next step (`fo-idea-plan`) and offer to proceed via `ask_user_question`. Do not automatically run the next skill — ask the operator first. The full pipeline is: create → audit → enhance → plan → implement.
|
|
210
210
|
|
|
211
211
|
## Constraints
|
|
212
212
|
|