@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,53 @@
|
|
|
1
|
+
export interface PersonaModel {
|
|
2
|
+
provider: string;
|
|
3
|
+
model: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
}
|
|
6
|
+
export type PersonaModelsMap = Record<string, PersonaModel>;
|
|
7
|
+
export interface PhaseConfig {
|
|
8
|
+
"model-override"?: string | PersonaModel;
|
|
9
|
+
}
|
|
10
|
+
export interface PipelineConfig {
|
|
11
|
+
"persona-models"?: PersonaModelsMap;
|
|
12
|
+
/** Phase overrides keyed by role string. */
|
|
13
|
+
phases?: Record<string, PhaseConfig>;
|
|
14
|
+
}
|
|
15
|
+
export interface SkillCurationConfig {
|
|
16
|
+
/**
|
|
17
|
+
* FORGE-S24 SKILL-CURATION pipeline rollout flag. Default false.
|
|
18
|
+
* When false, the four T08–T11 modules (skill-retriever, skill-usage-tracker,
|
|
19
|
+
* skill-curator-subagent, friction-emit) no-op at entry. Wired into the
|
|
20
|
+
* orchestrator handlers (run-task / fix-bug) so a flag-off run is
|
|
21
|
+
* byte-identical to pre-FORGE-S24 behaviour.
|
|
22
|
+
*/
|
|
23
|
+
enabled?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface ForgeCliFeatureFlags {
|
|
26
|
+
skillCuration?: SkillCurationConfig;
|
|
27
|
+
}
|
|
28
|
+
export interface GlobalConfig {
|
|
29
|
+
"persona-models"?: PersonaModelsMap;
|
|
30
|
+
forgeCli?: ForgeCliFeatureFlags;
|
|
31
|
+
}
|
|
32
|
+
export interface ProjectConfig {
|
|
33
|
+
"persona-models"?: PersonaModelsMap;
|
|
34
|
+
forgeCli?: ForgeCliFeatureFlags;
|
|
35
|
+
pipelines?: Record<string, PipelineConfig>;
|
|
36
|
+
}
|
|
37
|
+
export interface MergedConfig {
|
|
38
|
+
/** Shallow-merged persona-models (project wins on key collision). */
|
|
39
|
+
"persona-models"?: PersonaModelsMap;
|
|
40
|
+
/** Project-only pipelines (L3/L4 config lives here). */
|
|
41
|
+
pipelines?: Record<string, PipelineConfig>;
|
|
42
|
+
/** The raw global config for L1 lookups — null if absent or invalid. */
|
|
43
|
+
_global: GlobalConfig | null;
|
|
44
|
+
/** The raw project config for L2 lookups — null if absent or invalid. */
|
|
45
|
+
_project: ProjectConfig | null;
|
|
46
|
+
}
|
|
47
|
+
export interface LayeredConfig {
|
|
48
|
+
global: GlobalConfig | null;
|
|
49
|
+
project: ProjectConfig | null;
|
|
50
|
+
merged: MergedConfig;
|
|
51
|
+
errors: string[];
|
|
52
|
+
}
|
|
53
|
+
export declare function loadLayeredConfig(cwd: string): LayeredConfig;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import AjvModule from "ajv";
|
|
3
|
+
import schema from "../forge-cli-schema.json" with { type: "json" };
|
|
4
|
+
import { getGlobalConfigPath, getProjectConfigPath } from "../paths/paths.js";
|
|
5
|
+
// Ajv v8 ESM interop: default export is a namespace holder;
|
|
6
|
+
// the actual constructor lives at .Ajv or .default.Ajv.
|
|
7
|
+
const Ajv = AjvModule.default?.Ajv ?? AjvModule.Ajv ?? AjvModule;
|
|
8
|
+
const ajv = new Ajv({ allErrors: true });
|
|
9
|
+
const validate = ajv.compile(schema);
|
|
10
|
+
function validateConfig(raw, label) {
|
|
11
|
+
const ok = validate(raw);
|
|
12
|
+
if (!ok) {
|
|
13
|
+
const messages = validate.errors
|
|
14
|
+
?.map((e) => `${e.instancePath || "/"} ${e.message}`)
|
|
15
|
+
.join("; ") ?? "unknown";
|
|
16
|
+
return { valid: false, error: `forge-cli ${label} config schema error: ${messages}` };
|
|
17
|
+
}
|
|
18
|
+
return { valid: true, data: raw };
|
|
19
|
+
}
|
|
20
|
+
function readJsonFile(filePath) {
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
23
|
+
}
|
|
24
|
+
catch (_err) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function loadLayeredConfig(cwd) {
|
|
29
|
+
const errors = [];
|
|
30
|
+
const globalPath = getGlobalConfigPath();
|
|
31
|
+
const projectPath = getProjectConfigPath(cwd);
|
|
32
|
+
let globalConfig = null;
|
|
33
|
+
let projectConfig = null;
|
|
34
|
+
const rawGlobal = readJsonFile(globalPath);
|
|
35
|
+
if (rawGlobal !== null) {
|
|
36
|
+
const result = validateConfig(rawGlobal, "global");
|
|
37
|
+
if (result.valid) {
|
|
38
|
+
globalConfig = result.data;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
errors.push(result.error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const rawProject = readJsonFile(projectPath);
|
|
45
|
+
if (rawProject !== null) {
|
|
46
|
+
const result = validateConfig(rawProject, "project");
|
|
47
|
+
if (result.valid) {
|
|
48
|
+
projectConfig = result.data;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
errors.push(result.error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Shallow-merge persona-models: global first, project overwrites per key
|
|
55
|
+
const mergedPersonaModels = {
|
|
56
|
+
...(globalConfig?.["persona-models"] ?? {}),
|
|
57
|
+
...(projectConfig?.["persona-models"] ?? {}),
|
|
58
|
+
};
|
|
59
|
+
const merged = {
|
|
60
|
+
_global: globalConfig,
|
|
61
|
+
_project: projectConfig,
|
|
62
|
+
};
|
|
63
|
+
if (Object.keys(mergedPersonaModels).length > 0) {
|
|
64
|
+
merged["persona-models"] = mergedPersonaModels;
|
|
65
|
+
}
|
|
66
|
+
// Pipelines are project-only (global config is project-agnostic)
|
|
67
|
+
if (projectConfig?.pipelines) {
|
|
68
|
+
merged.pipelines = projectConfig.pipelines;
|
|
69
|
+
}
|
|
70
|
+
return { global: globalConfig, project: projectConfig, merged, errors };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=config-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-layer.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/config/config-layer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PersonaModelsMap, PipelineConfig } from "./config-layer.js";
|
|
2
|
+
export type ConfigLayer = "global" | "project";
|
|
3
|
+
export interface RoutingConfigBuffer {
|
|
4
|
+
"persona-models"?: PersonaModelsMap;
|
|
5
|
+
pipelines?: Record<string, PipelineConfig>;
|
|
6
|
+
}
|
|
7
|
+
export interface WriteOptions {
|
|
8
|
+
layer: ConfigLayer;
|
|
9
|
+
cwd: string;
|
|
10
|
+
buffer: RoutingConfigBuffer;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveTargetPath(opts: {
|
|
13
|
+
layer: ConfigLayer;
|
|
14
|
+
cwd: string;
|
|
15
|
+
}): string;
|
|
16
|
+
export declare function writeRoutingConfig(opts: WriteOptions): string;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Atomic, schema-validated writer for forge-cli routing config files.
|
|
2
|
+
//
|
|
3
|
+
// Plan 16, Slice 4a. Writes ONLY to (paths resolved via paths/paths.ts):
|
|
4
|
+
// - global layer (L1) → getGlobalConfigPath() → ~/.pi/forge-cli/config.json
|
|
5
|
+
// - project layer (L2/L3/L4) → getProjectConfigPath(cwd) →
|
|
6
|
+
// <cwd>/.pi/forge-cli/config.json
|
|
7
|
+
//
|
|
8
|
+
// Never writes to .forge/config.json — that's the plugin's pipeline catalogue,
|
|
9
|
+
// read-only from this TUI.
|
|
10
|
+
//
|
|
11
|
+
// Write protocol:
|
|
12
|
+
// 1. Validate buffer against forge-cli-schema.json. Throw on fail.
|
|
13
|
+
// 2. If buffer is empty ({}) and target file exists → unlink. Return target.
|
|
14
|
+
// 3. Otherwise: write to <target>.tmp, fsync, rename atomically to <target>.
|
|
15
|
+
import * as fs from "node:fs";
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import AjvModule from "ajv";
|
|
18
|
+
import schema from "../forge-cli-schema.json" with { type: "json" };
|
|
19
|
+
import { getGlobalConfigPath, getProjectConfigPath } from "../paths/paths.js";
|
|
20
|
+
// Ajv v8 ESM interop: default export is a namespace holder;
|
|
21
|
+
// the actual constructor lives at .Ajv or .default.Ajv.
|
|
22
|
+
const Ajv = AjvModule.default?.Ajv ?? AjvModule.Ajv ?? AjvModule;
|
|
23
|
+
const ajv = new Ajv({ allErrors: true });
|
|
24
|
+
const validate = ajv.compile(schema);
|
|
25
|
+
export function resolveTargetPath(opts) {
|
|
26
|
+
if (opts.layer === "global") {
|
|
27
|
+
return getGlobalConfigPath();
|
|
28
|
+
}
|
|
29
|
+
return getProjectConfigPath(opts.cwd);
|
|
30
|
+
}
|
|
31
|
+
function isEmpty(buffer) {
|
|
32
|
+
const personaCount = Object.keys(buffer["persona-models"] ?? {}).length;
|
|
33
|
+
const pipelineCount = Object.keys(buffer.pipelines ?? {}).length;
|
|
34
|
+
return personaCount === 0 && pipelineCount === 0;
|
|
35
|
+
}
|
|
36
|
+
export function writeRoutingConfig(opts) {
|
|
37
|
+
const target = resolveTargetPath(opts);
|
|
38
|
+
// Empty buffer → delete file if present.
|
|
39
|
+
if (isEmpty(opts.buffer)) {
|
|
40
|
+
if (fs.existsSync(target)) {
|
|
41
|
+
fs.unlinkSync(target);
|
|
42
|
+
}
|
|
43
|
+
return target;
|
|
44
|
+
}
|
|
45
|
+
// Validate FIRST. Any failure short-circuits before touching the filesystem.
|
|
46
|
+
const ok = validate(opts.buffer);
|
|
47
|
+
if (!ok) {
|
|
48
|
+
const messages = validate.errors
|
|
49
|
+
?.map((e) => `${e.instancePath || "/"} ${e.message}`)
|
|
50
|
+
.join("; ") ?? "unknown";
|
|
51
|
+
throw new Error(`forge-cli config schema error: ${messages}`);
|
|
52
|
+
}
|
|
53
|
+
// Ensure parent dir exists.
|
|
54
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
55
|
+
// Atomic write: temp file + rename. Pretty-print for human-readable diffs.
|
|
56
|
+
const tmpPath = `${target}.tmp`;
|
|
57
|
+
const serialized = `${JSON.stringify(opts.buffer, null, 2)}\n`;
|
|
58
|
+
const fd = fs.openSync(tmpPath, "w");
|
|
59
|
+
try {
|
|
60
|
+
fs.writeSync(fd, serialized);
|
|
61
|
+
fs.fsyncSync(fd);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
fs.closeSync(fd);
|
|
65
|
+
}
|
|
66
|
+
fs.renameSync(tmpPath, target);
|
|
67
|
+
return target;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=config-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/config/config-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type Static, Type } from "typebox";
|
|
2
|
+
declare const ProviderSchema: Type.TObject<{
|
|
3
|
+
id: Type.TString;
|
|
4
|
+
label: Type.TString;
|
|
5
|
+
enabled: Type.TBoolean;
|
|
6
|
+
deferredTo: Type.TOptional<Type.TString>;
|
|
7
|
+
modelGlobs: Type.TArray<Type.TString>;
|
|
8
|
+
credentialEnvAny: Type.TArray<Type.TString>;
|
|
9
|
+
}>;
|
|
10
|
+
declare const RegistrySchema: Type.TObject<{
|
|
11
|
+
version: Type.TLiteral<1>;
|
|
12
|
+
providers: Type.TArray<Type.TObject<{
|
|
13
|
+
id: Type.TString;
|
|
14
|
+
label: Type.TString;
|
|
15
|
+
enabled: Type.TBoolean;
|
|
16
|
+
deferredTo: Type.TOptional<Type.TString>;
|
|
17
|
+
modelGlobs: Type.TArray<Type.TString>;
|
|
18
|
+
credentialEnvAny: Type.TArray<Type.TString>;
|
|
19
|
+
}>>;
|
|
20
|
+
}>;
|
|
21
|
+
export type CuratedRegistry = Static<typeof RegistrySchema>;
|
|
22
|
+
export type CuratedProvider = Static<typeof ProviderSchema>;
|
|
23
|
+
export interface LoadOptions {
|
|
24
|
+
registryPath?: string;
|
|
25
|
+
env?: NodeJS.ProcessEnv;
|
|
26
|
+
}
|
|
27
|
+
export interface SeedOutcome {
|
|
28
|
+
seeded: boolean;
|
|
29
|
+
path: string;
|
|
30
|
+
}
|
|
31
|
+
export interface SeedOptions {
|
|
32
|
+
projectRoot: string;
|
|
33
|
+
registry: CuratedRegistry;
|
|
34
|
+
now?: () => number;
|
|
35
|
+
}
|
|
36
|
+
declare function resolveRegistryPath(opts: LoadOptions): string;
|
|
37
|
+
export declare function loadRegistry(opts?: LoadOptions): CuratedRegistry;
|
|
38
|
+
declare function seededModelGlobs(registry: CuratedRegistry): string[];
|
|
39
|
+
declare function defaultGlob(registry: CuratedRegistry): string;
|
|
40
|
+
declare function seedFilePath(projectRoot: string): string;
|
|
41
|
+
export declare function seedEnabledModels(opts: SeedOptions): Promise<SeedOutcome>;
|
|
42
|
+
export declare function detectMissingCredentials(registry: CuratedRegistry, env?: NodeJS.ProcessEnv): string | null;
|
|
43
|
+
export declare const __test__: {
|
|
44
|
+
BUNDLED_PATH: string;
|
|
45
|
+
resolveRegistryPath: typeof resolveRegistryPath;
|
|
46
|
+
seedFilePath: typeof seedFilePath;
|
|
47
|
+
seededModelGlobs: typeof seededModelGlobs;
|
|
48
|
+
defaultGlob: typeof defaultGlob;
|
|
49
|
+
RegistrySchema: Type.TObject<{
|
|
50
|
+
version: Type.TLiteral<1>;
|
|
51
|
+
providers: Type.TArray<Type.TObject<{
|
|
52
|
+
id: Type.TString;
|
|
53
|
+
label: Type.TString;
|
|
54
|
+
enabled: Type.TBoolean;
|
|
55
|
+
deferredTo: Type.TOptional<Type.TString>;
|
|
56
|
+
modelGlobs: Type.TArray<Type.TString>;
|
|
57
|
+
credentialEnvAny: Type.TArray<Type.TString>;
|
|
58
|
+
}>>;
|
|
59
|
+
}>;
|
|
60
|
+
};
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Curated provider/model registry — FORGE-S16-T16 (issue #17).
|
|
2
|
+
//
|
|
3
|
+
// Loads forgecli's bundled registry/models.json (or a `FORGE_MODEL_REGISTRY`
|
|
4
|
+
// override), seeds project-scope `enabledModels` exactly once into
|
|
5
|
+
// `<projectRoot>/.forge/pi-settings.json`, and emits a missing-credentials
|
|
6
|
+
// banner naming the env vars the user can set. Global pi settings
|
|
7
|
+
// (`~/.pi/agent/settings.json`) are never read or written.
|
|
8
|
+
import { promises as fs, readFileSync } from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { Type } from "typebox";
|
|
12
|
+
import { Value } from "typebox/value";
|
|
13
|
+
const ProviderSchema = Type.Object({
|
|
14
|
+
id: Type.String({ minLength: 1 }),
|
|
15
|
+
label: Type.String({ minLength: 1 }),
|
|
16
|
+
enabled: Type.Boolean(),
|
|
17
|
+
deferredTo: Type.Optional(Type.String()),
|
|
18
|
+
modelGlobs: Type.Array(Type.String()),
|
|
19
|
+
credentialEnvAny: Type.Array(Type.String()),
|
|
20
|
+
});
|
|
21
|
+
const RegistrySchema = Type.Object({
|
|
22
|
+
version: Type.Literal(1),
|
|
23
|
+
providers: Type.Array(ProviderSchema, { minItems: 1 }),
|
|
24
|
+
});
|
|
25
|
+
const PKG_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "..");
|
|
26
|
+
const BUNDLED_PATH = path.join(PKG_ROOT, "registry", "models.json");
|
|
27
|
+
function resolveRegistryPath(opts) {
|
|
28
|
+
const env = opts.env ?? process.env;
|
|
29
|
+
if (opts.registryPath && opts.registryPath.length > 0)
|
|
30
|
+
return opts.registryPath;
|
|
31
|
+
const envOverride = env.FORGE_MODEL_REGISTRY;
|
|
32
|
+
if (typeof envOverride === "string" && envOverride.length > 0)
|
|
33
|
+
return envOverride;
|
|
34
|
+
return BUNDLED_PATH;
|
|
35
|
+
}
|
|
36
|
+
export function loadRegistry(opts = {}) {
|
|
37
|
+
const target = resolveRegistryPath(opts);
|
|
38
|
+
const raw = readFileSync(target, "utf8");
|
|
39
|
+
const parsed = JSON.parse(raw);
|
|
40
|
+
if (!Value.Check(RegistrySchema, parsed)) {
|
|
41
|
+
const errors = [...Value.Errors(RegistrySchema, parsed)]
|
|
42
|
+
.slice(0, 3)
|
|
43
|
+
.map((e) => e.message)
|
|
44
|
+
.join("; ");
|
|
45
|
+
throw new Error(`Invalid model registry at ${target}: ${errors || "schema check failed"}`);
|
|
46
|
+
}
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
49
|
+
function seededModelGlobs(registry) {
|
|
50
|
+
const out = [];
|
|
51
|
+
for (const p of registry.providers) {
|
|
52
|
+
if (!p.enabled)
|
|
53
|
+
continue;
|
|
54
|
+
for (const g of p.modelGlobs) {
|
|
55
|
+
if (!out.includes(g))
|
|
56
|
+
out.push(g);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
function defaultGlob(registry) {
|
|
62
|
+
for (const p of registry.providers) {
|
|
63
|
+
if (p.enabled && p.modelGlobs.length > 0)
|
|
64
|
+
return p.modelGlobs[0];
|
|
65
|
+
}
|
|
66
|
+
return "claude-*";
|
|
67
|
+
}
|
|
68
|
+
function seedFilePath(projectRoot) {
|
|
69
|
+
return path.join(projectRoot, ".forge", "pi-settings.json");
|
|
70
|
+
}
|
|
71
|
+
async function pathExists(p) {
|
|
72
|
+
try {
|
|
73
|
+
await fs.access(p);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function seedEnabledModels(opts) {
|
|
81
|
+
const target = seedFilePath(opts.projectRoot);
|
|
82
|
+
if (await pathExists(target)) {
|
|
83
|
+
return { seeded: false, path: target };
|
|
84
|
+
}
|
|
85
|
+
const now = opts.now ?? (() => Date.now());
|
|
86
|
+
const payload = {
|
|
87
|
+
schemaVersion: 1,
|
|
88
|
+
seededAt: now(),
|
|
89
|
+
seedSource: "@entelligentsia/forgecli registry v1",
|
|
90
|
+
enabledModels: seededModelGlobs(opts.registry),
|
|
91
|
+
defaultModelGlob: defaultGlob(opts.registry),
|
|
92
|
+
};
|
|
93
|
+
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
94
|
+
const tmp = `${target}.${process.pid}.${Date.now()}.tmp`;
|
|
95
|
+
await fs.writeFile(tmp, JSON.stringify(payload, null, 2), "utf8");
|
|
96
|
+
await fs.rename(tmp, target);
|
|
97
|
+
return { seeded: true, path: target };
|
|
98
|
+
}
|
|
99
|
+
const PRIMARY_ENV_KEYS = ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GEMINI_API_KEY", "OPENROUTER_API_KEY"];
|
|
100
|
+
export function detectMissingCredentials(registry, env = process.env) {
|
|
101
|
+
const requiring = registry.providers.filter((p) => p.enabled && p.credentialEnvAny.length > 0);
|
|
102
|
+
if (requiring.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
for (const p of requiring) {
|
|
105
|
+
for (const key of p.credentialEnvAny) {
|
|
106
|
+
const v = env[key];
|
|
107
|
+
if (typeof v === "string" && v.length > 0) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const lines = [
|
|
113
|
+
"forge — no provider credentials configured. Set one of:",
|
|
114
|
+
` ${PRIMARY_ENV_KEYS.join(", ")}`,
|
|
115
|
+
"(or run pi /login for OAuth providers).",
|
|
116
|
+
];
|
|
117
|
+
return lines.join("\n");
|
|
118
|
+
}
|
|
119
|
+
export const __test__ = {
|
|
120
|
+
BUNDLED_PATH,
|
|
121
|
+
resolveRegistryPath,
|
|
122
|
+
seedFilePath,
|
|
123
|
+
seededModelGlobs,
|
|
124
|
+
defaultGlob,
|
|
125
|
+
RegistrySchema,
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=model-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/config/model-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { MergedConfig } from "./config-layer.js";
|
|
2
|
+
export type { MergedConfig } from "./config-layer.js";
|
|
3
|
+
export type ResolveSource = "L4-inline" | "L4-name" | "L3" | "L2" | "L1" | "default" | "inherit";
|
|
4
|
+
export type LookupSource = "L3" | "L2" | "L1" | "default" | "missing";
|
|
5
|
+
export interface ResolveResult {
|
|
6
|
+
model: {
|
|
7
|
+
provider: string;
|
|
8
|
+
model: string;
|
|
9
|
+
} | undefined;
|
|
10
|
+
source: ResolveSource;
|
|
11
|
+
}
|
|
12
|
+
export interface LookupResult {
|
|
13
|
+
model: {
|
|
14
|
+
provider: string;
|
|
15
|
+
model: string;
|
|
16
|
+
} | undefined;
|
|
17
|
+
source: LookupSource;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Look up a persona-model name through L3 → L2 → L1 → default → missing.
|
|
21
|
+
* Used by resolveModelForPhase for L4-name resolution and direct persona lookups.
|
|
22
|
+
*/
|
|
23
|
+
export declare function lookupPersonaModel(personaName: string, pipelineName: string, merged: MergedConfig): LookupResult;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the {provider, model} pair for a specific phase invocation.
|
|
26
|
+
*
|
|
27
|
+
* Cascade order:
|
|
28
|
+
* L4-inline → L4-name → L3 → L2 → L1 → default persona-model → inherit
|
|
29
|
+
*
|
|
30
|
+
* When source is "inherit", model is undefined — caller must skip setModel.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveModelForPhase(pipelineName: string, phaseRole: string, personaNoun: string, merged: MergedConfig): ResolveResult;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
function toModel(pm) {
|
|
2
|
+
return { provider: pm.provider, model: pm.model };
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Look up a persona-model name through L3 → L2 → L1 → default → missing.
|
|
6
|
+
* Used by resolveModelForPhase for L4-name resolution and direct persona lookups.
|
|
7
|
+
*/
|
|
8
|
+
export function lookupPersonaModel(personaName, pipelineName, merged) {
|
|
9
|
+
// L3 — pipeline-level persona-models
|
|
10
|
+
const l3 = merged.pipelines?.[pipelineName]?.["persona-models"]?.[personaName];
|
|
11
|
+
if (l3)
|
|
12
|
+
return { model: toModel(l3), source: "L3" };
|
|
13
|
+
// L2 — project persona-models
|
|
14
|
+
const l2 = merged._project?.["persona-models"]?.[personaName];
|
|
15
|
+
if (l2)
|
|
16
|
+
return { model: toModel(l2), source: "L2" };
|
|
17
|
+
// L1 — global persona-models
|
|
18
|
+
const l1 = merged._global?.["persona-models"]?.[personaName];
|
|
19
|
+
if (l1)
|
|
20
|
+
return { model: toModel(l1), source: "L1" };
|
|
21
|
+
// default persona-model (same L3→L2→L1 walk with key="default")
|
|
22
|
+
if (personaName !== "default") {
|
|
23
|
+
const defL3 = merged.pipelines?.[pipelineName]?.["persona-models"]?.["default"];
|
|
24
|
+
if (defL3)
|
|
25
|
+
return { model: toModel(defL3), source: "default" };
|
|
26
|
+
const defL2 = merged._project?.["persona-models"]?.["default"];
|
|
27
|
+
if (defL2)
|
|
28
|
+
return { model: toModel(defL2), source: "default" };
|
|
29
|
+
const defL1 = merged._global?.["persona-models"]?.["default"];
|
|
30
|
+
if (defL1)
|
|
31
|
+
return { model: toModel(defL1), source: "default" };
|
|
32
|
+
}
|
|
33
|
+
return { model: undefined, source: "missing" };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the {provider, model} pair for a specific phase invocation.
|
|
37
|
+
*
|
|
38
|
+
* Cascade order:
|
|
39
|
+
* L4-inline → L4-name → L3 → L2 → L1 → default persona-model → inherit
|
|
40
|
+
*
|
|
41
|
+
* When source is "inherit", model is undefined — caller must skip setModel.
|
|
42
|
+
*/
|
|
43
|
+
export function resolveModelForPhase(pipelineName, phaseRole, personaNoun, merged) {
|
|
44
|
+
const phase = merged.pipelines?.[pipelineName]?.phases?.[phaseRole];
|
|
45
|
+
const override = phase?.["model-override"];
|
|
46
|
+
if (override !== undefined) {
|
|
47
|
+
// L4-inline: override is an inline {provider, model} object
|
|
48
|
+
if (typeof override === "object") {
|
|
49
|
+
return { model: toModel(override), source: "L4-inline" };
|
|
50
|
+
}
|
|
51
|
+
// L4-name: override is a persona-model key string
|
|
52
|
+
const named = lookupPersonaModel(override, pipelineName, merged);
|
|
53
|
+
if (named.source !== "missing") {
|
|
54
|
+
return { model: named.model, source: "L4-name" };
|
|
55
|
+
}
|
|
56
|
+
// L4-name miss: fall through with original personaNoun
|
|
57
|
+
}
|
|
58
|
+
// L3 → L2 → L1 → default → missing
|
|
59
|
+
const lookup = lookupPersonaModel(personaNoun, pipelineName, merged);
|
|
60
|
+
if (lookup.source === "missing") {
|
|
61
|
+
return { model: undefined, source: "inherit" };
|
|
62
|
+
}
|
|
63
|
+
return { model: lookup.model, source: lookup.source };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=model-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/config/model-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MergedConfig } from "./config-layer.js";
|
|
2
|
+
export type ValidationCode = "UNKNOWN_PERSONA" | "MODEL_UNAVAILABLE" | "UNKNOWN_PIPELINE" | "UNRESOLVABLE_OVERRIDE";
|
|
3
|
+
export interface ValidationIssue {
|
|
4
|
+
code: ValidationCode;
|
|
5
|
+
message: string;
|
|
6
|
+
/** JSON-pointer-style path to the offending config value */
|
|
7
|
+
path?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ValidationReport {
|
|
10
|
+
errors: ValidationIssue[];
|
|
11
|
+
warnings: ValidationIssue[];
|
|
12
|
+
}
|
|
13
|
+
type AvailableModel = {
|
|
14
|
+
provider: string;
|
|
15
|
+
id: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Validate the merged forge-cli model config against runtime catalogues.
|
|
19
|
+
*
|
|
20
|
+
* - strict=false: unavailability and unknown persona names are warnings.
|
|
21
|
+
* - strict=true: those warnings become errors.
|
|
22
|
+
* - Unknown pipeline names are always errors when pipelineCatalogue is non-null;
|
|
23
|
+
* warnings when pipelineCatalogue is null (no .forge/config.json found).
|
|
24
|
+
* - Unresolvable model-override strings are always errors.
|
|
25
|
+
*
|
|
26
|
+
* The function is pure — no I/O. Callers pass in the pre-built catalogues.
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateModelConfig(personaCatalogue: string[], pipelineCatalogue: string[] | null, merged: MergedConfig, availableModels: AvailableModel[], strict: boolean): ValidationReport;
|
|
29
|
+
export {};
|