@entelligentsia/forgecli 1.0.21 → 1.0.36
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 +346 -0
- package/README.md +2 -0
- package/dist/CHANGELOG-forge-plugin.md +281 -0
- package/dist/bin/argv.d.ts +2 -2
- package/dist/bin/argv.js +25 -0
- package/dist/bin/argv.js.map +1 -1
- package/dist/bin/forge.js +12 -0
- package/dist/bin/forge.js.map +1 -1
- package/dist/bin/init.d.ts +23 -0
- package/dist/bin/init.js +123 -0
- package/dist/bin/init.js.map +1 -0
- package/dist/bin/uninstall.d.ts +20 -0
- package/dist/bin/uninstall.js +141 -0
- package/dist/bin/uninstall.js.map +1 -0
- package/dist/extensions/forgecli/claude-bootstrap/bootstrap.d.ts +40 -0
- package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js +593 -0
- package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js.map +1 -0
- package/dist/extensions/forgecli/claude-bootstrap/settings-merge.d.ts +46 -0
- package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js +245 -0
- package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js.map +1 -0
- package/dist/extensions/forgecli/claude-bootstrap/uninstall.d.ts +23 -0
- package/dist/extensions/forgecli/claude-bootstrap/uninstall.js +215 -0
- package/dist/extensions/forgecli/claude-bootstrap/uninstall.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/component.js +10 -7
- package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
- 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/bug/bug-body.d.ts +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-body.js +65 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-body.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-id.d.ts +23 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-id.js +140 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-id.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.d.ts +54 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js +349 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phases.d.ts +8 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js +60 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-state.d.ts +14 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-state.js +100 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-state.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.d.ts +72 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js +204 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.d.ts +38 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js +166 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.d.ts +3 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js +55 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.d.ts +7 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js +293 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.d.ts +2 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js +501 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.d.ts +41 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js +5 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.d.ts +43 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js +85 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.d.ts +8 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js +37 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.d.ts +28 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js +45 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.d.ts +26 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js +75 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/summary-recovery.d.ts +24 -0
- package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js +37 -0
- package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +9 -92
- package/dist/extensions/forgecli/orchestrators/fix-bug.js +23 -1695
- package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +3 -12
- package/dist/extensions/forgecli/orchestrators/run-sprint.js +97 -270
- package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/run-task.d.ts +10 -214
- package/dist/extensions/forgecli/orchestrators/run-task.js +31 -1481
- package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.d.ts +33 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js +135 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.d.ts +18 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js +55 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-command.d.ts +9 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-command.js +174 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-command.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.d.ts +2 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js +494 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-types.d.ts +62 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-types.js +5 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-types.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-body.d.ts +4 -0
- package/dist/extensions/forgecli/orchestrators/task/task-body.js +48 -0
- package/dist/extensions/forgecli/orchestrators/task/task-body.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-events.d.ts +63 -0
- package/dist/extensions/forgecli/orchestrators/task/task-events.js +185 -0
- package/dist/extensions/forgecli/orchestrators/task/task-events.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-gates.d.ts +34 -0
- package/dist/extensions/forgecli/orchestrators/task/task-gates.js +78 -0
- package/dist/extensions/forgecli/orchestrators/task/task-gates.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.d.ts +42 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js +370 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phases.d.ts +14 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phases.js +26 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phases.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-record.d.ts +9 -0
- package/dist/extensions/forgecli/orchestrators/task/task-record.js +58 -0
- package/dist/extensions/forgecli/orchestrators/task/task-record.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-state.d.ts +14 -0
- package/dist/extensions/forgecli/orchestrators/task/task-state.js +35 -0
- package/dist/extensions/forgecli/orchestrators/task/task-state.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.d.ts +36 -0
- package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js +152 -0
- package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js.map +1 -0
- package/dist/extensions/forgecli/update/forge-update-command.js +10 -7
- package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -1
- package/dist/forge-payload/.base-pack/commands/approve.md +2 -2
- package/dist/forge-payload/.base-pack/commands/check-agent.md +2 -2
- package/dist/forge-payload/.base-pack/commands/collate.md +2 -2
- package/dist/forge-payload/.base-pack/commands/commit.md +2 -2
- package/dist/forge-payload/.base-pack/commands/enhance.md +2 -2
- package/dist/forge-payload/.base-pack/commands/fix-bug.md +2 -2
- package/dist/forge-payload/.base-pack/commands/implement.md +2 -2
- package/dist/forge-payload/.base-pack/commands/init.md +278 -0
- package/dist/forge-payload/.base-pack/commands/new-sprint.md +2 -2
- package/dist/forge-payload/.base-pack/commands/plan-sprint.md +2 -2
- package/dist/forge-payload/.base-pack/commands/plan.md +2 -2
- package/dist/forge-payload/.base-pack/commands/retro.md +2 -2
- package/dist/forge-payload/.base-pack/commands/review-code.md +2 -2
- package/dist/forge-payload/.base-pack/commands/review-plan.md +2 -2
- package/dist/forge-payload/.base-pack/commands/run-sprint.md +2 -2
- package/dist/forge-payload/.base-pack/commands/run-task.md +2 -2
- package/dist/forge-payload/.base-pack/commands/validate.md +2 -2
- 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/collator_agent.md +5 -6
- 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/migrate_structural.md +1 -1
- package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
- package/dist/forge-payload/.base-pack/workflows-js/wfl-init.js +449 -0
- 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 +141 -0
- package/dist/forge-payload/commands/add-pipeline.md +1 -1
- package/dist/forge-payload/commands/add-task.md +3 -3
- package/dist/forge-payload/commands/ask.md +1 -1
- package/dist/forge-payload/commands/check-agent.md +1 -1
- package/dist/forge-payload/commands/config.md +1 -1
- package/dist/forge-payload/commands/health.md +1 -1
- package/dist/forge-payload/commands/init.md +62 -7
- package/dist/forge-payload/commands/rebuild.md +3 -3
- package/dist/forge-payload/commands/remove.md +1 -1
- package/dist/forge-payload/commands/repair.md +1 -1
- package/dist/forge-payload/commands/report-bug.md +1 -1
- package/dist/forge-payload/commands/status.md +1 -1
- package/dist/forge-payload/commands/update.md +3 -3
- package/dist/forge-payload/hooks/lib/common.cjs +228 -0
- package/dist/forge-payload/hooks/lib/plugin-detection.cjs +106 -0
- package/dist/forge-payload/hooks/lib/update-msg.cjs +23 -0
- package/dist/forge-payload/hooks/lib/update-url.cjs +46 -0
- package/dist/forge-payload/hooks/lib/write-registry.js +53 -0
- package/dist/forge-payload/init/discovery/discover-database.md +32 -0
- package/dist/forge-payload/init/discovery/discover-processes.md +31 -0
- package/dist/forge-payload/init/discovery/discover-routing.md +31 -0
- package/dist/forge-payload/init/discovery/discover-stack.md +33 -0
- package/dist/forge-payload/init/discovery/discover-testing.md +34 -0
- package/dist/forge-payload/init/generation/generate-commands.md +171 -0
- package/dist/forge-payload/init/generation/generate-kb-doc.md +60 -0
- package/dist/forge-payload/init/generation/generate-knowledge-base.md +56 -0
- package/dist/forge-payload/init/generation/generate-persona.md +73 -0
- package/dist/forge-payload/init/generation/generate-personas.md +54 -0
- package/dist/forge-payload/init/generation/generate-skill.md +66 -0
- package/dist/forge-payload/init/generation/generate-skills.md +36 -0
- package/dist/forge-payload/init/generation/generate-template.md +60 -0
- package/dist/forge-payload/init/generation/generate-templates.md +39 -0
- package/dist/forge-payload/init/generation/generate-tools.md +133 -0
- package/dist/forge-payload/init/generation/generate-workflows.md +78 -0
- package/dist/forge-payload/init/phases/phase-1-collect.md +10 -2
- package/dist/forge-payload/init/phases/phase-3-materialize.md +1 -1
- package/dist/forge-payload/init/phases/phase-4-register.md +8 -0
- package/dist/forge-payload/init/workflow-gen-plan.json +17 -0
- package/dist/forge-payload/integrity.json +16 -16
- 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-collate.md +5 -6
- 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-migrate.md +1 -1
- 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 +5 -12
- package/dist/forge-payload/tools/commit-task.cjs +218 -0
- package/dist/forge-payload/tools/forge-preflight.cjs +268 -0
- package/dist/forge-payload/tools/lib/paths.cjs +12 -11
- package/dist/forge-payload/tools/lib/pricing.cjs +31 -11
- package/dist/forge-payload/tools/query-logger.cjs +34 -0
- package/dist/forge-payload/tools/store-cli.cjs +6 -1
- package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -6
- package/package.json +2 -2
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
// run-bug-pipeline.ts — the per-bug orchestrator pipeline (runBugPipeline thin
|
|
2
|
+
// wrapper + runBugPipelineInner phase loop). Extracted VERBATIM from fix-bug.ts
|
|
3
|
+
// (FORGE-S31 file-size refactor); the only logic-neutral changes are that the
|
|
4
|
+
// per-phase dispatch, the post-triage bugId capture, the review-phase verdict
|
|
5
|
+
// handling, and the post-triage Path A/B routing are delegated to helpers in
|
|
6
|
+
// bug-phase-dispatch.ts / bug-triage-routing.ts / bug-verdict-loop.ts and the
|
|
7
|
+
// loop switches on their discriminated results.
|
|
8
|
+
//
|
|
9
|
+
// Iron Laws enforced here:
|
|
10
|
+
// IL6 — no shell-string interpolation; all external calls via spawnSync argv arrays
|
|
11
|
+
// IL7 — every failure path emits ctx.ui.notify and returns; no silent continuation
|
|
12
|
+
// IL10 — ALL LLM dispatch goes through runForgeSubagent (NO sendKickoff calls here)
|
|
13
|
+
//
|
|
14
|
+
// sendKickoff is NEVER called from this file.
|
|
15
|
+
import { spawnSync } from "node:child_process";
|
|
16
|
+
import * as fs from "node:fs";
|
|
17
|
+
import * as path from "node:path";
|
|
18
|
+
import { assertAudience, CallerContextStore } from "../../audience-gate.js";
|
|
19
|
+
import { checkMaterialization } from "../../lib/manifest-checker.js";
|
|
20
|
+
import { loadWorkflow } from "../../parsers/workflow-loader.js";
|
|
21
|
+
import { BUG_SUMMARY_KEY_BY_ROLE } from "../../subagent/phase-summary-map.js";
|
|
22
|
+
import { fmtPhaseSummary } from "../../viewport/renderer.js";
|
|
23
|
+
import { resolveAdvisorModel, runHaltAdvisor } from "../halt-advisor.js";
|
|
24
|
+
import { createOrchestratorNotifier } from "../common/orchestrator-notify.js";
|
|
25
|
+
import { runPipelinePreflight } from "../common/orchestrator-entry.js";
|
|
26
|
+
import { withOrchestratorTranscript, } from "../common/orchestrator-transcript-session.js";
|
|
27
|
+
import { buildPhaseEvent, drainFrictionFile, emitEvent, judgementFromSummary, runPreflightGateWithData, } from "../run-task.js";
|
|
28
|
+
import { dispatchBugPhase } from "./bug-phase-dispatch.js";
|
|
29
|
+
import { BUG_PHASES, BUG_TYPE_TOKENS } from "./bug-phases.js";
|
|
30
|
+
import { readBugRecord } from "./bug-id.js";
|
|
31
|
+
import { deleteBugState, writeBugState } from "./bug-state.js";
|
|
32
|
+
import { captureTriageBugId, maybeSkipPhase, routeAfterTriage } from "./bug-triage-routing.js";
|
|
33
|
+
import { handleBugReviewVerdict } from "./bug-verdict-loop.js";
|
|
34
|
+
const STATUS_KEY = "forge:fix-bug";
|
|
35
|
+
const MESSAGE_KEY = "forge:fix-bug:message";
|
|
36
|
+
export async function runBugPipeline(opts) {
|
|
37
|
+
// Entry preflight (layered-config schema + model-config validation) runs
|
|
38
|
+
// BEFORE the transcript writer is created, so a failed preflight never
|
|
39
|
+
// leaves a transcript file behind.
|
|
40
|
+
const notify = createOrchestratorNotifier(opts.ctx, {
|
|
41
|
+
label: "forge:fix-bug",
|
|
42
|
+
statusKey: STATUS_KEY,
|
|
43
|
+
messageKey: MESSAGE_KEY,
|
|
44
|
+
});
|
|
45
|
+
const pre = runPipelinePreflight({ cwd: opts.cwd, ctx: opts.ctx, notify });
|
|
46
|
+
if (!pre.proceed) {
|
|
47
|
+
return {
|
|
48
|
+
status: "failed",
|
|
49
|
+
lastPhaseIndex: opts.resumeFromState?.phaseIndex ?? 0,
|
|
50
|
+
iterationCounts: opts.resumeFromState?.iterationCounts ?? {},
|
|
51
|
+
lastError: pre.lastError,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// The transcript session owns ctx.ui.notify interception and the guaranteed
|
|
55
|
+
// pipeline-end close on every outcome (see orchestrator-transcript-session).
|
|
56
|
+
return withOrchestratorTranscript({ cwd: opts.cwd, entityKind: "bug", entityId: opts.bugId, ctx: opts.ctx }, (session) => runBugPipelineInner(opts, pre.modelRoutingConfig, session));
|
|
57
|
+
}
|
|
58
|
+
async function runBugPipelineInner(opts, modelRoutingConfig, session) {
|
|
59
|
+
const { bugId: initialBugId, originalArg, isNewBug, cwd, ctx, forgeRoot, storeCli, preflightGate, registry, resumeFromState, } = opts;
|
|
60
|
+
// Mutable bugId — for new bugs, pre-assign a real FORGE-BUG-NNN ID
|
|
61
|
+
// before triage so the subagent never needs to create or discover one.
|
|
62
|
+
// This replaces the fragile PENDING→capture pattern where the subagent was
|
|
63
|
+
// expected to create the bug record and we'd fish the ID from events.
|
|
64
|
+
let bugId = initialBugId;
|
|
65
|
+
let currentPhaseIndex = resumeFromState?.phaseIndex ?? 0;
|
|
66
|
+
const iterationCounts = resumeFromState?.iterationCounts ?? {};
|
|
67
|
+
// Per-phase completion-recovery guard (forge-engineering#41): each role gets
|
|
68
|
+
// at most one deterministic set-bug-summary recovery attempt before a
|
|
69
|
+
// missing-summary hard-fail. Prevents recovery loops.
|
|
70
|
+
const recoveredPhases = new Set();
|
|
71
|
+
// Per-role dispatch counter for OrchestratorTree node identity. Distinct
|
|
72
|
+
// from iterationCounts (which only tracks review-verdict revisions): every
|
|
73
|
+
// dispatch of a role — including a plan-fix re-run after a review
|
|
74
|
+
// loopback — gets its own `<bugId>:<role>:<attempt>` node, so the
|
|
75
|
+
// dashboard renders one leaf per run in dispatch order instead of merging
|
|
76
|
+
// attempts into one node (CART-BUG-003 dashboard regression). Seeded from
|
|
77
|
+
// resume state so resumed runs continue numbering past prior attempts.
|
|
78
|
+
const dispatchCounts = { ...(resumeFromState?.iterationCounts ?? {}) };
|
|
79
|
+
let lastModel;
|
|
80
|
+
let lastProvider;
|
|
81
|
+
// modelRoutingConfig is loaded and validated by runPipelinePreflight (in
|
|
82
|
+
// runBugPipeline) before the transcript writer exists, then passed in.
|
|
83
|
+
// Pipeline name "fix-bug" lets users configure per-phase overrides under
|
|
84
|
+
// pipelines["fix-bug"] in their routing config.
|
|
85
|
+
// Orchestrator transcript writer — created and notify-intercepted by
|
|
86
|
+
// withOrchestratorTranscript; the loop records structured phase-boundary
|
|
87
|
+
// events through it (one JSONL file per run).
|
|
88
|
+
const orchTranscript = session.writer;
|
|
89
|
+
const pipelineStartMs = Date.now();
|
|
90
|
+
while (currentPhaseIndex < BUG_PHASES.length) {
|
|
91
|
+
// ── Between-phase cancellation gate ────────────────────────────
|
|
92
|
+
if (opts.signal?.aborted) {
|
|
93
|
+
ctx.ui.notify(`⊘ forge:fix-bug — ${bugId} cancelled by user.`, "info");
|
|
94
|
+
registry.completePhase(bugId, BUG_PHASES[currentPhaseIndex]?.role ?? "unknown", "cancelled");
|
|
95
|
+
registry.confirmCancelled(bugId);
|
|
96
|
+
// ADR-S21-01: preserve state file so cancelled runs are resumable
|
|
97
|
+
writeBugState(cwd, {
|
|
98
|
+
bugId,
|
|
99
|
+
phaseIndex: currentPhaseIndex,
|
|
100
|
+
iterationCounts,
|
|
101
|
+
halted: false,
|
|
102
|
+
status: "cancelled",
|
|
103
|
+
lastError: undefined,
|
|
104
|
+
savedAt: new Date().toISOString(),
|
|
105
|
+
});
|
|
106
|
+
return { status: "cancelled", lastPhaseIndex: currentPhaseIndex, iterationCounts };
|
|
107
|
+
}
|
|
108
|
+
const phase = BUG_PHASES[currentPhaseIndex];
|
|
109
|
+
if (!phase) {
|
|
110
|
+
ctx.ui.notify(`× forge:fix-bug — invalid phase index ${currentPhaseIndex}`, "error");
|
|
111
|
+
return {
|
|
112
|
+
status: "failed",
|
|
113
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
114
|
+
iterationCounts,
|
|
115
|
+
lastError: `invalid phase index ${currentPhaseIndex}`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
ctx.ui.setStatus?.(STATUS_KEY, `fix-bug ${bugId}: phase ${currentPhaseIndex + 1}/${BUG_PHASES.length} (${phase.role})`);
|
|
119
|
+
ctx.ui.notify(`→ ${bugId}: ${phase.role} (phase ${currentPhaseIndex + 1}/${BUG_PHASES.length})`, "info");
|
|
120
|
+
orchTranscript.record({
|
|
121
|
+
kind: "phase-start",
|
|
122
|
+
ts: new Date().toISOString(),
|
|
123
|
+
phase: phase.role,
|
|
124
|
+
phaseIndex: currentPhaseIndex,
|
|
125
|
+
phaseCount: BUG_PHASES.length,
|
|
126
|
+
attempt: (iterationCounts[phase.role] ?? 0) + 1,
|
|
127
|
+
workflowFile: phase.workflowFile,
|
|
128
|
+
persona: phase.personaNoun,
|
|
129
|
+
});
|
|
130
|
+
const subWorkflowPath = path.join(cwd, ".forge", "workflows", `${phase.workflowFile}.md`);
|
|
131
|
+
// ── Read sub-workflow ─────────────────────────────────────────
|
|
132
|
+
let subWorkflowMd;
|
|
133
|
+
let subWorkflowAudience = "any";
|
|
134
|
+
try {
|
|
135
|
+
const loaded = loadWorkflow(subWorkflowPath);
|
|
136
|
+
subWorkflowMd = loaded.rawMarkdown;
|
|
137
|
+
subWorkflowAudience = loaded.audience;
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
const e = err;
|
|
141
|
+
ctx.ui.notify(`× forge:fix-bug — failed to read sub-workflow for ${phase.role}: ${e.message ?? "unknown"}`, "error");
|
|
142
|
+
writeBugState(cwd, {
|
|
143
|
+
bugId,
|
|
144
|
+
phaseIndex: currentPhaseIndex,
|
|
145
|
+
iterationCounts,
|
|
146
|
+
halted: true,
|
|
147
|
+
lastError: `sub-workflow read failed: ${e.message ?? "unknown"}`,
|
|
148
|
+
savedAt: new Date().toISOString(),
|
|
149
|
+
});
|
|
150
|
+
return {
|
|
151
|
+
status: "failed",
|
|
152
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
153
|
+
iterationCounts,
|
|
154
|
+
lastError: `sub-workflow read failed: ${e.message ?? "unknown"}`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// ── 6a. Phase skip (state-aware, defense-in-depth) ─────────────
|
|
158
|
+
const bugNow = readBugRecord(bugId, storeCli, cwd);
|
|
159
|
+
if (maybeSkipPhase({ phase, bugId, cwd, ctx, storeCli, bugNow, summaryKeyByRole: BUG_SUMMARY_KEY_BY_ROLE })) {
|
|
160
|
+
currentPhaseIndex++;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
// ── 6b. Preflight gate ────────────────────────────────────────
|
|
164
|
+
// Skip preflight gate for triage phase of new bugs (PENDING- placeholder)
|
|
165
|
+
// because the bug record doesn't exist yet — gates referencing bug fields
|
|
166
|
+
// would always fail.
|
|
167
|
+
//
|
|
168
|
+
// Also skip for review phases when the bug is already in a terminal
|
|
169
|
+
// state ("fixed"). Path A bugs get fixed during triage, then the
|
|
170
|
+
// preflight gate's `forbid bug.status == fixed` and `after implement
|
|
171
|
+
// = n/a` checks block review-code/review-plan even though we
|
|
172
|
+
// deliberately want to run those reviews. The review subagent handles
|
|
173
|
+
// the already-fixed scenario internally.
|
|
174
|
+
const pendingBugId = bugId.startsWith("PENDING-");
|
|
175
|
+
const bugAlreadyFixed = bugNow?.status === "fixed" && phase.isReview;
|
|
176
|
+
if (!pendingBugId && !bugAlreadyFixed && fs.existsSync(preflightGate)) {
|
|
177
|
+
const preflightOutcome = runPreflightGateWithData(preflightGate, phase.role, bugId, cwd, "bug");
|
|
178
|
+
if (preflightOutcome.result === "halt") {
|
|
179
|
+
// Render structured failure reason if available.
|
|
180
|
+
if (preflightOutcome.gateFailure) {
|
|
181
|
+
ctx.ui.notify(`× forge:fix-bug — preflight gate failed for phase ${phase.role} ` +
|
|
182
|
+
`[${preflightOutcome.gateFailure.reasonCode}]: ${preflightOutcome.gateFailure.detail}`, "error");
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
ctx.ui.notify(`× forge:fix-bug — preflight gate failed for phase ${phase.role} (exit 1); halting.`, "error");
|
|
186
|
+
}
|
|
187
|
+
writeBugState(cwd, {
|
|
188
|
+
bugId,
|
|
189
|
+
phaseIndex: currentPhaseIndex,
|
|
190
|
+
iterationCounts,
|
|
191
|
+
halted: true,
|
|
192
|
+
lastError: `preflight gate exit 1 for ${phase.role}`,
|
|
193
|
+
savedAt: new Date().toISOString(),
|
|
194
|
+
});
|
|
195
|
+
// Spawn halt-recovery advisor (Tier 1, best-effort — non-fatal).
|
|
196
|
+
if (preflightOutcome.gateFailure) {
|
|
197
|
+
const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
|
|
198
|
+
void runHaltAdvisor({
|
|
199
|
+
gateFailure: preflightOutcome.gateFailure,
|
|
200
|
+
advisorModel,
|
|
201
|
+
taskId: bugId,
|
|
202
|
+
cwd,
|
|
203
|
+
ctx: { ui: ctx.ui },
|
|
204
|
+
forgeRoot,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
status: "halted",
|
|
209
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
210
|
+
iterationCounts,
|
|
211
|
+
lastError: `preflight gate exit 1 for ${phase.role}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
if (preflightOutcome.result === "escalate") {
|
|
215
|
+
ctx.ui.notify(`× forge:fix-bug — preflight gate escalated for phase ${phase.role} (exit 2); manual intervention required.`, "error");
|
|
216
|
+
writeBugState(cwd, {
|
|
217
|
+
bugId,
|
|
218
|
+
phaseIndex: currentPhaseIndex,
|
|
219
|
+
iterationCounts,
|
|
220
|
+
halted: true,
|
|
221
|
+
lastError: `preflight gate exit 2 (escalate) for ${phase.role}`,
|
|
222
|
+
savedAt: new Date().toISOString(),
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
status: "escalated",
|
|
226
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
227
|
+
iterationCounts,
|
|
228
|
+
lastError: `preflight gate exit 2 (escalate) for ${phase.role}`,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// ── 6. Materialization-marker check ───────────────────────────
|
|
233
|
+
// FORGE-BUG-040: every BUG phase is now a true `audience: subagent`
|
|
234
|
+
// sub-workflow — triage / plan-fix / implement no longer alias to
|
|
235
|
+
// fix_bug.md. The marker check is therefore unconditional; a missing
|
|
236
|
+
// marker is a hard failure on the first dispatch.
|
|
237
|
+
{
|
|
238
|
+
const markerCheck = checkMaterialization(subWorkflowPath, subWorkflowMd);
|
|
239
|
+
if (!markerCheck.ok) {
|
|
240
|
+
for (const marker of markerCheck.missing) {
|
|
241
|
+
ctx.ui.notify(`× workflow regression: ${marker} not found in ${subWorkflowPath}`, "error");
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
status: "failed",
|
|
245
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
246
|
+
iterationCounts,
|
|
247
|
+
lastError: `materialization markers missing: ${markerCheck.missing.join(", ")}`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// ── 5. Audience check ─────────────────────────────────────────
|
|
252
|
+
// FORGE-BUG-040: every BUG phase is a true `audience: subagent`
|
|
253
|
+
// workflow now; the previous `fix_bug.md` audience-bypass is gone.
|
|
254
|
+
const audienceOk = CallerContextStore.asSubagent(phase.role, () => assertAudience({ workflowName: phase.workflowFile, audience: subWorkflowAudience }, ctx));
|
|
255
|
+
if (!audienceOk) {
|
|
256
|
+
writeBugState(cwd, {
|
|
257
|
+
bugId,
|
|
258
|
+
phaseIndex: currentPhaseIndex,
|
|
259
|
+
iterationCounts,
|
|
260
|
+
halted: true,
|
|
261
|
+
lastError: `audience check failed for ${phase.workflowFile}`,
|
|
262
|
+
savedAt: new Date().toISOString(),
|
|
263
|
+
});
|
|
264
|
+
return {
|
|
265
|
+
status: "failed",
|
|
266
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
267
|
+
iterationCounts,
|
|
268
|
+
lastError: `audience check failed for ${phase.workflowFile}`,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// ── Read bug record for current status ────────────────────────
|
|
272
|
+
// Skip for PENDING bugIds (bug doesn't exist yet).
|
|
273
|
+
const bugRecordBefore = pendingBugId ? null : readBugRecord(bugId, storeCli, cwd);
|
|
274
|
+
const bugStatusBeforePhase = bugRecordBefore?.status;
|
|
275
|
+
// ── Dispatch (persona load + runForgeSubagent + observer + abort/halt) ──
|
|
276
|
+
// Extracted to bug-phase-dispatch.ts (FORGE-S31). Returns either a
|
|
277
|
+
// terminal result or the live locals the rest of the loop needs.
|
|
278
|
+
const dispatch = await dispatchBugPhase({
|
|
279
|
+
opts,
|
|
280
|
+
phase,
|
|
281
|
+
bugId,
|
|
282
|
+
cwd,
|
|
283
|
+
ctx,
|
|
284
|
+
storeCli,
|
|
285
|
+
currentPhaseIndex,
|
|
286
|
+
iterationCounts,
|
|
287
|
+
dispatchCounts,
|
|
288
|
+
modelRoutingConfig,
|
|
289
|
+
registry,
|
|
290
|
+
isNewBug,
|
|
291
|
+
originalArg,
|
|
292
|
+
subWorkflowMd,
|
|
293
|
+
bugRecordBefore,
|
|
294
|
+
bugStatusBeforePhase,
|
|
295
|
+
pendingBugId,
|
|
296
|
+
});
|
|
297
|
+
if (dispatch.kind === "return")
|
|
298
|
+
return dispatch.result;
|
|
299
|
+
const { result, finishPhaseNode, observer, phaseStart, toolExecutionEvents, debugLogDisabled } = dispatch;
|
|
300
|
+
let { writeDebug, debugLogPath } = dispatch;
|
|
301
|
+
// Capture model/provider from subagent result.
|
|
302
|
+
if (result.model)
|
|
303
|
+
lastModel = result.model;
|
|
304
|
+
if (result.provider)
|
|
305
|
+
lastProvider = result.provider;
|
|
306
|
+
// ── BugId capture after triage phase (Finding #1, #2) ──────────
|
|
307
|
+
// For new bugs, the triage subagent creates the bug record via store-cli.
|
|
308
|
+
// We capture the bugId by scanning tool_execution_end events.
|
|
309
|
+
if (phase.role === "triage" && isNewBug && bugId.startsWith("PENDING-")) {
|
|
310
|
+
const capture = captureTriageBugId({
|
|
311
|
+
bugId,
|
|
312
|
+
cwd,
|
|
313
|
+
ctx,
|
|
314
|
+
storeCli,
|
|
315
|
+
currentPhaseIndex,
|
|
316
|
+
iterationCounts,
|
|
317
|
+
debugLogDisabled,
|
|
318
|
+
toolExecutionEvents,
|
|
319
|
+
}, writeDebug, debugLogPath);
|
|
320
|
+
if (capture.kind === "return")
|
|
321
|
+
return capture.result;
|
|
322
|
+
bugId = capture.bugId;
|
|
323
|
+
debugLogPath = capture.debugLogPath;
|
|
324
|
+
writeDebug = capture.writeDebug;
|
|
325
|
+
}
|
|
326
|
+
{
|
|
327
|
+
const elapsed = Math.floor((Date.now() - phaseStart) / 1000);
|
|
328
|
+
const { turn, toolCount, errCount, cumUsage, cumCompression } = observer.state;
|
|
329
|
+
ctx.ui.notify(`✓ ${phase.role}: ${turn} turn${turn === 1 ? "" : "s"} · ${toolCount} tool call${toolCount === 1 ? "" : "s"}${errCount ? ` · ${errCount} err` : ""} · ${elapsed}s`, "info");
|
|
330
|
+
orchTranscript.record({
|
|
331
|
+
kind: "phase-end",
|
|
332
|
+
ts: new Date().toISOString(),
|
|
333
|
+
phase: phase.role,
|
|
334
|
+
phaseIndex: currentPhaseIndex,
|
|
335
|
+
attempt: (iterationCounts[phase.role] ?? 0) + 1,
|
|
336
|
+
verdict: "n/a",
|
|
337
|
+
elapsedMs: Date.now() - phaseStart,
|
|
338
|
+
turns: turn,
|
|
339
|
+
toolCount,
|
|
340
|
+
errCount,
|
|
341
|
+
subagentTranscriptPath: result.subagentTranscriptPath,
|
|
342
|
+
});
|
|
343
|
+
registry.appendTail(bugId, phase.role, fmtPhaseSummary({
|
|
344
|
+
role: phase.role,
|
|
345
|
+
turns: turn,
|
|
346
|
+
tools: toolCount,
|
|
347
|
+
errors: errCount,
|
|
348
|
+
wallSeconds: elapsed,
|
|
349
|
+
usage: cumUsage,
|
|
350
|
+
model: result.model,
|
|
351
|
+
provider: result.provider,
|
|
352
|
+
compression: cumCompression.tokensSaved > 0 ? cumCompression : undefined,
|
|
353
|
+
}));
|
|
354
|
+
}
|
|
355
|
+
// ── Slice-2: orchestrator emits phase event ──────────────────
|
|
356
|
+
// sprintId for bug event emission is the literal "bugs" (routing key),
|
|
357
|
+
// matching the convention in .forge/workflows/fix_bug.md.
|
|
358
|
+
const phaseEndMs = Date.now();
|
|
359
|
+
const bugRecord = readBugRecord(bugId, storeCli, cwd);
|
|
360
|
+
const sprintId = "bugs"; // routing key for bug events — not a sprint reference
|
|
361
|
+
const phaseIteration = (iterationCounts[phase.role] ?? 0) + 1;
|
|
362
|
+
// Read summary judgement for review phases (using bug summary key map)
|
|
363
|
+
const judgement = phase.isReview
|
|
364
|
+
? judgementFromSummary(bugRecord ?? null, phase.role, BUG_SUMMARY_KEY_BY_ROLE)
|
|
365
|
+
: undefined;
|
|
366
|
+
const emitCtx = {
|
|
367
|
+
entityType: "bug",
|
|
368
|
+
bugId,
|
|
369
|
+
sprintId, // routing key "bugs" — not a sprint reference
|
|
370
|
+
phase,
|
|
371
|
+
iteration: phaseIteration,
|
|
372
|
+
startMs: phaseStart,
|
|
373
|
+
endMs: phaseEndMs,
|
|
374
|
+
model: result.model ?? "unknown",
|
|
375
|
+
provider: result.provider ?? "unknown",
|
|
376
|
+
usage: {
|
|
377
|
+
input: result.usage.input,
|
|
378
|
+
output: result.usage.output,
|
|
379
|
+
cacheRead: result.usage.cacheRead,
|
|
380
|
+
cacheWrite: result.usage.cacheWrite,
|
|
381
|
+
},
|
|
382
|
+
judgement,
|
|
383
|
+
storeCli,
|
|
384
|
+
cwd,
|
|
385
|
+
};
|
|
386
|
+
const phaseEvent = buildPhaseEvent(emitCtx);
|
|
387
|
+
// Set bug event type based on BUG_TYPE_TOKENS mapping.
|
|
388
|
+
const typeTokenEntry = BUG_TYPE_TOKENS[phase.role];
|
|
389
|
+
if (typeTokenEntry) {
|
|
390
|
+
if (phase.isReview && judgement?.verdict === "revision") {
|
|
391
|
+
phaseEvent.type = typeTokenEntry.fail;
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
phaseEvent.type = typeTokenEntry.pass;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
const emitResult = emitEvent(storeCli, cwd, sprintId, phaseEvent);
|
|
398
|
+
if (!emitResult.ok) {
|
|
399
|
+
ctx.ui.notify(`⚠ forge:fix-bug — phase event emit failed for ${phase.role}: ${emitResult.stderr.trim()}`, "warning");
|
|
400
|
+
writeDebug({ kind: "emit_failed", stderr: emitResult.stderr });
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
writeDebug({ kind: "emit_ok", eventId: phaseEvent.eventId });
|
|
404
|
+
}
|
|
405
|
+
// Drain friction file for this phase.
|
|
406
|
+
const frictionPath = path.join(cwd, ".forge", "cache", `FRICTION-${phase.role}.jsonl`);
|
|
407
|
+
const drain = drainFrictionFile(frictionPath, emitCtx);
|
|
408
|
+
if (drain.emitted + drain.failed > 0) {
|
|
409
|
+
writeDebug({ kind: "friction_drain", ...drain });
|
|
410
|
+
if (drain.failed > 0) {
|
|
411
|
+
ctx.ui.notify(`⚠ forge:fix-bug — friction drain for ${phase.role}: ${drain.emitted} ok, ${drain.failed} failed`, "warning");
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// ── AC §C.16: Bug FSM canonical-enum assertion ────────────────
|
|
415
|
+
// After each phase that could transition bug status, validate the new
|
|
416
|
+
// status via store-cli (single source of truth). Surface a warning (not halt) if invalid.
|
|
417
|
+
const currentBugRecordForAssert = readBugRecord(bugId, storeCli, cwd);
|
|
418
|
+
if (currentBugRecordForAssert && currentBugRecordForAssert.status) {
|
|
419
|
+
// Defer to store-cli's isLegalTransition as authoritative guard.
|
|
420
|
+
// Only warn on statuses store-cli itself would reject.
|
|
421
|
+
const validateResult = spawnSync("node", [storeCli, "validate", "bug", JSON.stringify(currentBugRecordForAssert)], { cwd, encoding: "utf8" });
|
|
422
|
+
if (validateResult.status !== 0) {
|
|
423
|
+
const detail = typeof validateResult.stderr === "string" ? validateResult.stderr.trim() : "unknown";
|
|
424
|
+
ctx.ui.notify(`⚠ forge:fix-bug — bug ${bugId} validation warning: ${detail}`, "warning");
|
|
425
|
+
writeDebug({ kind: "fsm_assertion_warning", bugId, status: currentBugRecordForAssert.status, detail });
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// ── 6b. Verdict check (review phases only) ────────────────────
|
|
429
|
+
if (phase.isReview) {
|
|
430
|
+
const outcome = handleBugReviewVerdict({
|
|
431
|
+
phase,
|
|
432
|
+
bugId,
|
|
433
|
+
storeCli,
|
|
434
|
+
cwd,
|
|
435
|
+
forgeRoot,
|
|
436
|
+
iterationCounts,
|
|
437
|
+
currentPhaseIndex,
|
|
438
|
+
modelRoutingConfig,
|
|
439
|
+
ctx,
|
|
440
|
+
orchTranscript,
|
|
441
|
+
summaryKeyByRole: BUG_SUMMARY_KEY_BY_ROLE,
|
|
442
|
+
recoveredPhases,
|
|
443
|
+
finishPhaseNode,
|
|
444
|
+
});
|
|
445
|
+
if (outcome.kind === "return")
|
|
446
|
+
return outcome.result;
|
|
447
|
+
if (outcome.kind === "loopback") {
|
|
448
|
+
currentPhaseIndex = outcome.toIndex;
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
// outcome.kind === "advance": fall through to advance
|
|
452
|
+
}
|
|
453
|
+
// ── Advance to next phase ─────────────────────────────────────
|
|
454
|
+
registry.completePhase(bugId, phase.role, "completed");
|
|
455
|
+
finishPhaseNode("completed");
|
|
456
|
+
writeBugState(cwd, {
|
|
457
|
+
bugId,
|
|
458
|
+
phaseIndex: currentPhaseIndex,
|
|
459
|
+
iterationCounts,
|
|
460
|
+
halted: false,
|
|
461
|
+
savedAt: new Date().toISOString(),
|
|
462
|
+
});
|
|
463
|
+
// ── 6c. Path A / Path B branch (post-triage) ──────────────────
|
|
464
|
+
// Per meta-fix-bug.md § Triage Judgement (forge v0.44.0+), the
|
|
465
|
+
// triage subagent records the route decision in
|
|
466
|
+
// bug.summaries.triage.route. The orchestrator reads it after
|
|
467
|
+
// triage returns and selects the downstream phase list:
|
|
468
|
+
// Path A (short-circuit): skip plan-fix + review-plan
|
|
469
|
+
// Path B (default, full loop): run all phases
|
|
470
|
+
//
|
|
471
|
+
// If route is missing or malformed, default to Path B (the safe
|
|
472
|
+
// choice — running extra phases never produces an unsafe outcome).
|
|
473
|
+
// The PHASE_SKIP_STATES heuristic at section 6a remains as
|
|
474
|
+
// defense-in-depth for cases where the field is missing but the
|
|
475
|
+
// bug status proves the work happened.
|
|
476
|
+
if (phase.role === "triage") {
|
|
477
|
+
const routing = routeAfterTriage({ bugId, cwd, ctx, storeCli, currentPhaseIndex });
|
|
478
|
+
if (routing.kind === "jump") {
|
|
479
|
+
currentPhaseIndex = routing.toIndex;
|
|
480
|
+
continue;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
currentPhaseIndex++;
|
|
484
|
+
}
|
|
485
|
+
// ── All phases complete ───────────────────────────────────────────
|
|
486
|
+
deleteBugState(cwd, bugId);
|
|
487
|
+
orchTranscript.record({
|
|
488
|
+
kind: "pipeline-end",
|
|
489
|
+
ts: new Date().toISOString(),
|
|
490
|
+
outcome: "complete",
|
|
491
|
+
elapsedMs: Date.now() - pipelineStartMs,
|
|
492
|
+
});
|
|
493
|
+
return {
|
|
494
|
+
status: "completed",
|
|
495
|
+
lastPhaseIndex: BUG_PHASES.length - 1,
|
|
496
|
+
iterationCounts,
|
|
497
|
+
model: lastModel,
|
|
498
|
+
provider: lastProvider,
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=run-bug-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-bug-pipeline.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/run-bug-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type ForgeToolDefs } from "../../forge-tools.js";
|
|
3
|
+
import { getSessionRegistry } from "../../session-registry.js";
|
|
4
|
+
import type { RunBugState } from "./bug-state.js";
|
|
5
|
+
export type RunBugPipelineStatus = "completed" | "halted" | "escalated" | "failed" | "cancelled";
|
|
6
|
+
export interface RunBugPipelineResult {
|
|
7
|
+
status: RunBugPipelineStatus;
|
|
8
|
+
lastPhaseIndex: number;
|
|
9
|
+
iterationCounts: Record<string, number>;
|
|
10
|
+
lastError?: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
provider?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Project-local orchestrator JSONL path for this run. Callers hand it to
|
|
15
|
+
* archiveRun() to mirror the run into the central transcript archive.
|
|
16
|
+
* Unset only when the pipeline returned before the writer was created.
|
|
17
|
+
*/
|
|
18
|
+
orchestratorTranscriptPath?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface RunBugPipelineOptions {
|
|
21
|
+
bugId: string;
|
|
22
|
+
/** Original free-form text argument when creating a new bug (not a FORGE-BUG-NNN ID).
|
|
23
|
+
* Passed to triage-phase subagent so it can create the bug with a meaningful description. */
|
|
24
|
+
originalArg?: string;
|
|
25
|
+
/** Whether this is a new bug (free-form text) vs. an existing FORGE-BUG-NNN ID. */
|
|
26
|
+
isNewBug?: boolean;
|
|
27
|
+
cwd: string;
|
|
28
|
+
ctx: ExtensionCommandContext;
|
|
29
|
+
forgeRoot: string;
|
|
30
|
+
storeCli: string;
|
|
31
|
+
preflightGate: string;
|
|
32
|
+
registry: ReturnType<typeof getSessionRegistry>;
|
|
33
|
+
resumeFromState?: RunBugState;
|
|
34
|
+
/**
|
|
35
|
+
* Optional AbortSignal from SessionRegistry. When provided, the pipeline
|
|
36
|
+
* checks signal.aborted between phases and passes the signal to
|
|
37
|
+
* runForgeSubagent so in-flight subagents can be aborted.
|
|
38
|
+
*/
|
|
39
|
+
signal?: AbortSignal;
|
|
40
|
+
forgeToolDefs?: ForgeToolDefs;
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-bug-types.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/run-bug-types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,WAAW"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type MergedConfig } from "../../config/config-layer.js";
|
|
3
|
+
import type { OrchestratorNotifier } from "./orchestrator-notify.js";
|
|
4
|
+
export interface ModelValidationInputs {
|
|
5
|
+
personaCatalogue: string[];
|
|
6
|
+
pipelineCatalogue: string[] | null;
|
|
7
|
+
availableModels: Array<{
|
|
8
|
+
provider: string;
|
|
9
|
+
id: string;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
/** Gather the model-validation inputs shared by every orchestrator entry: the
|
|
13
|
+
* bundled persona catalogue, the project pipeline names, and the session model
|
|
14
|
+
* registry. The persona dir is resolved relative to this module's dist
|
|
15
|
+
* location (orchestrators/common → four levels up to dist/forge-payload). */
|
|
16
|
+
export declare function gatherModelValidationInputs(cwd: string, ctx: Pick<ExtensionCommandContext, "modelRegistry">): ModelValidationInputs;
|
|
17
|
+
export interface OrchestratorEntry {
|
|
18
|
+
forgeRoot: string;
|
|
19
|
+
storeCli: string;
|
|
20
|
+
preflightGate: string;
|
|
21
|
+
}
|
|
22
|
+
/** Discover the Forge config at cwd. On success, sweep orphaned project
|
|
23
|
+
* transcripts and return the resolved tool paths. On failure, notify and clear
|
|
24
|
+
* the status line, then return null (caller returns immediately). */
|
|
25
|
+
export declare function resolveOrchestratorEntry(opts: {
|
|
26
|
+
cwd: string;
|
|
27
|
+
notify: OrchestratorNotifier;
|
|
28
|
+
}): OrchestratorEntry | null;
|
|
29
|
+
export type PipelinePreflightOutcome = {
|
|
30
|
+
proceed: true;
|
|
31
|
+
modelRoutingConfig: MergedConfig;
|
|
32
|
+
} | {
|
|
33
|
+
proceed: false;
|
|
34
|
+
lastError: string;
|
|
35
|
+
};
|
|
36
|
+
/** Layered-config schema check followed by full model-config validation.
|
|
37
|
+
* Surfaces schema/validation errors via the notifier (matching the legacy
|
|
38
|
+
* inline strings) and returns the merged routing config on success. */
|
|
39
|
+
export declare function runPipelinePreflight(opts: {
|
|
40
|
+
cwd: string;
|
|
41
|
+
ctx: ExtensionCommandContext;
|
|
42
|
+
notify: OrchestratorNotifier;
|
|
43
|
+
}): PipelinePreflightOutcome;
|