@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,178 @@
|
|
|
1
|
+
// init-context.ts — project-name discovery, project-context.json construction,
|
|
2
|
+
// and calibration baseline computation for /forge:init.
|
|
3
|
+
//
|
|
4
|
+
// Per INIT_PARITY_SPEC.md §9 and PLAN.md Phase C.
|
|
5
|
+
// Iron Law 6: no shell-string interpolation.
|
|
6
|
+
import * as crypto from "node:crypto";
|
|
7
|
+
import * as fs from "node:fs";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
// ── Project name discovery ─────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Discover project name from package.json:name, falling back to cwd basename.
|
|
12
|
+
*
|
|
13
|
+
* Tries to read <cwd>/package.json and parse the `name` field. If the file is
|
|
14
|
+
* absent, malformed, or missing the name field, returns `path.basename(cwd)`.
|
|
15
|
+
*/
|
|
16
|
+
export function discoverProjectName(cwd) {
|
|
17
|
+
const pkgPath = path.join(cwd, "package.json");
|
|
18
|
+
try {
|
|
19
|
+
const raw = fs.readFileSync(pkgPath, "utf8");
|
|
20
|
+
const pkg = JSON.parse(raw);
|
|
21
|
+
if (pkg &&
|
|
22
|
+
typeof pkg === "object" &&
|
|
23
|
+
"name" in pkg &&
|
|
24
|
+
typeof pkg.name === "string") {
|
|
25
|
+
const name = pkg.name;
|
|
26
|
+
if (name.trim())
|
|
27
|
+
return name.trim();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// ENOENT or JSON parse error — fall through to basename
|
|
32
|
+
}
|
|
33
|
+
return path.basename(cwd);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build a ProjectContext from discovery results and forge config.
|
|
37
|
+
*
|
|
38
|
+
* Merges discoveryResults with config data. Config project.name/prefix take
|
|
39
|
+
* precedence over discovery if both are present (config was set interactively).
|
|
40
|
+
*/
|
|
41
|
+
export function buildProjectContext(discoveryResults, config) {
|
|
42
|
+
const name = config.project?.name ?? discoveryResults.projectName ?? "";
|
|
43
|
+
const prefix = config.project?.prefix ?? discoveryResults.prefix ?? "";
|
|
44
|
+
const ctx = {
|
|
45
|
+
project: {
|
|
46
|
+
name,
|
|
47
|
+
prefix,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
if (discoveryResults.description) {
|
|
51
|
+
ctx.project.description = discoveryResults.description;
|
|
52
|
+
}
|
|
53
|
+
if (discoveryResults.stack && discoveryResults.stack.length > 0) {
|
|
54
|
+
ctx.project.stack = discoveryResults.stack;
|
|
55
|
+
}
|
|
56
|
+
const testCmd = discoveryResults.testCommand ?? "";
|
|
57
|
+
const buildCmd = discoveryResults.buildCommand ?? "";
|
|
58
|
+
const lintCmd = discoveryResults.lintCommand ?? "";
|
|
59
|
+
if (testCmd || buildCmd) {
|
|
60
|
+
ctx.project.commands = {
|
|
61
|
+
...(testCmd ? { test: testCmd } : {}),
|
|
62
|
+
...(buildCmd ? { build: buildCmd } : {}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const hasArch = discoveryResults.backendFramework ??
|
|
66
|
+
discoveryResults.frontendFramework ??
|
|
67
|
+
discoveryResults.database ??
|
|
68
|
+
discoveryResults.deployment ??
|
|
69
|
+
discoveryResults.dataAccess;
|
|
70
|
+
if (hasArch) {
|
|
71
|
+
ctx.architecture = {};
|
|
72
|
+
const frameworks = {};
|
|
73
|
+
if (discoveryResults.backendFramework)
|
|
74
|
+
frameworks.backend = discoveryResults.backendFramework;
|
|
75
|
+
if (discoveryResults.frontendFramework)
|
|
76
|
+
frameworks.frontend = discoveryResults.frontendFramework;
|
|
77
|
+
if (discoveryResults.database)
|
|
78
|
+
frameworks.database = discoveryResults.database;
|
|
79
|
+
if (Object.keys(frameworks).length > 0)
|
|
80
|
+
ctx.architecture.frameworks = frameworks;
|
|
81
|
+
if (discoveryResults.dataAccess)
|
|
82
|
+
ctx.architecture.dataAccess = discoveryResults.dataAccess;
|
|
83
|
+
if (discoveryResults.deployment)
|
|
84
|
+
ctx.architecture.deployment = discoveryResults.deployment;
|
|
85
|
+
}
|
|
86
|
+
const hasWorkflow = testCmd || lintCmd || buildCmd;
|
|
87
|
+
if (hasWorkflow) {
|
|
88
|
+
ctx.workflow = {
|
|
89
|
+
...(testCmd ? { testCommand: testCmd } : {}),
|
|
90
|
+
...(lintCmd ? { lintCommand: lintCmd } : {}),
|
|
91
|
+
...(buildCmd ? { buildCommand: buildCmd } : {}),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const kbPath = discoveryResults.kbPath ?? config.paths?.engineering ?? "engineering";
|
|
95
|
+
ctx.knowledgeBase = {
|
|
96
|
+
path: kbPath,
|
|
97
|
+
indexFile: `${kbPath}/MASTER_INDEX.md`,
|
|
98
|
+
};
|
|
99
|
+
return ctx;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate a ProjectContext object structurally. Throws with a descriptive
|
|
103
|
+
* error if required fields are missing.
|
|
104
|
+
*/
|
|
105
|
+
export function validateProjectContext(ctx) {
|
|
106
|
+
if (!ctx || typeof ctx !== "object") {
|
|
107
|
+
throw new Error("project-context validation failed: not an object");
|
|
108
|
+
}
|
|
109
|
+
const record = ctx;
|
|
110
|
+
if (!record.project || typeof record.project !== "object") {
|
|
111
|
+
throw new Error("project-context validation failed: missing required field 'project'");
|
|
112
|
+
}
|
|
113
|
+
const project = record.project;
|
|
114
|
+
if (typeof project.name !== "string" || !project.name.trim()) {
|
|
115
|
+
throw new Error("project-context validation failed: project.name is missing or empty");
|
|
116
|
+
}
|
|
117
|
+
if (typeof project.prefix !== "string" || !project.prefix.trim()) {
|
|
118
|
+
throw new Error("project-context validation failed: project.prefix is missing or empty");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Write project-context.json to <cwd>/.forge/project-context.json
|
|
123
|
+
*/
|
|
124
|
+
export function writeProjectContext(cwd, ctx) {
|
|
125
|
+
const filePath = path.join(cwd, ".forge", "project-context.json");
|
|
126
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
127
|
+
fs.writeFileSync(filePath, JSON.stringify(ctx, null, 2) + "\n", "utf8");
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Compute a calibration baseline snapshot for /forge:init Phase 2.
|
|
131
|
+
*
|
|
132
|
+
* @param cwd - project working directory
|
|
133
|
+
* @param kbPath - relative path to the knowledge base directory (e.g. "engineering")
|
|
134
|
+
* @param bundledPluginVersion - version string from package.json forge.bundledVersion
|
|
135
|
+
*/
|
|
136
|
+
export function computeCalibrationBaseline(cwd, kbPath, bundledPluginVersion) {
|
|
137
|
+
const baseline = {
|
|
138
|
+
lastCalibrated: new Date().toISOString(),
|
|
139
|
+
version: bundledPluginVersion,
|
|
140
|
+
masterIndexHash: null,
|
|
141
|
+
sprintsCovered: [],
|
|
142
|
+
};
|
|
143
|
+
// Compute SHA-256 of MASTER_INDEX.md if it exists
|
|
144
|
+
const masterIndexPath = path.join(cwd, kbPath, "MASTER_INDEX.md");
|
|
145
|
+
try {
|
|
146
|
+
const content = fs.readFileSync(masterIndexPath, "utf8");
|
|
147
|
+
baseline.masterIndexHash = crypto.createHash("sha256").update(content, "utf8").digest("hex");
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// File not yet present — leave as null (init just started Phase 2)
|
|
151
|
+
}
|
|
152
|
+
// Collect completed sprint IDs from .forge/store/sprints/
|
|
153
|
+
// Matches the algorithm used by /forge:calibrate Step 2 auto-init branch.
|
|
154
|
+
const storeSprintsDir = path.join(cwd, ".forge", "store", "sprints");
|
|
155
|
+
try {
|
|
156
|
+
const files = fs.readdirSync(storeSprintsDir).filter((f) => f.endsWith(".json"));
|
|
157
|
+
const completedIds = [];
|
|
158
|
+
for (const f of files) {
|
|
159
|
+
try {
|
|
160
|
+
const raw = fs.readFileSync(path.join(storeSprintsDir, f), "utf8");
|
|
161
|
+
const sprint = JSON.parse(raw);
|
|
162
|
+
if (typeof sprint.sprintId === "string" &&
|
|
163
|
+
(sprint.status === "done" || sprint.status === "retrospective-done")) {
|
|
164
|
+
completedIds.push(sprint.sprintId);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Skip malformed sprint file
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
baseline.sprintsCovered = completedIds.sort();
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Store sprints dir not yet created — leave as []
|
|
175
|
+
}
|
|
176
|
+
return baseline;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=init-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-context.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/init-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Canonical progress record written to .forge/init-progress.json */
|
|
2
|
+
export interface InitProgress {
|
|
3
|
+
lastPhase: 1 | 2 | 3 | 4;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
}
|
|
6
|
+
export type ReadProgressResult = {
|
|
7
|
+
kind: "none";
|
|
8
|
+
} | {
|
|
9
|
+
kind: "stale";
|
|
10
|
+
reason: string;
|
|
11
|
+
} | {
|
|
12
|
+
kind: "malformed";
|
|
13
|
+
} | {
|
|
14
|
+
kind: "valid";
|
|
15
|
+
progress: InitProgress;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Read the init-progress checkpoint file.
|
|
19
|
+
*
|
|
20
|
+
* Returns:
|
|
21
|
+
* - `{ kind: "none" }` — file does not exist
|
|
22
|
+
* - `{ kind: "malformed" }` — file exists but JSON parse failed
|
|
23
|
+
* - `{ kind: "stale", reason }` — file is a legacy 12-phase checkpoint
|
|
24
|
+
* - `{ kind: "valid", progress }` — clean 4-phase checkpoint
|
|
25
|
+
*/
|
|
26
|
+
export declare function readInitProgress(cwd: string): ReadProgressResult;
|
|
27
|
+
/**
|
|
28
|
+
* Write a progress checkpoint. Called at the end of each completed phase.
|
|
29
|
+
*
|
|
30
|
+
* @param cwd - project working directory
|
|
31
|
+
* @param lastPhase - completed phase number (1, 2, or 3; 4 is written then deleted)
|
|
32
|
+
* @param timestamp - ISO 8601 timestamp; defaults to now
|
|
33
|
+
*/
|
|
34
|
+
export declare function writeInitProgress(cwd: string, lastPhase: 1 | 2 | 3 | 4, timestamp?: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Delete the init-progress checkpoint. Called at the end of Phase 4
|
|
37
|
+
* to signal successful completion.
|
|
38
|
+
*/
|
|
39
|
+
export declare function deleteInitProgress(cwd: string): void;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// init-progress.ts — read/write/delete .forge/init-progress.json
|
|
2
|
+
//
|
|
3
|
+
// Tracks the last completed phase of /forge:init so the command can resume
|
|
4
|
+
// after an interrupted run. Implements stale-checkpoint detection to handle
|
|
5
|
+
// legacy 12-phase checkpoint files from old forge plugin versions.
|
|
6
|
+
//
|
|
7
|
+
// Per INIT_PARITY_SPEC.md §4 and PLAN.md Phase B.
|
|
8
|
+
import * as fs from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
const PROGRESS_FILENAME = ".forge/init-progress.json";
|
|
11
|
+
function progressPath(cwd) {
|
|
12
|
+
return path.join(cwd, PROGRESS_FILENAME);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read the init-progress checkpoint file.
|
|
16
|
+
*
|
|
17
|
+
* Returns:
|
|
18
|
+
* - `{ kind: "none" }` — file does not exist
|
|
19
|
+
* - `{ kind: "malformed" }` — file exists but JSON parse failed
|
|
20
|
+
* - `{ kind: "stale", reason }` — file is a legacy 12-phase checkpoint
|
|
21
|
+
* - `{ kind: "valid", progress }` — clean 4-phase checkpoint
|
|
22
|
+
*/
|
|
23
|
+
export function readInitProgress(cwd) {
|
|
24
|
+
const filePath = progressPath(cwd);
|
|
25
|
+
let raw;
|
|
26
|
+
try {
|
|
27
|
+
raw = fs.readFileSync(filePath, "utf8");
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const e = err;
|
|
31
|
+
if (e.code === "ENOENT")
|
|
32
|
+
return { kind: "none" };
|
|
33
|
+
// Unreadable — treat as missing
|
|
34
|
+
return { kind: "none" };
|
|
35
|
+
}
|
|
36
|
+
let obj;
|
|
37
|
+
try {
|
|
38
|
+
obj = JSON.parse(raw);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { kind: "malformed" };
|
|
42
|
+
}
|
|
43
|
+
if (!obj || typeof obj !== "object") {
|
|
44
|
+
return { kind: "malformed" };
|
|
45
|
+
}
|
|
46
|
+
const record = obj;
|
|
47
|
+
// Stale detection per spec §4:
|
|
48
|
+
// - lastPhase > 4 → old 12-phase run
|
|
49
|
+
// - contains "mode" key → old format
|
|
50
|
+
// - contains "phase-7-substep-map" key → old format
|
|
51
|
+
// - missing "timestamp" → corrupt / incomplete write
|
|
52
|
+
if ("mode" in record) {
|
|
53
|
+
return { kind: "stale", reason: 'contains "mode" field (legacy 12-phase format)' };
|
|
54
|
+
}
|
|
55
|
+
if ("phase-7-substep-map" in record) {
|
|
56
|
+
return { kind: "stale", reason: 'contains "phase-7-substep-map" field (legacy 12-phase format)' };
|
|
57
|
+
}
|
|
58
|
+
if (!("timestamp" in record)) {
|
|
59
|
+
return { kind: "stale", reason: 'missing "timestamp" field' };
|
|
60
|
+
}
|
|
61
|
+
const lastPhase = record.lastPhase;
|
|
62
|
+
if (typeof lastPhase !== "number" || !Number.isInteger(lastPhase)) {
|
|
63
|
+
return { kind: "malformed" };
|
|
64
|
+
}
|
|
65
|
+
if (lastPhase > 4) {
|
|
66
|
+
return { kind: "stale", reason: `lastPhase=${lastPhase} > 4 (legacy 12-phase run)` };
|
|
67
|
+
}
|
|
68
|
+
if (lastPhase < 1) {
|
|
69
|
+
return { kind: "malformed" };
|
|
70
|
+
}
|
|
71
|
+
const timestamp = record.timestamp;
|
|
72
|
+
if (typeof timestamp !== "string") {
|
|
73
|
+
return { kind: "malformed" };
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
kind: "valid",
|
|
77
|
+
progress: {
|
|
78
|
+
lastPhase: lastPhase,
|
|
79
|
+
timestamp,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Write a progress checkpoint. Called at the end of each completed phase.
|
|
85
|
+
*
|
|
86
|
+
* @param cwd - project working directory
|
|
87
|
+
* @param lastPhase - completed phase number (1, 2, or 3; 4 is written then deleted)
|
|
88
|
+
* @param timestamp - ISO 8601 timestamp; defaults to now
|
|
89
|
+
*/
|
|
90
|
+
export function writeInitProgress(cwd, lastPhase, timestamp) {
|
|
91
|
+
const record = {
|
|
92
|
+
lastPhase,
|
|
93
|
+
timestamp: timestamp ?? new Date().toISOString(),
|
|
94
|
+
};
|
|
95
|
+
const filePath = progressPath(cwd);
|
|
96
|
+
// Ensure .forge/ dir exists before writing
|
|
97
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
98
|
+
fs.writeFileSync(filePath, JSON.stringify(record, null, 2) + "\n", "utf8");
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Delete the init-progress checkpoint. Called at the end of Phase 4
|
|
102
|
+
* to signal successful completion.
|
|
103
|
+
*/
|
|
104
|
+
export function deleteInitProgress(cwd) {
|
|
105
|
+
const filePath = progressPath(cwd);
|
|
106
|
+
try {
|
|
107
|
+
fs.unlinkSync(filePath);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
const e = err;
|
|
111
|
+
// ENOENT is fine — file may not exist if phase was aborted before first write
|
|
112
|
+
if (e.code !== "ENOENT") {
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=init-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-progress.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/init-progress.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,mEAAmE;AACnE,EAAE;AACF,kDAAkD;AAElD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAclC,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AAEtD,SAAS,YAAY,CAAC,GAAW;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACJ,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,GAAwB,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACjD,gCAAgC;QAChC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,MAAM,GAAG,GAA8B,CAAC;IAE9C,+BAA+B;IAC/B,qCAAqC;IACrC,qCAAqC;IACrC,oDAAoD;IACpD,qDAAqD;IACrD,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,qBAAqB,IAAI,MAAM,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,+DAA+D,EAAE,CAAC;IACnG,CAAC;IACD,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,SAAS,4BAA4B,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO;QACN,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE;YACT,SAAS,EAAE,SAA0B;YACrC,SAAS;SACT;KACD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,SAAwB,EAAE,SAAkB;IAC1F,MAAM,MAAM,GAAiB;QAC5B,SAAS;QACT,SAAS,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAChD,CAAC;IACF,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,2CAA2C;IAC3C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC;QACJ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,GAAwB,CAAC;QACnC,8EAA8E;QAC9E,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type RouterResult = {
|
|
2
|
+
consume?: boolean;
|
|
3
|
+
data?: string;
|
|
4
|
+
} | undefined;
|
|
5
|
+
export type RouterListener = (data: string) => RouterResult;
|
|
6
|
+
export interface RegisterOptions {
|
|
7
|
+
/** Stable name for debugging and unsubscription tracking. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** When true, this listener is bypassed while any overlay is active.
|
|
10
|
+
* Use for keys that "activate" a widget (e.g. ↓ to open a strip) — the
|
|
11
|
+
* overlay needs the same key for navigation. Default: false. */
|
|
12
|
+
skipWhenOverlayActive?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class ForgeInputRouter {
|
|
15
|
+
private listeners;
|
|
16
|
+
private overlayDepth;
|
|
17
|
+
register(listener: RouterListener, opts: RegisterOptions): () => void;
|
|
18
|
+
pushOverlay(): void;
|
|
19
|
+
popOverlay(): void;
|
|
20
|
+
isOverlayActive(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Mirrors pi's listener-chain semantics (tui.ts:544-560):
|
|
23
|
+
* - Each listener may return { consume: true } to stop dispatch.
|
|
24
|
+
* - Each listener may return { data: rewritten } to alter the value the
|
|
25
|
+
* next listener (and ultimately the focused overlay) sees.
|
|
26
|
+
* - Listeners flagged skipWhenOverlayActive=true are silently bypassed
|
|
27
|
+
* whenever overlayDepth > 0.
|
|
28
|
+
*/
|
|
29
|
+
dispatch(data: string): RouterResult;
|
|
30
|
+
}
|
|
31
|
+
export declare function getInputRouter(): ForgeInputRouter;
|
|
32
|
+
/** Test helper — replace the singleton with a fresh router. */
|
|
33
|
+
export declare function __resetInputRouterForTesting(): void;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// Centralised onTerminalInput dispatch for forge-cli.
|
|
2
|
+
//
|
|
3
|
+
// Plan 16 Slice 4c. Pi-mono's `ctx.ui.onTerminalInput` lets any extension hook
|
|
4
|
+
// raw stdin, with the first consumer winning. Pi runs listeners BEFORE
|
|
5
|
+
// routing to the focused overlay (pi-mono/packages/tui/src/tui.ts:544-560).
|
|
6
|
+
// That made forge-cli's two existing arrow-activator listeners
|
|
7
|
+
// (thread-switcher, whats-new-widget) silently eat ↑/↓ when the config TUI was
|
|
8
|
+
// mounted as an overlay.
|
|
9
|
+
//
|
|
10
|
+
// This router gives forge-cli a single pi listener whose dispatch is
|
|
11
|
+
// overlay-aware: listeners flagged `skipWhenOverlayActive: true` are bypassed
|
|
12
|
+
// whenever an overlay has been registered via `pushOverlay()`. Other listeners
|
|
13
|
+
// (critical hotkeys, theme switchers, etc.) still run.
|
|
14
|
+
//
|
|
15
|
+
// Wiring:
|
|
16
|
+
// 1. index.ts session_start: `ctx.ui.onTerminalInput((d) => router.dispatch(d))`.
|
|
17
|
+
// 2. Each consumer: `router.register(listener, { name, skipWhenOverlayActive })`.
|
|
18
|
+
// 3. Each overlay mounter: `router.pushOverlay()` before ctx.ui.custom,
|
|
19
|
+
// `popOverlay()` in a finally.
|
|
20
|
+
//
|
|
21
|
+
// Debug logging (when FORGE_DEBUG_INPUT=1):
|
|
22
|
+
// Each dispatch + push/pop is logged with timestamp + listener name +
|
|
23
|
+
// overlay depth + raw byte sequence (hex-escaped). Default target:
|
|
24
|
+
// /tmp/forge-input-router.log. Override with FORGE_DEBUG_INPUT_LOG=<path>.
|
|
25
|
+
// Logging goes through fs.appendFileSync — synchronous so events are
|
|
26
|
+
// captured even when the process crashes mid-render.
|
|
27
|
+
import * as fs from "node:fs";
|
|
28
|
+
function debugEnabled() {
|
|
29
|
+
return process.env.FORGE_DEBUG_INPUT === "1";
|
|
30
|
+
}
|
|
31
|
+
function debugLogPath() {
|
|
32
|
+
return process.env.FORGE_DEBUG_INPUT_LOG ?? "/tmp/forge-input-router.log";
|
|
33
|
+
}
|
|
34
|
+
function hexEscape(s) {
|
|
35
|
+
// Render printable ASCII as-is, escape everything else as \xNN. Helps spot
|
|
36
|
+
// arrow sequences (\x1b[A etc.) and Kitty-protocol variants at a glance.
|
|
37
|
+
return [...s]
|
|
38
|
+
.map((c) => {
|
|
39
|
+
const cp = c.codePointAt(0);
|
|
40
|
+
if (cp >= 0x20 && cp <= 0x7e)
|
|
41
|
+
return c;
|
|
42
|
+
return `\\x${cp.toString(16).padStart(2, "0")}`;
|
|
43
|
+
})
|
|
44
|
+
.join("");
|
|
45
|
+
}
|
|
46
|
+
function logEvent(line) {
|
|
47
|
+
if (!debugEnabled())
|
|
48
|
+
return;
|
|
49
|
+
try {
|
|
50
|
+
const ts = new Date().toISOString();
|
|
51
|
+
fs.appendFileSync(debugLogPath(), `${ts} ${line}\n`);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Logging must never crash the host; failure to write is silently ignored.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class ForgeInputRouter {
|
|
58
|
+
listeners = [];
|
|
59
|
+
overlayDepth = 0;
|
|
60
|
+
register(listener, opts) {
|
|
61
|
+
const entry = { fn: listener, opts };
|
|
62
|
+
this.listeners.push(entry);
|
|
63
|
+
logEvent(`register name=${opts.name} skipWhenOverlayActive=${!!opts.skipWhenOverlayActive} total=${this.listeners.length}`);
|
|
64
|
+
return () => {
|
|
65
|
+
const i = this.listeners.indexOf(entry);
|
|
66
|
+
if (i >= 0) {
|
|
67
|
+
this.listeners.splice(i, 1);
|
|
68
|
+
logEvent(`unregister name=${opts.name} remaining=${this.listeners.length}`);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
pushOverlay() {
|
|
73
|
+
this.overlayDepth++;
|
|
74
|
+
logEvent(`pushOverlay depth=${this.overlayDepth}`);
|
|
75
|
+
}
|
|
76
|
+
popOverlay() {
|
|
77
|
+
if (this.overlayDepth > 0)
|
|
78
|
+
this.overlayDepth--;
|
|
79
|
+
logEvent(`popOverlay depth=${this.overlayDepth}`);
|
|
80
|
+
}
|
|
81
|
+
isOverlayActive() {
|
|
82
|
+
return this.overlayDepth > 0;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Mirrors pi's listener-chain semantics (tui.ts:544-560):
|
|
86
|
+
* - Each listener may return { consume: true } to stop dispatch.
|
|
87
|
+
* - Each listener may return { data: rewritten } to alter the value the
|
|
88
|
+
* next listener (and ultimately the focused overlay) sees.
|
|
89
|
+
* - Listeners flagged skipWhenOverlayActive=true are silently bypassed
|
|
90
|
+
* whenever overlayDepth > 0.
|
|
91
|
+
*/
|
|
92
|
+
dispatch(data) {
|
|
93
|
+
if (debugEnabled()) {
|
|
94
|
+
logEvent(`dispatch IN data="${hexEscape(data)}" overlayDepth=${this.overlayDepth} listeners=${this.listeners.length}`);
|
|
95
|
+
}
|
|
96
|
+
let current = data;
|
|
97
|
+
for (const entry of this.listeners) {
|
|
98
|
+
if (this.overlayDepth > 0 && entry.opts.skipWhenOverlayActive) {
|
|
99
|
+
logEvent(` skip name=${entry.opts.name} (overlay active)`);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const result = entry.fn(current);
|
|
103
|
+
if (debugEnabled()) {
|
|
104
|
+
const r = result === undefined
|
|
105
|
+
? "passthrough"
|
|
106
|
+
: `${result.consume ? "consume" : ""}${result.data !== undefined ? ` data="${hexEscape(result.data)}"` : ""}`.trim() ||
|
|
107
|
+
"noop";
|
|
108
|
+
logEvent(` call name=${entry.opts.name} → ${r}`);
|
|
109
|
+
}
|
|
110
|
+
if (result?.consume) {
|
|
111
|
+
logEvent(`dispatch OUT consumed-by=${entry.opts.name}`);
|
|
112
|
+
return { consume: true };
|
|
113
|
+
}
|
|
114
|
+
if (result?.data !== undefined)
|
|
115
|
+
current = result.data;
|
|
116
|
+
}
|
|
117
|
+
if (current !== data) {
|
|
118
|
+
logEvent(`dispatch OUT rewritten data="${hexEscape(current)}"`);
|
|
119
|
+
return { data: current };
|
|
120
|
+
}
|
|
121
|
+
logEvent(`dispatch OUT passthrough (focused overlay should receive)`);
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ── Module-level singleton ───────────────────────────────────────────────────
|
|
126
|
+
let singleton = null;
|
|
127
|
+
export function getInputRouter() {
|
|
128
|
+
if (!singleton)
|
|
129
|
+
singleton = new ForgeInputRouter();
|
|
130
|
+
return singleton;
|
|
131
|
+
}
|
|
132
|
+
/** Test helper — replace the singleton with a fresh router. */
|
|
133
|
+
export function __resetInputRouterForTesting() {
|
|
134
|
+
singleton = null;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=input-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-router.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/input-router.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,+EAA+E;AAC/E,uEAAuE;AACvE,4EAA4E;AAC5E,+DAA+D;AAC/D,+EAA+E;AAC/E,yBAAyB;AACzB,EAAE;AACF,qEAAqE;AACrE,8EAA8E;AAC9E,+EAA+E;AAC/E,uDAAuD;AACvD,EAAE;AACF,UAAU;AACV,oFAAoF;AACpF,oFAAoF;AACpF,0EAA0E;AAC1E,oCAAoC;AACpC,EAAE;AACF,4CAA4C;AAC5C,wEAAwE;AACxE,qEAAqE;AACrE,6EAA6E;AAC7E,uEAAuE;AACvE,uDAAuD;AAEvD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAmB9B,SAAS,YAAY;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,6BAA6B,CAAC;AAC3E,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC3B,2EAA2E;IAC3E,yEAAyE;IACzE,OAAO,CAAC,GAAG,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QAC7B,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QACvC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACjD,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC7B,IAAI,CAAC,YAAY,EAAE;QAAE,OAAO;IAC5B,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACR,2EAA2E;IAC5E,CAAC;AACF,CAAC;AAED,MAAM,OAAO,gBAAgB;IACpB,SAAS,GAAY,EAAE,CAAC;IACxB,YAAY,GAAG,CAAC,CAAC;IAEzB,QAAQ,CAAC,QAAwB,EAAE,IAAqB;QACvD,MAAM,KAAK,GAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,QAAQ,CACP,iBAAiB,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC,IAAI,CAAC,qBAAqB,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CACjH,CAAC;QACF,OAAO,GAAG,EAAE;YACX,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACZ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5B,QAAQ,CAAC,mBAAmB,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7E,CAAC;QACF,CAAC,CAAC;IACH,CAAC;IAED,WAAW;QACV,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,QAAQ,CAAC,qBAAqB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,UAAU;QACT,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC;YAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/C,QAAQ,CAAC,oBAAoB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,eAAe;QACd,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAY;QACpB,IAAI,YAAY,EAAE,EAAE,CAAC;YACpB,QAAQ,CACP,qBAAqB,SAAS,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAC5G,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC/D,QAAQ,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,CAAC;gBAC5D,SAAS;YACV,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,YAAY,EAAE,EAAE,CAAC;gBACpB,MAAM,CAAC,GACN,MAAM,KAAK,SAAS;oBACnB,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE;wBACnH,MAAM,CAAC;gBACV,QAAQ,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACrB,QAAQ,CAAC,4BAA4B,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS;gBAAE,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACtB,QAAQ,CAAC,gCAAgC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1B,CAAC;QACD,QAAQ,CAAC,2DAA2D,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;IAClB,CAAC;CACD;AAED,gFAAgF;AAEhF,IAAI,SAAS,GAA4B,IAAI,CAAC;AAE9C,MAAM,UAAU,cAAc;IAC7B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACnD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,4BAA4B;IAC3C,SAAS,GAAG,IAAI,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { MergedConfig, PersonaModel } from "../config-layer.js";
|
|
2
|
+
export interface UiLike {
|
|
3
|
+
notify(message: string, level?: string): void;
|
|
4
|
+
}
|
|
5
|
+
export interface CtxLike {
|
|
6
|
+
ui: UiLike;
|
|
7
|
+
}
|
|
8
|
+
export interface GateFailure {
|
|
9
|
+
phase: string;
|
|
10
|
+
reasonCode: string;
|
|
11
|
+
detail: string;
|
|
12
|
+
remediation: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RunHaltAdvisorOptions {
|
|
15
|
+
/** Structured failure parsed from preflight-gate.cjs stdout. */
|
|
16
|
+
gateFailure: GateFailure;
|
|
17
|
+
/** Resolved advisor model (from resolveAdvisorModel). If undefined, advisor is skipped. */
|
|
18
|
+
advisorModel: PersonaModel | undefined;
|
|
19
|
+
/** Task or bug id for context. */
|
|
20
|
+
taskId: string;
|
|
21
|
+
/** Working directory. */
|
|
22
|
+
cwd: string;
|
|
23
|
+
/** Extension command context (ui + modelRegistry). */
|
|
24
|
+
ctx: CtxLike;
|
|
25
|
+
/** Optional forge root path — forwarded to runForgeSubagent. */
|
|
26
|
+
forgeRoot?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the advisor model for halt-recovery.
|
|
30
|
+
*
|
|
31
|
+
* Priority:
|
|
32
|
+
* 1. Explicit `advisorModel` config slot from forge-cli layered config.
|
|
33
|
+
* Contract (rev. 2026-06-04): the advisor model is the HEAVY model the runtime
|
|
34
|
+
* resolves point-in-time. There is NO dedicated advisorModel config entry —
|
|
35
|
+
* "heavy" is the approve/architect slot resolved through the existing routing
|
|
36
|
+
* cascade (L4 phase override → L3/L2 project → L1 user/global → default),
|
|
37
|
+
* exactly as the approve phase itself would resolve. When the cascade bottoms
|
|
38
|
+
* out at inherit, the session's current model (pi default) is used. In the
|
|
39
|
+
* Claude Code plugin route the equivalent is the opus-class session model.
|
|
40
|
+
*
|
|
41
|
+
* Returns undefined (advisor skipped, non-fatal) only when nothing is routed
|
|
42
|
+
* AND no current model is available.
|
|
43
|
+
*
|
|
44
|
+
* (History: the original FORGE-S26-T18 implementation used a dedicated
|
|
45
|
+
* advisorModel config slot with a blind registry fallback that produced
|
|
46
|
+
* "anthropic/undefined" on the CART-S03-T01 halt — both retired.)
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveAdvisorModel(merged: MergedConfig, currentModel?: {
|
|
49
|
+
provider?: string;
|
|
50
|
+
model?: string;
|
|
51
|
+
id?: string;
|
|
52
|
+
}, pipelineName?: string): PersonaModel | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Spawn a read-only advisor subagent to explain the gate failure and guide recovery.
|
|
55
|
+
*
|
|
56
|
+
* Best-effort: errors are notified via ctx.ui but do NOT propagate. The
|
|
57
|
+
* primary halt status is the caller's responsibility to surface separately.
|
|
58
|
+
*/
|
|
59
|
+
export declare function runHaltAdvisor(opts: RunHaltAdvisorOptions): Promise<void>;
|