@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,514 @@
|
|
|
1
|
+
// forge-init.ts — /forge:init command handler — FORGE-S17-T02
|
|
2
|
+
//
|
|
3
|
+
// Full 4-phase init flow:
|
|
4
|
+
// Phase 1 — Collect: multi-step discovery + config.json synthesis → .forge/config.json
|
|
5
|
+
// Phase 2 — Discover: phase gate + KB doc generation + index files → engineering/
|
|
6
|
+
// Phase 3 — Materialize: substitute-placeholders → .forge/{personas,skills,workflows,templates}
|
|
7
|
+
// Phase 4 — Register: 11 deterministic steps → versioning, packs, store, Tomoshibi
|
|
8
|
+
//
|
|
9
|
+
// Per INIT_PARITY_SPEC.md and PLAN.md (rev 2) phases A–G.
|
|
10
|
+
//
|
|
11
|
+
// ── Phase model (FORGE-S26-T17) ──────────────────────────────────────────
|
|
12
|
+
//
|
|
13
|
+
// Phases 1–3 are standalone async functions in forge-init/run-phases.ts.
|
|
14
|
+
// Each reads its phase prompt from the bundled init/phases/phase-N-*.md file,
|
|
15
|
+
// dispatches via sendToAgent + waitForIdle (phases 1-2) or runs tools directly
|
|
16
|
+
// (phase 3), then verifies deliverables via verify-phase.cjs.
|
|
17
|
+
//
|
|
18
|
+
// Phase 4 is in forge-init/phase4-register.ts → runPhase4().
|
|
19
|
+
//
|
|
20
|
+
// This file is the orchestrator: flag parsing, resume detection, configCache population
|
|
21
|
+
// (between Phase 1 and Phase 2), phase loop, post-init report.
|
|
22
|
+
//
|
|
23
|
+
// Iron Laws:
|
|
24
|
+
// - Iron Law 1: no edits to forge/ or pi-mono/
|
|
25
|
+
// - Iron Law 6: execFile with argv arrays — no shell-string interpolation
|
|
26
|
+
// - Iron Law 7: silent continuation past failures is never acceptable
|
|
27
|
+
//
|
|
28
|
+
// Sub-decision bindings (from PLAN.md):
|
|
29
|
+
// #1: Marketplace skills — advisory only; write installedSkills: []
|
|
30
|
+
// #3: Parallel dispatch — vendored subagent via ctx.sendUserMessage instruction
|
|
31
|
+
// #4: /forge:enhance — sentinel + advisory only; no sendUserMessage dispatch
|
|
32
|
+
// #5: Tomoshibi — runRefreshKbLinks() native TS port; no shell-out
|
|
33
|
+
// #9: Health check — runHealthCheck() direct call; NOT via sendUserMessage
|
|
34
|
+
//
|
|
35
|
+
// ── Async/sync contract (N-B-C, revised 2026-05-26) ──────────────────────────
|
|
36
|
+
//
|
|
37
|
+
// `await sendToAgent(text)` sends a prompt to the agent and resolves when the agent
|
|
38
|
+
// has finished processing it. It wraps `pi.sendUserMessage(text, { deliverAs: "steer" })`.
|
|
39
|
+
//
|
|
40
|
+
// When the agent is IDLE (the common case at init start): sendUserMessage calls
|
|
41
|
+
// session.prompt(), which starts a full agent turn via agent.prompt(). Awaiting it
|
|
42
|
+
// blocks until that turn completes, including all tool calls and follow-ups.
|
|
43
|
+
//
|
|
44
|
+
// When the agent is STREAMING (mid-turn): sendUserMessage enqueues a steer message
|
|
45
|
+
// and resolves quickly — the steer is picked up by the running turn's steering poll.
|
|
46
|
+
// In this case `await ctx.waitForIdle()` IS needed afterwards to wait for the turn
|
|
47
|
+
// (including the steer) to finish.
|
|
48
|
+
//
|
|
49
|
+
// Both awaits are always issued: `await sendToAgent` covers the idle-agent path;
|
|
50
|
+
// `await waitForIdle` covers the streaming-agent path and is a harmless no-op when
|
|
51
|
+
// the agent already completed its turn via sendToAgent.
|
|
52
|
+
//
|
|
53
|
+
// Pattern for every phase:
|
|
54
|
+
// await sendToAgent(promptText); // dispatch + wait for completion when idle
|
|
55
|
+
// await waitForIdle(); // wait for current turn when streaming; no-op when idle
|
|
56
|
+
// const result = verifyPhaseN(); // read deliverable — agent is done
|
|
57
|
+
//
|
|
58
|
+
// ── Config cache boundary (B-4, N-B-A) ──────────────────────────────────────
|
|
59
|
+
//
|
|
60
|
+
// `.forge/config.json` is WRITTEN by the Phase-1 agent. Any read before Phase 1's
|
|
61
|
+
// `waitForIdle` returns stale or absent data. `configCache` is populated once,
|
|
62
|
+
// immediately after Phase 1 completes, and reused throughout Phase 2, Phase 4,
|
|
63
|
+
// the post-init hook, and the report section — reducing 8 fs.readFileSync calls to 1.
|
|
64
|
+
//
|
|
65
|
+
// `verifyPhase1` inside `forge-init/verifiers.ts` intentionally reads config.json
|
|
66
|
+
// directly rather than using `configCache` — it validates the Phase-1 deliverable
|
|
67
|
+
// and must see the freshly written file.
|
|
68
|
+
import * as fs from "node:fs";
|
|
69
|
+
import * as path from "node:path";
|
|
70
|
+
import { fileURLToPath } from "node:url";
|
|
71
|
+
import { runPhase4 } from "./forge-init/phase4-register.js";
|
|
72
|
+
import { runPhase1, runPhase2, runPhase3 } from "./forge-init/run-phases.js";
|
|
73
|
+
import { verifyPhase1, verifyPhase3 } from "./forge-init/verifiers.js";
|
|
74
|
+
import { runHealthCheck } from "./health-check.js";
|
|
75
|
+
import { emitSyntheticEvent } from "./hook-dispatcher.js";
|
|
76
|
+
import { discoverProjectName } from "./init-context.js";
|
|
77
|
+
import { deleteInitProgress, readInitProgress } from "./init-progress.js";
|
|
78
|
+
import { execFileAsync } from "./lib/exec-helpers.js";
|
|
79
|
+
import { clearForgeConfigCache } from "./lib/forge-config.js";
|
|
80
|
+
// FORGE-S26-T11: registerMigrate imported to power `forge:init --migrate`
|
|
81
|
+
import { registerMigrate } from "./migrate.js";
|
|
82
|
+
// ── Bundle path resolution ─────────────────────────────────────────────────
|
|
83
|
+
const _EXTENSION_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
84
|
+
// dist/extensions/forgecli/ → dist/ → <pkg-root>/
|
|
85
|
+
const _DIST_DIR = path.resolve(_EXTENSION_DIR, "..", "..");
|
|
86
|
+
const _PKG_ROOT = path.resolve(_DIST_DIR, "..");
|
|
87
|
+
/** Get the bundled forge-payload root (dist/forge-payload/) */
|
|
88
|
+
export function getBundledPayloadRoot() {
|
|
89
|
+
return path.join(_PKG_ROOT, "dist", "forge-payload");
|
|
90
|
+
}
|
|
91
|
+
/** Get the bundled tools directory (dist/forge-payload/tools/) */
|
|
92
|
+
export function getBundledToolsRoot() {
|
|
93
|
+
return path.join(getBundledPayloadRoot(), "tools");
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Resolve the absolute path to dist/forge-payload/tools and validate it
|
|
97
|
+
* contains store-cli.cjs. Throws if the directory is missing or incomplete.
|
|
98
|
+
* Exported for test access and for Phase-4 pi-aware forgeRoot stamp.
|
|
99
|
+
*/
|
|
100
|
+
export function resolveBundleToolsRoot() {
|
|
101
|
+
const toolsRoot = getBundledToolsRoot();
|
|
102
|
+
const storeCli = path.join(toolsRoot, "store-cli.cjs");
|
|
103
|
+
if (!fs.existsSync(storeCli)) {
|
|
104
|
+
throw new Error(`resolveBundleToolsRoot: bundled tools dir missing store-cli.cjs — expected at ${storeCli}. ` +
|
|
105
|
+
"Run 'npm run build' to populate dist/forge-payload/tools/.");
|
|
106
|
+
}
|
|
107
|
+
return toolsRoot;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Detect pi runtime. forge-init.ts is only ever called from the forgecli pi
|
|
111
|
+
* extension (registerForgeInit is invoked during extension load by pi). There
|
|
112
|
+
* is no Claude Code execution path. Therefore this always returns true.
|
|
113
|
+
*
|
|
114
|
+
* We keep the guard explicit rather than hardcoding `true` so that if a future
|
|
115
|
+
* Claude Code path is added it is obvious where to insert the condition.
|
|
116
|
+
*
|
|
117
|
+
* Heuristic: PI_CODING_AGENT_DIR env set → definitely pi. Otherwise assume pi
|
|
118
|
+
* (our only caller). Only false if explicitly opted-out via env flag in a
|
|
119
|
+
* hypothetical future Claude Code integration.
|
|
120
|
+
* Exported for test access.
|
|
121
|
+
*/
|
|
122
|
+
export function isPiRuntime() {
|
|
123
|
+
// If the caller explicitly overrides via env, respect it (test escape hatch only).
|
|
124
|
+
if (process.env.FORGE_INIT_CLAUDE_CODE_MODE === "1")
|
|
125
|
+
return false;
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
/** Get the bundled forge version from .claude-plugin/plugin.json */
|
|
129
|
+
function getBundledForgeVersion() {
|
|
130
|
+
try {
|
|
131
|
+
const pluginPath = path.join(getBundledPayloadRoot(), ".claude-plugin", "plugin.json");
|
|
132
|
+
const raw = fs.readFileSync(pluginPath, "utf8");
|
|
133
|
+
const plugin = JSON.parse(raw);
|
|
134
|
+
return typeof plugin.version === "string" ? plugin.version : "0.0.0";
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return "0.0.0";
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ── Session-scoped banner state ────────────────────────────────────────────
|
|
141
|
+
// Prevents re-rendering the hero banner on resume within the same session.
|
|
142
|
+
let heroBannerShown = false;
|
|
143
|
+
// ── Non-interactive mode ───────────────────────────────────────────────────
|
|
144
|
+
/**
|
|
145
|
+
* Returns true when running in non-interactive / CI mode.
|
|
146
|
+
*
|
|
147
|
+
* Activated by either:
|
|
148
|
+
* - `FORGE_YES=1` — ergonomic shell shorthand (FORGE-S18-T01)
|
|
149
|
+
* - `FORGE_NON_INTERACTIVE=1` — set by `forge --non-interactive` flag
|
|
150
|
+
*
|
|
151
|
+
* When active, every Y/N gate resolves to its documented default without
|
|
152
|
+
* emitting a model-text prompt.
|
|
153
|
+
*/
|
|
154
|
+
function isNonInteractive() {
|
|
155
|
+
return process.env.FORGE_YES === "1" || process.env.FORGE_NON_INTERACTIVE === "1";
|
|
156
|
+
}
|
|
157
|
+
function parseInitFlags(args) {
|
|
158
|
+
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
159
|
+
const hasFast = parts.includes("--fast");
|
|
160
|
+
const hasFull = parts.includes("--full");
|
|
161
|
+
const hasMigrate = parts.includes("--migrate");
|
|
162
|
+
// Find trailing numeric phase arg
|
|
163
|
+
let startPhase = null;
|
|
164
|
+
let invalidPhase = false;
|
|
165
|
+
for (let i = 0; i < parts.length; i++) {
|
|
166
|
+
const p = parts[i];
|
|
167
|
+
if (p === "--fast" || p === "--full" || p === "--migrate")
|
|
168
|
+
continue;
|
|
169
|
+
const n = parseInt(p, 10);
|
|
170
|
+
if (!Number.isNaN(n)) {
|
|
171
|
+
if (n >= 1 && n <= 4) {
|
|
172
|
+
startPhase = n;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
invalidPhase = true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
fast: hasFast,
|
|
181
|
+
full: hasFull,
|
|
182
|
+
migrate: hasMigrate,
|
|
183
|
+
startPhase,
|
|
184
|
+
conflict: hasFast && hasFull,
|
|
185
|
+
invalidPhase,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// ── Main command registration ──────────────────────────────────────────────
|
|
189
|
+
export function registerForgeInit(pi) {
|
|
190
|
+
// Capture pi.sendUserMessage in closure — ExtensionCommandContext does not
|
|
191
|
+
// have sendUserMessage; it is on ExtensionAPI per pi types.ts:1187.
|
|
192
|
+
//
|
|
193
|
+
// sendToAgent MUST be awaited. When the agent is idle (the typical case for
|
|
194
|
+
// /forge:init), sendUserMessage starts a full agent turn and resolves when it
|
|
195
|
+
// completes. When the agent is streaming, sendUserMessage enqueues a steer and
|
|
196
|
+
// resolves quickly — waitForIdle is then needed to wait for the turn to finish.
|
|
197
|
+
//
|
|
198
|
+
// Previous bug (BUG-017/BUG-023 workaround was incomplete): sendToAgent was
|
|
199
|
+
// fire-and-forget (no await), and waitForIdle was the sole sync primitive.
|
|
200
|
+
// But waitForIdle() returns Promise.resolve() when agent.activeRun is null
|
|
201
|
+
// (no active turn), which is the state at init start — the steer hadn't been
|
|
202
|
+
// picked up yet, so everything after waitForIdle fired instantly.
|
|
203
|
+
const sendToAgent = async (text) => {
|
|
204
|
+
await pi.sendUserMessage(text, { deliverAs: "steer" });
|
|
205
|
+
};
|
|
206
|
+
pi.registerCommand("forge:init", {
|
|
207
|
+
description: "Bootstrap a new Forge SDLC project at the current working directory",
|
|
208
|
+
async handler(args, ctx) {
|
|
209
|
+
const cwd = process.cwd();
|
|
210
|
+
const bundleRoot = getBundledPayloadRoot();
|
|
211
|
+
const toolsRoot = getBundledToolsRoot();
|
|
212
|
+
const bundledVersion = getBundledForgeVersion();
|
|
213
|
+
// kbPathFinal is resolved in Phase 4 but used in post-phase report.
|
|
214
|
+
// Declare at handler scope so post-phase code can read it.
|
|
215
|
+
let kbPathFinal = "engineering";
|
|
216
|
+
// ── 1. Flag parsing ────────────────────────────────────────────────
|
|
217
|
+
const flags = parseInitFlags(args);
|
|
218
|
+
// FORGE-S26-T11: --migrate flag dispatches to store migration instead of init.
|
|
219
|
+
if (flags.migrate) {
|
|
220
|
+
// Strip --migrate, pass remaining args to migrate handler.
|
|
221
|
+
const migrateParts = (args ?? "").trim().split(/\s+/).filter((p) => p !== "--migrate");
|
|
222
|
+
const migrateArgs = migrateParts.join(" ");
|
|
223
|
+
let migrateHandler;
|
|
224
|
+
const syntheticPi = {
|
|
225
|
+
...pi,
|
|
226
|
+
registerCommand: (name, def) => {
|
|
227
|
+
if (name === "forge:migrate")
|
|
228
|
+
migrateHandler = def.handler;
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
registerMigrate(syntheticPi);
|
|
232
|
+
if (migrateHandler) {
|
|
233
|
+
await migrateHandler(migrateArgs, ctx);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
ctx.ui.notify("× forge:init --migrate — migrate handler unavailable", "error");
|
|
237
|
+
}
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
if (flags.conflict) {
|
|
241
|
+
ctx.ui.notify("× Conflicting flags: --fast and --full cannot be combined.", "error");
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
// ── 2. Resume detection ────────────────────────────────────────────
|
|
245
|
+
const progressResult = readInitProgress(cwd);
|
|
246
|
+
let startPhase = flags.startPhase ?? 1;
|
|
247
|
+
if (progressResult.kind === "malformed") {
|
|
248
|
+
ctx.ui.notify("△ init-progress.json is malformed — deleting and starting fresh.", "warning");
|
|
249
|
+
deleteInitProgress(cwd);
|
|
250
|
+
}
|
|
251
|
+
else if (progressResult.kind === "stale") {
|
|
252
|
+
// Silently delete stale checkpoint and proceed fresh
|
|
253
|
+
deleteInitProgress(cwd);
|
|
254
|
+
}
|
|
255
|
+
else if (progressResult.kind === "valid") {
|
|
256
|
+
const lastPhase = progressResult.progress.lastPhase;
|
|
257
|
+
const nextPhase = Math.min(lastPhase + 1, 4);
|
|
258
|
+
const resumeBanner = `〇 Previous init detected — last completed phase: ${lastPhase} of 4\n` +
|
|
259
|
+
`Resume from Phase ${nextPhase}?`;
|
|
260
|
+
// G1: in non-interactive mode, default to not resuming (start fresh)
|
|
261
|
+
const shouldResume = isNonInteractive() ? false : await ctx.ui.confirm("Resume /forge:init?", resumeBanner);
|
|
262
|
+
if (shouldResume) {
|
|
263
|
+
startPhase = nextPhase;
|
|
264
|
+
// Skip hero banner on resume (session-scoped gate)
|
|
265
|
+
heroBannerShown = true;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
deleteInitProgress(cwd);
|
|
269
|
+
startPhase = 1;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Override startPhase from flags if --fast/--full N or direct phase arg
|
|
273
|
+
if (flags.startPhase !== null) {
|
|
274
|
+
startPhase = flags.startPhase;
|
|
275
|
+
}
|
|
276
|
+
if (flags.invalidPhase) {
|
|
277
|
+
// Invalid phase specified — re-prompt via pre-flight (fall through to pre-flight)
|
|
278
|
+
startPhase = 1;
|
|
279
|
+
}
|
|
280
|
+
// ── 3. Hero banner (once per session) ────────────────────────────
|
|
281
|
+
if (!heroBannerShown) {
|
|
282
|
+
heroBannerShown = true;
|
|
283
|
+
const bannersTool = path.join(toolsRoot, "banners.cjs");
|
|
284
|
+
if (fs.existsSync(bannersTool)) {
|
|
285
|
+
await execFileAsync("node", [bannersTool, "forge"], {
|
|
286
|
+
cwd,
|
|
287
|
+
timeout: 5000,
|
|
288
|
+
}).catch(() => {
|
|
289
|
+
/* non-fatal */
|
|
290
|
+
});
|
|
291
|
+
await execFileAsync("node", [bannersTool, "--subtitle", `AI SDLC bootstrapper · forge:init v${bundledVersion}`], { cwd, timeout: 5000 }).catch(() => {
|
|
292
|
+
/* non-fatal */
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// ── 4. Flag acknowledgement (--fast or --full, no phase jump) ────
|
|
297
|
+
if ((flags.fast || flags.full) && flags.startPhase === null) {
|
|
298
|
+
const mode = flags.fast ? "--fast" : "--full";
|
|
299
|
+
ctx.ui.notify(`〇 ${mode} — running all 4 phases sequentially (functionally equivalent).`, "info");
|
|
300
|
+
}
|
|
301
|
+
// ── 5. Pre-flight plan (unless jumping to a specific phase) ───────
|
|
302
|
+
const projectName = discoverProjectName(cwd);
|
|
303
|
+
if (flags.startPhase === null || flags.invalidPhase) {
|
|
304
|
+
const preflightSummary = `Forge Init — ${projectName}\n\n` +
|
|
305
|
+
`4 phases will run in this session (~45 seconds non-interactive):\n\n` +
|
|
306
|
+
` 1 Collect — codebase discovery → config.json\n` +
|
|
307
|
+
` KB folder prompt (interactive)\n` +
|
|
308
|
+
` 2 Discover — KB doc generation + project-context.json\n` +
|
|
309
|
+
` 3 Materialize — substitute-placeholders.cjs → fully functional workflows\n` +
|
|
310
|
+
` 4 Register — versioning, manifest, cache, store entries, Tomoshibi\n\n` +
|
|
311
|
+
`Phase 1 is interactive (KB folder name prompt). Phases 2–4 are non-interactive.`;
|
|
312
|
+
// G2: skip pre-flight confirm in non-interactive mode (proceed directly to Phase 1)
|
|
313
|
+
if (!isNonInteractive()) {
|
|
314
|
+
const proceed = await ctx.ui.confirm("Start /forge:init?", preflightSummary);
|
|
315
|
+
if (!proceed) {
|
|
316
|
+
ctx.ui.notify("〇 /forge:init cancelled.", "info");
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// ── Config cache (B-4, N-B-A) ─────────────────────────────────────
|
|
322
|
+
// Populated unconditionally before the loop so that resume paths
|
|
323
|
+
// (startPhase > 1) read the config.json that Phase 1 wrote in a prior
|
|
324
|
+
// session. Falls back to {} when config.json does not exist yet (first-run
|
|
325
|
+
// Phase 1 will create it). Refreshed after Phase 1 completes in the loop
|
|
326
|
+
// to pick up values the Phase-1 agent just wrote. See file-header comment
|
|
327
|
+
// §Config cache boundary for the full rationale.
|
|
328
|
+
let configCache = {};
|
|
329
|
+
try {
|
|
330
|
+
configCache = JSON.parse(fs.readFileSync(path.join(cwd, ".forge", "config.json"), "utf8"));
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
// File not yet present — Phase 1 will create it
|
|
334
|
+
}
|
|
335
|
+
// ── Phases 1–3: linear phase calls ──────────────────────────────────
|
|
336
|
+
// Each phase is a standalone async function in forge-init/run-phases.ts.
|
|
337
|
+
// (FORGE-S26-T17: replaced descriptor-driven loop with explicit calls.)
|
|
338
|
+
// Phase 1 — Collect
|
|
339
|
+
if (startPhase <= 1) {
|
|
340
|
+
const phase1Result = await runPhase1(cwd, bundleRoot, toolsRoot, configCache, ctx, sendToAgent, () => ctx.waitForIdle(), isNonInteractive);
|
|
341
|
+
if (phase1Result === "abort")
|
|
342
|
+
return;
|
|
343
|
+
// Inter-phase gate: let user review before Phase 2
|
|
344
|
+
if (!isNonInteractive()) {
|
|
345
|
+
const proceed = await ctx.ui.confirm("Phase 1 complete — proceed?", "Phase 1 deliverables verified. Continue to Phase 2: Discover (KB generation)?");
|
|
346
|
+
if (!proceed) {
|
|
347
|
+
ctx.ui.notify("〇 /forge:init paused after Phase 1. Re-run /forge:init to resume.", "info");
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Refresh configCache after Phase 1 writes .forge/config.json
|
|
352
|
+
try {
|
|
353
|
+
configCache = JSON.parse(fs.readFileSync(path.join(cwd, ".forge", "config.json"), "utf8"));
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// Fall back to existing cache — all downstream reads have their own defaults
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Phase 2 — Discover
|
|
360
|
+
if (startPhase <= 2) {
|
|
361
|
+
const phase2Result = await runPhase2(cwd, bundleRoot, toolsRoot, projectName, configCache, ctx, sendToAgent, () => ctx.waitForIdle(), isNonInteractive);
|
|
362
|
+
if (phase2Result === "abort")
|
|
363
|
+
return;
|
|
364
|
+
// Inter-phase gate: let user review before Phase 3
|
|
365
|
+
if (!isNonInteractive()) {
|
|
366
|
+
const proceed = await ctx.ui.confirm("Phase 2 complete — proceed?", "Phase 2 deliverables verified. Continue to Phase 3: Materialize (workflow generation)?");
|
|
367
|
+
if (!proceed) {
|
|
368
|
+
ctx.ui.notify("〇 /forge:init paused after Phase 2. Re-run /forge:init to resume.", "info");
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Phase 3 — Materialize
|
|
374
|
+
if (startPhase <= 3) {
|
|
375
|
+
const phase3Result = await runPhase3(cwd, bundleRoot, toolsRoot, ctx);
|
|
376
|
+
if (phase3Result === "abort")
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
// ── Phase 4 — Register (runPhase4) ────────────────────────────────
|
|
380
|
+
if (startPhase <= 4) {
|
|
381
|
+
const phase4Result = await runPhase4({
|
|
382
|
+
cwd,
|
|
383
|
+
bundleRoot,
|
|
384
|
+
toolsRoot,
|
|
385
|
+
projectName,
|
|
386
|
+
configCache,
|
|
387
|
+
ctx,
|
|
388
|
+
isPiRuntime,
|
|
389
|
+
getBundledToolsRoot,
|
|
390
|
+
});
|
|
391
|
+
if (phase4Result === "abort") {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
// phase4Result.kbPathFinal is used in the post-init report below
|
|
395
|
+
kbPathFinal = phase4Result.kbPathFinal;
|
|
396
|
+
}
|
|
397
|
+
// ── Invalidate forge-config cache so same-session commands find the new project
|
|
398
|
+
clearForgeConfigCache();
|
|
399
|
+
// ── Post-Phase-4: health check ────────────────────────────────────
|
|
400
|
+
ctx.ui.setStatus?.("forge:init", "Post-init: health check");
|
|
401
|
+
const healthResult = await runHealthCheck(cwd, bundleRoot);
|
|
402
|
+
if (healthResult.clean) {
|
|
403
|
+
ctx.ui.notify("〇 /forge:health: clean.", "info");
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
ctx.ui.notify(`△ /forge:health: ${healthResult.gaps.length} gap(s) detected — see console output.`, "warning");
|
|
407
|
+
for (const gap of healthResult.gaps) {
|
|
408
|
+
ctx.ui.notify(` · ${gap.check}: ${gap.message}`, "info");
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// ── Report ────────────────────────────────────────────────────────
|
|
412
|
+
// FIX BUG-020: use configCache here (populated from config.json after Phase 1
|
|
413
|
+
// or from pre-existing config.json for resumed inits starting at Phase 2+).
|
|
414
|
+
// kbPathFinal is updated inside the Phase-4 block; for Phase-1-3 resumes
|
|
415
|
+
// configCache captures the correct value that Phase 4 would have stamped.
|
|
416
|
+
{
|
|
417
|
+
const p = configCache.paths;
|
|
418
|
+
if (p && typeof p.engineering === "string" && p.engineering) {
|
|
419
|
+
kbPathFinal = p.engineering;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
ctx.ui.setStatus?.("forge:init", undefined);
|
|
423
|
+
const kbPath_ = kbPathFinal;
|
|
424
|
+
// FIX BUG-022 (product call): surface gap details in Report.
|
|
425
|
+
// Conservative path: always include gap list in the Report.
|
|
426
|
+
// Exit non-zero (via notify "error") only for blocking (severity: "error") gaps.
|
|
427
|
+
// Warning-severity gaps are advisory; init is considered successful.
|
|
428
|
+
//
|
|
429
|
+
// Rationale: exiting non-zero for any gap would break common fresh-init
|
|
430
|
+
// flows where KB docs haven't been generated yet (kb-freshness warning).
|
|
431
|
+
// Error gaps (e.g. config missing) indicate structural failure and must
|
|
432
|
+
// surface clearly.
|
|
433
|
+
const criticalGaps = healthResult.gaps.filter((g) => g.severity === "error");
|
|
434
|
+
const warningGaps = healthResult.gaps.filter((g) => g.severity === "warning");
|
|
435
|
+
let healthSection = `Health: ${healthResult.summary}`;
|
|
436
|
+
if (healthResult.gaps.length > 0) {
|
|
437
|
+
const gapLines = healthResult.gaps
|
|
438
|
+
.map((g) => ` [${g.severity.toUpperCase()}] ${g.check}: ${g.message}`)
|
|
439
|
+
.join("\n");
|
|
440
|
+
healthSection += `\n\nGap detail:\n${gapLines}`;
|
|
441
|
+
}
|
|
442
|
+
if (warningGaps.length > 0) {
|
|
443
|
+
healthSection += `\n\nWarning gaps are advisory. Run /forge:health anytime to recheck.`;
|
|
444
|
+
}
|
|
445
|
+
if (criticalGaps.length > 0) {
|
|
446
|
+
healthSection += `\n\n× CRITICAL: ${criticalGaps.length} blocking gap(s) — review the detail above and re-run /forge:init.`;
|
|
447
|
+
ctx.ui.notify(`× /forge:init: ${criticalGaps.length} critical gap(s) require attention — see Report.`, "error");
|
|
448
|
+
}
|
|
449
|
+
// Final cross-phase verification — banner reflects real disk state.
|
|
450
|
+
const finalP1 = await verifyPhase1(cwd);
|
|
451
|
+
const finalP3 = await verifyPhase3(cwd);
|
|
452
|
+
const fullyComplete = finalP1.ok && finalP3.ok;
|
|
453
|
+
const bannerLabel = fullyComplete
|
|
454
|
+
? `║ /forge:init complete ║`
|
|
455
|
+
: `║ /forge:init incomplete — see gaps below ║`;
|
|
456
|
+
const incompleteDetail = [];
|
|
457
|
+
if (!finalP1.ok) {
|
|
458
|
+
incompleteDetail.push(`× Phase 1: ${finalP1.missing.join(", ")} (config incomplete)`);
|
|
459
|
+
}
|
|
460
|
+
if (!finalP3.ok) {
|
|
461
|
+
incompleteDetail.push(`× Phase 3: ${finalP3.missing.join(", ")} (materialization missing)`);
|
|
462
|
+
incompleteDetail.push(` → Recover: \`/forge:rebuild\` (re-runs substitute-placeholders against current config), or delete .forge/init-progress.json and re-run /forge:init.`);
|
|
463
|
+
}
|
|
464
|
+
const report = [
|
|
465
|
+
``,
|
|
466
|
+
`╔══════════════════════════════════════════════════════════════╗`,
|
|
467
|
+
bannerLabel,
|
|
468
|
+
`╚══════════════════════════════════════════════════════════════╝`,
|
|
469
|
+
``,
|
|
470
|
+
`Project: ${projectName}`,
|
|
471
|
+
`Bundle: forge v${bundledVersion}`,
|
|
472
|
+
``,
|
|
473
|
+
`Knowledge base: ${kbPath_}/`,
|
|
474
|
+
`Personas: .forge/personas/`,
|
|
475
|
+
`Skills: .forge/skills/`,
|
|
476
|
+
`Workflows: .forge/workflows/`,
|
|
477
|
+
`Templates: .forge/templates/`,
|
|
478
|
+
``,
|
|
479
|
+
...(incompleteDetail.length > 0 ? [`Phase verification gaps:`, ...incompleteDetail, ``] : []),
|
|
480
|
+
healthSection,
|
|
481
|
+
``,
|
|
482
|
+
`Next steps:`,
|
|
483
|
+
` 1. Run /forge:new-sprint to start your first sprint`,
|
|
484
|
+
` 2. Run /forge:status to see sprint and task summary`,
|
|
485
|
+
` 3. Run /forge:health anytime to check project health`,
|
|
486
|
+
``,
|
|
487
|
+
`Note: Marketplace skills auto-recommendation is Claude-Code-only.`,
|
|
488
|
+
`Pi users install extensions manually.`,
|
|
489
|
+
``,
|
|
490
|
+
// BUG-025: explain slash command registration under pi runtime
|
|
491
|
+
...(isPiRuntime()
|
|
492
|
+
? [
|
|
493
|
+
`Note: Slash commands registered programmatically (pi runtime); skipping .claude/commands/ Claude-Code-only artifact.`,
|
|
494
|
+
``,
|
|
495
|
+
]
|
|
496
|
+
: []),
|
|
497
|
+
].join("\n");
|
|
498
|
+
await sendToAgent(report);
|
|
499
|
+
// ── post-init: emit synthetic event for registered hooks (FORGE-S21-T04) ──
|
|
500
|
+
// Fires AFTER the report so the user sees the summary before enhancement
|
|
501
|
+
// or other hook-triggered workflows begin.
|
|
502
|
+
// Errors inside hooks are caught by emitSyntheticEvent — fail-open.
|
|
503
|
+
{
|
|
504
|
+
let projectPrefixForHook = "";
|
|
505
|
+
const projForHook = configCache.project;
|
|
506
|
+
if (projForHook && typeof projForHook.prefix === "string") {
|
|
507
|
+
projectPrefixForHook = projForHook.prefix;
|
|
508
|
+
}
|
|
509
|
+
await emitSyntheticEvent({ type: "init-complete", projectPrefix: projectPrefixForHook, cwd }, ctx);
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
//# sourceMappingURL=forge-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge-init.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/forge-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ForgeConfig {
|
|
2
|
+
forgeRoot: string;
|
|
3
|
+
configPath: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Discover the forge plugin root AND return the config path so callers can
|
|
7
|
+
* read other config fields (e.g. `project.name`) without re-scanning.
|
|
8
|
+
* Returns null when no `.forge/config.json` is found or it lacks `paths.forgeRoot`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function discoverForgeConfig(cwd?: string): ForgeConfig | null;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Forge root resolver — walks up from cwd looking for `.forge/config.json`,
|
|
2
|
+
// then resolves `paths.forgeRoot` (relative paths are resolved against the
|
|
3
|
+
// project dir — the parent of `.forge/` — not cwd). Returns null when no
|
|
4
|
+
// config is found or when the config is missing/malformed/unreadable. All filesystem reads are wrapped
|
|
5
|
+
// in try/catch so a malformed config can never crash the extension.
|
|
6
|
+
//
|
|
7
|
+
// Pattern modelled on `findNearestProjectAgentsDir` in
|
|
8
|
+
// `subagent/agents.ts:96-106`.
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import { isFile } from "./lib/shared-fs-utils.js";
|
|
12
|
+
function findNearestForgeConfig(cwd) {
|
|
13
|
+
let currentDir = cwd;
|
|
14
|
+
while (true) {
|
|
15
|
+
const candidate = path.join(currentDir, ".forge", "config.json");
|
|
16
|
+
if (isFile(candidate))
|
|
17
|
+
return candidate;
|
|
18
|
+
const parentDir = path.dirname(currentDir);
|
|
19
|
+
if (parentDir === currentDir)
|
|
20
|
+
return null;
|
|
21
|
+
currentDir = parentDir;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Discover the forge plugin root AND return the config path so callers can
|
|
26
|
+
* read other config fields (e.g. `project.name`) without re-scanning.
|
|
27
|
+
* Returns null when no `.forge/config.json` is found or it lacks `paths.forgeRoot`.
|
|
28
|
+
*/
|
|
29
|
+
export function discoverForgeConfig(cwd = process.cwd()) {
|
|
30
|
+
const configPath = findNearestForgeConfig(cwd);
|
|
31
|
+
if (!configPath)
|
|
32
|
+
return null;
|
|
33
|
+
let raw;
|
|
34
|
+
try {
|
|
35
|
+
raw = fs.readFileSync(configPath, "utf8");
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
let config;
|
|
41
|
+
try {
|
|
42
|
+
config = JSON.parse(raw);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const forgeRootValue = config && typeof config === "object" && "paths" in config
|
|
48
|
+
? config.paths?.forgeRoot
|
|
49
|
+
: undefined;
|
|
50
|
+
if (typeof forgeRootValue !== "string" || forgeRootValue.length === 0) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// `configPath` is `<projectDir>/.forge/config.json`. Relative `forgeRoot`
|
|
54
|
+
// values in Forge configs are written relative to the project dir (the
|
|
55
|
+
// parent of `.forge/`), not the `.forge/` dir itself. Example dogfood
|
|
56
|
+
// config: `paths.forgeRoot = "./forge/forge"` resolving to
|
|
57
|
+
// `<projectDir>/forge/forge`.
|
|
58
|
+
const projectDir = path.dirname(path.dirname(configPath));
|
|
59
|
+
const resolved = path.isAbsolute(forgeRootValue) ? forgeRootValue : path.resolve(projectDir, forgeRootValue);
|
|
60
|
+
return { forgeRoot: resolved, configPath };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=forge-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge-root.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/forge-root.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,uGAAuG;AACvG,oEAAoE;AACpE,EAAE;AACF,uDAAuD;AACvD,+BAA+B;AAE/B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,SAAS,sBAAsB,CAAC,GAAW;IAC1C,IAAI,UAAU,GAAG,GAAG,CAAC;IACrB,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAExC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAC1C,UAAU,GAAG,SAAS,CAAC;IACxB,CAAC;AACF,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,MAAM,UAAU,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACJ,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,cAAc,GACnB,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;QACxD,CAAC,CAAE,MAA8C,CAAC,KAAK,EAAE,SAAS;QAClE,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACb,CAAC;IAED,0EAA0E;IAC1E,uEAAuE;IACvE,sEAAsE;IACtE,2DAA2D;IAC3D,8BAA8B;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE7G,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC"}
|