@entelligentsia/forgecli 1.0.21 → 1.0.25
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/CHANGELOG.md +88 -0
- package/dist/CHANGELOG-forge-plugin.md +118 -0
- package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
- package/dist/extensions/forgecli/forge-tools.js +73 -0
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
- package/dist/extensions/forgecli/lib/forge-root.js +14 -1
- package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +1 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js +26 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/run-sprint.js +49 -0
- package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
- package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/event.schema.json +8 -3
- package/dist/forge-payload/.schemas/migrations.json +56 -0
- package/dist/forge-payload/integrity.json +3 -3
- package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
- package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/event.schema.json +8 -3
- package/dist/forge-payload/schemas/structure-manifest.json +4 -2
- package/dist/forge-payload/tools/commit-task.cjs +218 -0
- package/dist/forge-payload/tools/store-cli.cjs +6 -1
- package/node_modules/@mariozechner/clipboard/package.json +2 -1
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
- package/package.json +2 -2
- package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
- package/dist/extensions/forgecli/add-pipeline.js +0 -143
- package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
- package/dist/extensions/forgecli/add-task.d.ts +0 -20
- package/dist/extensions/forgecli/add-task.js +0 -154
- package/dist/extensions/forgecli/add-task.js.map +0 -1
- package/dist/extensions/forgecli/approve.d.ts +0 -22
- package/dist/extensions/forgecli/approve.js +0 -152
- package/dist/extensions/forgecli/approve.js.map +0 -1
- package/dist/extensions/forgecli/banner.d.ts +0 -10
- package/dist/extensions/forgecli/banner.js +0 -36
- package/dist/extensions/forgecli/banner.js.map +0 -1
- package/dist/extensions/forgecli/calibrate.d.ts +0 -64
- package/dist/extensions/forgecli/calibrate.js +0 -481
- package/dist/extensions/forgecli/calibrate.js.map +0 -1
- package/dist/extensions/forgecli/collate.d.ts +0 -22
- package/dist/extensions/forgecli/collate.js +0 -134
- package/dist/extensions/forgecli/collate.js.map +0 -1
- package/dist/extensions/forgecli/commit.d.ts +0 -22
- package/dist/extensions/forgecli/commit.js +0 -152
- package/dist/extensions/forgecli/commit.js.map +0 -1
- package/dist/extensions/forgecli/config-command.d.ts +0 -8
- package/dist/extensions/forgecli/config-command.js +0 -67
- package/dist/extensions/forgecli/config-command.js.map +0 -1
- package/dist/extensions/forgecli/config-layer.d.ts +0 -53
- package/dist/extensions/forgecli/config-layer.js +0 -72
- package/dist/extensions/forgecli/config-layer.js.map +0 -1
- package/dist/extensions/forgecli/config-writer.d.ts +0 -16
- package/dist/extensions/forgecli/config-writer.js +0 -69
- package/dist/extensions/forgecli/config-writer.js.map +0 -1
- package/dist/extensions/forgecli/enhance.d.ts +0 -27
- package/dist/extensions/forgecli/enhance.js +0 -199
- package/dist/extensions/forgecli/enhance.js.map +0 -1
- package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
- package/dist/extensions/forgecli/fix-bug.js +0 -1580
- package/dist/extensions/forgecli/fix-bug.js.map +0 -1
- package/dist/extensions/forgecli/forge-header.d.ts +0 -12
- package/dist/extensions/forgecli/forge-header.js +0 -114
- package/dist/extensions/forgecli/forge-header.js.map +0 -1
- package/dist/extensions/forgecli/forge-init.d.ts +0 -26
- package/dist/extensions/forgecli/forge-init.js +0 -514
- package/dist/extensions/forgecli/forge-init.js.map +0 -1
- package/dist/extensions/forgecli/forge-root.d.ts +0 -10
- package/dist/extensions/forgecli/forge-root.js +0 -62
- package/dist/extensions/forgecli/forge-root.js.map +0 -1
- package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
- package/dist/extensions/forgecli/forge-update-command.js +0 -435
- package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
- package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
- package/dist/extensions/forgecli/friction-emit.js +0 -245
- package/dist/extensions/forgecli/friction-emit.js.map +0 -1
- package/dist/extensions/forgecli/implement.d.ts +0 -22
- package/dist/extensions/forgecli/implement.js +0 -170
- package/dist/extensions/forgecli/implement.js.map +0 -1
- package/dist/extensions/forgecli/init-context.d.ts +0 -99
- package/dist/extensions/forgecli/init-context.js +0 -178
- package/dist/extensions/forgecli/init-context.js.map +0 -1
- package/dist/extensions/forgecli/init-progress.d.ts +0 -39
- package/dist/extensions/forgecli/init-progress.js +0 -117
- package/dist/extensions/forgecli/init-progress.js.map +0 -1
- package/dist/extensions/forgecli/input-router.d.ts +0 -33
- package/dist/extensions/forgecli/input-router.js +0 -136
- package/dist/extensions/forgecli/input-router.js.map +0 -1
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
- package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
- package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
- package/dist/extensions/forgecli/materialize.d.ts +0 -16
- package/dist/extensions/forgecli/materialize.js +0 -195
- package/dist/extensions/forgecli/materialize.js.map +0 -1
- package/dist/extensions/forgecli/migrate.d.ts +0 -22
- package/dist/extensions/forgecli/migrate.js +0 -260
- package/dist/extensions/forgecli/migrate.js.map +0 -1
- package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
- package/dist/extensions/forgecli/migration-engine.js +0 -563
- package/dist/extensions/forgecli/migration-engine.js.map +0 -1
- package/dist/extensions/forgecli/model-registry.d.ts +0 -61
- package/dist/extensions/forgecli/model-registry.js +0 -127
- package/dist/extensions/forgecli/model-registry.js.map +0 -1
- package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
- package/dist/extensions/forgecli/model-resolver.js +0 -65
- package/dist/extensions/forgecli/model-resolver.js.map +0 -1
- package/dist/extensions/forgecli/model-validator.d.ts +0 -29
- package/dist/extensions/forgecli/model-validator.js +0 -107
- package/dist/extensions/forgecli/model-validator.js.map +0 -1
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
- package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
- package/dist/extensions/forgecli/plan.d.ts +0 -22
- package/dist/extensions/forgecli/plan.js +0 -167
- package/dist/extensions/forgecli/plan.js.map +0 -1
- package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
- package/dist/extensions/forgecli/quiz-agent.js +0 -98
- package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
- package/dist/extensions/forgecli/read-command.d.ts +0 -2
- package/dist/extensions/forgecli/read-command.js +0 -100
- package/dist/extensions/forgecli/read-command.js.map +0 -1
- package/dist/extensions/forgecli/regenerate.d.ts +0 -40
- package/dist/extensions/forgecli/regenerate.js +0 -438
- package/dist/extensions/forgecli/regenerate.js.map +0 -1
- package/dist/extensions/forgecli/remove-command.d.ts +0 -17
- package/dist/extensions/forgecli/remove-command.js +0 -124
- package/dist/extensions/forgecli/remove-command.js.map +0 -1
- package/dist/extensions/forgecli/report-bug.d.ts +0 -25
- package/dist/extensions/forgecli/report-bug.js +0 -159
- package/dist/extensions/forgecli/report-bug.js.map +0 -1
- package/dist/extensions/forgecli/retrospective.d.ts +0 -20
- package/dist/extensions/forgecli/retrospective.js +0 -126
- package/dist/extensions/forgecli/retrospective.js.map +0 -1
- package/dist/extensions/forgecli/review-code.d.ts +0 -35
- package/dist/extensions/forgecli/review-code.js +0 -196
- package/dist/extensions/forgecli/review-code.js.map +0 -1
- package/dist/extensions/forgecli/review-plan.d.ts +0 -35
- package/dist/extensions/forgecli/review-plan.js +0 -200
- package/dist/extensions/forgecli/review-plan.js.map +0 -1
- package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
- package/dist/extensions/forgecli/run-sprint.js +0 -716
- package/dist/extensions/forgecli/run-sprint.js.map +0 -1
- package/dist/extensions/forgecli/run-task.d.ts +0 -204
- package/dist/extensions/forgecli/run-task.js +0 -1403
- package/dist/extensions/forgecli/run-task.js.map +0 -1
- package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
- package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
- package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
- package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
- package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
- package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
- package/dist/extensions/forgecli/skill-retriever.js +0 -246
- package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
- package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
- package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
- package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
- package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
- package/dist/extensions/forgecli/sprint-intake.js +0 -91
- package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
- package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
- package/dist/extensions/forgecli/sprint-plan.js +0 -122
- package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
- package/dist/extensions/forgecli/status-command.d.ts +0 -19
- package/dist/extensions/forgecli/status-command.js +0 -140
- package/dist/extensions/forgecli/status-command.js.map +0 -1
- package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
- package/dist/extensions/forgecli/store-error-remediation.js +0 -307
- package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
- package/dist/extensions/forgecli/store-query.d.ts +0 -22
- package/dist/extensions/forgecli/store-query.js +0 -107
- package/dist/extensions/forgecli/store-query.js.map +0 -1
- package/dist/extensions/forgecli/store-repair.d.ts +0 -17
- package/dist/extensions/forgecli/store-repair.js +0 -123
- package/dist/extensions/forgecli/store-repair.js.map +0 -1
- package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
- package/dist/extensions/forgecli/store-resolver.js +0 -263
- package/dist/extensions/forgecli/store-resolver.js.map +0 -1
- package/dist/extensions/forgecli/store-validator.d.ts +0 -16
- package/dist/extensions/forgecli/store-validator.js +0 -32
- package/dist/extensions/forgecli/store-validator.js.map +0 -1
- package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
- package/dist/extensions/forgecli/test-orchestrate.js +0 -182
- package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
- package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
- package/dist/extensions/forgecli/thread-switcher.js +0 -189
- package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
- package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
- package/dist/extensions/forgecli/transition-guard.js +0 -89
- package/dist/extensions/forgecli/transition-guard.js.map +0 -1
- package/dist/extensions/forgecli/update-check.d.ts +0 -37
- package/dist/extensions/forgecli/update-check.js +0 -185
- package/dist/extensions/forgecli/update-check.js.map +0 -1
- package/dist/extensions/forgecli/update-tools.d.ts +0 -23
- package/dist/extensions/forgecli/update-tools.js +0 -135
- package/dist/extensions/forgecli/update-tools.js.map +0 -1
- package/dist/extensions/forgecli/validate.d.ts +0 -22
- package/dist/extensions/forgecli/validate.js +0 -152
- package/dist/extensions/forgecli/validate.js.map +0 -1
- package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
- package/dist/extensions/forgecli/viewport-events.js +0 -243
- package/dist/extensions/forgecli/viewport-events.js.map +0 -1
- package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
- package/dist/extensions/forgecli/viewport-renderer.js +0 -233
- package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
- package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
- package/dist/extensions/forgecli/viewport-theme.js +0 -128
- package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
- package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
- package/dist/extensions/forgecli/whats-new-widget.js +0 -376
- package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
- package/dist/extensions/forgecli/whats-new.d.ts +0 -120
- package/dist/extensions/forgecli/whats-new.js +0 -470
- package/dist/extensions/forgecli/whats-new.js.map +0 -1
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
// halt-advisor.ts — Halt-recovery advisor helper (FORGE-S26-T18).
|
|
2
|
-
//
|
|
3
|
-
// When preflight-gate.cjs exits 1 and emits a structured failure JSON,
|
|
4
|
-
// the CLI route (run-task / fix-bug) calls runHaltAdvisor to spawn a
|
|
5
|
-
// read-only one-shot subagent that explains the failure and guides recovery.
|
|
6
|
-
//
|
|
7
|
-
// Design constraints:
|
|
8
|
-
// - Advisor is READ-ONLY: no store writes, no artifact mutations.
|
|
9
|
-
// - Model: the HEAVY model the runtime resolves point-in-time — the
|
|
10
|
-
// approve/architect slot through the existing routing cascade
|
|
11
|
-
// (project > user > pi default). NO dedicated advisorModel config entry.
|
|
12
|
-
// If nothing is routed and no current model exists, the advisor is
|
|
13
|
-
// skipped silently (non-fatal).
|
|
14
|
-
// - runHaltAdvisor is best-effort: failures must not mask the primary halt.
|
|
15
|
-
import { runForgeSubagent, loadForgePersona } from "../forge-subagent.js";
|
|
16
|
-
import { resolveModelForPhase } from "../model-resolver.js";
|
|
17
|
-
/**
|
|
18
|
-
* Resolve the advisor model for halt-recovery.
|
|
19
|
-
*
|
|
20
|
-
* Priority:
|
|
21
|
-
* 1. Explicit `advisorModel` config slot from forge-cli layered config.
|
|
22
|
-
* Contract (rev. 2026-06-04): the advisor model is the HEAVY model the runtime
|
|
23
|
-
* resolves point-in-time. There is NO dedicated advisorModel config entry —
|
|
24
|
-
* "heavy" is the approve/architect slot resolved through the existing routing
|
|
25
|
-
* cascade (L4 phase override → L3/L2 project → L1 user/global → default),
|
|
26
|
-
* exactly as the approve phase itself would resolve. When the cascade bottoms
|
|
27
|
-
* out at inherit, the session's current model (pi default) is used. In the
|
|
28
|
-
* Claude Code plugin route the equivalent is the opus-class session model.
|
|
29
|
-
*
|
|
30
|
-
* Returns undefined (advisor skipped, non-fatal) only when nothing is routed
|
|
31
|
-
* AND no current model is available.
|
|
32
|
-
*
|
|
33
|
-
* (History: the original FORGE-S26-T18 implementation used a dedicated
|
|
34
|
-
* advisorModel config slot with a blind registry fallback that produced
|
|
35
|
-
* "anthropic/undefined" on the CART-S03-T01 halt — both retired.)
|
|
36
|
-
*/
|
|
37
|
-
export function resolveAdvisorModel(merged, currentModel, pipelineName = "default") {
|
|
38
|
-
// Heavy slot: the approve phase / architect persona routing resolution.
|
|
39
|
-
try {
|
|
40
|
-
const heavy = resolveModelForPhase(pipelineName, "approve", "architect", merged ?? {});
|
|
41
|
-
if (heavy.model)
|
|
42
|
-
return heavy.model;
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// resolution errors are non-fatal — fall through to the current model
|
|
46
|
-
}
|
|
47
|
-
// Inherit → pi's current model (provider-neutral, known-good).
|
|
48
|
-
if (currentModel?.provider) {
|
|
49
|
-
const model = currentModel.model ?? currentModel.id;
|
|
50
|
-
if (model)
|
|
51
|
-
return { provider: currentModel.provider, model };
|
|
52
|
-
}
|
|
53
|
-
return undefined;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Spawn a read-only advisor subagent to explain the gate failure and guide recovery.
|
|
57
|
-
*
|
|
58
|
-
* Best-effort: errors are notified via ctx.ui but do NOT propagate. The
|
|
59
|
-
* primary halt status is the caller's responsibility to surface separately.
|
|
60
|
-
*/
|
|
61
|
-
export async function runHaltAdvisor(opts) {
|
|
62
|
-
const { gateFailure, advisorModel, taskId, cwd, ctx, forgeRoot } = opts;
|
|
63
|
-
if (!advisorModel) {
|
|
64
|
-
// No model available — skip advisor silently.
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
ctx.ui.notify(`ℹ forge: halt advisor running on ${advisorModel.provider}/${advisorModel.model} for ${taskId}`, "info");
|
|
68
|
-
const advisoryPrompt = [
|
|
69
|
-
`# Halt-Recovery Advisory for ${taskId}`,
|
|
70
|
-
``,
|
|
71
|
-
`A preflight gate halted the pipeline for phase **${gateFailure.phase}**.`,
|
|
72
|
-
``,
|
|
73
|
-
`## Failure Details`,
|
|
74
|
-
`- **Reason code:** \`${gateFailure.reasonCode}\``,
|
|
75
|
-
`- **Detail:** ${gateFailure.detail}`,
|
|
76
|
-
``,
|
|
77
|
-
`## Recommended Remediation`,
|
|
78
|
-
gateFailure.remediation,
|
|
79
|
-
``,
|
|
80
|
-
`## Your Role`,
|
|
81
|
-
`You are a read-only advisor. Explain the failure in plain language, confirm the`,
|
|
82
|
-
`remediation step, and provide any additional context the user needs to unblock.`,
|
|
83
|
-
`Do NOT modify any files, run any commands, or write to the store.`,
|
|
84
|
-
`Output your advisory as a brief structured summary (2–4 sentences).`,
|
|
85
|
-
].join("\n");
|
|
86
|
-
try {
|
|
87
|
-
let persona;
|
|
88
|
-
try {
|
|
89
|
-
persona = loadForgePersona("engineer", cwd);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
// Persona unavailable — use a minimal fallback rather than crashing.
|
|
93
|
-
persona = {
|
|
94
|
-
name: "advisor",
|
|
95
|
-
description: "Halt-recovery advisor",
|
|
96
|
-
systemPrompt: "You are a Forge engineering advisor. Be concise and helpful.",
|
|
97
|
-
filePath: "",
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
await runForgeSubagent({
|
|
101
|
-
persona,
|
|
102
|
-
task: advisoryPrompt,
|
|
103
|
-
cwd,
|
|
104
|
-
forgeRoot,
|
|
105
|
-
requestedModel: advisorModel,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
const e = err;
|
|
110
|
-
ctx.ui.notify(`⚠ forge: halt advisor failed (non-fatal): ${e.message ?? "unknown"}`, "warning");
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=halt-advisor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"halt-advisor.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/lib/halt-advisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { MergedConfig } from "../config-layer.js";
|
|
2
|
-
import type { OrchestratorResult } from "./orchestrator-types.js";
|
|
3
|
-
/** Minimal context interface — only the bits preflight needs. */
|
|
4
|
-
export interface PreflightContext {
|
|
5
|
-
ui: {
|
|
6
|
-
notify(message: string, type?: "error" | "info" | "warning"): void;
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
export interface RunOrchestratorPreflightOptions {
|
|
10
|
-
/** "task" runs validateModelConfig; "ceremony" skips it. */
|
|
11
|
-
mode: "task" | "ceremony";
|
|
12
|
-
/** Minimal context for notifications. */
|
|
13
|
-
ctx: PreflightContext;
|
|
14
|
-
/** Prefix for notify messages, e.g. "forge:run-task" or "forge:fix-bug". */
|
|
15
|
-
notifyPrefix: string;
|
|
16
|
-
/** Persona name catalogue from readPersonaDir. */
|
|
17
|
-
personaCatalogue: string[];
|
|
18
|
-
/** Pipeline name catalogue from readPipelineNames; null if no config found. */
|
|
19
|
-
pipelineCatalogue: string[] | null;
|
|
20
|
-
/** Merged model-routing config from loadLayeredConfig. */
|
|
21
|
-
modelRoutingConfig: MergedConfig;
|
|
22
|
-
/** Available models from ctx.modelRegistry.getAvailable(). */
|
|
23
|
-
availableModels: Array<{
|
|
24
|
-
provider: string;
|
|
25
|
-
id: string;
|
|
26
|
-
}>;
|
|
27
|
-
}
|
|
28
|
-
/** Discriminated union: proceed=true → continue; proceed=false → return result early. */
|
|
29
|
-
export type OrchestratorPreflightResult = {
|
|
30
|
-
proceed: true;
|
|
31
|
-
} | {
|
|
32
|
-
proceed: false;
|
|
33
|
-
result: OrchestratorResult;
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Run the orchestrator pre-flight check.
|
|
37
|
-
*
|
|
38
|
-
* In mode="task": calls validateModelConfig and surfaces warnings/errors via
|
|
39
|
-
* ctx.ui.notify. Returns `{ proceed: false, result }` with status="failed" if
|
|
40
|
-
* there are errors; returns `{ proceed: true }` otherwise.
|
|
41
|
-
*
|
|
42
|
-
* In mode="ceremony": returns `{ proceed: true }` immediately without calling
|
|
43
|
-
* validateModelConfig. This matches the existing behaviour of ceremony dispatch
|
|
44
|
-
* which uses lookupPersonaModel rather than the full validator.
|
|
45
|
-
*/
|
|
46
|
-
export declare function runOrchestratorPreflight(opts: RunOrchestratorPreflightOptions): OrchestratorPreflightResult;
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// lib/orchestrator-preflight.ts — FORGE-S25-T17 (H-13, N-H-D)
|
|
2
|
-
//
|
|
3
|
-
// Single shared preflight helper for orchestrator pipelines. Replaces the
|
|
4
|
-
// duplicate pre-flight validation blocks in run-task.ts and fix-bug.ts.
|
|
5
|
-
//
|
|
6
|
-
// Design: a `mode` parameter selects behaviour:
|
|
7
|
-
//
|
|
8
|
-
// mode="task" — full model-config validation via validateModelConfig.
|
|
9
|
-
// Used by runTaskPipeline and runBugPipeline.
|
|
10
|
-
// mode="ceremony" — skips validateModelConfig entirely.
|
|
11
|
-
// Aligns with dispatchSprintCeremony which uses
|
|
12
|
-
// lookupPersonaModel (not the full validator). The
|
|
13
|
-
// run-sprint.ts ceremony call does NOT use this helper
|
|
14
|
-
// directly; it was already skip-validation by design
|
|
15
|
-
// (N-H-D). This mode is available for future callers
|
|
16
|
-
// that need a ceremony-style preflight.
|
|
17
|
-
//
|
|
18
|
-
// Why run-sprint.ts is NOT migrated to this helper:
|
|
19
|
-
// run-sprint.ts contains a separate sprint-entry validation block
|
|
20
|
-
// (lines 470–498) that validates sprint-level config, not task/phase-level.
|
|
21
|
-
// That block is architecturally distinct and is explicitly out of scope
|
|
22
|
-
// per the plan-review finding (N-H-D resolved, reviewer-approved).
|
|
23
|
-
import { validateModelConfig } from "../model-validator.js";
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
// runOrchestratorPreflight
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
/**
|
|
28
|
-
* Run the orchestrator pre-flight check.
|
|
29
|
-
*
|
|
30
|
-
* In mode="task": calls validateModelConfig and surfaces warnings/errors via
|
|
31
|
-
* ctx.ui.notify. Returns `{ proceed: false, result }` with status="failed" if
|
|
32
|
-
* there are errors; returns `{ proceed: true }` otherwise.
|
|
33
|
-
*
|
|
34
|
-
* In mode="ceremony": returns `{ proceed: true }` immediately without calling
|
|
35
|
-
* validateModelConfig. This matches the existing behaviour of ceremony dispatch
|
|
36
|
-
* which uses lookupPersonaModel rather than the full validator.
|
|
37
|
-
*/
|
|
38
|
-
export function runOrchestratorPreflight(opts) {
|
|
39
|
-
if (opts.mode === "ceremony") {
|
|
40
|
-
return { proceed: true };
|
|
41
|
-
}
|
|
42
|
-
// mode="task" — full validation
|
|
43
|
-
const strict = process.env.FORGE_STRICT_MODELS === "1";
|
|
44
|
-
const { errors, warnings } = validateModelConfig(opts.personaCatalogue, opts.pipelineCatalogue, opts.modelRoutingConfig, opts.availableModels, strict);
|
|
45
|
-
for (const w of warnings) {
|
|
46
|
-
opts.ctx.ui.notify(`⚠ ${opts.notifyPrefix} — model routing: ${w.message}`, "warning");
|
|
47
|
-
}
|
|
48
|
-
if (errors.length > 0) {
|
|
49
|
-
for (const e of errors) {
|
|
50
|
-
opts.ctx.ui.notify(`× ${opts.notifyPrefix} — model routing: ${e.message}`, "error");
|
|
51
|
-
}
|
|
52
|
-
return {
|
|
53
|
-
proceed: false,
|
|
54
|
-
result: {
|
|
55
|
-
status: "failed",
|
|
56
|
-
lastPhaseIndex: 0,
|
|
57
|
-
iterationCounts: {},
|
|
58
|
-
lastError: `model config validation failed: ${errors.map((e) => e.code).join(", ")}`,
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
return { proceed: true };
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=orchestrator-preflight.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-preflight.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/lib/orchestrator-preflight.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,EAAE;AACF,gDAAgD;AAChD,EAAE;AACF,4EAA4E;AAC5E,kEAAkE;AAClE,0DAA0D;AAC1D,oEAAoE;AACpE,uEAAuE;AACvE,2EAA2E;AAC3E,yEAAyE;AACzE,yEAAyE;AACzE,4DAA4D;AAC5D,EAAE;AACF,oDAAoD;AACpD,oEAAoE;AACpE,8EAA8E;AAC9E,0EAA0E;AAC1E,qEAAqE;AAGrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAkC5D,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAqC;IAC7E,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,gCAAgC;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC;IACvD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAC/C,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,eAAe,EACpB,MAAM,CACN,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,YAAY,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,YAAY,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACrF,CAAC;QACD,OAAO;YACN,OAAO,EAAE,KAAK;YACd,MAAM,EAAE;gBACP,MAAM,EAAE,QAAQ;gBAChB,cAAc,EAAE,CAAC;gBACjB,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,mCAAmC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACpF;SACD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
export interface ParsedMaterializeArgs {
|
|
3
|
-
mode: "all" | "single-workflow";
|
|
4
|
-
workflowId?: string;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Parse /forge:materialize arguments.
|
|
8
|
-
*
|
|
9
|
-
* Recognised forms:
|
|
10
|
-
* (empty) → { mode: "all" }
|
|
11
|
-
* --all → { mode: "all" }
|
|
12
|
-
* workflows <id> → { mode: "single-workflow", workflowId: "<id>" }
|
|
13
|
-
* workflows:<id> → { mode: "single-workflow", workflowId: "<id>" }
|
|
14
|
-
*/
|
|
15
|
-
export declare function parseMaterializeArgs(args: string): ParsedMaterializeArgs;
|
|
16
|
-
export declare function registerMaterialize(pi: ExtensionAPI): void;
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
// materialize.ts — native handler for /forge:materialize (FORGE-S23-T09)
|
|
2
|
-
//
|
|
3
|
-
// Ports the deterministic subset of the plugin's /forge:materialize:
|
|
4
|
-
// - Full warm-up (no args or --all): runs substitute-placeholders.cjs,
|
|
5
|
-
// build-persona-pack.cjs, and build-context-pack.cjs from the bundled payload.
|
|
6
|
-
// - Single-workflow mode: deferred — notify + return (follow-up task).
|
|
7
|
-
//
|
|
8
|
-
// Mode-neutral invariant: never writes .forge/config.json mode field.
|
|
9
|
-
// Uses spawn("node", [toolPath, ...argv]) — argv-array, no shell (IL6).
|
|
10
|
-
//
|
|
11
|
-
// References: regenerate.ts (substitute-placeholders.cjs argv),
|
|
12
|
-
// forge-init.ts (build-persona-pack / build-context-pack argv).
|
|
13
|
-
import { spawn } from "node:child_process";
|
|
14
|
-
import * as fs from "node:fs";
|
|
15
|
-
import * as path from "node:path";
|
|
16
|
-
import { getBundledPayloadRoot, getBundledToolsRoot } from "./forge-init.js";
|
|
17
|
-
// ── Argument parser ─────────────────────────────────────────────────────────
|
|
18
|
-
/**
|
|
19
|
-
* Parse /forge:materialize arguments.
|
|
20
|
-
*
|
|
21
|
-
* Recognised forms:
|
|
22
|
-
* (empty) → { mode: "all" }
|
|
23
|
-
* --all → { mode: "all" }
|
|
24
|
-
* workflows <id> → { mode: "single-workflow", workflowId: "<id>" }
|
|
25
|
-
* workflows:<id> → { mode: "single-workflow", workflowId: "<id>" }
|
|
26
|
-
*/
|
|
27
|
-
export function parseMaterializeArgs(args) {
|
|
28
|
-
const trimmed = args.trim();
|
|
29
|
-
if (!trimmed || trimmed === "--all") {
|
|
30
|
-
return { mode: "all" };
|
|
31
|
-
}
|
|
32
|
-
// "workflows plan_task" or "workflows:plan_task"
|
|
33
|
-
const workflowsMatch = trimmed.match(/^workflows[: ](.+)$/);
|
|
34
|
-
if (workflowsMatch) {
|
|
35
|
-
return { mode: "single-workflow", workflowId: workflowsMatch[1].trim() };
|
|
36
|
-
}
|
|
37
|
-
// Unrecognised flags/forms: treat as full warm-up (fail-open)
|
|
38
|
-
return { mode: "all" };
|
|
39
|
-
}
|
|
40
|
-
// ── Tool runner ─────────────────────────────────────────────────────────────
|
|
41
|
-
/**
|
|
42
|
-
* Spawn `node <toolPath> [...argv]` and await completion.
|
|
43
|
-
* Returns `{ ok: boolean, stderr: string }`.
|
|
44
|
-
*
|
|
45
|
-
* Non-zero exit is FATAL when `fatal === true` (default), ADVISORY otherwise.
|
|
46
|
-
*/
|
|
47
|
-
async function runTool(toolPath, argv, cwd, label, timeoutMs = 60_000) {
|
|
48
|
-
return new Promise((resolve) => {
|
|
49
|
-
const child = spawn("node", [toolPath, ...argv], {
|
|
50
|
-
cwd,
|
|
51
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
52
|
-
});
|
|
53
|
-
let stderrBuf = "";
|
|
54
|
-
const timer = setTimeout(() => {
|
|
55
|
-
child.kill("SIGKILL");
|
|
56
|
-
resolve({ ok: false, stderr: `${label} timed out after ${timeoutMs}ms` });
|
|
57
|
-
}, timeoutMs);
|
|
58
|
-
child.stderr?.on("data", (d) => {
|
|
59
|
-
stderrBuf += d.toString();
|
|
60
|
-
});
|
|
61
|
-
child.on("close", (code) => {
|
|
62
|
-
clearTimeout(timer);
|
|
63
|
-
resolve({ ok: code === 0, stderr: stderrBuf });
|
|
64
|
-
});
|
|
65
|
-
child.on("error", (err) => {
|
|
66
|
-
clearTimeout(timer);
|
|
67
|
-
resolve({ ok: false, stderr: err.message });
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
// ── Register ────────────────────────────────────────────────────────────────
|
|
72
|
-
export function registerMaterialize(pi) {
|
|
73
|
-
pi.registerCommand("forge:materialize", {
|
|
74
|
-
description: "Fill missing or stubbed Forge scaffolding without overwriting pristine files. " +
|
|
75
|
-
"Deterministic complement to /forge:init --fast. Mode-neutral: never writes config mode.",
|
|
76
|
-
async handler(args, ctx) {
|
|
77
|
-
const cwd = process.cwd();
|
|
78
|
-
const parsed = parseMaterializeArgs(args);
|
|
79
|
-
// Single-workflow mode: deferred in forge-cli — notify and return
|
|
80
|
-
if (parsed.mode === "single-workflow") {
|
|
81
|
-
ctx.ui.notify(`〇 forge:materialize — single-workflow mode ('${parsed.workflowId ?? "?"}') is not yet supported in forge-cli. ` +
|
|
82
|
-
"Use the Forge plugin directly or run /forge:materialize --all for a full warm-up.", "info");
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
// Config guard
|
|
86
|
-
const configPath = path.join(cwd, ".forge", "config.json");
|
|
87
|
-
if (!fs.existsSync(configPath)) {
|
|
88
|
-
ctx.ui.notify("× forge:materialize — no .forge/config.json found. Run /forge:init first.", "error");
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
// Resolve tool paths
|
|
92
|
-
let bundleRoot;
|
|
93
|
-
let toolsRoot;
|
|
94
|
-
try {
|
|
95
|
-
bundleRoot = getBundledPayloadRoot();
|
|
96
|
-
toolsRoot = getBundledToolsRoot();
|
|
97
|
-
}
|
|
98
|
-
catch (err) {
|
|
99
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
100
|
-
ctx.ui.notify(`× forge:materialize — could not resolve bundle paths: ${msg}`, "error");
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const substituteTool = path.join(toolsRoot, "substitute-placeholders.cjs");
|
|
104
|
-
const basePackDir = path.join(bundleRoot, ".base-pack");
|
|
105
|
-
const configJsonPath = path.join(cwd, ".forge", "config.json");
|
|
106
|
-
// Guard: tools must exist
|
|
107
|
-
if (!fs.existsSync(substituteTool)) {
|
|
108
|
-
ctx.ui.notify(`× forge:materialize — substitute-placeholders.cjs not found at ${substituteTool}`, "error");
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
if (!fs.existsSync(basePackDir)) {
|
|
112
|
-
ctx.ui.notify(`× forge:materialize — .base-pack not found at ${basePackDir}`, "error");
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
ctx.ui.setStatus?.("forge:materialize", "Materializing .forge/ artifacts…");
|
|
116
|
-
// Step 1: substitute-placeholders.cjs (fatal on failure)
|
|
117
|
-
// argv shape mirrors regenerate.ts usage
|
|
118
|
-
const initContextJson = path.join(cwd, ".forge", "init-context.json");
|
|
119
|
-
const subArgv = [
|
|
120
|
-
"--forge-root",
|
|
121
|
-
bundleRoot,
|
|
122
|
-
"--base-pack",
|
|
123
|
-
basePackDir,
|
|
124
|
-
"--config",
|
|
125
|
-
configJsonPath,
|
|
126
|
-
"--out",
|
|
127
|
-
cwd,
|
|
128
|
-
];
|
|
129
|
-
if (fs.existsSync(initContextJson)) {
|
|
130
|
-
subArgv.push("--context", initContextJson);
|
|
131
|
-
}
|
|
132
|
-
const subResult = await runTool(substituteTool, subArgv, cwd, "substitute-placeholders", 60_000);
|
|
133
|
-
if (!subResult.ok) {
|
|
134
|
-
const errMsg = subResult.stderr.trim().split("\n").slice(-3).join(" | ") || "unknown error";
|
|
135
|
-
ctx.ui.notify(`× forge:materialize — substitute-placeholders.cjs failed: ${errMsg}`, "error");
|
|
136
|
-
ctx.ui.setStatus?.("forge:materialize", undefined);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
ctx.ui.notify("〇 forge:materialize — scaffold filled", "info");
|
|
140
|
-
// Step 2: build-persona-pack.cjs (advisory — non-fatal)
|
|
141
|
-
const buildPersonaPackTool = path.join(toolsRoot, "build-persona-pack.cjs");
|
|
142
|
-
if (fs.existsSync(buildPersonaPackTool)) {
|
|
143
|
-
fs.mkdirSync(path.join(cwd, ".forge", "cache"), { recursive: true });
|
|
144
|
-
const personaResult = await runTool(buildPersonaPackTool, ["--out", path.join(cwd, ".forge", "cache", "persona-pack.json")], cwd, "build-persona-pack", 30_000);
|
|
145
|
-
if (!personaResult.ok) {
|
|
146
|
-
const msg = personaResult.stderr.trim().split("\n").at(-1) ?? "unknown";
|
|
147
|
-
ctx.ui.notify(`△ forge:materialize — build-persona-pack.cjs failed (non-fatal): ${msg}`, "warning");
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
// Step 3: build-context-pack.cjs (advisory — non-fatal)
|
|
151
|
-
const buildContextPackTool = path.join(toolsRoot, "build-context-pack.cjs");
|
|
152
|
-
if (fs.existsSync(buildContextPackTool)) {
|
|
153
|
-
// Read engineering path from config
|
|
154
|
-
let kbPath = "engineering";
|
|
155
|
-
try {
|
|
156
|
-
const raw = fs.readFileSync(configPath, "utf8");
|
|
157
|
-
const cfg = JSON.parse(raw);
|
|
158
|
-
const p = cfg.paths;
|
|
159
|
-
if (p && typeof p.engineering === "string")
|
|
160
|
-
kbPath = p.engineering;
|
|
161
|
-
}
|
|
162
|
-
catch {
|
|
163
|
-
// use default
|
|
164
|
-
}
|
|
165
|
-
const ctxResult = await runTool(buildContextPackTool, [
|
|
166
|
-
"--arch-dir",
|
|
167
|
-
path.join(cwd, kbPath, "architecture"),
|
|
168
|
-
"--out-md",
|
|
169
|
-
path.join(cwd, ".forge", "cache", "context-pack.md"),
|
|
170
|
-
"--out-json",
|
|
171
|
-
path.join(cwd, ".forge", "cache", "context-pack.json"),
|
|
172
|
-
], cwd, "build-context-pack", 30_000);
|
|
173
|
-
if (!ctxResult.ok) {
|
|
174
|
-
const msg = ctxResult.stderr.trim().split("\n").at(-1) ?? "unknown";
|
|
175
|
-
ctx.ui.notify(`△ forge:materialize — build-context-pack.cjs failed (non-fatal): ${msg}`, "warning");
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
// Complete
|
|
179
|
-
ctx.ui.setStatus?.("forge:materialize", undefined);
|
|
180
|
-
ctx.ui.notify("〇 forge:materialize complete — gaps filled (mode unchanged)", "info");
|
|
181
|
-
// Promotion hint (mode-neutral: only read, never write)
|
|
182
|
-
try {
|
|
183
|
-
const raw = fs.readFileSync(configPath, "utf8");
|
|
184
|
-
const cfg = JSON.parse(raw);
|
|
185
|
-
if (cfg.mode === "fast") {
|
|
186
|
-
ctx.ui.notify("〇 To declare the project fully generated: /forge:config mode full", "info");
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
catch {
|
|
190
|
-
// non-fatal — promotion hint is cosmetic
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
//# sourceMappingURL=materialize.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"materialize.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/materialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { type ForgeToolDefs } from "./forge-tools.js";
|
|
3
|
-
export interface ParsedMigrateArgs {
|
|
4
|
-
/** True when --structural flag present OR .forge/structure-versions.json absent. */
|
|
5
|
-
structural: boolean;
|
|
6
|
-
/** True when --dry-run flag present (schema branch only). */
|
|
7
|
-
dryRun: boolean;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Parse /forge:migrate arguments.
|
|
11
|
-
*
|
|
12
|
-
* Also checks filesystem for .forge/structure-versions.json to determine
|
|
13
|
-
* structural vs schema branch (absence → structural).
|
|
14
|
-
*/
|
|
15
|
-
export declare function parseMigrateArgs(args: string, cwd: string): ParsedMigrateArgs;
|
|
16
|
-
export interface RegisterMigrateOptions {
|
|
17
|
-
/** Override bundleRoot — for testing only. Production: always undefined (resolved via getBundledPayloadRoot). */
|
|
18
|
-
_testBundleRoot?: string;
|
|
19
|
-
/** Forge tool definitions for subagent injection. */
|
|
20
|
-
forgeToolDefs?: ForgeToolDefs;
|
|
21
|
-
}
|
|
22
|
-
export declare function registerMigrate(pi: ExtensionAPI, opts?: RegisterMigrateOptions): void;
|