@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,55 @@
|
|
|
1
|
+
// bug-verdict.ts — read the routing verdict for a bug phase from the bug
|
|
2
|
+
// record (approve summary / commit status / review summaries). Extracted
|
|
3
|
+
// VERBATIM from fix-bug.ts (FORGE-S31 file-size refactor); no logic changes.
|
|
4
|
+
export function readBugVerdict(bugRecord, phaseRole, summaryKeyByRole) {
|
|
5
|
+
if (!bugRecord)
|
|
6
|
+
return "missing";
|
|
7
|
+
// Approve phase: read approve summary verdict (set via set-bug-summary).
|
|
8
|
+
// The forge v0.44.0 contract makes summaries.approve.verdict the canonical
|
|
9
|
+
// approve signal for bugs — `bug.status` does NOT carry an "approved"
|
|
10
|
+
// value (that enum was dropped). See read-verdict.cjs §
|
|
11
|
+
// BUG_PHASE_VERDICT_SOURCE for the matching plugin-side wiring.
|
|
12
|
+
if (phaseRole === "approve") {
|
|
13
|
+
const summaryKey = summaryKeyByRole["approve"];
|
|
14
|
+
if (summaryKey) {
|
|
15
|
+
const summaries = bugRecord.summaries ?? {};
|
|
16
|
+
const blob = summaries[summaryKey];
|
|
17
|
+
if (blob && typeof blob === "object") {
|
|
18
|
+
const verdict = blob?.verdict;
|
|
19
|
+
if (typeof verdict === "string") {
|
|
20
|
+
if (verdict === "approved")
|
|
21
|
+
return "approved";
|
|
22
|
+
if (verdict === "revision")
|
|
23
|
+
return "revision";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return "missing";
|
|
28
|
+
}
|
|
29
|
+
// Commit phase: read bug status directly. Terminal target is `fixed`.
|
|
30
|
+
if (phaseRole === "commit") {
|
|
31
|
+
if (bugRecord.status === "fixed")
|
|
32
|
+
return "approved";
|
|
33
|
+
// in-progress means commit did not advance status — treat as revision-needed.
|
|
34
|
+
if (bugRecord.status === "in-progress")
|
|
35
|
+
return "revision";
|
|
36
|
+
return "missing";
|
|
37
|
+
}
|
|
38
|
+
// Review phases: read from summaries via key map.
|
|
39
|
+
const summaryKey = summaryKeyByRole[phaseRole];
|
|
40
|
+
if (!summaryKey)
|
|
41
|
+
return "missing";
|
|
42
|
+
const summaries = bugRecord.summaries ?? {};
|
|
43
|
+
const blob = summaries[summaryKey];
|
|
44
|
+
if (!blob || typeof blob !== "object")
|
|
45
|
+
return "missing";
|
|
46
|
+
const verdict = blob?.verdict;
|
|
47
|
+
if (typeof verdict !== "string")
|
|
48
|
+
return "missing";
|
|
49
|
+
if (verdict === "approved")
|
|
50
|
+
return "approved";
|
|
51
|
+
if (verdict === "revision")
|
|
52
|
+
return "revision";
|
|
53
|
+
return "missing";
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=bug-verdict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug-verdict.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/bug-verdict.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,6EAA6E;AAQ7E,MAAM,UAAU,cAAc,CAC7B,SAA2B,EAC3B,SAAiB,EACjB,gBAA+C;IAE/C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,yEAAyE;IACzE,2EAA2E;IAC3E,sEAAsE;IACtE,wDAAwD;IACxD,gEAAgE;IAChE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,UAAU,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAI,SAAqC,CAAC,UAAU,CAAC,CAAC;YAChE,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAI,IAAgC,EAAE,OAAO,CAAC;gBAC3D,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACjC,IAAI,OAAO,KAAK,UAAU;wBAAE,OAAO,UAAU,CAAC;oBAC9C,IAAI,OAAO,KAAK,UAAU;wBAAE,OAAO,UAAU,CAAC;gBAC/C,CAAC;YACF,CAAC;QACF,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,sEAAsE;IACtE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,UAAU,CAAC;QACpD,8EAA8E;QAC9E,IAAI,SAAS,CAAC,MAAM,KAAK,aAAa;YAAE,OAAO,UAAU,CAAC;QAC1D,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,kDAAkD;IAClD,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAElC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAI,SAAqC,CAAC,UAAU,CAAC,CAAC;IAChE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAExD,MAAM,OAAO,GAAI,IAAgC,EAAE,OAAO,CAAC;IAC3D,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC9C,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC9C,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type ForgeToolDefs } from "../../forge-tools.js";
|
|
3
|
+
export interface RegisterFixBugOptions {
|
|
4
|
+
cwd?: string;
|
|
5
|
+
forgeToolDefs?: ForgeToolDefs;
|
|
6
|
+
}
|
|
7
|
+
export declare function registerFixBug(pi: ExtensionAPI, options?: RegisterFixBugOptions): void;
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// run-bug-command.ts — the /forge:fix-bug command handler (config discovery,
|
|
2
|
+
// bug-ID resolution / minting, resume detection, session registration, then
|
|
3
|
+
// delegate to runBugPipeline). Extracted VERBATIM from fix-bug.ts (no logic
|
|
4
|
+
// changes).
|
|
5
|
+
import * as fs from "node:fs";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import { assertAudience, CallerContextStore } from "../../audience-gate.js";
|
|
8
|
+
import { loadGovernorProjectConfig } from "../../governor-config.js";
|
|
9
|
+
import { getOrchestratorTree } from "../../orchestrator-tree.js";
|
|
10
|
+
import { loadWorkflow } from "../../parsers/workflow-loader.js";
|
|
11
|
+
import { getSessionRegistry } from "../../session-registry.js";
|
|
12
|
+
import { resolveToCanonicalId, resolveToolDir } from "../../store/store-resolver.js";
|
|
13
|
+
import { archiveRun } from "../../transcript-archive.js";
|
|
14
|
+
import { createOrchestratorNotifier } from "../common/orchestrator-notify.js";
|
|
15
|
+
import { resolveOrchestratorEntry } from "../common/orchestrator-entry.js";
|
|
16
|
+
import { formatLocalTime, isNonInteractive } from "../common/orchestrator-misc.js";
|
|
17
|
+
import { assignNextBugId, extractBugIdFromReportText, preCreateBug, readBugRecord } from "./bug-id.js";
|
|
18
|
+
import { BUG_PHASES, BUG_TERMINAL_STATES } from "./bug-phases.js";
|
|
19
|
+
import { deleteBugState, isBugStateStale, readBugState } from "./bug-state.js";
|
|
20
|
+
import { runBugPipeline } from "./run-bug-pipeline.js";
|
|
21
|
+
const STATUS_KEY = "forge:fix-bug";
|
|
22
|
+
const MESSAGE_KEY = "forge:fix-bug:message";
|
|
23
|
+
export function registerFixBug(pi, options = {}) {
|
|
24
|
+
pi.registerCommand("forge:fix-bug", {
|
|
25
|
+
description: "Run the full bug-fix pipeline (triage → plan-fix → review-plan → implement → review-code → approve → commit). " +
|
|
26
|
+
"Usage: /forge:fix-bug <BUG_ID_OR_SUMMARY>. " +
|
|
27
|
+
"Orchestrator archetype: each phase is an isolated subagent session (IL10).",
|
|
28
|
+
async handler(args, ctx) {
|
|
29
|
+
const cwd = options.cwd ?? process.cwd();
|
|
30
|
+
const rawArg = args.trim();
|
|
31
|
+
if (!rawArg) {
|
|
32
|
+
ctx.ui.notify("× forge:fix-bug — bug ID or summary required. Usage: /forge:fix-bug <BUG_ID_OR_SUMMARY>", "error");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const notify = createOrchestratorNotifier(ctx, {
|
|
36
|
+
label: "forge:fix-bug",
|
|
37
|
+
statusKey: STATUS_KEY,
|
|
38
|
+
messageKey: MESSAGE_KEY,
|
|
39
|
+
});
|
|
40
|
+
notify.setStatus(`fix-bug: initializing…`);
|
|
41
|
+
// ── Discover forge config + sweep orphaned transcripts ───────────
|
|
42
|
+
const entry = resolveOrchestratorEntry({ cwd, notify });
|
|
43
|
+
if (!entry)
|
|
44
|
+
return;
|
|
45
|
+
const { forgeRoot, storeCli, preflightGate } = entry;
|
|
46
|
+
// ── Determine bugId ────────────────────────────────────────────
|
|
47
|
+
let bugId;
|
|
48
|
+
let isNewBug = false;
|
|
49
|
+
// Check if arg looks like it could be a bug ID (prefixed or unprefixed).
|
|
50
|
+
// Covers: FORGE-BUG-042, BUG-042, B042.
|
|
51
|
+
const looksLikeBugId = /^(?:[A-Z0-9]+-)?(?:BUG-?\d+|B\d+)$/i.test(rawArg) || /^BUG-\d+$/i.test(rawArg);
|
|
52
|
+
if (/^[A-Z][A-Z0-9]*-BUG-\d+$/.test(rawArg)) {
|
|
53
|
+
// Canonical prefixed bug ID (any project prefix, e.g. FORGE-BUG-042,
|
|
54
|
+
// CART-BUG-001) — verify it exists. Previously hardcoded to FORGE-,
|
|
55
|
+
// which pushed other-prefix canonical IDs through the resolver.
|
|
56
|
+
bugId = rawArg;
|
|
57
|
+
const bugRecord = readBugRecord(bugId, storeCli, cwd);
|
|
58
|
+
if (!bugRecord) {
|
|
59
|
+
ctx.ui.notify(`× forge:fix-bug — bug ${bugId} not found in store.`, "error");
|
|
60
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Check if bug is already in a terminal state
|
|
64
|
+
if (BUG_TERMINAL_STATES.has(bugRecord.status ?? "")) {
|
|
65
|
+
ctx.ui.notify(`× forge:fix-bug — bug ${bugId} is already in terminal state '${bugRecord.status}'. No further processing.`, "error");
|
|
66
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (looksLikeBugId) {
|
|
71
|
+
// Unprefixed bug ID — resolve through the store cascade.
|
|
72
|
+
// Issue #20: unprefixed entity IDs silently poisoned substitutions.
|
|
73
|
+
const toolDir = resolveToolDir(forgeRoot);
|
|
74
|
+
const resolvedBugId = await resolveToCanonicalId(rawArg, toolDir, cwd, "bug", {
|
|
75
|
+
ctx,
|
|
76
|
+
commandLabel: "forge:fix-bug",
|
|
77
|
+
});
|
|
78
|
+
if (!resolvedBugId) {
|
|
79
|
+
// Error already emitted by resolver
|
|
80
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
81
|
+
ctx.ui.setStatus?.(MESSAGE_KEY, undefined);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
bugId = resolvedBugId;
|
|
85
|
+
// Re-verify the resolved bug exists
|
|
86
|
+
const bugRecord = readBugRecord(bugId, storeCli, cwd);
|
|
87
|
+
if (!bugRecord) {
|
|
88
|
+
ctx.ui.notify(`× forge:fix-bug — bug ${bugId} not found in store.`, "error");
|
|
89
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (BUG_TERMINAL_STATES.has(bugRecord.status ?? "")) {
|
|
93
|
+
ctx.ui.notify(`× forge:fix-bug — bug ${bugId} is already in terminal state '${bugRecord.status}'. No further processing.`, "error");
|
|
94
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// @file or free-form text. If an @file report references a canonical
|
|
100
|
+
// <PREFIX>-BUG-NNN that already exists in the store, fix THAT record —
|
|
101
|
+
// minting a new bug here duplicated CART-BUG-001 as a phantom in the
|
|
102
|
+
// CART incident (the report header carried the real ID all along).
|
|
103
|
+
let reportBugId = null;
|
|
104
|
+
if (rawArg.startsWith("@")) {
|
|
105
|
+
const rel = rawArg.slice(1).trim();
|
|
106
|
+
const reportPath = path.isAbsolute(rel) ? rel : path.join(cwd, rel);
|
|
107
|
+
try {
|
|
108
|
+
// 256 KB cap — bug reports are small; never slurp arbitrary files.
|
|
109
|
+
if (fs.existsSync(reportPath) && fs.statSync(reportPath).size <= 262144) {
|
|
110
|
+
const projectPrefix = loadGovernorProjectConfig(cwd).prefix;
|
|
111
|
+
reportBugId = extractBugIdFromReportText(fs.readFileSync(reportPath, "utf8"), projectPrefix);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* unreadable report — fall through to new-bug intake */
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const reportRecord = reportBugId ? readBugRecord(reportBugId, storeCli, cwd) : null;
|
|
119
|
+
if (reportBugId && reportRecord) {
|
|
120
|
+
if (BUG_TERMINAL_STATES.has(reportRecord.status ?? "")) {
|
|
121
|
+
ctx.ui.notify(`× forge:fix-bug — ${rawArg} references ${reportBugId}, which is already in terminal state ` +
|
|
122
|
+
`'${reportRecord.status}'. No further processing.`, "error");
|
|
123
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
bugId = reportBugId;
|
|
127
|
+
ctx.ui.notify(`forge:fix-bug — ${rawArg} references existing bug ${bugId}; fixing it (no new record minted).`, "info");
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Free-form text (or report with no resolvable ID) — defer bug
|
|
131
|
+
// creation to the triage-phase subagent via a PENDING placeholder.
|
|
132
|
+
bugId = `PENDING-${Date.now()}`;
|
|
133
|
+
isNewBug = true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// ── Pre-flight confirm ───────────────────────────────────────────
|
|
137
|
+
if (!isNonInteractive()) {
|
|
138
|
+
const confirmMsg = isNewBug
|
|
139
|
+
? `Fix bug: "${rawArg.slice(0, 80)}"? A bug record will be created during triage.`
|
|
140
|
+
: `Fix bug ${bugId}?`;
|
|
141
|
+
const proceed = await ctx.ui.confirm(`Fix bug?`, confirmMsg);
|
|
142
|
+
if (!proceed) {
|
|
143
|
+
ctx.ui.notify("forge:fix-bug — cancelled.", "info");
|
|
144
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ── Resume detection ─────────────────────────────────────────────
|
|
149
|
+
const registry = getSessionRegistry();
|
|
150
|
+
const existing = isNewBug ? null : readBugState(cwd, bugId);
|
|
151
|
+
let resumeFromState;
|
|
152
|
+
if (existing) {
|
|
153
|
+
if (isBugStateStale(existing)) {
|
|
154
|
+
ctx.ui.notify(`⚠ forge:fix-bug — cached state for ${bugId} is stale (>7 days old, saved at ${formatLocalTime(existing.savedAt)}). Offering purge.`, "warning");
|
|
155
|
+
if (!isNonInteractive()) {
|
|
156
|
+
const purge = await ctx.ui.confirm(`Purge stale state for ${bugId}?`, "The cached state is older than 7 days. Purge and restart from the beginning?");
|
|
157
|
+
if (purge) {
|
|
158
|
+
deleteBugState(cwd, bugId);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
ctx.ui.notify("forge:fix-bug — stale state kept; aborting.", "info");
|
|
162
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
163
|
+
ctx.ui.setStatus?.(MESSAGE_KEY, undefined);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
ctx.ui.notify("forge:fix-bug — stale state; non-interactive mode auto-aborting.", "info");
|
|
169
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
170
|
+
ctx.ui.setStatus?.(MESSAGE_KEY, undefined);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// ADR-S21-01: offer resume for ALL non-stale states — halted=true
|
|
176
|
+
// (explicit failure), halted=false (cancelled/interrupted), and
|
|
177
|
+
// any state with existing.status set.
|
|
178
|
+
const stateStatus = existing.status ?? (existing.halted ? "halted" : "interrupted");
|
|
179
|
+
const statusLabel = stateStatus === "cancelled" ? "cancelled" : stateStatus === "halted" ? "halted" : "interrupted";
|
|
180
|
+
const phaseRole = BUG_PHASES[existing.phaseIndex]?.role ?? existing.phaseIndex;
|
|
181
|
+
if (!isNonInteractive()) {
|
|
182
|
+
const resume = await ctx.ui.confirm(`Resume ${bugId}?`, `Cached state — phase ${existing.phaseIndex} (${phaseRole}), ${statusLabel}, ` +
|
|
183
|
+
`saved at ${formatLocalTime(existing.savedAt)}. Resume from here?`);
|
|
184
|
+
if (resume) {
|
|
185
|
+
resumeFromState = existing;
|
|
186
|
+
ctx.ui.notify(`forge:fix-bug — resuming ${bugId} from phase ${phaseRole} (${statusLabel})`, "info");
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
deleteBugState(cwd, bugId);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Non-interactive: auto-resume from state (no confirmation).
|
|
194
|
+
// Cancelled/interrupted states are valid resume points.
|
|
195
|
+
resumeFromState = existing;
|
|
196
|
+
ctx.ui.notify(`forge:fix-bug — resuming ${bugId} from phase ${phaseRole} (${statusLabel})`, "info");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// For new bugs, triage phase will create the bug record.
|
|
201
|
+
// After triage, we need to capture the bugId from the subagent events.
|
|
202
|
+
// This is handled inside runBugPipeline via onEvent interception.
|
|
203
|
+
// For now, we pass the temporary bugId; runBugPipeline will update it.
|
|
204
|
+
// ── Materialization check (top-level workflow) ──────────────────
|
|
205
|
+
const workflowPath = path.join(cwd, ".forge", "workflows", "fix_bug.md");
|
|
206
|
+
if (fs.existsSync(workflowPath)) {
|
|
207
|
+
try {
|
|
208
|
+
const loaded = loadWorkflow(workflowPath);
|
|
209
|
+
// AC#12: Top-level audience check for the fix_bug.md workflow.
|
|
210
|
+
// The orchestrator ITSELF runs fix_bug.md (not a subagent), so check
|
|
211
|
+
// from orchestrator context. Using asSubagent would falsely reject
|
|
212
|
+
// orchestrator-only workflows called by the orchestrator.
|
|
213
|
+
const topAudienceOk = CallerContextStore.asOrchestrator(() => assertAudience({ workflowName: "fix_bug", audience: loaded.audience }, ctx));
|
|
214
|
+
if (!topAudienceOk) {
|
|
215
|
+
ctx.ui.notify("× forge:fix-bug — audience check failed for top-level fix_bug workflow.", "error");
|
|
216
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
217
|
+
ctx.ui.setStatus?.(MESSAGE_KEY, undefined);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
// Note: no materialization-marker check here. fix_bug.md is the
|
|
221
|
+
// orchestrator workflow (prose algorithm), not a sub-workflow that
|
|
222
|
+
// subagents run directly. Per-phase sub-workflows (architect_approve,
|
|
223
|
+
// review_code, etc.) each get their own materialization check inside
|
|
224
|
+
// runBugPipeline at line ~481, which is the correct guard layer.
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Workflow file exists but couldn't be read — non-fatal, continue
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// ── Pre-assign real bug ID for new bugs ────────────────────────
|
|
231
|
+
// Previously this was done inside runBugPipeline, but the session registry
|
|
232
|
+
// needs the real ID before startSession is called.
|
|
233
|
+
if (isNewBug && bugId.startsWith("PENDING-")) {
|
|
234
|
+
const realBugId = assignNextBugId(storeCli, cwd, loadGovernorProjectConfig(cwd).prefix);
|
|
235
|
+
const title = rawArg && !rawArg.startsWith("@") ? rawArg.slice(0, 120) : "New bug (pending triage)";
|
|
236
|
+
if (preCreateBug(realBugId, title, storeCli, cwd)) {
|
|
237
|
+
ctx.ui.notify(`forge:fix-bug — pre-assigned bug ID: ${realBugId}`, "info");
|
|
238
|
+
bugId = realBugId;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
ctx.ui.notify("× forge:fix-bug — failed to pre-create bug record. Falling back to PENDING capture.", "error");
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Register session
|
|
245
|
+
registry.startSession(bugId);
|
|
246
|
+
// Bridge: register bug in OrchestratorTree.
|
|
247
|
+
const tree = getOrchestratorTree();
|
|
248
|
+
tree.startNode(bugId, { label: `fix-bug ${bugId}`, kind: "orchestrator" });
|
|
249
|
+
// ── Delegate to pipeline ─────────────────────────────────────────
|
|
250
|
+
// ── Delegate to pipeline ─────────────────────────────────────────
|
|
251
|
+
const signal = registry.getAbortSignal(bugId);
|
|
252
|
+
const pipelineResult = await runBugPipeline({
|
|
253
|
+
bugId,
|
|
254
|
+
originalArg: isNewBug ? rawArg : undefined,
|
|
255
|
+
isNewBug,
|
|
256
|
+
cwd,
|
|
257
|
+
ctx,
|
|
258
|
+
forgeRoot,
|
|
259
|
+
storeCli,
|
|
260
|
+
preflightGate,
|
|
261
|
+
registry,
|
|
262
|
+
resumeFromState,
|
|
263
|
+
signal,
|
|
264
|
+
forgeToolDefs: options.forgeToolDefs,
|
|
265
|
+
});
|
|
266
|
+
// ── Handle result ────────────────────────────────────────────────
|
|
267
|
+
if (pipelineResult.status === "completed") {
|
|
268
|
+
registry.completeSession(bugId, "completed");
|
|
269
|
+
tree.completeNode(bugId, "completed");
|
|
270
|
+
ctx.ui.notify(`〇 forge:fix-bug — ${bugId} pipeline complete (${BUG_PHASES.length} phases).`, "info");
|
|
271
|
+
}
|
|
272
|
+
else if (pipelineResult.status === "cancelled") {
|
|
273
|
+
registry.completeSession(bugId, "cancelled");
|
|
274
|
+
tree.completeNode(bugId, "cancelled");
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
registry.completeSession(bugId, "failed");
|
|
278
|
+
tree.completeNode(bugId, "failed");
|
|
279
|
+
}
|
|
280
|
+
// Mirror this run into the central transcript archive (best-effort —
|
|
281
|
+
// archiveRun never throws).
|
|
282
|
+
if (pipelineResult.orchestratorTranscriptPath) {
|
|
283
|
+
archiveRun({
|
|
284
|
+
cwd,
|
|
285
|
+
orchestratorJsonlPath: pipelineResult.orchestratorTranscriptPath,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
ctx.ui.setStatus?.(STATUS_KEY, undefined);
|
|
289
|
+
ctx.ui.setStatus?.(MESSAGE_KEY, undefined);
|
|
290
|
+
},
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=run-bug-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-bug-command.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/run-bug-command.ts"],"names":[],"mappings":"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"}
|