@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,449 @@
|
|
|
1
|
+
export const meta = {
|
|
2
|
+
name: 'wfl:init',
|
|
3
|
+
description: 'Code-orchestrated /forge:init LLM half — parallel discovery fan-out → config-writer (Phase 1 Collect), parallel KB-doc fan-out → index → context (Phase 2 Discover), deterministic materialize (Phase 3), content-register (Phase 4). JS holds the phase index, verify gates, retry caps, and fan-out; subagents execute the phase rulebooks. Args: { forgeRoot, kbFolder, startPhase, createClaudeMd, isoTimestamp, rawArguments }.',
|
|
4
|
+
whenToUse: "Run the LLM-orchestrated half of /forge:init after `4ge init claude .` has bootstrapped the project structure. Dispatch by name: workflow('wfl:init', { forgeRoot, kbFolder, startPhase, createClaudeMd, isoTimestamp, rawArguments }).",
|
|
5
|
+
phases: [
|
|
6
|
+
{ title: 'Collect', detail: 'parallel() 5 discovery agents scan codebase domains; config-writer agent merges findings and writes config + init-progress.json; verify-phase gate with one retry cap' },
|
|
7
|
+
{ title: 'Discover', detail: 'gate+scaffold agent verifies phase 1; parallel() 7 KB-doc agents generate architecture docs with JS-held retry-once; sequential index + context agents close the phase' },
|
|
8
|
+
{ title: 'Materialize', detail: 'single haiku agent runs deterministic substitute-placeholders + generation-manifest + build-overlay; Phase 3 verify failure is a hard halt (no retry — rebuild/restart)' },
|
|
9
|
+
{ title: 'Register', detail: 'single haiku agent runs content-register steps; CLAUDE.md creation gated on args.createClaudeMd === true; returns pendingActions for Tomoshibi' },
|
|
10
|
+
{ title: 'Report', detail: 'return structured result { ok, lastPhase, stack, skillMatches, counts, confidence, pendingActions, failure? } for the command wrapper to render' },
|
|
11
|
+
],
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// wfl:init — code-orchestrated LLM half of /forge:init
|
|
15
|
+
//
|
|
16
|
+
// Why a script: init is a deterministic 4-phase FSM with mechanical verify
|
|
17
|
+
// gates (verify-phase.cjs --phase N), bounded retries (max 1), fan-out steps
|
|
18
|
+
// (5 discovery scans, 7 KB docs), and escalate-don't-continue semantics.
|
|
19
|
+
// JS holds the phase index, the verify-gate routing, the retry counters, and
|
|
20
|
+
// the fan-out; subagents only execute one phase rulebook each.
|
|
21
|
+
//
|
|
22
|
+
// WORKFLOW-API CONTRACT (forge#112 — field failure; enforced by
|
|
23
|
+
// wfl-drivers-parse.test.cjs):
|
|
24
|
+
// - Exactly ONE export: the meta literal. The body runs at top level in the
|
|
25
|
+
// harness's async context (top-level await/return valid; args is a global).
|
|
26
|
+
// - phase(title) takes ONLY a title — a callback second arg is silently
|
|
27
|
+
// discarded. Phase bodies run inline after the phase() call.
|
|
28
|
+
// - parallel() takes thunks: parallel([() => agent(...), ...]).
|
|
29
|
+
// - agent(prompt, opts) — model goes in opts.model; structured results
|
|
30
|
+
// REQUIRE opts.schema (otherwise agent() returns plain text and .ok
|
|
31
|
+
// reads are undefined).
|
|
32
|
+
//
|
|
33
|
+
// CLI-FIRST BOOTSTRAP ADR (doc/decisions/cli-first-bootstrap.md):
|
|
34
|
+
// `4ge init claude .` runs first (deterministic, zero tokens): scaffolds
|
|
35
|
+
// .forge/ as a complete vendored Forge root (tools, schemas, hooks, init/,
|
|
36
|
+
// .base-pack/, meta/) and installs THIS FILE into .claude/workflows/.
|
|
37
|
+
// All rulebook reads use vendored .forge/init/... paths; discovery prompts
|
|
38
|
+
// fall back to direct project analysis if a prompt file is absent.
|
|
39
|
+
//
|
|
40
|
+
// SIDE-EFFECT OWNERSHIP: this script has NO filesystem/shell access. Each
|
|
41
|
+
// per-phase subagent owns rulebook execution (artifact writes, checkpoint
|
|
42
|
+
// writes, verify runs). The JS driver holds ONLY control flow.
|
|
43
|
+
//
|
|
44
|
+
// Timestamps: the Workflow sandbox blocks timestamp minting (Date.now,
|
|
45
|
+
// Math.random, and the zero-arg Date constructor are all unavailable).
|
|
46
|
+
// The command wrapper supplies args.isoTimestamp.
|
|
47
|
+
//
|
|
48
|
+
// MODEL TIERING: generation/discovery → sonnet; deterministic gates and
|
|
49
|
+
// registration → haiku. No opus (init has no review/approve gates).
|
|
50
|
+
|
|
51
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
|
+
// Schemas
|
|
53
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
const DISCOVERY_SCHEMA = {
|
|
56
|
+
type: 'object',
|
|
57
|
+
properties: {
|
|
58
|
+
domain: { type: 'string', description: 'discovery domain name (stack|routing|processes|database|testing)' },
|
|
59
|
+
findings: { type: 'object', description: 'domain-specific structured findings' },
|
|
60
|
+
confidence: { type: 'number', description: '0–1 confidence in completeness of scan' },
|
|
61
|
+
warnings: { type: 'array', items: { type: 'string' }, description: 'ambiguities or partial coverage notes' },
|
|
62
|
+
},
|
|
63
|
+
required: ['domain', 'findings', 'confidence'],
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const KB_DOC_SCHEMA = {
|
|
67
|
+
type: 'object',
|
|
68
|
+
properties: {
|
|
69
|
+
id: { type: 'string', description: 'KB doc id matching the phase-2 table row' },
|
|
70
|
+
ok: { type: 'boolean', description: 'true if doc written successfully' },
|
|
71
|
+
confidence: { type: 'number', description: '0–1 confidence in doc completeness' },
|
|
72
|
+
error: { type: 'string', description: 'error message if ok=false' },
|
|
73
|
+
},
|
|
74
|
+
required: ['id', 'ok', 'confidence'],
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const PHASE_RESULT_SCHEMA = {
|
|
78
|
+
type: 'object',
|
|
79
|
+
properties: {
|
|
80
|
+
verifyExit: { type: 'number', description: 'exit code from verify-phase.cjs (0=pass, non-zero=fail)' },
|
|
81
|
+
verifyError: { type: 'string', description: 'stderr/stdout from failed verify run' },
|
|
82
|
+
stack: { type: 'string', description: 'technology stack summary (Phase 1 output)' },
|
|
83
|
+
skillMatches: {
|
|
84
|
+
type: 'array',
|
|
85
|
+
items: { type: 'string' },
|
|
86
|
+
description: 'skill IDs matching project tech stack (from skill-recommendations.md)',
|
|
87
|
+
},
|
|
88
|
+
confidence: { type: 'number', description: '0–1 confidence' },
|
|
89
|
+
ok: { type: 'boolean', description: 'true if phase completed and verify passed' },
|
|
90
|
+
},
|
|
91
|
+
required: ['verifyExit', 'ok'],
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const OK_SCHEMA = {
|
|
95
|
+
type: 'object',
|
|
96
|
+
properties: {
|
|
97
|
+
ok: { type: 'boolean', description: 'true if all steps completed' },
|
|
98
|
+
error: { type: 'string', description: 'error message if ok=false' },
|
|
99
|
+
},
|
|
100
|
+
required: ['ok'],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const REGISTER_SCHEMA = {
|
|
104
|
+
type: 'object',
|
|
105
|
+
properties: {
|
|
106
|
+
ok: { type: 'boolean', description: 'true if all register steps completed' },
|
|
107
|
+
error: { type: 'string', description: 'error message if ok=false' },
|
|
108
|
+
pendingActions: { type: 'array', items: { type: 'string' }, description: 'orchestrator-owned follow-ups, e.g. ["refresh-kb-links"]' },
|
|
109
|
+
},
|
|
110
|
+
required: ['ok'],
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
114
|
+
// Model tiering
|
|
115
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
116
|
+
|
|
117
|
+
const ROLE_TIER = {
|
|
118
|
+
'discovery': 'sonnet',
|
|
119
|
+
'config': 'sonnet',
|
|
120
|
+
'kb-doc': 'sonnet',
|
|
121
|
+
'index': 'sonnet',
|
|
122
|
+
'context': 'sonnet',
|
|
123
|
+
'gate': 'haiku',
|
|
124
|
+
'materialize': 'haiku',
|
|
125
|
+
'register': 'haiku',
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
129
|
+
// Helpers
|
|
130
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
function halt(lastPhase, reason, extra) {
|
|
133
|
+
return { ok: false, lastPhase, failure: reason, ...extra };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const VENDORED = 'Use only .forge/tools/ paths for all tool invocations (vendored-tools world).';
|
|
137
|
+
|
|
138
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
139
|
+
// Main workflow body (top-level async context; top-level return is valid)
|
|
140
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
141
|
+
|
|
142
|
+
const {
|
|
143
|
+
forgeRoot,
|
|
144
|
+
kbFolder = 'engineering',
|
|
145
|
+
startPhase = 1,
|
|
146
|
+
createClaudeMd = null,
|
|
147
|
+
isoTimestamp,
|
|
148
|
+
rawArguments = '',
|
|
149
|
+
} = args || {};
|
|
150
|
+
|
|
151
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
152
|
+
// Phase 1 — Collect (startPhase <= 1)
|
|
153
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
154
|
+
let phase1Result;
|
|
155
|
+
if (startPhase <= 1) {
|
|
156
|
+
phase('Collect');
|
|
157
|
+
|
|
158
|
+
// Fan-out: 5 parallel discovery agents
|
|
159
|
+
const DOMAINS = ['stack', 'routing', 'processes', 'database', 'testing'];
|
|
160
|
+
const discoveryResults = await parallel(
|
|
161
|
+
DOMAINS.map((domain) => () =>
|
|
162
|
+
agent(`
|
|
163
|
+
You are a codebase discovery agent for the "${domain}" domain.
|
|
164
|
+
1. Read \`.forge/init/discovery/discover-${domain}.md\` if it exists and follow
|
|
165
|
+
its instructions against the current project.
|
|
166
|
+
2. If that file does NOT exist, read \`.forge/init/phases/phase-1-collect.md\`
|
|
167
|
+
Step 2 for context, then perform a best-effort "${domain}" discovery of the
|
|
168
|
+
project directly (read manifests, source files, configs) and add a warning
|
|
169
|
+
noting the missing discovery prompt file.
|
|
170
|
+
Set domain="${domain}" in your structured output. ${VENDORED}
|
|
171
|
+
`, { model: ROLE_TIER['discovery'], label: `discover:${domain}`, phase: 'Collect', schema: DISCOVERY_SCHEMA })
|
|
172
|
+
)
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
// Config-writer agent: merge findings, write config, verify Phase 1
|
|
176
|
+
const configResult = await agent(`
|
|
177
|
+
You are the Forge init config-writer agent. You have received the following
|
|
178
|
+
discovery findings from 5 parallel discovery agents:
|
|
179
|
+
|
|
180
|
+
${JSON.stringify(discoveryResults.filter(Boolean), null, 2)}
|
|
181
|
+
|
|
182
|
+
Execute the Phase 1 Collect rulebook steps:
|
|
183
|
+
1. Read \`.forge/init/phases/phase-1-collect.md\` for the full step list.
|
|
184
|
+
2. Call \`node .forge/tools/manage-config.cjs\` to write the config. If kbFolder
|
|
185
|
+
is non-default, set paths.engineering="${kbFolder}". Set mode=full.
|
|
186
|
+
3. Compute skill-recommendation matches from .forge/meta/skill-recommendations.md
|
|
187
|
+
and the output of \`node .forge/tools/list-skills.js\`. Do NOT install —
|
|
188
|
+
report matches in skillMatches only.
|
|
189
|
+
4. Write .forge/init-progress.json: { "lastPhase": 1, "timestamp": "${isoTimestamp}" }.
|
|
190
|
+
5. Run: node .forge/tools/verify-phase.cjs --phase 1
|
|
191
|
+
6. In your structured output set verifyExit=<exit code>,
|
|
192
|
+
verifyError=<stderr if non-zero>, stack=<one-line stack summary>,
|
|
193
|
+
skillMatches=[<matched skill ids>], confidence=<0-1>, ok=(verifyExit===0).
|
|
194
|
+
${VENDORED}
|
|
195
|
+
kbFolder="${kbFolder}", isoTimestamp="${isoTimestamp}".
|
|
196
|
+
`, { model: ROLE_TIER['config'], label: 'config-writer', phase: 'Collect', schema: PHASE_RESULT_SCHEMA });
|
|
197
|
+
|
|
198
|
+
// Verify routing: one retry on failure
|
|
199
|
+
if (configResult && configResult.verifyExit !== 0) {
|
|
200
|
+
const retryResult = await agent(`
|
|
201
|
+
Phase 1 of Forge init verify failed. Error:
|
|
202
|
+
${configResult.verifyError || '(no error text)'}
|
|
203
|
+
|
|
204
|
+
Read the error carefully. Fix the config by re-running
|
|
205
|
+
\`node .forge/tools/manage-config.cjs\` with the correct values, then
|
|
206
|
+
re-run \`node .forge/tools/verify-phase.cjs --phase 1\`.
|
|
207
|
+
In your structured output set verifyExit=<exit code>, ok=(verifyExit===0).
|
|
208
|
+
${VENDORED}
|
|
209
|
+
`, { model: ROLE_TIER['config'], label: 'config-writer:retry', phase: 'Collect', schema: PHASE_RESULT_SCHEMA });
|
|
210
|
+
if (!retryResult || retryResult.verifyExit !== 0) {
|
|
211
|
+
return halt(1, 'Phase 1 verify failed after retry', {
|
|
212
|
+
verifyError: retryResult ? retryResult.verifyError : 'retry agent returned null',
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
phase1Result = { ...configResult, ...retryResult };
|
|
216
|
+
} else if (configResult) {
|
|
217
|
+
phase1Result = configResult;
|
|
218
|
+
} else {
|
|
219
|
+
return halt(1, 'config-writer agent returned null');
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (!phase1Result.ok) {
|
|
223
|
+
return halt(1, 'Phase 1 failed', {
|
|
224
|
+
verifyError: phase1Result.verifyError,
|
|
225
|
+
stack: phase1Result.stack,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
} else {
|
|
229
|
+
phase1Result = { ok: true, lastPhase: 1, skipped: true };
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
233
|
+
// Phase 2 — Discover (startPhase <= 2)
|
|
234
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
235
|
+
let phase2Result;
|
|
236
|
+
const KB_DOC_IDS = [
|
|
237
|
+
'architecture/stack',
|
|
238
|
+
'architecture/processes',
|
|
239
|
+
'architecture/routing',
|
|
240
|
+
'architecture/database',
|
|
241
|
+
'architecture/testing',
|
|
242
|
+
'business-domain/domain-model',
|
|
243
|
+
'business-domain/domain-concepts',
|
|
244
|
+
];
|
|
245
|
+
|
|
246
|
+
if (startPhase <= 2) {
|
|
247
|
+
phase('Discover');
|
|
248
|
+
|
|
249
|
+
// Gate+scaffold agent: verify Phase 1 passed, mkdir scaffold
|
|
250
|
+
const gateResult = await agent(`
|
|
251
|
+
You are the Forge init Phase 2 gate agent. Execute these steps in order:
|
|
252
|
+
1. Run: node .forge/tools/verify-phase.cjs --phase 1
|
|
253
|
+
If exit non-zero, set ok=false and error=<stderr> in your output and stop.
|
|
254
|
+
2. Read \`.forge/init/phases/phase-2-discover.md\` Step 2 (scaffold mkdir
|
|
255
|
+
commands) and execute them. Create the KB directory structure under ${kbFolder}/.
|
|
256
|
+
3. Set ok=true.
|
|
257
|
+
${VENDORED}
|
|
258
|
+
`, { model: ROLE_TIER['gate'], label: 'phase2-gate', phase: 'Discover', schema: OK_SCHEMA });
|
|
259
|
+
|
|
260
|
+
if (!gateResult || !gateResult.ok) {
|
|
261
|
+
return halt(2, 'Phase 2 gate failed — Phase 1 verify did not pass', {
|
|
262
|
+
verifyError: gateResult ? gateResult.error : 'gate agent returned null',
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Fan-out: 7 parallel KB-doc agents
|
|
267
|
+
const kbDocPrompt = (docId) => `
|
|
268
|
+
You are a Forge KB-doc generation agent. Your doc id is: "${docId}".
|
|
269
|
+
1. Read \`.forge/init/phases/phase-2-discover.md\` for the full doc spec for "${docId}".
|
|
270
|
+
2. If \`.forge/init/generation/generate-kb-doc.md\` exists, read it for the
|
|
271
|
+
generation rulebook; otherwise follow the doc spec from step 1 directly.
|
|
272
|
+
3. Generate the doc using all available project context (including
|
|
273
|
+
.forge/config.json written in Phase 1).
|
|
274
|
+
4. Write the doc to the correct path under ${kbFolder}/.
|
|
275
|
+
5. Set id="${docId}", ok=<true if written>, confidence=<0-1>, error=<if not ok>.
|
|
276
|
+
${VENDORED}
|
|
277
|
+
`;
|
|
278
|
+
|
|
279
|
+
const kbDocResults = await parallel(
|
|
280
|
+
KB_DOC_IDS.map((docId) => () =>
|
|
281
|
+
agent(kbDocPrompt(docId), { model: ROLE_TIER['kb-doc'], label: `kb-doc:${docId}`, phase: 'Discover', schema: KB_DOC_SCHEMA })
|
|
282
|
+
)
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
// JS-held retry-once for any failed KB-doc
|
|
286
|
+
const failedDocs = KB_DOC_IDS.filter((docId, i) => !kbDocResults[i] || !kbDocResults[i].ok);
|
|
287
|
+
if (failedDocs.length > 0) {
|
|
288
|
+
const retryResults = await parallel(
|
|
289
|
+
failedDocs.map((docId) => () =>
|
|
290
|
+
agent(`
|
|
291
|
+
KB-doc "${docId}" failed on first attempt. Retry it:
|
|
292
|
+
${kbDocPrompt(docId)}
|
|
293
|
+
`, { model: ROLE_TIER['kb-doc'], label: `kb-doc-retry:${docId}`, phase: 'Discover', schema: KB_DOC_SCHEMA })
|
|
294
|
+
)
|
|
295
|
+
);
|
|
296
|
+
const stillFailed = failedDocs.filter((docId, i) => !retryResults[i] || !retryResults[i].ok);
|
|
297
|
+
if (stillFailed.length > 0) {
|
|
298
|
+
return halt(2, `KB-doc generation failed after retry for: ${stillFailed.join(', ')}`, {
|
|
299
|
+
failedDocs: stillFailed.join(', '),
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Sequential index agent (after all leaf docs — real data dependency)
|
|
305
|
+
const indexResult = await agent(`
|
|
306
|
+
You are the Forge init index agent. All 7 KB architecture docs have been generated.
|
|
307
|
+
Read \`.forge/init/phases/phase-2-discover.md\` Step 4 (index files).
|
|
308
|
+
Generate the 3 INDEX files:
|
|
309
|
+
- ${kbFolder}/architecture/INDEX.md
|
|
310
|
+
- ${kbFolder}/business-domain/INDEX.md
|
|
311
|
+
- ${kbFolder}/INDEX.md
|
|
312
|
+
Set ok=true when done, or ok=false with error=<message>.
|
|
313
|
+
${VENDORED}
|
|
314
|
+
`, { model: ROLE_TIER['index'], label: 'index', phase: 'Discover', schema: OK_SCHEMA });
|
|
315
|
+
|
|
316
|
+
if (!indexResult || !indexResult.ok) {
|
|
317
|
+
return halt(2, 'Index agent failed', { error: indexResult ? indexResult.error : 'null result' });
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Context agent: project-context.json + calibration + init-progress.json + verify
|
|
321
|
+
const contextResult = await agent(`
|
|
322
|
+
You are the Forge init context agent. KB docs and index files are complete.
|
|
323
|
+
Execute \`.forge/init/phases/phase-2-discover.md\` Steps 5–6:
|
|
324
|
+
5. Write project-context.json (combined structured context from all discovery
|
|
325
|
+
findings). Write calibration baseline.
|
|
326
|
+
6. Write .forge/init-progress.json: { "lastPhase": 2, "timestamp": "${isoTimestamp}" }.
|
|
327
|
+
Run: node .forge/tools/verify-phase.cjs --phase 2 --kb-path "${kbFolder}"
|
|
328
|
+
Set verifyExit=<exit code>, verifyError=<stderr if non-zero>, ok=(verifyExit===0).
|
|
329
|
+
${VENDORED}
|
|
330
|
+
`, { model: ROLE_TIER['context'], label: 'context', phase: 'Discover', schema: PHASE_RESULT_SCHEMA });
|
|
331
|
+
|
|
332
|
+
// Verify routing: one retry on failure
|
|
333
|
+
if (contextResult && contextResult.verifyExit !== 0) {
|
|
334
|
+
const verifyRetry = await agent(`
|
|
335
|
+
Phase 2 of Forge init verify failed. Error:
|
|
336
|
+
${contextResult.verifyError || '(no error text)'}
|
|
337
|
+
Read the error, fix the missing or malformed outputs, re-run
|
|
338
|
+
\`node .forge/tools/verify-phase.cjs --phase 2 --kb-path "${kbFolder}"\`.
|
|
339
|
+
Set verifyExit=<exit code>, ok=(verifyExit===0).
|
|
340
|
+
${VENDORED}
|
|
341
|
+
`, { model: ROLE_TIER['context'], label: 'context:retry', phase: 'Discover', schema: PHASE_RESULT_SCHEMA });
|
|
342
|
+
if (!verifyRetry || verifyRetry.verifyExit !== 0) {
|
|
343
|
+
return halt(2, 'Phase 2 verify failed after retry', {
|
|
344
|
+
verifyError: verifyRetry ? verifyRetry.verifyError : 'retry returned null',
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
phase2Result = verifyRetry;
|
|
348
|
+
} else if (contextResult) {
|
|
349
|
+
phase2Result = contextResult;
|
|
350
|
+
} else {
|
|
351
|
+
return halt(2, 'context agent returned null');
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (!phase2Result.ok) {
|
|
355
|
+
return halt(2, 'Phase 2 failed', { verifyError: phase2Result.verifyError });
|
|
356
|
+
}
|
|
357
|
+
} else {
|
|
358
|
+
phase2Result = { ok: true, lastPhase: 2, skipped: true };
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
362
|
+
// Phase 3 — Materialize (startPhase <= 3)
|
|
363
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
364
|
+
let phase3Result;
|
|
365
|
+
if (startPhase <= 3) {
|
|
366
|
+
phase('Materialize');
|
|
367
|
+
|
|
368
|
+
// Single haiku agent — deterministic shell steps
|
|
369
|
+
const materializeResult = await agent(`
|
|
370
|
+
You are the Forge init materialize agent. Read
|
|
371
|
+
\`.forge/init/phases/phase-3-materialize.md\` for the rulebook, then execute
|
|
372
|
+
these deterministic steps:
|
|
373
|
+
1. Run: node .forge/tools/build-init-context.cjs
|
|
374
|
+
2. Run: node .forge/tools/substitute-placeholders.cjs
|
|
375
|
+
3. Record generation-manifest entries for all materialized assets.
|
|
376
|
+
4. Run a build-overlay smoke check: node .forge/tools/build-overlay.cjs --check
|
|
377
|
+
5. Write .forge/init-progress.json: { "lastPhase": 3, "timestamp": "${isoTimestamp}" }
|
|
378
|
+
6. Run: node .forge/tools/verify-phase.cjs --phase 3
|
|
379
|
+
Set verifyExit=<exit code>, verifyError=<stderr if non-zero>, ok=(verifyExit===0).
|
|
380
|
+
${VENDORED}
|
|
381
|
+
IMPORTANT: If verify-phase exits non-zero, report it faithfully — do NOT retry.
|
|
382
|
+
Phase 3 verify failure is a hard halt. The rulebook says: rebuild or restart init.
|
|
383
|
+
`, { model: ROLE_TIER['materialize'], label: 'materialize', phase: 'Materialize', schema: PHASE_RESULT_SCHEMA });
|
|
384
|
+
|
|
385
|
+
// Phase 3: hard halt on verify failure (no retry)
|
|
386
|
+
if (!materializeResult || materializeResult.verifyExit !== 0) {
|
|
387
|
+
const verifyError = materializeResult ? materializeResult.verifyError : 'materialize agent returned null';
|
|
388
|
+
return halt(3, [
|
|
389
|
+
'Phase 3 (Materialize) verify failed. This is a hard halt — no retry.',
|
|
390
|
+
'Per the phase-3-materialize.md rulebook: you must rebuild or restart /forge:init.',
|
|
391
|
+
'Run: /forge:init (or `4ge init claude .` to re-scaffold, then /forge:init).',
|
|
392
|
+
`Verify error: ${verifyError}`,
|
|
393
|
+
].join(' '), { verifyError, rebuild: true, restart: true });
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
phase3Result = materializeResult;
|
|
397
|
+
} else {
|
|
398
|
+
phase3Result = { ok: true, lastPhase: 3, skipped: true };
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
402
|
+
// Phase 4 — Register (startPhase <= 4)
|
|
403
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
404
|
+
let phase4Result;
|
|
405
|
+
if (startPhase <= 4) {
|
|
406
|
+
phase('Register');
|
|
407
|
+
|
|
408
|
+
const registerResult = await agent(`
|
|
409
|
+
You are the Forge init register agent. Execute the content-register steps:
|
|
410
|
+
1. Read \`.forge/init/phases/phase-4-register.md\` for the full step list.
|
|
411
|
+
2. Execute steps 1–10 and step 12 verbatim.
|
|
412
|
+
3. Step 13 (CLAUDE.md file creation): ${createClaudeMd === true
|
|
413
|
+
? 'createClaudeMd=true — execute this step (create the CLAUDE.md file).'
|
|
414
|
+
: 'createClaudeMd is not true — SKIP step 13 (the prompt was hoisted to the wrapper).'}
|
|
415
|
+
4. Step 11 (Tomoshibi forge:refresh-kb-links): DO NOT execute. This is
|
|
416
|
+
orchestrator-owned. Set pendingActions=["refresh-kb-links"] and the
|
|
417
|
+
wrapper (init.md) will run it post-workflow.
|
|
418
|
+
5. Delete .forge/init-progress.json (phase 4 complete — no resume needed).
|
|
419
|
+
6. Set ok=true, pendingActions=["refresh-kb-links"].
|
|
420
|
+
${VENDORED}
|
|
421
|
+
createClaudeMd=${JSON.stringify(createClaudeMd)}, isoTimestamp="${isoTimestamp}".
|
|
422
|
+
`, { model: ROLE_TIER['register'], label: 'register', phase: 'Register', schema: REGISTER_SCHEMA });
|
|
423
|
+
|
|
424
|
+
if (!registerResult || !registerResult.ok) {
|
|
425
|
+
return halt(4, registerResult ? (registerResult.error || 'Phase 4 failed') : 'register agent returned null');
|
|
426
|
+
}
|
|
427
|
+
phase4Result = registerResult;
|
|
428
|
+
} else {
|
|
429
|
+
phase4Result = { ok: true, lastPhase: 4, skipped: true };
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
433
|
+
// Report
|
|
434
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
435
|
+
phase('Report');
|
|
436
|
+
|
|
437
|
+
return {
|
|
438
|
+
ok: true,
|
|
439
|
+
lastPhase: 4,
|
|
440
|
+
stack: phase1Result && phase1Result.stack,
|
|
441
|
+
skillMatches: phase1Result && phase1Result.skillMatches,
|
|
442
|
+
counts: {
|
|
443
|
+
kbDocs: KB_DOC_IDS.length,
|
|
444
|
+
workflows: 4, // wfl-run-task, wfl-run-sprint, wfl-fix-bug, wfl-init (installed by the CLI half)
|
|
445
|
+
commands: 3, // run-task, run-sprint, fix-bug (init.md is the wrapper, not a base-pack command)
|
|
446
|
+
},
|
|
447
|
+
confidence: phase1Result && phase1Result.confidence,
|
|
448
|
+
pendingActions: (phase4Result && phase4Result.pendingActions) || ['refresh-kb-links'],
|
|
449
|
+
};
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
{
|
|
2
|
+
"1.2.21": {
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"date": "2026-06-07",
|
|
5
|
+
"notes": "CLI-first bootstrap: /forge:init now dispatches workflow('wfl:init') — the dynamic JS driver added in S31-T04. init.md command wrapper hoists interactive prompts (KB folder, CLAUDE.md offer, marketplace-skills offer). Phase-1 and Phase-4 rulebooks annotated with orchestrator-owned step markers. sdlc-init.md reduced to a spec pointer. New base-pack/commands/init.md project-local wrapper authored. No change to installed projects (init.md is a plugin command, not a materialized base-pack command).",
|
|
6
|
+
"target": "commands:init,init:wfl-init,init:phases:phase-1-collect,init:phases:phase-4-register,init:sdlc-init,init:base-pack:commands:init",
|
|
7
|
+
"regenerate": [],
|
|
8
|
+
"breaking": false,
|
|
9
|
+
"manual": [
|
|
10
|
+
"No action required for existing initialized projects. New inits use the dynamic wfl:init driver. The Workflow tool is required; upgrade Claude Code if not available."
|
|
11
|
+
]
|
|
12
|
+
},
|
|
2
13
|
"1.2.20": {
|
|
3
14
|
"version": "1.2.21",
|
|
4
15
|
"date": "2026-06-06",
|
|
@@ -2913,5 +2924,79 @@
|
|
|
2913
2924
|
],
|
|
2914
2925
|
"breaking": false,
|
|
2915
2926
|
"manual": []
|
|
2927
|
+
},
|
|
2928
|
+
"1.3.0": {
|
|
2929
|
+
"version": "1.4.0",
|
|
2930
|
+
"date": "2026-06-07",
|
|
2931
|
+
"notes": "Fixed /forge:* command namespace (CLI-first redesign). Project-prefix command namespaces (/acme:*, /hello:*) are retired: getCommandsSubdir() now returns 'forge' unconditionally, base-pack command templates carry literal /forge: headings ({{PREFIX}} removed), and substitute-placeholders materializes commands to .claude/commands/forge/. All command .md files (plugin commands/ + base-pack commands/) resolve FORGE_ROOT with a vendored fallback: ${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge} — full parity for plugin-less projects bootstrapped by '4ge init claude' where tools/schemas/hooks are vendored under .forge/. Rulebooks (generate-commands, phase-3-materialize, phase-1-collect, meta-migrate, migrate_structural) updated to the fixed namespace.",
|
|
2932
|
+
"target": "tools:lib:paths,tools:substitute-placeholders,commands:*,init:base-pack:commands:*,init:generation:generate-commands,init:phases:phase-1-collect,init:phases:phase-3-materialize,meta:workflows:meta-migrate,init:base-pack:workflows:migrate_structural",
|
|
2933
|
+
"regenerate": [
|
|
2934
|
+
"commands"
|
|
2935
|
+
],
|
|
2936
|
+
"breaking": true,
|
|
2937
|
+
"manual": [
|
|
2938
|
+
"Existing projects with prefix-namespaced commands (.claude/commands/<prefix>/): re-run materialization (or /forge:rebuild) to produce .claude/commands/forge/, then delete the old .claude/commands/<prefix>/ directory. The old commands keep working until removed but will not receive updates."
|
|
2939
|
+
]
|
|
2940
|
+
},
|
|
2941
|
+
"1.4.0": {
|
|
2942
|
+
"version": "1.4.1",
|
|
2943
|
+
"date": "2026-06-07",
|
|
2944
|
+
"notes": "wfl-init.js Workflow-harness parse fix: the driver shipped wrapped in 'export default async function wflInit(args)' — the Workflow tool permits exactly one export (the meta literal) and evaluates the rest as an async function body, so every /forge:init dispatch failed at launch with \"SyntaxError: Unexpected keyword 'export'\". Body now runs at top level reading the global args. New regression test (wfl-drivers-parse.test.cjs) parses all four base-pack drivers exactly the way the harness does.",
|
|
2945
|
+
"target": "init:base-pack:workflows-js:wfl-init",
|
|
2946
|
+
"regenerate": [
|
|
2947
|
+
"workflows"
|
|
2948
|
+
],
|
|
2949
|
+
"breaking": false,
|
|
2950
|
+
"manual": [
|
|
2951
|
+
"Projects bootstrapped with the broken driver: re-run '4ge init claude .' (idempotent repair overwrites .claude/workflows/wfl-init.js)."
|
|
2952
|
+
]
|
|
2953
|
+
},
|
|
2954
|
+
"1.4.1": {
|
|
2955
|
+
"version": "1.4.2",
|
|
2956
|
+
"date": "2026-06-07",
|
|
2957
|
+
"notes": "wfl-init.js Workflow-API rewrite (forge#112): the driver mis-used the harness API four ways — phase(title, callback) callbacks were silently discarded so init ran 0 agents while reporting fabricated ok:true; parallel() received promises instead of thunks; agent() had model as first arg instead of opts.model; structured results lacked opts.schema. Phase bodies now run inline at top level, fan-outs use thunks, all agents use agent(prompt, {model, label, phase, schema}), and the report reflects real phase results. Rulebook reads use vendored .forge/init/... paths with direct-analysis fallback. Contract enforced by wfl-drivers-parse.test.cjs (phase-callback, thunk, arg-order, referenced-rulebook-exists gates).",
|
|
2958
|
+
"target": "init:base-pack:workflows-js:wfl-init",
|
|
2959
|
+
"regenerate": [
|
|
2960
|
+
"workflows"
|
|
2961
|
+
],
|
|
2962
|
+
"breaking": false,
|
|
2963
|
+
"manual": [
|
|
2964
|
+
"Projects bootstrapped with the broken driver: re-run '4ge init claude .' (idempotent repair overwrites .claude/workflows/wfl-init.js)."
|
|
2965
|
+
]
|
|
2966
|
+
},
|
|
2967
|
+
"1.4.2": {
|
|
2968
|
+
"version": "1.4.3",
|
|
2969
|
+
"date": "2026-06-07",
|
|
2970
|
+
"notes": "wfl-init.js verify-phase CLI alignment (forge#112 follow-up): the Phase 2 verify prompts invoked 'verify-phase.cjs --phase 2' bare, but the tool requires '--phase 2 --kb-path <path>' (exit 2 without it). Both Phase 2 invocations now pass --kb-path \"${kbFolder}\". New contract gates in wfl-drivers-parse.test.cjs assert every driver verify-phase invocation uses a supported phase (1-3) and that --phase 2 always carries --kb-path.",
|
|
2971
|
+
"target": "init:base-pack:workflows-js:wfl-init",
|
|
2972
|
+
"regenerate": [
|
|
2973
|
+
"workflows"
|
|
2974
|
+
],
|
|
2975
|
+
"breaking": false,
|
|
2976
|
+
"manual": []
|
|
2977
|
+
},
|
|
2978
|
+
"1.4.3": {
|
|
2979
|
+
"version": "1.4.4",
|
|
2980
|
+
"date": "2026-06-07",
|
|
2981
|
+
"notes": "First full CLI-first field-test gap fixes (config drift + manifest scope): (1) phase-1-collect.md no longer instructs the config-writer to derive paths.commands from the project prefix — it is ALWAYS '.claude/commands/forge' (the prefix-derived instruction survived the 1.4.0 namespace redesign and produced paths.commands='.claude/commands/git' -> check-structure 0/14). (2) generate-tools.md gains an explicit step writing paths.forgeRoot='.forge' — without it the register agent improvised an absolute npm-global payload path, which breaks on version upgrades and nvm switches. (3) build-manifest.cjs excludes 10 plugin-development tools from the tools namespace — the structure manifest describes instances, and expecting dev tools produced false 49/59 'missing tools' gaps in /forge:health.",
|
|
2982
|
+
"target": "init:phases:phase-1-collect,init:generation:generate-tools,tools:build-manifest,schemas:structure-manifest",
|
|
2983
|
+
"regenerate": [],
|
|
2984
|
+
"breaking": false,
|
|
2985
|
+
"manual": [
|
|
2986
|
+
"Existing CLI-first projects with drifted config: run node .forge/tools/manage-config.cjs set paths.commands '\".claude/commands/forge\"' and set paths.forgeRoot '\".forge\"', then re-run '4ge init claude .' to refresh .forge/schemas/structure-manifest.json."
|
|
2987
|
+
]
|
|
2988
|
+
},
|
|
2989
|
+
"1.4.4": {
|
|
2990
|
+
"version": "1.4.5",
|
|
2991
|
+
"date": "2026-06-09",
|
|
2992
|
+
"notes": "Collate-workflow KB-link refresh is orchestrator-owned under forge-cli. collator_agent.md (base-pack) + meta-collate.md (meta source) no longer instruct the collator subagent to invoke the forge:refresh-kb-links Skill tool: forge-cli subagents run via the Pi runtime, which has no Skill tool, so the instruction triggered a multi-call bash-probe loop before falling back. The Claude Code TUI standalone path still uses the Skill tool; under forge-cli the run-task orchestrator owns the KB refresh (runRefreshKbLinks) after the writeback phase. Prose-only change to the generated collate workflow.",
|
|
2993
|
+
"target": "workflows:collator_agent,meta:meta-collate",
|
|
2994
|
+
"regenerate": [
|
|
2995
|
+
"workflows:collator_agent"
|
|
2996
|
+
],
|
|
2997
|
+
"breaking": false,
|
|
2998
|
+
"manual": [
|
|
2999
|
+
"Run /forge:update (or /forge:rebuild) to regenerate the collate workflow (collator_agent.md) with the orchestrator-owned KB-refresh guidance."
|
|
3000
|
+
]
|
|
2916
3001
|
}
|
|
2917
3002
|
}
|
|
@@ -10,7 +10,7 @@ Add a task to an existing sprint without re-running the full sprint planner.
|
|
|
10
10
|
## Setup
|
|
11
11
|
|
|
12
12
|
```
|
|
13
|
-
FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
|
|
13
|
+
FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
Read project config values:
|
|
@@ -256,8 +256,8 @@ Display a summary (substitute `{PREFIX}` with `PROJECT_PREFIX.toLowerCase()`):
|
|
|
256
256
|
Pipeline: {PIPELINE}
|
|
257
257
|
|
|
258
258
|
── Next steps:
|
|
259
|
-
1. Run /
|
|
260
|
-
2. Or run /
|
|
259
|
+
1. Run /forge:run-task {TASK_ID} to execute the full pipeline.
|
|
260
|
+
2. Or run /forge:plan {TASK_ID} to plan it first.
|
|
261
261
|
```
|
|
262
262
|
|
|
263
263
|
---
|
|
@@ -11,7 +11,7 @@ commands (e.g. `paths.forgeRoot` is refreshed by `/forge:update`).
|
|
|
11
11
|
## Locate the Forge plugin
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
|
|
14
|
+
FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
Read `.forge/config.json`. If it does not exist, stop and emit:
|
|
@@ -32,7 +32,7 @@ Assess the health and currency of the project's SDLC knowledge base.
|
|
|
32
32
|
|
|
33
33
|
First, resolve the plugin root and project root:
|
|
34
34
|
```
|
|
35
|
-
FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
|
|
35
|
+
FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
Open the run with the oracle hero + subtitle:
|