@entelligentsia/forgecli 1.0.25 → 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 +258 -0
- package/README.md +2 -0
- package/dist/CHANGELOG-forge-plugin.md +163 -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/add-pipeline.d.ts +19 -0
- package/dist/extensions/forgecli/add-pipeline.js +143 -0
- package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/add-task.d.ts +20 -0
- package/dist/extensions/forgecli/add-task.js +154 -0
- package/dist/extensions/forgecli/add-task.js.map +1 -0
- package/dist/extensions/forgecli/approve.d.ts +22 -0
- package/dist/extensions/forgecli/approve.js +152 -0
- package/dist/extensions/forgecli/approve.js.map +1 -0
- package/dist/extensions/forgecli/banner.d.ts +10 -0
- package/dist/extensions/forgecli/banner.js +36 -0
- package/dist/extensions/forgecli/banner.js.map +1 -0
- package/dist/extensions/forgecli/calibrate.d.ts +64 -0
- package/dist/extensions/forgecli/calibrate.js +481 -0
- package/dist/extensions/forgecli/calibrate.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/collate.d.ts +22 -0
- package/dist/extensions/forgecli/collate.js +134 -0
- package/dist/extensions/forgecli/collate.js.map +1 -0
- package/dist/extensions/forgecli/commit.d.ts +22 -0
- package/dist/extensions/forgecli/commit.js +152 -0
- package/dist/extensions/forgecli/commit.js.map +1 -0
- package/dist/extensions/forgecli/config-command.d.ts +8 -0
- package/dist/extensions/forgecli/config-command.js +67 -0
- package/dist/extensions/forgecli/config-command.js.map +1 -0
- package/dist/extensions/forgecli/config-layer.d.ts +53 -0
- package/dist/extensions/forgecli/config-layer.js +72 -0
- package/dist/extensions/forgecli/config-layer.js.map +1 -0
- package/dist/extensions/forgecli/config-writer.d.ts +16 -0
- package/dist/extensions/forgecli/config-writer.js +69 -0
- package/dist/extensions/forgecli/config-writer.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/enhance.d.ts +27 -0
- package/dist/extensions/forgecli/enhance.js +199 -0
- package/dist/extensions/forgecli/enhance.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.d.ts +85 -0
- package/dist/extensions/forgecli/fix-bug.js +1580 -0
- package/dist/extensions/forgecli/fix-bug.js.map +1 -0
- package/dist/extensions/forgecli/forge-header.d.ts +12 -0
- package/dist/extensions/forgecli/forge-header.js +114 -0
- package/dist/extensions/forgecli/forge-header.js.map +1 -0
- package/dist/extensions/forgecli/forge-init.d.ts +26 -0
- package/dist/extensions/forgecli/forge-init.js +514 -0
- package/dist/extensions/forgecli/forge-init.js.map +1 -0
- package/dist/extensions/forgecli/forge-root.d.ts +10 -0
- package/dist/extensions/forgecli/forge-root.js +62 -0
- package/dist/extensions/forgecli/forge-root.js.map +1 -0
- package/dist/extensions/forgecli/forge-update-command.d.ts +100 -0
- package/dist/extensions/forgecli/forge-update-command.js +435 -0
- package/dist/extensions/forgecli/forge-update-command.js.map +1 -0
- package/dist/extensions/forgecli/friction-emit.d.ts +99 -0
- package/dist/extensions/forgecli/friction-emit.js +245 -0
- package/dist/extensions/forgecli/friction-emit.js.map +1 -0
- package/dist/extensions/forgecli/implement.d.ts +22 -0
- package/dist/extensions/forgecli/implement.js +170 -0
- package/dist/extensions/forgecli/implement.js.map +1 -0
- package/dist/extensions/forgecli/init-context.d.ts +99 -0
- package/dist/extensions/forgecli/init-context.js +178 -0
- package/dist/extensions/forgecli/init-context.js.map +1 -0
- package/dist/extensions/forgecli/init-progress.d.ts +39 -0
- package/dist/extensions/forgecli/init-progress.js +117 -0
- package/dist/extensions/forgecli/init-progress.js.map +1 -0
- package/dist/extensions/forgecli/input-router.d.ts +33 -0
- package/dist/extensions/forgecli/input-router.js +136 -0
- package/dist/extensions/forgecli/input-router.js.map +1 -0
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +59 -0
- package/dist/extensions/forgecli/lib/halt-advisor.js +113 -0
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -0
- package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +46 -0
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js +64 -0
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +1 -0
- package/dist/extensions/forgecli/materialize.d.ts +16 -0
- package/dist/extensions/forgecli/materialize.js +195 -0
- package/dist/extensions/forgecli/materialize.js.map +1 -0
- package/dist/extensions/forgecli/migrate.d.ts +22 -0
- package/dist/extensions/forgecli/migrate.js +260 -0
- package/dist/extensions/forgecli/migrate.js.map +1 -0
- package/dist/extensions/forgecli/migration-engine.d.ts +117 -0
- package/dist/extensions/forgecli/migration-engine.js +563 -0
- package/dist/extensions/forgecli/migration-engine.js.map +1 -0
- package/dist/extensions/forgecli/model-registry.d.ts +61 -0
- package/dist/extensions/forgecli/model-registry.js +127 -0
- package/dist/extensions/forgecli/model-registry.js.map +1 -0
- package/dist/extensions/forgecli/model-resolver.d.ts +32 -0
- package/dist/extensions/forgecli/model-resolver.js +65 -0
- package/dist/extensions/forgecli/model-resolver.js.map +1 -0
- package/dist/extensions/forgecli/model-validator.d.ts +29 -0
- package/dist/extensions/forgecli/model-validator.js +107 -0
- package/dist/extensions/forgecli/model-validator.js.map +1 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +26 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.js +213 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -0
- 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 -93
- package/dist/extensions/forgecli/orchestrators/fix-bug.js +23 -1721
- 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 +48 -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/plan.d.ts +22 -0
- package/dist/extensions/forgecli/plan.js +167 -0
- package/dist/extensions/forgecli/plan.js.map +1 -0
- package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
- package/dist/extensions/forgecli/quiz-agent.js +98 -0
- package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
- package/dist/extensions/forgecli/read-command.d.ts +2 -0
- package/dist/extensions/forgecli/read-command.js +100 -0
- package/dist/extensions/forgecli/read-command.js.map +1 -0
- package/dist/extensions/forgecli/regenerate.d.ts +40 -0
- package/dist/extensions/forgecli/regenerate.js +438 -0
- package/dist/extensions/forgecli/regenerate.js.map +1 -0
- package/dist/extensions/forgecli/remove-command.d.ts +17 -0
- package/dist/extensions/forgecli/remove-command.js +124 -0
- package/dist/extensions/forgecli/remove-command.js.map +1 -0
- package/dist/extensions/forgecli/report-bug.d.ts +25 -0
- package/dist/extensions/forgecli/report-bug.js +159 -0
- package/dist/extensions/forgecli/report-bug.js.map +1 -0
- package/dist/extensions/forgecli/retrospective.d.ts +20 -0
- package/dist/extensions/forgecli/retrospective.js +126 -0
- package/dist/extensions/forgecli/retrospective.js.map +1 -0
- package/dist/extensions/forgecli/review-code.d.ts +35 -0
- package/dist/extensions/forgecli/review-code.js +196 -0
- package/dist/extensions/forgecli/review-code.js.map +1 -0
- package/dist/extensions/forgecli/review-plan.d.ts +35 -0
- package/dist/extensions/forgecli/review-plan.js +200 -0
- package/dist/extensions/forgecli/review-plan.js.map +1 -0
- package/dist/extensions/forgecli/run-sprint.d.ts +27 -0
- package/dist/extensions/forgecli/run-sprint.js +716 -0
- package/dist/extensions/forgecli/run-sprint.js.map +1 -0
- package/dist/extensions/forgecli/run-task.d.ts +204 -0
- package/dist/extensions/forgecli/run-task.js +1403 -0
- package/dist/extensions/forgecli/run-task.js.map +1 -0
- package/dist/extensions/forgecli/skill-curation-flag.d.ts +21 -0
- package/dist/extensions/forgecli/skill-curation-flag.js +71 -0
- package/dist/extensions/forgecli/skill-curation-flag.js.map +1 -0
- package/dist/extensions/forgecli/skill-curator-subagent.d.ts +102 -0
- package/dist/extensions/forgecli/skill-curator-subagent.js +339 -0
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +1 -0
- package/dist/extensions/forgecli/skill-retriever.d.ts +84 -0
- package/dist/extensions/forgecli/skill-retriever.js +246 -0
- package/dist/extensions/forgecli/skill-retriever.js.map +1 -0
- package/dist/extensions/forgecli/skill-usage-tracker.d.ts +91 -0
- package/dist/extensions/forgecli/skill-usage-tracker.js +224 -0
- package/dist/extensions/forgecli/skill-usage-tracker.js.map +1 -0
- package/dist/extensions/forgecli/sprint-intake.d.ts +10 -0
- package/dist/extensions/forgecli/sprint-intake.js +91 -0
- package/dist/extensions/forgecli/sprint-intake.js.map +1 -0
- package/dist/extensions/forgecli/sprint-plan.d.ts +14 -0
- package/dist/extensions/forgecli/sprint-plan.js +122 -0
- package/dist/extensions/forgecli/sprint-plan.js.map +1 -0
- package/dist/extensions/forgecli/status-command.d.ts +19 -0
- package/dist/extensions/forgecli/status-command.js +140 -0
- package/dist/extensions/forgecli/status-command.js.map +1 -0
- package/dist/extensions/forgecli/store-error-remediation.d.ts +65 -0
- package/dist/extensions/forgecli/store-error-remediation.js +307 -0
- package/dist/extensions/forgecli/store-error-remediation.js.map +1 -0
- package/dist/extensions/forgecli/store-query.d.ts +22 -0
- package/dist/extensions/forgecli/store-query.js +107 -0
- package/dist/extensions/forgecli/store-query.js.map +1 -0
- package/dist/extensions/forgecli/store-repair.d.ts +17 -0
- package/dist/extensions/forgecli/store-repair.js +123 -0
- package/dist/extensions/forgecli/store-repair.js.map +1 -0
- package/dist/extensions/forgecli/store-resolver.d.ts +56 -0
- package/dist/extensions/forgecli/store-resolver.js +263 -0
- package/dist/extensions/forgecli/store-resolver.js.map +1 -0
- package/dist/extensions/forgecli/store-validator.d.ts +16 -0
- package/dist/extensions/forgecli/store-validator.js +32 -0
- package/dist/extensions/forgecli/store-validator.js.map +1 -0
- package/dist/extensions/forgecli/test-orchestrate.d.ts +2 -0
- package/dist/extensions/forgecli/test-orchestrate.js +182 -0
- package/dist/extensions/forgecli/test-orchestrate.js.map +1 -0
- package/dist/extensions/forgecli/thread-switcher.d.ts +5 -0
- package/dist/extensions/forgecli/thread-switcher.js +189 -0
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -0
- package/dist/extensions/forgecli/transition-guard.d.ts +20 -0
- package/dist/extensions/forgecli/transition-guard.js +89 -0
- package/dist/extensions/forgecli/transition-guard.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/extensions/forgecli/update-check.d.ts +37 -0
- package/dist/extensions/forgecli/update-check.js +185 -0
- package/dist/extensions/forgecli/update-check.js.map +1 -0
- package/dist/extensions/forgecli/update-tools.d.ts +23 -0
- package/dist/extensions/forgecli/update-tools.js +135 -0
- package/dist/extensions/forgecli/update-tools.js.map +1 -0
- package/dist/extensions/forgecli/validate.d.ts +22 -0
- package/dist/extensions/forgecli/validate.js +152 -0
- package/dist/extensions/forgecli/validate.js.map +1 -0
- package/dist/extensions/forgecli/viewport-events.d.ts +78 -0
- package/dist/extensions/forgecli/viewport-events.js +243 -0
- package/dist/extensions/forgecli/viewport-events.js.map +1 -0
- package/dist/extensions/forgecli/viewport-renderer.d.ts +83 -0
- package/dist/extensions/forgecli/viewport-renderer.js +233 -0
- package/dist/extensions/forgecli/viewport-renderer.js.map +1 -0
- package/dist/extensions/forgecli/viewport-theme.d.ts +11 -0
- package/dist/extensions/forgecli/viewport-theme.js +128 -0
- package/dist/extensions/forgecli/viewport-theme.js.map +1 -0
- package/dist/extensions/forgecli/whats-new-widget.d.ts +26 -0
- package/dist/extensions/forgecli/whats-new-widget.js +376 -0
- package/dist/extensions/forgecli/whats-new-widget.js.map +1 -0
- package/dist/extensions/forgecli/whats-new.d.ts +120 -0
- package/dist/extensions/forgecli/whats-new.js +470 -0
- package/dist/extensions/forgecli/whats-new.js.map +1 -0
- 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/collator_agent.md +5 -6
- package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +1 -1
- package/dist/forge-payload/.base-pack/workflows-js/wfl-init.js +449 -0
- 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/migrations.json +85 -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/workflows/meta-collate.md +5 -6
- package/dist/forge-payload/meta/workflows/meta-migrate.md +1 -1
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/structure-manifest.json +3 -12
- 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/substitute-placeholders.cjs +5 -6
- package/node_modules/@mariozechner/clipboard/package.json +1 -2
- package/package.json +2 -2
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +0 -3
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +0 -25
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// bug-verdict-loop.ts — review-phase verdict + revision/loopback handling for
|
|
2
|
+
// the fix-bug pipeline. Extracted VERBATIM from fix-bug.ts's phase loop
|
|
3
|
+
// (FORGE-S31 file-size refactor) as a pure decision function: it performs the
|
|
4
|
+
// same store reads, ctx.ui notifications, state writes, transcript records,
|
|
5
|
+
// tree-node finalization, status-reset transition, and halt-advisor dispatch the
|
|
6
|
+
// inline block did, and returns a small discriminated result the caller's loop
|
|
7
|
+
// switches on.
|
|
8
|
+
//
|
|
9
|
+
// Behavior-preserving: no logic changes. The only structural change is that the
|
|
10
|
+
// inline `return {...}` paths now return `{ kind: "return"; result }`, the
|
|
11
|
+
// `continue` path returns `{ kind: "loopback"; toIndex }`, and the fall-through
|
|
12
|
+
// (approved) path returns `{ kind: "advance" }`.
|
|
13
|
+
import { spawnSync } from "node:child_process";
|
|
14
|
+
import { resolveAdvisorModel, runHaltAdvisor } from "../halt-advisor.js";
|
|
15
|
+
import { recoverPhaseSummary } from "../common/summary-recovery.js";
|
|
16
|
+
import { findPredecessorIndex } from "../run-task.js";
|
|
17
|
+
import { BUG_PHASES } from "./bug-phases.js";
|
|
18
|
+
import { readBugRecord } from "./bug-id.js";
|
|
19
|
+
import { writeBugState } from "./bug-state.js";
|
|
20
|
+
import { readBugVerdict } from "./bug-verdict.js";
|
|
21
|
+
/**
|
|
22
|
+
* Evaluate the review-phase verdict and decide the loop's next move.
|
|
23
|
+
* Mirrors the inline block that previously lived in runBugPipelineInner.
|
|
24
|
+
*/
|
|
25
|
+
export function handleBugReviewVerdict(p) {
|
|
26
|
+
const { phase, bugId, storeCli, cwd, forgeRoot, iterationCounts, currentPhaseIndex, modelRoutingConfig, ctx } = p;
|
|
27
|
+
const { orchTranscript, finishPhaseNode, summaryKeyByRole, recoveredPhases } = p;
|
|
28
|
+
// Re-read bug record for latest status after subagent ran
|
|
29
|
+
const updatedBugRecord = readBugRecord(bugId, storeCli, cwd);
|
|
30
|
+
let verdict = readBugVerdict(updatedBugRecord, phase.role, summaryKeyByRole);
|
|
31
|
+
// Completion recovery (forge-engineering#41): a clean stop with no verdict in
|
|
32
|
+
// the store is most often the subagent writing the {PHASE}-SUMMARY.json
|
|
33
|
+
// sidecar but eliding the set-bug-summary that registers it. Register the
|
|
34
|
+
// sidecar ourselves (once per phase), then re-read. Phases whose verdict comes
|
|
35
|
+
// from bug.status (e.g. commit → summaryKey null) are not recoverable this way.
|
|
36
|
+
if (verdict === "missing") {
|
|
37
|
+
const summaryKey = summaryKeyByRole[phase.role];
|
|
38
|
+
if (summaryKey && !recoveredPhases.has(phase.role)) {
|
|
39
|
+
recoveredPhases.add(phase.role);
|
|
40
|
+
const rec = recoverPhaseSummary({
|
|
41
|
+
storeCli,
|
|
42
|
+
entityId: bugId,
|
|
43
|
+
summaryKey,
|
|
44
|
+
cwd,
|
|
45
|
+
summaryVerb: "set-bug-summary",
|
|
46
|
+
});
|
|
47
|
+
if (rec.ok) {
|
|
48
|
+
const recheck = readBugVerdict(readBugRecord(bugId, storeCli, cwd), phase.role, summaryKeyByRole);
|
|
49
|
+
if (recheck !== "missing") {
|
|
50
|
+
ctx.ui.notify(`⟳ forge:fix-bug — ${phase.role}: subagent skipped set-bug-summary; orchestrator registered ` +
|
|
51
|
+
`the '${summaryKey}' sidecar and the verdict is now present.`, "info");
|
|
52
|
+
verdict = recheck;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (verdict === "missing") {
|
|
58
|
+
ctx.ui.notify(`× forge:fix-bug — verdict missing for phase ${phase.role} after subagent completed. Halting for advisory.`, "error");
|
|
59
|
+
finishPhaseNode("failed");
|
|
60
|
+
writeBugState(cwd, {
|
|
61
|
+
bugId,
|
|
62
|
+
phaseIndex: currentPhaseIndex,
|
|
63
|
+
iterationCounts,
|
|
64
|
+
halted: true,
|
|
65
|
+
lastError: `verdict missing for ${phase.role}`,
|
|
66
|
+
savedAt: new Date().toISOString(),
|
|
67
|
+
});
|
|
68
|
+
// A missing verdict IS a postflight-outputs failure: the canonical
|
|
69
|
+
// phase summary the subagent must write (e.g. summaries.code_review,
|
|
70
|
+
// linked via set-bug-summary) was never recorded, so there is no
|
|
71
|
+
// verdict to route on. Route it through the halt-recovery advisor
|
|
72
|
+
// (FORGE-S26-T18) — the same hand-off the preflight/postflight gate
|
|
73
|
+
// failures use — instead of a bare escalation. Best-effort, non-fatal.
|
|
74
|
+
const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
|
|
75
|
+
void runHaltAdvisor({
|
|
76
|
+
gateFailure: {
|
|
77
|
+
phase: phase.role,
|
|
78
|
+
reasonCode: "verdict-missing",
|
|
79
|
+
detail: `Phase '${phase.role}' completed but no verdict was found in the store. ` +
|
|
80
|
+
"The canonical phase summary was not written, so the orchestrator has no verdict to route on.",
|
|
81
|
+
remediation: "Re-run the phase and ensure the subagent's forge_store set-bug-summary call " +
|
|
82
|
+
'uses args:["<bugId>", "<phaseKey>"] with the literal phase key as args[1] ' +
|
|
83
|
+
"(e.g. code_review), and that the call exits zero before the subagent returns.",
|
|
84
|
+
},
|
|
85
|
+
advisorModel,
|
|
86
|
+
taskId: bugId,
|
|
87
|
+
cwd,
|
|
88
|
+
ctx: { ui: ctx.ui },
|
|
89
|
+
forgeRoot,
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
kind: "return",
|
|
93
|
+
result: {
|
|
94
|
+
status: "halted",
|
|
95
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
96
|
+
iterationCounts,
|
|
97
|
+
lastError: `verdict missing for ${phase.role}`,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (verdict === "revision") {
|
|
102
|
+
iterationCounts[phase.role] = (iterationCounts[phase.role] ?? 0) + 1;
|
|
103
|
+
if (iterationCounts[phase.role] >= phase.maxIterations) {
|
|
104
|
+
ctx.ui.notify(`× forge:fix-bug — revision cap reached for phase ${phase.role} ` +
|
|
105
|
+
`(${iterationCounts[phase.role]}/${phase.maxIterations} iterations). Escalating.`, "error");
|
|
106
|
+
finishPhaseNode("escalated");
|
|
107
|
+
writeBugState(cwd, {
|
|
108
|
+
bugId,
|
|
109
|
+
phaseIndex: currentPhaseIndex,
|
|
110
|
+
iterationCounts,
|
|
111
|
+
halted: true,
|
|
112
|
+
lastError: `revision cap reached for ${phase.role}`,
|
|
113
|
+
savedAt: new Date().toISOString(),
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
kind: "return",
|
|
117
|
+
result: {
|
|
118
|
+
status: "escalated",
|
|
119
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
120
|
+
iterationCounts,
|
|
121
|
+
lastError: `revision cap reached for ${phase.role}`,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// Transition bug back to in-progress before re-dispatching implement.
|
|
126
|
+
// This is required for review-code → implement and approve → implement loops.
|
|
127
|
+
const currentBugStatus = updatedBugRecord?.status;
|
|
128
|
+
if (currentBugStatus === "fixed" || currentBugStatus === "approved") {
|
|
129
|
+
const transitionResult = spawnSync("node", [storeCli, "update-status", "bug", bugId, "status", "in-progress"], { cwd, encoding: "utf8" });
|
|
130
|
+
if (transitionResult.status !== 0) {
|
|
131
|
+
ctx.ui.notify(`⚠ forge:fix-bug — failed to transition bug ${bugId} from ${currentBugStatus} to in-progress: ${transitionResult.stderr ?? "unknown"}`, "warning");
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
ctx.ui.notify(`⟳ forge:fix-bug — transitioned bug ${bugId}: ${currentBugStatus} → in-progress`, "info");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// The review subagent itself finished cleanly — `revision`
|
|
138
|
+
// is its verdict, not a failure — so its node closes as
|
|
139
|
+
// completed before the predecessor re-dispatches under a
|
|
140
|
+
// fresh node ID.
|
|
141
|
+
finishPhaseNode("completed");
|
|
142
|
+
const predIndex = findPredecessorIndex(BUG_PHASES, currentPhaseIndex);
|
|
143
|
+
ctx.ui.notify(`⟳ forge:fix-bug — ${phase.role} returned revision; looping to ${BUG_PHASES[predIndex]?.role ?? predIndex} ` +
|
|
144
|
+
`(attempt ${iterationCounts[phase.role]}/${phase.maxIterations})`, "info");
|
|
145
|
+
orchTranscript.record({
|
|
146
|
+
kind: "phase-loopback",
|
|
147
|
+
ts: new Date().toISOString(),
|
|
148
|
+
fromPhase: phase.role,
|
|
149
|
+
toPhase: BUG_PHASES[predIndex]?.role ?? String(predIndex),
|
|
150
|
+
fromPhaseIndex: currentPhaseIndex,
|
|
151
|
+
toPhaseIndex: predIndex,
|
|
152
|
+
reason: `${phase.role} returned revision (attempt ${iterationCounts[phase.role]}/${phase.maxIterations})`,
|
|
153
|
+
});
|
|
154
|
+
writeBugState(cwd, {
|
|
155
|
+
bugId,
|
|
156
|
+
phaseIndex: predIndex,
|
|
157
|
+
iterationCounts,
|
|
158
|
+
halted: false,
|
|
159
|
+
savedAt: new Date().toISOString(),
|
|
160
|
+
});
|
|
161
|
+
return { kind: "loopback", toIndex: predIndex };
|
|
162
|
+
}
|
|
163
|
+
// verdict === "approved": fall through to advance
|
|
164
|
+
return { kind: "advance" };
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=bug-verdict-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug-verdict-loop.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/bug-verdict-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|