@entelligentsia/forgecli 1.0.14 → 1.0.21
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 +185 -0
- package/README.md +7 -1
- package/dist/CHANGELOG-forge-plugin.md +61 -0
- package/dist/bin/config.js +4 -4
- package/dist/bin/config.js.map +1 -1
- package/dist/bin/update-cli.d.ts +1 -1
- package/dist/bin/update-cli.js +1 -1
- package/dist/bin/update-cli.js.map +1 -1
- package/dist/extensions/forgecli/ask-user-tool.js +1 -1
- package/dist/extensions/forgecli/ask-user-tool.js.map +1 -1
- package/dist/extensions/forgecli/commands/add-pipeline.d.ts +19 -0
- package/dist/extensions/forgecli/commands/add-pipeline.js +143 -0
- package/dist/extensions/forgecli/commands/add-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/commands/add-task.d.ts +20 -0
- package/dist/extensions/forgecli/commands/add-task.js +154 -0
- package/dist/extensions/forgecli/commands/add-task.js.map +1 -0
- package/dist/extensions/forgecli/commands/approve.d.ts +22 -0
- package/dist/extensions/forgecli/commands/approve.js +152 -0
- package/dist/extensions/forgecli/commands/approve.js.map +1 -0
- package/dist/extensions/forgecli/commands/collate.d.ts +22 -0
- package/dist/extensions/forgecli/commands/collate.js +134 -0
- package/dist/extensions/forgecli/commands/collate.js.map +1 -0
- package/dist/extensions/forgecli/commands/commit.d.ts +22 -0
- package/dist/extensions/forgecli/commands/commit.js +152 -0
- package/dist/extensions/forgecli/commands/commit.js.map +1 -0
- package/dist/extensions/forgecli/commands/config-command.d.ts +8 -0
- package/dist/extensions/forgecli/commands/config-command.js +67 -0
- package/dist/extensions/forgecli/commands/config-command.js.map +1 -0
- package/dist/extensions/forgecli/commands/enhance.d.ts +45 -0
- package/dist/extensions/forgecli/commands/enhance.js +219 -0
- package/dist/extensions/forgecli/commands/enhance.js.map +1 -0
- package/dist/extensions/forgecli/commands/implement.d.ts +22 -0
- package/dist/extensions/forgecli/commands/implement.js +170 -0
- package/dist/extensions/forgecli/commands/implement.js.map +1 -0
- package/dist/extensions/forgecli/commands/plan.d.ts +22 -0
- package/dist/extensions/forgecli/commands/plan.js +167 -0
- package/dist/extensions/forgecli/commands/plan.js.map +1 -0
- package/dist/extensions/forgecli/commands/quiz-agent.d.ts +17 -0
- package/dist/extensions/forgecli/commands/quiz-agent.js +98 -0
- package/dist/extensions/forgecli/commands/quiz-agent.js.map +1 -0
- package/dist/extensions/forgecli/commands/read-command.d.ts +2 -0
- package/dist/extensions/forgecli/commands/read-command.js +100 -0
- package/dist/extensions/forgecli/commands/read-command.js.map +1 -0
- package/dist/extensions/forgecli/commands/regenerate.d.ts +40 -0
- package/dist/extensions/forgecli/commands/regenerate.js +426 -0
- package/dist/extensions/forgecli/commands/regenerate.js.map +1 -0
- package/dist/extensions/forgecli/commands/remove-command.d.ts +17 -0
- package/dist/extensions/forgecli/commands/remove-command.js +124 -0
- package/dist/extensions/forgecli/commands/remove-command.js.map +1 -0
- package/dist/extensions/forgecli/commands/report-bug.d.ts +25 -0
- package/dist/extensions/forgecli/commands/report-bug.js +159 -0
- package/dist/extensions/forgecli/commands/report-bug.js.map +1 -0
- package/dist/extensions/forgecli/commands/retrospective.d.ts +20 -0
- package/dist/extensions/forgecli/commands/retrospective.js +126 -0
- package/dist/extensions/forgecli/commands/retrospective.js.map +1 -0
- package/dist/extensions/forgecli/commands/review-code.d.ts +35 -0
- package/dist/extensions/forgecli/commands/review-code.js +196 -0
- package/dist/extensions/forgecli/commands/review-code.js.map +1 -0
- package/dist/extensions/forgecli/commands/review-plan.d.ts +35 -0
- package/dist/extensions/forgecli/commands/review-plan.js +200 -0
- package/dist/extensions/forgecli/commands/review-plan.js.map +1 -0
- package/dist/extensions/forgecli/commands/sprint-intake.d.ts +10 -0
- package/dist/extensions/forgecli/commands/sprint-intake.js +91 -0
- package/dist/extensions/forgecli/commands/sprint-intake.js.map +1 -0
- package/dist/extensions/forgecli/commands/sprint-plan.d.ts +14 -0
- package/dist/extensions/forgecli/commands/sprint-plan.js +122 -0
- package/dist/extensions/forgecli/commands/sprint-plan.js.map +1 -0
- package/dist/extensions/forgecli/commands/status-command.d.ts +19 -0
- package/dist/extensions/forgecli/commands/status-command.js +140 -0
- package/dist/extensions/forgecli/commands/status-command.js.map +1 -0
- package/dist/extensions/forgecli/commands/store-query.d.ts +22 -0
- package/dist/extensions/forgecli/commands/store-query.js +107 -0
- package/dist/extensions/forgecli/commands/store-query.js.map +1 -0
- package/dist/extensions/forgecli/commands/store-repair.d.ts +17 -0
- package/dist/extensions/forgecli/commands/store-repair.js +123 -0
- package/dist/extensions/forgecli/commands/store-repair.js.map +1 -0
- package/dist/extensions/forgecli/commands/test-orchestrate.d.ts +2 -0
- package/dist/extensions/forgecli/commands/test-orchestrate.js +182 -0
- package/dist/extensions/forgecli/commands/test-orchestrate.js.map +1 -0
- package/dist/extensions/forgecli/commands/transcripts-command.d.ts +87 -0
- package/dist/extensions/forgecli/commands/transcripts-command.js +418 -0
- package/dist/extensions/forgecli/commands/transcripts-command.js.map +1 -0
- package/dist/extensions/forgecli/commands/validate.d.ts +22 -0
- package/dist/extensions/forgecli/commands/validate.js +152 -0
- package/dist/extensions/forgecli/commands/validate.js.map +1 -0
- package/dist/extensions/forgecli/config/config-layer.d.ts +53 -0
- package/dist/extensions/forgecli/config/config-layer.js +72 -0
- package/dist/extensions/forgecli/config/config-layer.js.map +1 -0
- package/dist/extensions/forgecli/config/config-writer.d.ts +16 -0
- package/dist/extensions/forgecli/config/config-writer.js +69 -0
- package/dist/extensions/forgecli/config/config-writer.js.map +1 -0
- package/dist/extensions/forgecli/config/model-registry.d.ts +61 -0
- package/dist/extensions/forgecli/config/model-registry.js +127 -0
- package/dist/extensions/forgecli/config/model-registry.js.map +1 -0
- package/dist/extensions/forgecli/config/model-resolver.d.ts +32 -0
- package/dist/extensions/forgecli/config/model-resolver.js +65 -0
- package/dist/extensions/forgecli/config/model-resolver.js.map +1 -0
- package/dist/extensions/forgecli/config/model-validator.d.ts +29 -0
- package/dist/extensions/forgecli/config/model-validator.js +107 -0
- package/dist/extensions/forgecli/config/model-validator.js.map +1 -0
- package/dist/extensions/forgecli/config-layer.d.ts +0 -16
- package/dist/extensions/forgecli/config-layer.js +0 -5
- package/dist/extensions/forgecli/config-layer.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/component.js +1 -1
- package/dist/extensions/forgecli/config-tui/component.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/handler.js +1 -1
- package/dist/extensions/forgecli/config-tui/handler.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/override-editor.js +1 -1
- package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +1 -1
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +1 -1
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/state/model.d.ts +1 -1
- package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/state/selectors.js +1 -1
- package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -1
- package/dist/extensions/forgecli/context-governor-compaction.d.ts +94 -0
- package/dist/extensions/forgecli/context-governor-compaction.js +327 -0
- package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -0
- package/dist/extensions/forgecli/context-governor.d.ts +169 -0
- package/dist/extensions/forgecli/context-governor.js +592 -0
- package/dist/extensions/forgecli/context-governor.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/component.d.ts +17 -5
- package/dist/extensions/forgecli/dashboard/component.js +160 -115
- package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
- package/dist/extensions/forgecli/dashboard/register.js +7 -21
- package/dist/extensions/forgecli/dashboard/register.js.map +1 -1
- package/dist/extensions/forgecli/dashboard/theme.d.ts +27 -0
- package/dist/extensions/forgecli/dashboard/theme.js +91 -0
- package/dist/extensions/forgecli/dashboard/theme.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.js +59 -5
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js +3 -2
- package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
- package/dist/extensions/forgecli/forge-cli-schema.json +0 -4
- package/dist/extensions/forgecli/forge-commands.js +1 -1
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/forge-init.d.ts +26 -0
- package/dist/extensions/forgecli/forge-init/forge-init.js +514 -0
- package/dist/extensions/forgecli/forge-init/forge-init.js.map +1 -0
- package/dist/extensions/forgecli/forge-init/init-context.d.ts +99 -0
- package/dist/extensions/forgecli/forge-init/init-context.js +178 -0
- package/dist/extensions/forgecli/forge-init/init-context.js.map +1 -0
- package/dist/extensions/forgecli/forge-init/init-progress.d.ts +39 -0
- package/dist/extensions/forgecli/forge-init/init-progress.js +117 -0
- package/dist/extensions/forgecli/forge-init/init-progress.js.map +1 -0
- package/dist/extensions/forgecli/forge-init/phase4-register.js +1 -1
- package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/run-phases.js +2 -2
- package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +42 -1
- package/dist/extensions/forgecli/forge-subagent.js +59 -18
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-tools.d.ts +0 -25
- package/dist/extensions/forgecli/forge-tools.js +8 -37
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/governor-config.d.ts +19 -0
- package/dist/extensions/forgecli/governor-config.js +58 -0
- package/dist/extensions/forgecli/governor-config.js.map +1 -0
- package/dist/extensions/forgecli/health-check.js +1 -1
- package/dist/extensions/forgecli/health-check.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +3 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +39 -5
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-init-hook.js +11 -6
- package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js +11 -6
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
- package/dist/extensions/forgecli/hooks/write-guard.js +1 -1
- package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -1
- package/dist/extensions/forgecli/index.js +70 -36
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/kickoff.d.ts +9 -0
- package/dist/extensions/forgecli/kickoff.js +15 -0
- package/dist/extensions/forgecli/kickoff.js.map +1 -1
- package/dist/extensions/forgecli/lib/forge-config.d.ts +1 -1
- package/dist/extensions/forgecli/lib/forge-config.js +1 -1
- package/dist/extensions/forgecli/lib/forge-config.js.map +1 -1
- package/dist/extensions/forgecli/lib/forge-root.d.ts +10 -0
- package/dist/extensions/forgecli/lib/forge-root.js +62 -0
- package/dist/extensions/forgecli/lib/forge-root.js.map +1 -0
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +19 -14
- package/dist/extensions/forgecli/lib/halt-advisor.js +36 -13
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -1
- package/dist/extensions/forgecli/lib/run-cjs.d.ts +26 -0
- package/dist/extensions/forgecli/lib/run-cjs.js +42 -0
- package/dist/extensions/forgecli/lib/run-cjs.js.map +1 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +3 -2
- package/dist/extensions/forgecli/orchestrator-status-bar.js +90 -60
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -1
- package/dist/extensions/forgecli/orchestrator-tree.d.ts +4 -0
- package/dist/extensions/forgecli/orchestrator-tree.js +21 -3
- package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/calibrate.d.ts +64 -0
- package/dist/extensions/forgecli/orchestrators/calibrate.js +481 -0
- package/dist/extensions/forgecli/orchestrators/calibrate.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +93 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js +1705 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/halt-advisor.d.ts +59 -0
- package/dist/extensions/forgecli/orchestrators/halt-advisor.js +113 -0
- package/dist/extensions/forgecli/orchestrators/halt-advisor.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/materialize.d.ts +16 -0
- package/dist/extensions/forgecli/orchestrators/materialize.js +195 -0
- package/dist/extensions/forgecli/orchestrators/materialize.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/migrate.d.ts +22 -0
- package/dist/extensions/forgecli/orchestrators/migrate.js +260 -0
- package/dist/extensions/forgecli/orchestrators/migrate.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.d.ts +46 -0
- package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js +64 -0
- package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +27 -0
- package/dist/extensions/forgecli/orchestrators/run-sprint.js +734 -0
- package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/run-task.d.ts +215 -0
- package/dist/extensions/forgecli/orchestrators/run-task.js +1491 -0
- package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -0
- package/dist/extensions/forgecli/paths/paths.d.ts +8 -0
- package/dist/extensions/forgecli/paths/paths.js +17 -0
- package/dist/extensions/forgecli/paths/paths.js.map +1 -1
- package/dist/extensions/forgecli/phase-vocab.d.ts +31 -0
- package/dist/extensions/forgecli/phase-vocab.js +82 -0
- package/dist/extensions/forgecli/phase-vocab.js.map +1 -0
- package/dist/extensions/forgecli/run-sprint.d.ts +3 -1
- package/dist/extensions/forgecli/run-sprint.js +1 -0
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +34 -1
- package/dist/extensions/forgecli/run-task.js +144 -6
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/session-registry.d.ts +2 -2
- package/dist/extensions/forgecli/session-registry.js +6 -2
- package/dist/extensions/forgecli/session-registry.js.map +1 -1
- package/dist/extensions/forgecli/skill-curation/friction-emit.d.ts +99 -0
- package/dist/extensions/forgecli/skill-curation/friction-emit.js +245 -0
- package/dist/extensions/forgecli/skill-curation/friction-emit.js.map +1 -0
- package/dist/extensions/forgecli/skill-curation/skill-curation-flag.d.ts +21 -0
- package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js +71 -0
- package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js.map +1 -0
- package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.d.ts +102 -0
- package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js +339 -0
- package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js.map +1 -0
- package/dist/extensions/forgecli/skill-curation/skill-retriever.d.ts +84 -0
- package/dist/extensions/forgecli/skill-curation/skill-retriever.js +246 -0
- package/dist/extensions/forgecli/skill-curation/skill-retriever.js.map +1 -0
- package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.d.ts +91 -0
- package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js +224 -0
- package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js.map +1 -0
- package/dist/extensions/forgecli/store/store-error-remediation.d.ts +65 -0
- package/dist/extensions/forgecli/store/store-error-remediation.js +307 -0
- package/dist/extensions/forgecli/store/store-error-remediation.js.map +1 -0
- package/dist/extensions/forgecli/store/store-resolver.d.ts +56 -0
- package/dist/extensions/forgecli/store/store-resolver.js +263 -0
- package/dist/extensions/forgecli/store/store-resolver.js.map +1 -0
- package/dist/extensions/forgecli/store/store-validator.d.ts +16 -0
- package/dist/extensions/forgecli/store/store-validator.js +32 -0
- package/dist/extensions/forgecli/store/store-validator.js.map +1 -0
- package/dist/extensions/forgecli/store/transition-guard.d.ts +20 -0
- package/dist/extensions/forgecli/store/transition-guard.js +89 -0
- package/dist/extensions/forgecli/store/transition-guard.js.map +1 -0
- package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +5 -0
- package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -1
- package/dist/extensions/forgecli/thread-switcher.d.ts +4 -1
- package/dist/extensions/forgecli/thread-switcher.js +36 -21
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
- package/dist/extensions/forgecli/transcript-archive-types.d.ts +171 -0
- package/dist/extensions/forgecli/transcript-archive-types.js +130 -0
- package/dist/extensions/forgecli/transcript-archive-types.js.map +1 -0
- package/dist/extensions/forgecli/transcript-archive.d.ts +127 -0
- package/dist/extensions/forgecli/transcript-archive.js +656 -0
- package/dist/extensions/forgecli/transcript-archive.js.map +1 -0
- package/dist/extensions/forgecli/transcript-replay.d.ts +28 -0
- package/dist/extensions/forgecli/transcript-replay.js +153 -0
- package/dist/extensions/forgecli/transcript-replay.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/component.d.ts +36 -0
- package/dist/extensions/forgecli/transcripts-tui/component.js +112 -0
- package/dist/extensions/forgecli/transcripts-tui/component.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/index.d.ts +4 -0
- package/dist/extensions/forgecli/transcripts-tui/index.js +5 -0
- package/dist/extensions/forgecli/transcripts-tui/index.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/browse.d.ts +21 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/browse.js +172 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/browse.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/types.d.ts +22 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/types.js +4 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/types.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/index.d.ts +4 -0
- package/dist/extensions/forgecli/transcripts-tui/state/index.js +5 -0
- package/dist/extensions/forgecli/transcripts-tui/state/index.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/init.d.ts +8 -0
- package/dist/extensions/forgecli/transcripts-tui/state/init.js +18 -0
- package/dist/extensions/forgecli/transcripts-tui/state/init.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/model.d.ts +56 -0
- package/dist/extensions/forgecli/transcripts-tui/state/model.js +6 -0
- package/dist/extensions/forgecli/transcripts-tui/state/model.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/reducer.d.ts +2 -0
- package/dist/extensions/forgecli/transcripts-tui/state/reducer.js +51 -0
- package/dist/extensions/forgecli/transcripts-tui/state/reducer.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/selectors.d.ts +10 -0
- package/dist/extensions/forgecli/transcripts-tui/state/selectors.js +62 -0
- package/dist/extensions/forgecli/transcripts-tui/state/selectors.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/theme.d.ts +20 -0
- package/dist/extensions/forgecli/transcripts-tui/theme.js +47 -0
- package/dist/extensions/forgecli/transcripts-tui/theme.js.map +1 -0
- package/dist/extensions/forgecli/tui/banner.d.ts +10 -0
- package/dist/extensions/forgecli/tui/banner.js +36 -0
- package/dist/extensions/forgecli/tui/banner.js.map +1 -0
- package/dist/extensions/forgecli/tui/forge-header.d.ts +12 -0
- package/dist/extensions/forgecli/tui/forge-header.js +114 -0
- package/dist/extensions/forgecli/tui/forge-header.js.map +1 -0
- package/dist/extensions/forgecli/tui/input-router.d.ts +33 -0
- package/dist/extensions/forgecli/tui/input-router.js +136 -0
- package/dist/extensions/forgecli/tui/input-router.js.map +1 -0
- package/dist/extensions/forgecli/tui/orchestrator-status-bar.d.ts +26 -0
- package/dist/extensions/forgecli/tui/orchestrator-status-bar.js +213 -0
- package/dist/extensions/forgecli/tui/orchestrator-status-bar.js.map +1 -0
- package/dist/extensions/forgecli/tui/thread-switcher.d.ts +18 -0
- package/dist/extensions/forgecli/tui/thread-switcher.js +194 -0
- package/dist/extensions/forgecli/tui/thread-switcher.js.map +1 -0
- package/dist/extensions/forgecli/update/forge-update-command.d.ts +100 -0
- package/dist/extensions/forgecli/update/forge-update-command.js +435 -0
- package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -0
- package/dist/extensions/forgecli/update/migration-engine.d.ts +117 -0
- package/dist/extensions/forgecli/update/migration-engine.js +563 -0
- package/dist/extensions/forgecli/update/migration-engine.js.map +1 -0
- package/dist/extensions/forgecli/update/update-check.d.ts +37 -0
- package/dist/extensions/forgecli/update/update-check.js +185 -0
- package/dist/extensions/forgecli/update/update-check.js.map +1 -0
- package/dist/extensions/forgecli/update/update-tools.d.ts +23 -0
- package/dist/extensions/forgecli/update/update-tools.js +135 -0
- package/dist/extensions/forgecli/update/update-tools.js.map +1 -0
- package/dist/extensions/forgecli/update/whats-new-widget.d.ts +26 -0
- package/dist/extensions/forgecli/update/whats-new-widget.js +376 -0
- package/dist/extensions/forgecli/update/whats-new-widget.js.map +1 -0
- package/dist/extensions/forgecli/update/whats-new.d.ts +120 -0
- package/dist/extensions/forgecli/update/whats-new.js +470 -0
- package/dist/extensions/forgecli/update/whats-new.js.map +1 -0
- package/dist/extensions/forgecli/viewport/events.d.ts +113 -0
- package/dist/extensions/forgecli/viewport/events.js +290 -0
- package/dist/extensions/forgecli/viewport/events.js.map +1 -0
- package/dist/extensions/forgecli/viewport/renderer.d.ts +102 -0
- package/dist/extensions/forgecli/viewport/renderer.js +277 -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 +131 -0
- package/dist/extensions/forgecli/viewport/theme.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/engine.js +1 -1
- package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -1
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +9 -0
- package/dist/forge-payload/.base-pack/workflows/plan_task.md +7 -0
- package/dist/forge-payload/.base-pack/workflows/review_code.md +4 -3
- package/dist/forge-payload/.base-pack/workflows/review_plan.md +4 -3
- package/dist/forge-payload/.base-pack/workflows/validate_task.md +4 -3
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/migrations.json +132 -27
- package/dist/forge-payload/meta/workflows/meta-review-implementation.md +4 -3
- package/dist/forge-payload/meta/workflows/meta-review-plan.md +4 -3
- package/dist/forge-payload/meta/workflows/meta-validate.md +4 -3
- package/dist/forge-payload/tools/collate.cjs +32 -0
- package/dist/forge-payload/tools/postflight-gate.cjs +56 -10
- package/package.json +5 -3
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
// forge:review-plan — native kickoff handler (FORGE-S21-T10).
|
|
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
|
+
// Note: The materialized workflow (review_plan.md) declares
|
|
8
|
+
// `audience: subagent` — advisory only. Users may invoke this command
|
|
9
|
+
// manually from the CLI; assertAudience never refuses subagent-audience
|
|
10
|
+
// workflows. Orchestrator chains (run-task, run-sprint, fix-bug) still
|
|
11
|
+
// dispatch via runForgeSubagent directly and do NOT route through this
|
|
12
|
+
// handler.
|
|
13
|
+
//
|
|
14
|
+
// FORGE-S26-T11:
|
|
15
|
+
// - Pipeline step guard added (checks task state via store-cli; --force bypasses).
|
|
16
|
+
// - Revision loop context injected into kickoff: `### Review Loop Context` block
|
|
17
|
+
// with `Iteration: 1 of M` (user-invoked default) where M is read from config
|
|
18
|
+
// `maxReviewIterations` (default 3). Matches T07 workflow fallback spec.
|
|
19
|
+
//
|
|
20
|
+
// Iron Laws:
|
|
21
|
+
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
22
|
+
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
23
|
+
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
24
|
+
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
25
|
+
// continuation.
|
|
26
|
+
import * as fs from "node:fs";
|
|
27
|
+
import * as path from "node:path";
|
|
28
|
+
import { assertAudience } from "../audience-gate.js";
|
|
29
|
+
import { discoverForgeConfig } from "../lib/forge-root.js";
|
|
30
|
+
import { sendKickoff } from "../kickoff.js";
|
|
31
|
+
// FORGE-S25-T16: extracted to lib modules (H-1, H-2). Re-exported here for
|
|
32
|
+
// backward compatibility with existing test and consumer imports.
|
|
33
|
+
import { extractPersonaNames } from "../lib/frontmatter-parser.js";
|
|
34
|
+
import { parseGuardArgs, runPipelineGuard } from "../lib/pipeline-guard.js";
|
|
35
|
+
import { loadPersona, PersonaSkillLoaderError } from "../parsers/persona-skill-loader.js";
|
|
36
|
+
import { loadWorkflow, WorkflowLoaderError } from "../parsers/workflow-loader.js";
|
|
37
|
+
export { extractPersonaNames };
|
|
38
|
+
import { checkMaterialization } from "../lib/manifest-checker.js";
|
|
39
|
+
export { checkMaterialization };
|
|
40
|
+
export function parseReviewPlanArgs(rawArgs, cwd) {
|
|
41
|
+
const trimmed = (rawArgs ?? "").trim();
|
|
42
|
+
if (trimmed === "") {
|
|
43
|
+
return { mode: "empty", taskRef: "", sourceLabel: "(no input — supervisor infers task from store/context)" };
|
|
44
|
+
}
|
|
45
|
+
if (trimmed.startsWith("@")) {
|
|
46
|
+
const ref = trimmed.slice(1).trim();
|
|
47
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
48
|
+
const seed = fs.readFileSync(filePath, "utf8");
|
|
49
|
+
return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
|
|
50
|
+
}
|
|
51
|
+
return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
|
|
52
|
+
}
|
|
53
|
+
export function composeKickoff(opts) {
|
|
54
|
+
const { workflowMd, personaIdentity, parsed, reviewLoopContext } = opts;
|
|
55
|
+
const sections = ["# /forge:review-plan", ""];
|
|
56
|
+
if (personaIdentity.trim().length > 0) {
|
|
57
|
+
sections.push(personaIdentity.trim(), "");
|
|
58
|
+
}
|
|
59
|
+
// Inject review loop context before workflow body (FORGE-S26-T11 / T07).
|
|
60
|
+
if (reviewLoopContext) {
|
|
61
|
+
sections.push(reviewLoopContext.trim(), "");
|
|
62
|
+
}
|
|
63
|
+
sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the plan at `engineering/sprints/<SPRINT_ID>/<TASK_ID>/PLAN.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: review the plan for correctness, completeness, and risk.", "4. Write `PLAN_REVIEW.md` and `REVIEW-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; in-conversation clarifications use `forge_ask_user`.");
|
|
64
|
+
sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
|
|
65
|
+
if (parsed.mode === "empty") {
|
|
66
|
+
sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
|
|
70
|
+
}
|
|
71
|
+
return sections.join("\n");
|
|
72
|
+
}
|
|
73
|
+
// Iteration context builder (FORGE-S26-T11) ------------------------------------
|
|
74
|
+
/**
|
|
75
|
+
* Build the `### Review Loop Context` block for user-invoked (non-orchestrated)
|
|
76
|
+
* review-plan calls. Matches the T07 graceful-fallback spec:
|
|
77
|
+
* "iteration 1 of M" where M is config.maxReviewIterations (default 3).
|
|
78
|
+
*/
|
|
79
|
+
export function buildReviewLoopContext(maxIterations) {
|
|
80
|
+
return [
|
|
81
|
+
"### Review Loop Context",
|
|
82
|
+
`- Iteration: 1 of ${maxIterations}`,
|
|
83
|
+
`- Is final iteration: ${maxIterations === 1 ? "true" : "false"}`,
|
|
84
|
+
].join("\n");
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Read maxReviewIterations from .forge/config.json. Returns default 3 on any
|
|
88
|
+
* error (missing file, missing field, non-integer value).
|
|
89
|
+
*/
|
|
90
|
+
export function readMaxReviewIterations(cwd) {
|
|
91
|
+
const configPath = path.join(cwd, ".forge", "config.json");
|
|
92
|
+
try {
|
|
93
|
+
const raw = fs.readFileSync(configPath, "utf8");
|
|
94
|
+
const cfg = JSON.parse(raw);
|
|
95
|
+
const v = cfg["maxReviewIterations"];
|
|
96
|
+
if (typeof v === "number" && Number.isInteger(v) && v >= 1)
|
|
97
|
+
return v;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// fail-open
|
|
101
|
+
}
|
|
102
|
+
return 3;
|
|
103
|
+
}
|
|
104
|
+
// Registration -------------------------------------------------------------
|
|
105
|
+
const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "review_plan.md");
|
|
106
|
+
export function registerReviewPlan(pi, options = {}) {
|
|
107
|
+
pi.registerCommand("forge:review-plan", {
|
|
108
|
+
description: "Run the review-plan workflow for a Forge task. " +
|
|
109
|
+
"Usage: /forge:review-plan [@<file> | <free-form text>]. " +
|
|
110
|
+
"Note: this workflow is subagent-only; standalone invocations are refused. " +
|
|
111
|
+
"Orchestrator chains dispatch directly via runForgeSubagent.",
|
|
112
|
+
async handler(args, ctx) {
|
|
113
|
+
const cwd = options.cwd ?? process.cwd();
|
|
114
|
+
const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
|
|
115
|
+
// Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
|
|
116
|
+
const guardParsed = parseGuardArgs(args);
|
|
117
|
+
if (!guardParsed.force) {
|
|
118
|
+
const forgeConfig = discoverForgeConfig(cwd);
|
|
119
|
+
if (forgeConfig) {
|
|
120
|
+
const guard = runPipelineGuard("review-plan", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
|
|
121
|
+
if (guard.blocked) {
|
|
122
|
+
ctx.ui.notify(guard.message, "error");
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const effectiveArgs = guardParsed.cleanArgs;
|
|
128
|
+
let workflowMd;
|
|
129
|
+
let workflowAudience;
|
|
130
|
+
try {
|
|
131
|
+
const loaded = loadWorkflow(workflowPath);
|
|
132
|
+
workflowMd = loaded.rawMarkdown;
|
|
133
|
+
workflowAudience = loaded.audience;
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
if (err instanceof WorkflowLoaderError) {
|
|
137
|
+
if (err.code === "missing_file") {
|
|
138
|
+
ctx.ui.notify(`× forge:review-plan — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
ctx.ui.notify(`× forge:review-plan — workflow load failed (${err.code}): ${err.message}`, "error");
|
|
142
|
+
}
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const e = err;
|
|
146
|
+
ctx.ui.notify(`× forge:review-plan — failed to read workflow: ${e.message ?? "unknown"}`, "error");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
let parsed;
|
|
150
|
+
try {
|
|
151
|
+
parsed = parseReviewPlanArgs(effectiveArgs, cwd);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
const e = err;
|
|
155
|
+
ctx.ui.notify(`× forge:review-plan — failed to read seed: ${e.message ?? "unknown"}`, "error");
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Build revision loop context block (FORGE-S26-T11 / T07): inject iteration
|
|
159
|
+
// 1 of M for user-invoked (non-orchestrated) calls. Orchestrator uses
|
|
160
|
+
// runForgeSubagent directly and injects its own context block.
|
|
161
|
+
const maxIter = readMaxReviewIterations(cwd);
|
|
162
|
+
const reviewLoopContext = buildReviewLoopContext(maxIter);
|
|
163
|
+
const check = checkMaterialization(workflowPath, workflowMd);
|
|
164
|
+
if (!check.ok) {
|
|
165
|
+
for (const marker of check.missing) {
|
|
166
|
+
ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const personas = extractPersonaNames(workflowMd);
|
|
171
|
+
let personaIdentity = "";
|
|
172
|
+
if (personas.length > 0) {
|
|
173
|
+
try {
|
|
174
|
+
const persona = loadPersona(personas[0], { cwd });
|
|
175
|
+
personaIdentity = persona.identity;
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (err instanceof PersonaSkillLoaderError) {
|
|
179
|
+
ctx.ui.notify(`× forge:review-plan — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const e = err;
|
|
183
|
+
ctx.ui.notify(`× forge:review-plan — persona load error: ${e.message ?? "unknown"}`, "error");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (!assertAudience({ workflowName: "review_plan", audience: workflowAudience }, ctx)) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const kickoff = composeKickoff({
|
|
191
|
+
workflowMd,
|
|
192
|
+
personaIdentity,
|
|
193
|
+
parsed,
|
|
194
|
+
reviewLoopContext,
|
|
195
|
+
});
|
|
196
|
+
sendKickoff(pi, kickoff);
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=review-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-plan.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/commands/review-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
interface ParsedArgs {
|
|
3
|
+
mode: "empty" | "file" | "text";
|
|
4
|
+
seed: string;
|
|
5
|
+
sourceLabel: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseSprintIntakeArgs(rawArgs: string, cwd: string): ParsedArgs;
|
|
8
|
+
export declare function composeKickoff(workflowMd: string, parsed: ParsedArgs): string;
|
|
9
|
+
export declare function registerSprintIntake(pi: ExtensionAPI): void;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// forge:sprint-intake — LLM-driven kickoff handler (FORGE-BUG-031).
|
|
2
|
+
//
|
|
3
|
+
// Replaces the deterministic TUI flow shipped in FORGE-S19-T01. The native
|
|
4
|
+
// handler is now a thin shim that:
|
|
5
|
+
// 1. Parses argv: empty | "@<path>" (file ref) | free-form text
|
|
6
|
+
// 2. Reads .forge/workflows/architect_sprint_intake.md
|
|
7
|
+
// 3. Composes a kickoff message (workflow + seed input)
|
|
8
|
+
// 4. Calls pi.sendUserMessage() to inject — LLM drives the interview using
|
|
9
|
+
// forge_store, forge_ask_user, write, read, forge_collate tools.
|
|
10
|
+
//
|
|
11
|
+
// No multi-turn TUI, no checkpoints, no scripted-answers env var. The LLM
|
|
12
|
+
// owns the conversation; the handler returns once the kickoff is queued.
|
|
13
|
+
//
|
|
14
|
+
// Persona/skill loading: this handler does not read `.forge/personas/` or
|
|
15
|
+
// `.forge/skills/` directly — the LLM dereferences those via the workflow
|
|
16
|
+
// text. Any future need for typed persona/skill access in this handler MUST
|
|
17
|
+
// go through `./loaders/persona-skill-loader.ts` (FORGE-S20-T02). The smoke
|
|
18
|
+
// gate enforces this with a grep assertion.
|
|
19
|
+
import * as fs from "node:fs";
|
|
20
|
+
import * as path from "node:path";
|
|
21
|
+
export function parseSprintIntakeArgs(rawArgs, cwd) {
|
|
22
|
+
const trimmed = (rawArgs ?? "").trim();
|
|
23
|
+
if (!trimmed) {
|
|
24
|
+
return { mode: "empty", seed: "", sourceLabel: "(no input — start interview)" };
|
|
25
|
+
}
|
|
26
|
+
if (trimmed.startsWith("@")) {
|
|
27
|
+
const ref = trimmed.slice(1).trim();
|
|
28
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
29
|
+
const seed = fs.readFileSync(filePath, "utf8");
|
|
30
|
+
return { mode: "file", seed, sourceLabel: `(seed from file: ${ref})` };
|
|
31
|
+
}
|
|
32
|
+
return { mode: "text", seed: trimmed, sourceLabel: "(seed from inline text)" };
|
|
33
|
+
}
|
|
34
|
+
// ── Kickoff composition ───────────────────────────────────────────────────
|
|
35
|
+
export function composeKickoff(workflowMd, parsed) {
|
|
36
|
+
const seedSection = parsed.mode === "empty"
|
|
37
|
+
? "\n## Input\n\n(no seed — begin interview now and elicit goals/scope/constraints conversationally)\n"
|
|
38
|
+
: `\n## Input — ${parsed.sourceLabel}\n\n${parsed.seed.trim()}\n`;
|
|
39
|
+
return [
|
|
40
|
+
"# /forge:new-sprint",
|
|
41
|
+
"",
|
|
42
|
+
"Run the sprint-intake workflow below. Drive the interview conversationally — read referenced personas/skills/templates as needed, ask clarifying questions one at a time, and write `engineering/sprints/<SPRINT_ID>/SPRINT_REQUIREMENTS.md` plus the corresponding store records when ready. For the canonical sprint record, call the `forge_store` MCP tool with `{command:'write', args:['sprint','<json>']}` — 2-positional, id INSIDE json. Call `forge_store_template` first to get the json shape. Do NOT bash-shell `forge store ...`.",
|
|
43
|
+
"",
|
|
44
|
+
"---",
|
|
45
|
+
"",
|
|
46
|
+
"## Workflow",
|
|
47
|
+
"",
|
|
48
|
+
workflowMd.trim(),
|
|
49
|
+
"",
|
|
50
|
+
"---",
|
|
51
|
+
seedSection,
|
|
52
|
+
].join("\n");
|
|
53
|
+
}
|
|
54
|
+
// ── Registration ──────────────────────────────────────────────────────────
|
|
55
|
+
const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "architect_sprint_intake.md");
|
|
56
|
+
export function registerSprintIntake(pi) {
|
|
57
|
+
pi.registerCommand("forge:new-sprint", {
|
|
58
|
+
description: "Start an LLM-driven sprint-intake interview. " +
|
|
59
|
+
"Usage: /forge:new-sprint [@<file> | <free-form text>]. " +
|
|
60
|
+
"Empty args start a conversational interview from scratch.",
|
|
61
|
+
async handler(args, ctx) {
|
|
62
|
+
const cwd = process.cwd();
|
|
63
|
+
const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
|
|
64
|
+
if (!fs.existsSync(workflowPath)) {
|
|
65
|
+
ctx.ui.notify(`forge:new-sprint — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "warning");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
let parsed;
|
|
69
|
+
try {
|
|
70
|
+
parsed = parseSprintIntakeArgs(args, cwd);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
const e = err;
|
|
74
|
+
ctx.ui.notify(`forge:new-sprint — failed to read seed: ${e.message ?? "unknown"}`, "error");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
let workflowMd;
|
|
78
|
+
try {
|
|
79
|
+
workflowMd = fs.readFileSync(workflowPath, "utf8");
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const e = err;
|
|
83
|
+
ctx.ui.notify(`forge:new-sprint — failed to read workflow: ${e.message ?? "unknown"}`, "error");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const kickoff = composeKickoff(workflowMd, parsed);
|
|
87
|
+
pi.sendUserMessage(kickoff);
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=sprint-intake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprint-intake.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/commands/sprint-intake.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
interface ParsedArgs {
|
|
3
|
+
sprintId: string;
|
|
4
|
+
seedMode: "none" | "file" | "text";
|
|
5
|
+
seed: string;
|
|
6
|
+
sourceLabel: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseSprintPlanArgs(rawArgs: string, cwd: string): ParsedArgs;
|
|
9
|
+
export declare function composeKickoff(workflowMd: string, parsed: ParsedArgs, requirements: {
|
|
10
|
+
path: string;
|
|
11
|
+
content: string;
|
|
12
|
+
} | null): string;
|
|
13
|
+
export declare function registerSprintPlan(pi: ExtensionAPI): void;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// forge:sprint-plan — LLM-driven kickoff handler (FORGE-BUG-032).
|
|
2
|
+
//
|
|
3
|
+
// Replaces the deterministic JSON-mode subagent call shipped in FORGE-S19-T02.
|
|
4
|
+
// The handler is now a thin shim that:
|
|
5
|
+
// 1. Parses argv: <SPRINT_ID> [@<file> | free-form text]
|
|
6
|
+
// 2. Reads SPRINT_REQUIREMENTS.md (or REQUIREMENTS.md alias) when present
|
|
7
|
+
// 3. Reads .forge/workflows/architect_sprint_plan.md
|
|
8
|
+
// 4. Composes a kickoff message (workflow + requirements + optional seed)
|
|
9
|
+
// 5. Calls pi.sendUserMessage() — LLM drives task decomposition with
|
|
10
|
+
// forge_store write task per task, no rigid JSON contract.
|
|
11
|
+
//
|
|
12
|
+
// Persona/skill loading: this handler does not read `.forge/personas/` or
|
|
13
|
+
// `.forge/skills/` directly — the LLM dereferences those via the workflow
|
|
14
|
+
// text. Any future need for typed persona/skill access in this handler MUST
|
|
15
|
+
// go through `./loaders/persona-skill-loader.ts` (FORGE-S20-T02). The smoke
|
|
16
|
+
// gate enforces this with a grep assertion.
|
|
17
|
+
import * as fs from "node:fs";
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
export function parseSprintPlanArgs(rawArgs, cwd) {
|
|
20
|
+
const trimmed = (rawArgs ?? "").trim();
|
|
21
|
+
if (!trimmed) {
|
|
22
|
+
throw new Error("sprint ID required — usage: /forge:plan-sprint <SPRINT_ID> [@<file> | <text>]");
|
|
23
|
+
}
|
|
24
|
+
const [sprintId, ...rest] = trimmed.split(/\s+/);
|
|
25
|
+
const tail = rest.join(" ").trim();
|
|
26
|
+
if (!tail) {
|
|
27
|
+
return { sprintId, seedMode: "none", seed: "", sourceLabel: "" };
|
|
28
|
+
}
|
|
29
|
+
if (tail.startsWith("@")) {
|
|
30
|
+
const ref = tail.slice(1).trim();
|
|
31
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
32
|
+
const seed = fs.readFileSync(filePath, "utf8");
|
|
33
|
+
return { sprintId, seedMode: "file", seed, sourceLabel: `(seed from file: ${ref})` };
|
|
34
|
+
}
|
|
35
|
+
return { sprintId, seedMode: "text", seed: tail, sourceLabel: "(seed from inline text)" };
|
|
36
|
+
}
|
|
37
|
+
// ── Requirements lookup ───────────────────────────────────────────────────
|
|
38
|
+
function resolveRequirements(cwd, sprintId) {
|
|
39
|
+
const sprintDir = path.join(cwd, "engineering", "sprints", sprintId);
|
|
40
|
+
for (const name of ["SPRINT_REQUIREMENTS.md", "REQUIREMENTS.md"]) {
|
|
41
|
+
const p = path.join(sprintDir, name);
|
|
42
|
+
try {
|
|
43
|
+
const content = fs.readFileSync(p, "utf8");
|
|
44
|
+
return { path: p, content };
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
/* try next */
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
// ── Kickoff composition ───────────────────────────────────────────────────
|
|
53
|
+
export function composeKickoff(workflowMd, parsed, requirements) {
|
|
54
|
+
const sections = [
|
|
55
|
+
"# /forge:plan-sprint",
|
|
56
|
+
"",
|
|
57
|
+
`Decompose sprint ${parsed.sprintId} into tasks. Drive the planning conversationally per the workflow below — read referenced personas/skills, validate dependencies, and write each task by calling the \`forge_store\` MCP tool with \`{command:'write', args:['task','<json>']}\` (2-positional, id INSIDE json) once you and the user agree on the shape. Call \`forge_store_template\` first for the canonical task shape. Update the sprint record (same tool, args:['sprint','<json>']) with the final task ID list. Do not return a single bulk JSON array; commit tasks one at a time so the user can interject. Do NOT bash-shell \`forge store ...\`.`,
|
|
58
|
+
"",
|
|
59
|
+
"---",
|
|
60
|
+
"",
|
|
61
|
+
"## Workflow",
|
|
62
|
+
"",
|
|
63
|
+
workflowMd.trim(),
|
|
64
|
+
"",
|
|
65
|
+
"---",
|
|
66
|
+
"",
|
|
67
|
+
`## Sprint: ${parsed.sprintId}`,
|
|
68
|
+
];
|
|
69
|
+
if (requirements) {
|
|
70
|
+
sections.push("", `Requirements file: \`${path.relative(process.cwd(), requirements.path)}\``);
|
|
71
|
+
sections.push("", "```markdown", requirements.content.trim(), "```");
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
sections.push("", `(no requirements file found at engineering/sprints/${parsed.sprintId}/SPRINT_REQUIREMENTS.md or REQUIREMENTS.md — ask the user to confirm intent or run /forge:new-sprint first)`);
|
|
75
|
+
}
|
|
76
|
+
if (parsed.seedMode !== "none") {
|
|
77
|
+
sections.push("", `## Additional Input — ${parsed.sourceLabel}`, "", parsed.seed.trim());
|
|
78
|
+
}
|
|
79
|
+
return sections.join("\n");
|
|
80
|
+
}
|
|
81
|
+
// ── Registration ──────────────────────────────────────────────────────────
|
|
82
|
+
const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "architect_sprint_plan.md");
|
|
83
|
+
export function registerSprintPlan(pi) {
|
|
84
|
+
pi.registerCommand("forge:plan-sprint", {
|
|
85
|
+
description: "Start an LLM-driven sprint task-decomposition session. " +
|
|
86
|
+
"Usage: /forge:plan-sprint <SPRINT_ID> [@<file> | <free-form text>]. " +
|
|
87
|
+
"Reads SPRINT_REQUIREMENTS.md (or REQUIREMENTS.md) from the sprint directory.",
|
|
88
|
+
async handler(args, ctx) {
|
|
89
|
+
const cwd = process.cwd();
|
|
90
|
+
let parsed;
|
|
91
|
+
try {
|
|
92
|
+
parsed = parseSprintPlanArgs(args, cwd);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
const e = err;
|
|
96
|
+
ctx.ui.notify(`× forge:plan-sprint — ${e.message ?? "argv parse failed"}`, "error");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
|
|
100
|
+
if (!fs.existsSync(workflowPath)) {
|
|
101
|
+
ctx.ui.notify(`× forge:plan-sprint — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
let workflowMd;
|
|
105
|
+
try {
|
|
106
|
+
workflowMd = fs.readFileSync(workflowPath, "utf8");
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
const e = err;
|
|
110
|
+
ctx.ui.notify(`× forge:plan-sprint — failed to read workflow: ${e.message ?? "unknown"}`, "error");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const requirements = resolveRequirements(cwd, parsed.sprintId);
|
|
114
|
+
if (!requirements) {
|
|
115
|
+
ctx.ui.notify(`△ forge:plan-sprint — no SPRINT_REQUIREMENTS.md found at engineering/sprints/${parsed.sprintId}/. Continuing; LLM will ask you for context.`, "warning");
|
|
116
|
+
}
|
|
117
|
+
const kickoff = composeKickoff(workflowMd, parsed, requirements);
|
|
118
|
+
pi.sendUserMessage(kickoff);
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=sprint-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprint-plan.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/commands/sprint-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
export interface StatusResult {
|
|
3
|
+
lines: string[];
|
|
4
|
+
hasActiveSprint: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Read active sprint and its tasks from store-cli.
|
|
8
|
+
* Returns formatted text lines for display via ctx.ui.notify.
|
|
9
|
+
* Exported so orchestrators can call directly without going through sendUserMessage.
|
|
10
|
+
*/
|
|
11
|
+
export declare function runStatus(forgeRoot: string, cwd: string): Promise<StatusResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Register /forge:status (v0 native handler).
|
|
14
|
+
* forgeRoot is nullable — null means we're outside a Forge project.
|
|
15
|
+
*/
|
|
16
|
+
export declare function registerStatusCommand(pi: ExtensionAPI, opts: {
|
|
17
|
+
forgeRoot: string | null;
|
|
18
|
+
}): void;
|
|
19
|
+
export declare function readForgeRootFromConfig(cwd: string): string | null;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// status-command.ts — native v0 handler for /forge:status (FORGE-S23-T10)
|
|
2
|
+
//
|
|
3
|
+
// Replaces the delegateMarkdownCommand stub that previously lived in forge-commands.ts.
|
|
4
|
+
// Reads the active sprint from store and lists tasks with their statuses.
|
|
5
|
+
// No TUI — text-only widget via ctx.ui.notify.
|
|
6
|
+
//
|
|
7
|
+
// Archetype: Atomic (no LLM in loop — pack-04 §Atomic).
|
|
8
|
+
// Iron Laws:
|
|
9
|
+
// IL1 — new code lives in forge-cli/ only
|
|
10
|
+
// IL6 — no shell-string interpolation (argv-array throughout)
|
|
11
|
+
// IL7 — silent continuation past failures is never acceptable
|
|
12
|
+
import { execFile } from "node:child_process";
|
|
13
|
+
import * as fs from "node:fs";
|
|
14
|
+
import * as path from "node:path";
|
|
15
|
+
import { promisify } from "node:util";
|
|
16
|
+
import { resolveToolDir } from "../store/store-resolver.js";
|
|
17
|
+
const execFileAsync = promisify(execFile);
|
|
18
|
+
/**
|
|
19
|
+
* Read active sprint and its tasks from store-cli.
|
|
20
|
+
* Returns formatted text lines for display via ctx.ui.notify.
|
|
21
|
+
* Exported so orchestrators can call directly without going through sendUserMessage.
|
|
22
|
+
*/
|
|
23
|
+
export async function runStatus(forgeRoot, cwd) {
|
|
24
|
+
const toolDir = resolveToolDir(forgeRoot);
|
|
25
|
+
const storeCliPath = path.join(toolDir, "store-cli.cjs");
|
|
26
|
+
// Step 1: list all sprints
|
|
27
|
+
let listResult;
|
|
28
|
+
try {
|
|
29
|
+
const out = await execFileAsync("node", [storeCliPath, "query", "--list-sprints"], {
|
|
30
|
+
cwd,
|
|
31
|
+
encoding: "utf8",
|
|
32
|
+
timeout: 10_000,
|
|
33
|
+
});
|
|
34
|
+
listResult = JSON.parse(out.stdout);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
38
|
+
return {
|
|
39
|
+
lines: [`× forge:status — could not list sprints: ${msg}`],
|
|
40
|
+
hasActiveSprint: false,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Step 2: filter active sprints, sort by ID descending (proxy for recency)
|
|
44
|
+
const activeSprints = (listResult.results ?? [])
|
|
45
|
+
.filter((s) => s.status === "active")
|
|
46
|
+
.sort((a, b) => b.id.localeCompare(a.id));
|
|
47
|
+
if (activeSprints.length === 0) {
|
|
48
|
+
return {
|
|
49
|
+
lines: [
|
|
50
|
+
"forge:status — No active sprint found.",
|
|
51
|
+
'Run /forge:init to initialise a project, or check your store with /forge:search "--list-sprints".',
|
|
52
|
+
],
|
|
53
|
+
hasActiveSprint: false,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Use the most recent active sprint
|
|
57
|
+
const sprint = activeSprints[0];
|
|
58
|
+
// Step 3: fetch tasks for this sprint
|
|
59
|
+
let sprintResult;
|
|
60
|
+
try {
|
|
61
|
+
const out = await execFileAsync("node", [storeCliPath, "query", "--sprint", sprint.id], {
|
|
62
|
+
cwd,
|
|
63
|
+
encoding: "utf8",
|
|
64
|
+
timeout: 10_000,
|
|
65
|
+
});
|
|
66
|
+
sprintResult = JSON.parse(out.stdout);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
70
|
+
return {
|
|
71
|
+
lines: [`× forge:status — could not fetch tasks for sprint ${sprint.id}: ${msg}`],
|
|
72
|
+
hasActiveSprint: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const tasks = sprintResult.results ?? [];
|
|
76
|
+
// Step 4: format output
|
|
77
|
+
const lines = [
|
|
78
|
+
`Sprint: ${sprint.id}${sprint.title ? ` — ${sprint.title}` : ""}`,
|
|
79
|
+
`Tasks: ${tasks.length}`,
|
|
80
|
+
"",
|
|
81
|
+
];
|
|
82
|
+
if (tasks.length === 0) {
|
|
83
|
+
lines.push(" (no tasks found)");
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
for (const task of tasks) {
|
|
87
|
+
const status = task.status ?? "unknown";
|
|
88
|
+
const title = task.title ? ` — ${task.title.slice(0, 60)}` : "";
|
|
89
|
+
lines.push(` ${task.id} [${status}]${title}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (activeSprints.length > 1) {
|
|
93
|
+
lines.push("");
|
|
94
|
+
lines.push(` Note: ${activeSprints.length - 1} other active sprint(s) found. Showing most recent (${sprint.id}).`);
|
|
95
|
+
}
|
|
96
|
+
return { lines, hasActiveSprint: true };
|
|
97
|
+
}
|
|
98
|
+
// ── Register ─────────────────────────────────────────────────────────────────
|
|
99
|
+
/**
|
|
100
|
+
* Register /forge:status (v0 native handler).
|
|
101
|
+
* forgeRoot is nullable — null means we're outside a Forge project.
|
|
102
|
+
*/
|
|
103
|
+
export function registerStatusCommand(pi, opts) {
|
|
104
|
+
pi.registerCommand("forge:status", {
|
|
105
|
+
description: "Sprint and task summary widget — lists active sprint and task statuses.",
|
|
106
|
+
async handler(_args, ctx) {
|
|
107
|
+
const cwd = process.cwd();
|
|
108
|
+
// Outside-project guard
|
|
109
|
+
if (!opts.forgeRoot) {
|
|
110
|
+
ctx.ui.notify("× forge:status — not inside a Forge project. Run /forge:init first.", "error");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
ctx.ui.setStatus?.("forge:status", "Loading sprint status…");
|
|
114
|
+
const result = await runStatus(opts.forgeRoot, cwd);
|
|
115
|
+
ctx.ui.setStatus?.("forge:status", undefined);
|
|
116
|
+
for (const line of result.lines) {
|
|
117
|
+
const severity = line.startsWith("×") ? "error" : "info";
|
|
118
|
+
ctx.ui.notify(line, severity);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// ── Outside-project config guard helper ──────────────────────────────────────
|
|
124
|
+
// Not used above because forgeRoot is passed in at register time, but exported
|
|
125
|
+
// for use in tests that need to verify the guard path.
|
|
126
|
+
export function readForgeRootFromConfig(cwd) {
|
|
127
|
+
try {
|
|
128
|
+
const configPath = path.join(cwd, ".forge", "config.json");
|
|
129
|
+
const raw = fs.readFileSync(configPath, "utf8");
|
|
130
|
+
const cfg = JSON.parse(raw);
|
|
131
|
+
const paths = cfg.paths;
|
|
132
|
+
if (paths && typeof paths.forgeRoot === "string")
|
|
133
|
+
return paths.forgeRoot;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// fall through
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=status-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-command.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/commands/status-command.ts"],"names":[],"mappings":"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"}
|