@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,152 @@
|
|
|
1
|
+
// task-verdict-loop.ts — review-phase verdict + revision/loopback handling
|
|
2
|
+
// for the run-task pipeline. Extracted VERBATIM from run-task.ts's phase loop
|
|
3
|
+
// (FORGE-S31 file-size refactor) as a pure decision function: it performs the
|
|
4
|
+
// same store reads, ctx.ui notifications, state writes, transcript records,
|
|
5
|
+
// tree-node finalization, and halt-advisor dispatch the inline block did, and
|
|
6
|
+
// returns a small discriminated result the caller's loop switches on.
|
|
7
|
+
//
|
|
8
|
+
// Behavior-preserving: no logic changes. The only structural change is that the
|
|
9
|
+
// inline `return {...}` paths now return `{ kind: "return"; result }`, the
|
|
10
|
+
// `continue` path returns `{ kind: "loopback"; toIndex }`, and the fall-through
|
|
11
|
+
// (approved) path returns `{ kind: "advance" }`.
|
|
12
|
+
import { resolveAdvisorModel, runHaltAdvisor } from "../halt-advisor.js";
|
|
13
|
+
import { recoverPhaseSummary } from "../common/summary-recovery.js";
|
|
14
|
+
import { findPredecessorIndex } from "./task-body.js";
|
|
15
|
+
import { PHASES, SUMMARY_KEY_BY_ROLE } from "./task-phases.js";
|
|
16
|
+
import { readVerdict } from "./task-record.js";
|
|
17
|
+
import { writeState } from "./task-state.js";
|
|
18
|
+
/**
|
|
19
|
+
* Evaluate the review-phase verdict and decide the loop's next move.
|
|
20
|
+
* Mirrors the inline block that previously lived in runTaskPipelineInner.
|
|
21
|
+
*/
|
|
22
|
+
export function handleReviewVerdict(p) {
|
|
23
|
+
const { phase, taskId, storeCli, cwd, forgeRoot, iterationCounts, currentPhaseIndex, modelRoutingConfig, ctx } = p;
|
|
24
|
+
const { orchTranscript, finishPhaseNode, recoveredPhases } = p;
|
|
25
|
+
let verdict = readVerdict(taskId, phase.role, storeCli, cwd);
|
|
26
|
+
// Completion recovery (forge-engineering#41): a clean stop with no verdict in
|
|
27
|
+
// the store is most often the subagent writing the {PHASE}-SUMMARY.json
|
|
28
|
+
// sidecar but eliding the set-summary that registers it. Register the sidecar
|
|
29
|
+
// ourselves (once per phase), then re-read. Phases whose verdict comes from
|
|
30
|
+
// task.status (approve → summaryKey null) are not recoverable this way.
|
|
31
|
+
if (verdict === "missing") {
|
|
32
|
+
const summaryKey = SUMMARY_KEY_BY_ROLE[phase.role];
|
|
33
|
+
if (summaryKey && !recoveredPhases.has(phase.role)) {
|
|
34
|
+
recoveredPhases.add(phase.role);
|
|
35
|
+
const rec = recoverPhaseSummary({ storeCli, entityId: taskId, summaryKey, cwd });
|
|
36
|
+
if (rec.ok) {
|
|
37
|
+
const recheck = readVerdict(taskId, phase.role, storeCli, cwd);
|
|
38
|
+
if (recheck !== "missing") {
|
|
39
|
+
ctx.ui.notify(`⟳ forge:run-task — ${phase.role}: subagent skipped set-summary; orchestrator registered ` +
|
|
40
|
+
`the '${summaryKey}' sidecar and the verdict is now present.`, "info");
|
|
41
|
+
verdict = recheck;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Surface the resolved verdict on the dashboard (mirrored to the root node).
|
|
47
|
+
ctx.ui.notify(` verdict: ${phase.role} → ${verdict === "approved" ? "〇 approved" : verdict === "revision" ? "⟳ revision" : `× ${verdict}`}`, verdict === "approved" || verdict === "revision" ? "info" : "error");
|
|
48
|
+
if (verdict === "missing") {
|
|
49
|
+
ctx.ui.notify(`× forge:run-task — verdict missing for phase ${phase.role} after subagent completed. ` +
|
|
50
|
+
"Subagent may have crashed or failed to write summaries. Halting for advisory.", "error");
|
|
51
|
+
finishPhaseNode("failed");
|
|
52
|
+
writeState(cwd, {
|
|
53
|
+
taskId,
|
|
54
|
+
phaseIndex: currentPhaseIndex,
|
|
55
|
+
iterationCounts,
|
|
56
|
+
halted: true,
|
|
57
|
+
lastError: `verdict missing for ${phase.role}`,
|
|
58
|
+
savedAt: new Date().toISOString(),
|
|
59
|
+
});
|
|
60
|
+
// A missing verdict IS a postflight-outputs failure: the canonical
|
|
61
|
+
// phase summary the subagent must write (e.g. summaries.code_review)
|
|
62
|
+
// was never recorded, so there is no verdict to route on. review-phase
|
|
63
|
+
// workflows declare no `outputs` block, so runPostflightGate is a
|
|
64
|
+
// pass-through here — this readVerdict check is the effective gate.
|
|
65
|
+
// Route it through the halt-recovery advisor (FORGE-S26-T18), the same
|
|
66
|
+
// hand-off the postflight-gate-unsatisfied branch uses, instead of a
|
|
67
|
+
// bare escalation — so the strongest configured model can diagnose the
|
|
68
|
+
// missing-summary cause. Best-effort, non-fatal (FORGE-S26-T19 parity).
|
|
69
|
+
const gateFailure = {
|
|
70
|
+
phase: phase.role,
|
|
71
|
+
reasonCode: "verdict-missing",
|
|
72
|
+
detail: `Phase '${phase.role}' completed but no verdict was found in the store. ` +
|
|
73
|
+
"The canonical phase summary was not written, so the orchestrator has no verdict to route on.",
|
|
74
|
+
remediation: "Re-run the phase and ensure the subagent's forge_store set-summary call " +
|
|
75
|
+
'uses args:["<recordId>", "<phaseKey>"] with the literal phase key as args[1] ' +
|
|
76
|
+
"(e.g. code_review), and that the call exits zero before the subagent returns.",
|
|
77
|
+
};
|
|
78
|
+
const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
|
|
79
|
+
void runHaltAdvisor({
|
|
80
|
+
gateFailure,
|
|
81
|
+
advisorModel,
|
|
82
|
+
taskId,
|
|
83
|
+
cwd,
|
|
84
|
+
ctx: { ui: ctx.ui },
|
|
85
|
+
forgeRoot,
|
|
86
|
+
});
|
|
87
|
+
return {
|
|
88
|
+
kind: "return",
|
|
89
|
+
result: {
|
|
90
|
+
status: "halted",
|
|
91
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
92
|
+
iterationCounts,
|
|
93
|
+
lastError: `verdict missing for ${phase.role}`,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (verdict === "revision") {
|
|
98
|
+
// Increment iteration count for this review phase
|
|
99
|
+
iterationCounts[phase.role] = (iterationCounts[phase.role] ?? 0) + 1;
|
|
100
|
+
if (iterationCounts[phase.role] >= phase.maxIterations) {
|
|
101
|
+
ctx.ui.notify(`× forge:run-task — revision cap reached for phase ${phase.role} ` +
|
|
102
|
+
`(${iterationCounts[phase.role]}/${phase.maxIterations} iterations). Escalating.`, "error");
|
|
103
|
+
finishPhaseNode("escalated");
|
|
104
|
+
writeState(cwd, {
|
|
105
|
+
taskId,
|
|
106
|
+
phaseIndex: currentPhaseIndex,
|
|
107
|
+
iterationCounts,
|
|
108
|
+
halted: true,
|
|
109
|
+
lastError: `revision cap reached for ${phase.role}`,
|
|
110
|
+
savedAt: new Date().toISOString(),
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
kind: "return",
|
|
114
|
+
result: {
|
|
115
|
+
status: "escalated",
|
|
116
|
+
lastPhaseIndex: currentPhaseIndex,
|
|
117
|
+
iterationCounts,
|
|
118
|
+
lastError: `revision cap reached for ${phase.role}`,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// Loop back to predecessor non-review phase. The review
|
|
123
|
+
// subagent itself finished cleanly — `revision` is its verdict,
|
|
124
|
+
// not a failure — so its node closes as completed before the
|
|
125
|
+
// predecessor re-dispatches under a fresh node ID.
|
|
126
|
+
finishPhaseNode("completed");
|
|
127
|
+
const predIndex = findPredecessorIndex(PHASES, currentPhaseIndex);
|
|
128
|
+
ctx.ui.notify(`⟳ forge:run-task — ${phase.role} returned revision; looping to ${PHASES[predIndex]?.role ?? predIndex} ` +
|
|
129
|
+
`(attempt ${iterationCounts[phase.role]}/${phase.maxIterations})`, "info");
|
|
130
|
+
orchTranscript.record({
|
|
131
|
+
kind: "phase-loopback",
|
|
132
|
+
ts: new Date().toISOString(),
|
|
133
|
+
fromPhase: phase.role,
|
|
134
|
+
toPhase: PHASES[predIndex]?.role ?? String(predIndex),
|
|
135
|
+
fromPhaseIndex: currentPhaseIndex,
|
|
136
|
+
toPhaseIndex: predIndex,
|
|
137
|
+
reason: `${phase.role} returned revision (attempt ${iterationCounts[phase.role]}/${phase.maxIterations})`,
|
|
138
|
+
});
|
|
139
|
+
// Write intermediate state (not halted — still running)
|
|
140
|
+
writeState(cwd, {
|
|
141
|
+
taskId,
|
|
142
|
+
phaseIndex: predIndex,
|
|
143
|
+
iterationCounts,
|
|
144
|
+
halted: false,
|
|
145
|
+
savedAt: new Date().toISOString(),
|
|
146
|
+
});
|
|
147
|
+
return { kind: "loopback", toIndex: predIndex };
|
|
148
|
+
}
|
|
149
|
+
// verdict === "approved": advance
|
|
150
|
+
return { kind: "advance" };
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=task-verdict-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-verdict-loop.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/task/task-verdict-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { extractPersonaNames } from "./lib/frontmatter-parser.js";
|
|
3
|
+
export { extractPersonaNames };
|
|
4
|
+
import { checkMaterialization, type MaterializationCheck } from "./lib/manifest-checker.js";
|
|
5
|
+
export { checkMaterialization, type MaterializationCheck };
|
|
6
|
+
export type ArgMode = "empty" | "file" | "text";
|
|
7
|
+
export interface ParsedArgs {
|
|
8
|
+
mode: ArgMode;
|
|
9
|
+
taskRef: string;
|
|
10
|
+
sourceLabel: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function parsePlanArgs(rawArgs: string, cwd: string): ParsedArgs;
|
|
13
|
+
export interface ComposeKickoffOpts {
|
|
14
|
+
workflowMd: string;
|
|
15
|
+
personaIdentity: string;
|
|
16
|
+
parsed: ParsedArgs;
|
|
17
|
+
}
|
|
18
|
+
export declare function composeKickoff(opts: ComposeKickoffOpts): string;
|
|
19
|
+
export interface RegisterPlanOptions {
|
|
20
|
+
cwd?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function registerPlan(pi: ExtensionAPI, options?: RegisterPlanOptions): void;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// forge:plan — native kickoff handler (FORGE-S20-T05).
|
|
2
|
+
//
|
|
3
|
+
// Replaces the auto-generated stub previously installed by
|
|
4
|
+
// registerAllForgeCommands (forge-commands.ts). Like S19 sprint-intake and
|
|
5
|
+
// FORGE-S20-T04 enhance, this is a Kickoff Shim (Pack-04 + Pack-06):
|
|
6
|
+
// 1. Reads `.forge/workflows/plan_task.md` (the materialized workflow).
|
|
7
|
+
// 2. Verifies four Pack-06 materialization markers — refuses to dispatch on
|
|
8
|
+
// regression and emits a per-marker `ctx.ui.notify` so a user sees the
|
|
9
|
+
// cause.
|
|
10
|
+
// 3. Loads the persona declared in the workflow's `deps.personas:`
|
|
11
|
+
// frontmatter via the FORGE-S20-T02 loader (no ad-hoc fs.readFile of
|
|
12
|
+
// `.forge/personas/`).
|
|
13
|
+
// 4. Composes ONE kickoff message: persona identity, dispatch instructions
|
|
14
|
+
// (read TASK_PROMPT.md, follow workflow, write PLAN.md/PLAN-SUMMARY.json,
|
|
15
|
+
// forge_store-driven status updates), the workflow body verbatim, and
|
|
16
|
+
// argv as @<path> file ref or free-form text.
|
|
17
|
+
// 5. Hands control to the LLM via `sendKickoff(pi, text)` —
|
|
18
|
+
// `deliverAs: "steer"`. Never raw `pi.sendUserMessage`.
|
|
19
|
+
//
|
|
20
|
+
// Per FORGE-S20 SPRINT_REQUIREMENTS Constraints and T05 AC#4: the
|
|
21
|
+
// prompt-injection fallback is DELETED — no FORGE_LEGACY_KICKOFF flag, no
|
|
22
|
+
// markdown-stub for this command.
|
|
23
|
+
//
|
|
24
|
+
// FORGE-S26-T11: pipeline step guard added. Checks task status via store-cli
|
|
25
|
+
// before dispatching. --force flag bypasses the guard.
|
|
26
|
+
//
|
|
27
|
+
// Iron Laws:
|
|
28
|
+
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
29
|
+
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
30
|
+
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
31
|
+
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
32
|
+
// continuation.
|
|
33
|
+
import * as fs from "node:fs";
|
|
34
|
+
import * as path from "node:path";
|
|
35
|
+
import { assertAudience } from "./audience-gate.js";
|
|
36
|
+
import { discoverForgeConfig } from "./forge-root.js";
|
|
37
|
+
import { sendKickoff } from "./kickoff.js";
|
|
38
|
+
// FORGE-S25-T16: extracted to lib modules. Re-exported here for backward compat
|
|
39
|
+
// (plan.test.ts, bundled-base-pack-markers.test.ts, run-task.ts, run-sprint.ts,
|
|
40
|
+
// fix-bug.ts all import checkMaterialization / extractPersonaNames from plan.js).
|
|
41
|
+
import { extractPersonaNames } from "./lib/frontmatter-parser.js";
|
|
42
|
+
import { parseGuardArgs, runPipelineGuard } from "./lib/pipeline-guard.js";
|
|
43
|
+
import { loadPersona, PersonaSkillLoaderError } from "./parsers/persona-skill-loader.js";
|
|
44
|
+
import { loadWorkflow, WorkflowLoaderError } from "./parsers/workflow-loader.js";
|
|
45
|
+
export { extractPersonaNames };
|
|
46
|
+
import { checkMaterialization } from "./lib/manifest-checker.js";
|
|
47
|
+
export { checkMaterialization };
|
|
48
|
+
export function parsePlanArgs(rawArgs, cwd) {
|
|
49
|
+
const trimmed = (rawArgs ?? "").trim();
|
|
50
|
+
if (trimmed === "") {
|
|
51
|
+
return { mode: "empty", taskRef: "", sourceLabel: "(no input — engineer infers task from store/context)" };
|
|
52
|
+
}
|
|
53
|
+
if (trimmed.startsWith("@")) {
|
|
54
|
+
const ref = trimmed.slice(1).trim();
|
|
55
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
56
|
+
const seed = fs.readFileSync(filePath, "utf8");
|
|
57
|
+
return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
|
|
58
|
+
}
|
|
59
|
+
return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
|
|
60
|
+
}
|
|
61
|
+
export function composeKickoff(opts) {
|
|
62
|
+
const { workflowMd, personaIdentity, parsed } = opts;
|
|
63
|
+
const sections = ["# /forge:plan", ""];
|
|
64
|
+
if (personaIdentity.trim().length > 0) {
|
|
65
|
+
sections.push(personaIdentity.trim(), "");
|
|
66
|
+
}
|
|
67
|
+
sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the task prompt at `engineering/sprints/<SPRINT_ID>/<TASK_ID>/TASK_PROMPT.md` (the source of truth).", "2. Query the store for the task and its sprint/feature context via `forge_store_query` — do NOT raw-read `.forge/store/`.", "3. Follow the workflow Algorithm verbatim: load context, research, plan, knowledge writeback, finalize.", "4. Write `PLAN.md` and `PLAN-SUMMARY.json` to the task directory using the `write` tool.", "5. Update task status by calling the `forge_store` MCP tool: `{command:'update-status', args:['task','<TASK_ID>','status','<new-status>']}`. Never raw-write `.forge/store/`. Do NOT bash-shell `forge store ...`.", "6. Honour Pack-06 Read/Write/Ask/Store discipline: writes go via the `forge_store` MCP tool (canonical 2-positional write: `args:['<entity>','<json>']`, id INSIDE json); in-conversation clarifications use `forge_ask_user`.");
|
|
68
|
+
sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
|
|
69
|
+
if (parsed.mode === "empty") {
|
|
70
|
+
sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
|
|
74
|
+
}
|
|
75
|
+
return sections.join("\n");
|
|
76
|
+
}
|
|
77
|
+
// Registration -------------------------------------------------------------
|
|
78
|
+
const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "plan_task.md");
|
|
79
|
+
export function registerPlan(pi, options = {}) {
|
|
80
|
+
pi.registerCommand("forge:plan", {
|
|
81
|
+
description: "Run the plan-task workflow for a Forge task. " +
|
|
82
|
+
"Usage: /forge:plan [@<file> | <free-form text>]. " +
|
|
83
|
+
"Empty args → engineer infers the task from sprint/store context.",
|
|
84
|
+
async handler(args, ctx) {
|
|
85
|
+
const cwd = options.cwd ?? process.cwd();
|
|
86
|
+
const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
|
|
87
|
+
// Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
|
|
88
|
+
const guardParsed = parseGuardArgs(args);
|
|
89
|
+
if (!guardParsed.force) {
|
|
90
|
+
const forgeConfig = discoverForgeConfig(cwd);
|
|
91
|
+
if (forgeConfig) {
|
|
92
|
+
const guard = runPipelineGuard("plan", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
|
|
93
|
+
if (guard.blocked) {
|
|
94
|
+
ctx.ui.notify(guard.message, "error");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Use cleanArgs (--force stripped) for workflow dispatch
|
|
100
|
+
const effectiveArgs = guardParsed.cleanArgs;
|
|
101
|
+
let workflowMd;
|
|
102
|
+
let workflowAudience;
|
|
103
|
+
try {
|
|
104
|
+
const loaded = loadWorkflow(workflowPath);
|
|
105
|
+
workflowMd = loaded.rawMarkdown;
|
|
106
|
+
workflowAudience = loaded.audience;
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
if (err instanceof WorkflowLoaderError) {
|
|
110
|
+
if (err.code === "missing_file") {
|
|
111
|
+
ctx.ui.notify(`× forge:plan — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
ctx.ui.notify(`× forge:plan — workflow load failed (${err.code}): ${err.message}`, "error");
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const e = err;
|
|
119
|
+
ctx.ui.notify(`× forge:plan — failed to read workflow: ${e.message ?? "unknown"}`, "error");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
let parsed;
|
|
123
|
+
try {
|
|
124
|
+
parsed = parsePlanArgs(effectiveArgs, cwd);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
const e = err;
|
|
128
|
+
ctx.ui.notify(`× forge:plan — failed to read seed: ${e.message ?? "unknown"}`, "error");
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const check = checkMaterialization(workflowPath, workflowMd);
|
|
132
|
+
if (!check.ok) {
|
|
133
|
+
for (const marker of check.missing) {
|
|
134
|
+
ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const personas = extractPersonaNames(workflowMd);
|
|
139
|
+
let personaIdentity = "";
|
|
140
|
+
if (personas.length > 0) {
|
|
141
|
+
try {
|
|
142
|
+
const persona = loadPersona(personas[0], { cwd });
|
|
143
|
+
personaIdentity = persona.identity;
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
if (err instanceof PersonaSkillLoaderError) {
|
|
147
|
+
ctx.ui.notify(`× forge:plan — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const e = err;
|
|
151
|
+
ctx.ui.notify(`× forge:plan — persona load error: ${e.message ?? "unknown"}`, "error");
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (!assertAudience({ workflowName: "plan_task", audience: workflowAudience }, ctx)) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const kickoff = composeKickoff({
|
|
159
|
+
workflowMd,
|
|
160
|
+
personaIdentity,
|
|
161
|
+
parsed,
|
|
162
|
+
});
|
|
163
|
+
sendKickoff(pi, kickoff);
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
export interface ParsedQuizAgentArgs {
|
|
3
|
+
mode: "empty" | "file" | "text";
|
|
4
|
+
topicSeed: string;
|
|
5
|
+
sourceLabel: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseQuizAgentArgs(rawArgs: string, cwd: string): ParsedQuizAgentArgs;
|
|
8
|
+
export interface ComposeQuizAgentKickoffOpts {
|
|
9
|
+
commandMd: string;
|
|
10
|
+
parsed: ParsedQuizAgentArgs;
|
|
11
|
+
}
|
|
12
|
+
export declare function composeQuizAgentKickoff(opts: ComposeQuizAgentKickoffOpts): string;
|
|
13
|
+
export interface RegisterQuizAgentOptions {
|
|
14
|
+
forgeRoot: string | null;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function registerQuizAgent(pi: ExtensionAPI, options: RegisterQuizAgentOptions): void;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// forge:quiz-agent — native kickoff handler (FORGE-S23-T11).
|
|
2
|
+
//
|
|
3
|
+
// Replaces the auto-generated stub previously installed by
|
|
4
|
+
// registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
|
|
5
|
+
// (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
|
|
6
|
+
//
|
|
7
|
+
// Ultra-thin shim: reads commands/quiz-agent.md and dispatches.
|
|
8
|
+
// Optional topic seed or @<file> narrows the quiz scope.
|
|
9
|
+
//
|
|
10
|
+
// Workflow source: <forgeRoot>/commands/quiz-agent.md (command file).
|
|
11
|
+
// Note: quiz_agent.md also exists in .forge/workflows/ but lacks 3 of
|
|
12
|
+
// 4 Pack-06 markers. Using the command file for consistency with the
|
|
13
|
+
// other 5 handlers in this batch. Follow-up task can upgrade to read
|
|
14
|
+
// from .forge/workflows/quiz_agent.md when it has all markers.
|
|
15
|
+
//
|
|
16
|
+
// File-existence check only — command files lack Pack-06 workflow markers.
|
|
17
|
+
//
|
|
18
|
+
// Iron Laws:
|
|
19
|
+
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
20
|
+
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
21
|
+
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
22
|
+
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
23
|
+
// continuation.
|
|
24
|
+
import * as fs from "node:fs";
|
|
25
|
+
import * as path from "node:path";
|
|
26
|
+
import { sendKickoff } from "./kickoff.js";
|
|
27
|
+
export function parseQuizAgentArgs(rawArgs, cwd) {
|
|
28
|
+
const trimmed = (rawArgs ?? "").trim();
|
|
29
|
+
if (!trimmed) {
|
|
30
|
+
return { mode: "empty", topicSeed: "", sourceLabel: "(no topic — full KB quiz)" };
|
|
31
|
+
}
|
|
32
|
+
if (trimmed.startsWith("@")) {
|
|
33
|
+
const ref = trimmed.slice(1).trim();
|
|
34
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
35
|
+
const topicSeed = fs.readFileSync(filePath, "utf8");
|
|
36
|
+
return { mode: "file", topicSeed, sourceLabel: `(topic from file: ${ref})` };
|
|
37
|
+
}
|
|
38
|
+
return { mode: "text", topicSeed: trimmed, sourceLabel: "(topic from inline text)" };
|
|
39
|
+
}
|
|
40
|
+
export function composeQuizAgentKickoff(opts) {
|
|
41
|
+
const { commandMd, parsed } = opts;
|
|
42
|
+
const sections = ["# /forge:check-agent", ""];
|
|
43
|
+
sections.push("## Dispatch", "");
|
|
44
|
+
sections.push("Run the quiz-agent workflow below to verify this agent has read and understood the project knowledge base. " +
|
|
45
|
+
"Ask factual questions about the project's architecture, entity model, and sprint conventions — do not accept vague answers. " +
|
|
46
|
+
"Report pass/fail with specific evidence.");
|
|
47
|
+
sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
|
|
48
|
+
if (parsed.mode === "empty") {
|
|
49
|
+
sections.push("", "## Topic", "", "(no topic specified — quiz the full KB scope)");
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
sections.push("", `## Topic — ${parsed.sourceLabel}`, "", parsed.topicSeed.trim());
|
|
53
|
+
}
|
|
54
|
+
return sections.join("\n");
|
|
55
|
+
}
|
|
56
|
+
// ── Registration ──────────────────────────────────────────────────────────
|
|
57
|
+
const COMMAND_NAME = "quiz-agent";
|
|
58
|
+
export function registerQuizAgent(pi, options) {
|
|
59
|
+
pi.registerCommand("forge:check-agent", {
|
|
60
|
+
description: "Verify an agent has loaded and understood the project knowledge base — run a short factual quiz. " +
|
|
61
|
+
"Usage: /forge:check-agent [@<file> | <topic>]. Empty args run a full KB quiz.",
|
|
62
|
+
async handler(args, ctx) {
|
|
63
|
+
const { forgeRoot } = options;
|
|
64
|
+
const cwd = options.cwd ?? process.cwd();
|
|
65
|
+
if (!forgeRoot) {
|
|
66
|
+
ctx.ui.notify("× forge:check-agent — no Forge project at cwd; run /forge:init to bootstrap", "warning");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
|
|
70
|
+
let commandMd;
|
|
71
|
+
try {
|
|
72
|
+
commandMd = fs.readFileSync(commandPath, "utf8");
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const e = err;
|
|
76
|
+
if (e.code === "ENOENT") {
|
|
77
|
+
ctx.ui.notify(`× forge:check-agent — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
ctx.ui.notify(`× forge:check-agent — failed to read command file: ${e.message ?? "unknown error"}`, "error");
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
let parsed;
|
|
85
|
+
try {
|
|
86
|
+
parsed = parseQuizAgentArgs(args, cwd);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
const e = err;
|
|
90
|
+
ctx.ui.notify(`× forge:check-agent — failed to parse args: ${e.message ?? "unknown"}`, "error");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const kickoff = composeQuizAgentKickoff({ commandMd, parsed });
|
|
94
|
+
sendKickoff(pi, kickoff);
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=quiz-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quiz-agent.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/quiz-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { startReviewServer } from "./review-server.js";
|
|
4
|
+
import { resolveEntityRef, resolveToolDir } from "./store-resolver.js";
|
|
5
|
+
function isNonInteractive() {
|
|
6
|
+
return process.env.FORGE_YES === "1" || process.env.FORGE_NON_INTERACTIVE === "1";
|
|
7
|
+
}
|
|
8
|
+
export function registerReadCommand(pi, forgeRoot) {
|
|
9
|
+
pi.registerCommand("forge:read", {
|
|
10
|
+
description: "Review a Forge artifact in the browser and provide inline feedback",
|
|
11
|
+
async handler(args, ctx) {
|
|
12
|
+
if (!forgeRoot) {
|
|
13
|
+
ctx.ui.notify("forge:read — no Forge project at cwd; run /forge:init to bootstrap", "warning");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (isNonInteractive()) {
|
|
17
|
+
ctx.ui.notify("forge:read requires interactive mode (browser review). Unset FORGE_YES/FORGE_NON_INTERACTIVE.", "error");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const arg = args.trim();
|
|
21
|
+
if (!arg) {
|
|
22
|
+
ctx.ui.notify("Usage: /forge:read <task-id|sprint-id|@path|natural language>\n" +
|
|
23
|
+
"Examples: /forge:read S01-T01 | /forge:read S01 | " +
|
|
24
|
+
"/forge:read @engineering/sprints/HELLO-S01/HELLO-S01-T01 | " +
|
|
25
|
+
"/forge:read the i18n task", "error");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const toolDir = resolveToolDir(forgeRoot);
|
|
29
|
+
const resolved = await resolveEntityRef(arg, toolDir, ctx.cwd, {
|
|
30
|
+
ctx,
|
|
31
|
+
statusLabel: "forge:read",
|
|
32
|
+
}).catch((err) => {
|
|
33
|
+
ctx.ui.setStatus("forge:read", undefined);
|
|
34
|
+
ctx.ui.notify(`Store query failed: ${err.message}`, "error");
|
|
35
|
+
return null;
|
|
36
|
+
});
|
|
37
|
+
if (!resolved)
|
|
38
|
+
return;
|
|
39
|
+
let taskDir;
|
|
40
|
+
let label;
|
|
41
|
+
if ("dir" in resolved) {
|
|
42
|
+
taskDir = resolved.dir;
|
|
43
|
+
label = path.basename(taskDir);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const item = resolved.item;
|
|
47
|
+
if (!item.fileRefs?.md) {
|
|
48
|
+
ctx.ui.notify(`No markdown index found for ${item.id}`, "error");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
taskDir = path.dirname(path.join(ctx.cwd, item.fileRefs.md));
|
|
52
|
+
label = `${item.id} — ${item.title}`;
|
|
53
|
+
ctx.ui.notify(`Resolved to ${item.type}: ${item.id} (${item.title})`, "info");
|
|
54
|
+
}
|
|
55
|
+
let files;
|
|
56
|
+
try {
|
|
57
|
+
files = await fs.readdir(taskDir);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
ctx.ui.notify(`No artifacts found at ${taskDir}`, "warning");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const mdFiles = files.filter((f) => f.endsWith(".md"));
|
|
64
|
+
if (mdFiles.length === 0) {
|
|
65
|
+
ctx.ui.notify(`No markdown artifacts found at ${taskDir}`, "info");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const selectedFile = await ctx.ui.select(`Select artifact to review for ${label}:`, mdFiles);
|
|
69
|
+
if (!selectedFile)
|
|
70
|
+
return;
|
|
71
|
+
const artifactPath = path.join(taskDir, selectedFile);
|
|
72
|
+
ctx.ui.notify(`Starting local review server for ${selectedFile}…`, "info");
|
|
73
|
+
ctx.ui.setStatus("forge:read", "Waiting for browser review…");
|
|
74
|
+
try {
|
|
75
|
+
const feedback = await startReviewServer(artifactPath, `${label} — ${selectedFile}`);
|
|
76
|
+
ctx.ui.setStatus("forge:read", undefined);
|
|
77
|
+
if (feedback && feedback.length > 0) {
|
|
78
|
+
ctx.ui.notify(`Received ${feedback.length} feedback item(s). Sending to Forge…`, "info");
|
|
79
|
+
const itemType = "item" in resolved ? resolved.item.type : "artifact";
|
|
80
|
+
const itemId = "item" in resolved ? resolved.item.id : label;
|
|
81
|
+
let promptText = `I have reviewed the artifact \`${selectedFile}\` for ${itemType} ${itemId}. Here is my inline feedback:\n\n`;
|
|
82
|
+
for (const fb of feedback) {
|
|
83
|
+
promptText += `> **Text:** "${fb.selectedText}"\n`;
|
|
84
|
+
promptText += `> **Feedback:** ${fb.comment}\n\n`;
|
|
85
|
+
}
|
|
86
|
+
promptText += `Please process this feedback and update the artifact accordingly.`;
|
|
87
|
+
pi.sendUserMessage(promptText, { deliverAs: "steer" });
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
ctx.ui.notify("Review completed with no feedback submitted.", "info");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
ctx.ui.setStatus("forge:read", undefined);
|
|
95
|
+
ctx.ui.notify(`forge:read error: ${err.message}`, "error");
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=read-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-command.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/read-command.ts"],"names":[],"mappings":"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"}
|