@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,94 @@
|
|
|
1
|
+
import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
/**
|
|
3
|
+
* Structured Forge facts extracted from messagesToSummarize.
|
|
4
|
+
* All fields are arrays of strings for serialization into the compaction summary.
|
|
5
|
+
*/
|
|
6
|
+
export interface ForgeFactSummary {
|
|
7
|
+
/** FORGE-X-Y / FORGE-X-Y-TN patterns extracted from message text. */
|
|
8
|
+
storeIds: string[];
|
|
9
|
+
/** Lines containing [x] or [ ] checkbox patterns (Markdown task lists). */
|
|
10
|
+
acStateLines: string[];
|
|
11
|
+
/** Lines matching → <status> or update-status ... status <value>. */
|
|
12
|
+
transitionLines: string[];
|
|
13
|
+
/** File refs: engineering/, .forge/, *.ts/*.md/*.cjs/*.json paths. */
|
|
14
|
+
fileRefs: string[];
|
|
15
|
+
/** Text blocks containing [FRICTION] or type:friction. */
|
|
16
|
+
frictionBlocks: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Options for buildForgeCompactionFactory.
|
|
20
|
+
*/
|
|
21
|
+
export interface ForgeCompactionOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Absolute path to the project CWD (for warm-tier summary file lookup).
|
|
24
|
+
* When omitted, warm-tier merge is skipped unless summaryReader is provided.
|
|
25
|
+
*/
|
|
26
|
+
cwd?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Phase key for summary filename resolution (e.g. "architect/plan").
|
|
29
|
+
* When omitted, warm-tier merge is skipped.
|
|
30
|
+
*/
|
|
31
|
+
phaseKey?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Task/entity ID for summary path resolution (e.g. "FORGE-S30-T09").
|
|
34
|
+
* When omitted, warm-tier merge is skipped.
|
|
35
|
+
*/
|
|
36
|
+
entityId?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Sprint ID for summary path resolution (e.g. "FORGE-S30").
|
|
39
|
+
* When omitted, warm-tier merge is skipped.
|
|
40
|
+
*/
|
|
41
|
+
sprintId?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Injected summary reader (test seam). Receives the resolved summary
|
|
44
|
+
* file path (empty string when path resolution is skipped) and returns
|
|
45
|
+
* the raw JSON string or null. Defaults to fs.readFileSync.
|
|
46
|
+
* Must not throw — return null on any failure.
|
|
47
|
+
*/
|
|
48
|
+
summaryReader?: (filePath: string) => string | null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Extract structured Forge facts from an array of message-like objects.
|
|
52
|
+
*
|
|
53
|
+
* Pure function — no fs I/O, no LLM calls, provider-neutral.
|
|
54
|
+
* Accepts any array (unknown[]) to be safe against varying pi message shapes.
|
|
55
|
+
* Text content is extracted from `.content[].text` (assistant messages)
|
|
56
|
+
* and from direct string entries.
|
|
57
|
+
*
|
|
58
|
+
* @param messagesToSummarize Array of message-like objects from preparation.
|
|
59
|
+
* @param extractOpts Optional project-config parameters (FORGE-BUG-043 PR 2):
|
|
60
|
+
* prefix (store-ID prefix, default "FORGE") and
|
|
61
|
+
* engineeringPath (file-ref directory, default "engineering").
|
|
62
|
+
* Omitting them preserves the historical behaviour exactly.
|
|
63
|
+
* @returns ForgeFactSummary with all extracted patterns.
|
|
64
|
+
*/
|
|
65
|
+
export declare function extractForgeFacts(messagesToSummarize: unknown[], extractOpts?: {
|
|
66
|
+
prefix?: string;
|
|
67
|
+
engineeringPath?: string;
|
|
68
|
+
}): ForgeFactSummary;
|
|
69
|
+
/**
|
|
70
|
+
* Build an ExtensionFactory that registers a session_before_compact handler
|
|
71
|
+
* returning a deterministically-composed CompactionResult.
|
|
72
|
+
*
|
|
73
|
+
* The handler:
|
|
74
|
+
* 1. Validates that event.preparation is present and well-formed.
|
|
75
|
+
* 2. Extracts Forge facts from event.preparation.messagesToSummarize
|
|
76
|
+
* (no LLM call, provider-neutral).
|
|
77
|
+
* 3. Reads the warm-tier {PHASE}-SUMMARY.json if opts provide path context,
|
|
78
|
+
* or invokes opts.summaryReader("") as a test seam.
|
|
79
|
+
* 4. Assembles a compact structured summary string.
|
|
80
|
+
* 5. Returns { compaction: { summary, firstKeptEntryId, tokensBefore } }.
|
|
81
|
+
* 6. Returns undefined on any error (IL7 — lets pi compact normally).
|
|
82
|
+
*
|
|
83
|
+
* Pack 07: reads summary files but never writes .forge/store/.
|
|
84
|
+
* IL10: no pi-mono edits, no dispatch contract changes.
|
|
85
|
+
* Wired per-phase by run-task.ts via RunSubagentOptions.extensionFactories.
|
|
86
|
+
*
|
|
87
|
+
* Project config (store-ID prefix, paths.engineering) is loaded ONCE here at
|
|
88
|
+
* factory construction from `<opts.cwd>/.forge/config.json` — never per
|
|
89
|
+
* compaction event. Without cwd the historical defaults apply (FORGE-BUG-043 PR 2).
|
|
90
|
+
*
|
|
91
|
+
* @param opts ForgeCompactionOptions (default: empty — no warm-tier).
|
|
92
|
+
* @returns ExtensionFactory for passing to DefaultResourceLoader.extensionFactories.
|
|
93
|
+
*/
|
|
94
|
+
export declare function buildForgeCompactionFactory(opts?: ForgeCompactionOptions): ExtensionFactory;
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
// context-governor-compaction.ts — Mechanism E: Forge-aware compaction handler.
|
|
2
|
+
// FORGE-S30-T09
|
|
3
|
+
//
|
|
4
|
+
// Exports:
|
|
5
|
+
// ForgeFactSummary — extracted Forge facts struct
|
|
6
|
+
// ForgeCompactionOptions — options for the compaction factory
|
|
7
|
+
// extractForgeFacts(msgs) — pure extractor (no fs I/O)
|
|
8
|
+
// buildForgeCompactionFactory(opts) — ExtensionFactory builder
|
|
9
|
+
//
|
|
10
|
+
// Design:
|
|
11
|
+
// - Thin module separate from context-governor.ts so it can import ExtensionAPI
|
|
12
|
+
// types (which require the pi pkg) without polluting the pure-logic governor.
|
|
13
|
+
// - extractForgeFacts: line-level pattern matching — no LLM call, provider-neutral,
|
|
14
|
+
// lossless on structured facts.
|
|
15
|
+
// - Warm-tier merge: reads {PHASE}-SUMMARY.json via injected summaryReader
|
|
16
|
+
// (defaults to fs.readFileSync). Best-effort — absent/malformed files silently
|
|
17
|
+
// skipped (IL7).
|
|
18
|
+
// - IL7 fallback: entire session_before_compact handler wrapped in try/catch.
|
|
19
|
+
// On any error, returns undefined — lets pi compact normally with generateSummary.
|
|
20
|
+
// - IL10/Pack 07: only reads summary files, never writes .forge/store/ or summaries.
|
|
21
|
+
// - Wired per-phase by run-task.ts (FORGE_CTX_GOVERNOR=1) with cwd/phaseKey/
|
|
22
|
+
// entityId/sprintId opts; project config (prefix, paths.engineering) loads
|
|
23
|
+
// once at factory construction (FORGE-BUG-043 PR 2).
|
|
24
|
+
import * as fs from "node:fs";
|
|
25
|
+
import * as path from "node:path";
|
|
26
|
+
import { loadGovernorProjectConfig } from "./governor-config.js";
|
|
27
|
+
import { summaryFilenameFor } from "./phase-vocab.js";
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Pattern builders (parameterized by project config — FORGE-BUG-043 PR 2)
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/**
|
|
32
|
+
* Build the store-ID pattern for a project prefix. Standard forms:
|
|
33
|
+
* <P>-S30-T09 (sprint+task)
|
|
34
|
+
* <P>-S30 (sprint)
|
|
35
|
+
* <P>-BUG-042 (bug, with category letters + digit suffix)
|
|
36
|
+
* Pattern: prefix followed by alternating ALPHANUM segments separated by
|
|
37
|
+
* hyphens; two variants ordered longest-first so overlapping (sprint+task
|
|
38
|
+
* before sprint) works.
|
|
39
|
+
*
|
|
40
|
+
* The prefix was previously the literal "FORGE", so any project with a
|
|
41
|
+
* different project.prefix (e.g. CART) extracted zero store IDs (FORGE-BUG-043).
|
|
42
|
+
* The prefix is identifier-validated by loadGovernorProjectConfig before it
|
|
43
|
+
* reaches this builder; escaping here is defence in depth.
|
|
44
|
+
*/
|
|
45
|
+
function buildStoreIdRe(prefix) {
|
|
46
|
+
const p = prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
47
|
+
return new RegExp(`${p}-[A-Z]+\\d*-(?:T?\\d+|[A-Z]+\\d*)|${p}-[A-Z]+\\d*`, "g");
|
|
48
|
+
}
|
|
49
|
+
/** Matches Markdown checkbox lines. */
|
|
50
|
+
const CHECKBOX_RE = /^\s*[-*]?\s*\[[ xX]\].*$/gm;
|
|
51
|
+
/** Matches status transition patterns:
|
|
52
|
+
* - Arrow: "→ implemented"
|
|
53
|
+
* - store-cli: "update-status task FORGE-S30-T09 status implementing"
|
|
54
|
+
* Using a broad match to capture both forms reliably. */
|
|
55
|
+
const TRANSITION_RE = /(?:→\s*[\w][\w-]*|update-status\s+\S+\s+\S+\s+status\s+[\w][\w-]*)/g;
|
|
56
|
+
/**
|
|
57
|
+
* Build the file-reference pattern. The engineering directory segment comes
|
|
58
|
+
* from paths.engineering (default "engineering"); `.forge/` is the product's
|
|
59
|
+
* fixed instance directory (it hosts config.json itself) and stays literal.
|
|
60
|
+
*/
|
|
61
|
+
function buildFileRefRe(engineeringPath) {
|
|
62
|
+
const e = engineeringPath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
63
|
+
return new RegExp(`(?:${e}\\/[^\\s"'\`,;)]+|\\.forge\\/[^\\s"'\`,;)]+|\\b[\\w./\\-]+\\.(?:ts|md|cjs|json)\\b)`, "g");
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// extractForgeFacts — pure extractor
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Extract structured Forge facts from an array of message-like objects.
|
|
70
|
+
*
|
|
71
|
+
* Pure function — no fs I/O, no LLM calls, provider-neutral.
|
|
72
|
+
* Accepts any array (unknown[]) to be safe against varying pi message shapes.
|
|
73
|
+
* Text content is extracted from `.content[].text` (assistant messages)
|
|
74
|
+
* and from direct string entries.
|
|
75
|
+
*
|
|
76
|
+
* @param messagesToSummarize Array of message-like objects from preparation.
|
|
77
|
+
* @param extractOpts Optional project-config parameters (FORGE-BUG-043 PR 2):
|
|
78
|
+
* prefix (store-ID prefix, default "FORGE") and
|
|
79
|
+
* engineeringPath (file-ref directory, default "engineering").
|
|
80
|
+
* Omitting them preserves the historical behaviour exactly.
|
|
81
|
+
* @returns ForgeFactSummary with all extracted patterns.
|
|
82
|
+
*/
|
|
83
|
+
export function extractForgeFacts(messagesToSummarize, extractOpts) {
|
|
84
|
+
const storeIdRe = buildStoreIdRe(extractOpts?.prefix ?? "FORGE");
|
|
85
|
+
const fileRefRe = buildFileRefRe(extractOpts?.engineeringPath ?? "engineering");
|
|
86
|
+
const storeIdSet = new Set();
|
|
87
|
+
const acStateLines = [];
|
|
88
|
+
const transitionLineSet = new Set();
|
|
89
|
+
const fileRefSet = new Set();
|
|
90
|
+
const frictionBlocks = [];
|
|
91
|
+
for (const msg of messagesToSummarize) {
|
|
92
|
+
const texts = extractTextContent(msg);
|
|
93
|
+
for (const text of texts) {
|
|
94
|
+
// Store IDs — fresh RegExp per text so lastIndex never leaks
|
|
95
|
+
const storeMatches = text.matchAll(new RegExp(storeIdRe.source, "g"));
|
|
96
|
+
for (const m of storeMatches) {
|
|
97
|
+
storeIdSet.add(m[0]);
|
|
98
|
+
}
|
|
99
|
+
// AC-state checkbox lines
|
|
100
|
+
const checkboxMatches = text.match(new RegExp(CHECKBOX_RE.source, "gm"));
|
|
101
|
+
if (checkboxMatches) {
|
|
102
|
+
for (const line of checkboxMatches) {
|
|
103
|
+
acStateLines.push(line.trim());
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Transition lines
|
|
107
|
+
const transitionMatches = text.matchAll(new RegExp(TRANSITION_RE.source, "g"));
|
|
108
|
+
for (const m of transitionMatches) {
|
|
109
|
+
transitionLineSet.add(m[0].trim());
|
|
110
|
+
}
|
|
111
|
+
// File refs
|
|
112
|
+
const fileRefMatches = text.matchAll(new RegExp(fileRefRe.source, "g"));
|
|
113
|
+
for (const m of fileRefMatches) {
|
|
114
|
+
const ref = m[0].trim();
|
|
115
|
+
if (ref.length > 2) {
|
|
116
|
+
fileRefSet.add(ref);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// FRICTION blocks — scan per line
|
|
120
|
+
for (const line of text.split("\n")) {
|
|
121
|
+
if (/\[FRICTION\]|type:friction/i.test(line)) {
|
|
122
|
+
frictionBlocks.push(line.trim());
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
storeIds: Array.from(storeIdSet),
|
|
129
|
+
acStateLines,
|
|
130
|
+
transitionLines: Array.from(transitionLineSet),
|
|
131
|
+
fileRefs: Array.from(fileRefSet),
|
|
132
|
+
frictionBlocks,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Extract text strings from a message-like object.
|
|
137
|
+
* Handles assistant messages (content[].text) and plain strings.
|
|
138
|
+
*/
|
|
139
|
+
function extractTextContent(msg) {
|
|
140
|
+
if (typeof msg === "string") {
|
|
141
|
+
return [msg];
|
|
142
|
+
}
|
|
143
|
+
if (typeof msg !== "object" || msg === null) {
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
const msgObj = msg;
|
|
147
|
+
const content = msgObj["content"];
|
|
148
|
+
if (!Array.isArray(content)) {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
const texts = [];
|
|
152
|
+
for (const part of content) {
|
|
153
|
+
if (typeof part === "string") {
|
|
154
|
+
texts.push(part);
|
|
155
|
+
}
|
|
156
|
+
else if (typeof part === "object" && part !== null) {
|
|
157
|
+
const p = part;
|
|
158
|
+
if (p["type"] === "text" && typeof p["text"] === "string") {
|
|
159
|
+
texts.push(p["text"]);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return texts;
|
|
164
|
+
}
|
|
165
|
+
/** Default summaryReader: synchronous fs.readFileSync. Returns null on any error. */
|
|
166
|
+
function defaultSummaryReader(filePath) {
|
|
167
|
+
try {
|
|
168
|
+
return fs.readFileSync(filePath, "utf-8");
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Read and parse the warm-tier {PHASE}-SUMMARY.json (synchronous).
|
|
176
|
+
* Returns the parsed object or null on any failure (IL7).
|
|
177
|
+
*
|
|
178
|
+
* The summary filename comes from phase-vocab (mirror of the plugin's
|
|
179
|
+
* artifact-kinds.cjs catalog — FORGE-BUG-043). Unknown phase keys and phases
|
|
180
|
+
* without a summary artifact skip the warm-tier read entirely; no placeholder
|
|
181
|
+
* paths are ever constructed.
|
|
182
|
+
*
|
|
183
|
+
* When summaryReader is provided but cwd/phaseKey/entityId/sprintId are not,
|
|
184
|
+
* calls summaryReader("") — enables test seams that don't need path resolution.
|
|
185
|
+
*/
|
|
186
|
+
function readWarmTierSummary(opts, engineeringPath) {
|
|
187
|
+
try {
|
|
188
|
+
let filePath;
|
|
189
|
+
const reader = opts.summaryReader ?? defaultSummaryReader;
|
|
190
|
+
if (opts.cwd && opts.phaseKey && opts.entityId && opts.sprintId) {
|
|
191
|
+
const filename = summaryFilenameFor(opts.phaseKey);
|
|
192
|
+
if (filename === null)
|
|
193
|
+
return null; // unknown key / no artifact — skip warm tier
|
|
194
|
+
filePath = path.join(opts.cwd, engineeringPath, "sprints", opts.sprintId, opts.entityId, filename);
|
|
195
|
+
}
|
|
196
|
+
else if (opts.summaryReader) {
|
|
197
|
+
// Test seam: summaryReader present but no path context — call with empty string.
|
|
198
|
+
filePath = "";
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
const raw = reader(filePath);
|
|
204
|
+
if (!raw)
|
|
205
|
+
return null;
|
|
206
|
+
const parsed = JSON.parse(raw);
|
|
207
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
208
|
+
return null;
|
|
209
|
+
return parsed;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// Summary assembly
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
/**
|
|
219
|
+
* Assemble a compact structured summary string from extracted facts
|
|
220
|
+
* and an optional warm-tier summary.
|
|
221
|
+
*/
|
|
222
|
+
function assembleSummary(facts, warmTier) {
|
|
223
|
+
const parts = [];
|
|
224
|
+
// Warm-tier objective (highest information density — prepend).
|
|
225
|
+
if (warmTier?.objective) {
|
|
226
|
+
parts.push(`## Phase Objective\n${warmTier.objective}`);
|
|
227
|
+
}
|
|
228
|
+
// Warm-tier key changes.
|
|
229
|
+
if (warmTier?.key_changes && warmTier.key_changes.length > 0) {
|
|
230
|
+
parts.push(`## Key Changes\n${warmTier.key_changes.map((c) => `- ${c}`).join("\n")}`);
|
|
231
|
+
}
|
|
232
|
+
// Extracted store IDs.
|
|
233
|
+
if (facts.storeIds.length > 0) {
|
|
234
|
+
parts.push(`## Active Store IDs\n${facts.storeIds.join(", ")}`);
|
|
235
|
+
}
|
|
236
|
+
// AC state (checkboxes — capped at 10).
|
|
237
|
+
if (facts.acStateLines.length > 0) {
|
|
238
|
+
const sample = facts.acStateLines.slice(0, 10);
|
|
239
|
+
parts.push(`## Acceptance Criteria State\n${sample.join("\n")}`);
|
|
240
|
+
}
|
|
241
|
+
// Transitions (capped at 5).
|
|
242
|
+
if (facts.transitionLines.length > 0) {
|
|
243
|
+
const sample = facts.transitionLines.slice(0, 5);
|
|
244
|
+
parts.push(`## Status Transitions\n${sample.join("\n")}`);
|
|
245
|
+
}
|
|
246
|
+
// File refs (capped at 10).
|
|
247
|
+
if (facts.fileRefs.length > 0) {
|
|
248
|
+
const sample = facts.fileRefs.slice(0, 10);
|
|
249
|
+
parts.push(`## File References\n${sample.join("\n")}`);
|
|
250
|
+
}
|
|
251
|
+
// FRICTION blocks.
|
|
252
|
+
if (facts.frictionBlocks.length > 0) {
|
|
253
|
+
parts.push(`## FRICTION\n${facts.frictionBlocks.join("\n")}`);
|
|
254
|
+
}
|
|
255
|
+
if (parts.length === 0) {
|
|
256
|
+
return "[Forge context governor — compaction summary — no structured facts extracted]";
|
|
257
|
+
}
|
|
258
|
+
return `[Forge context governor — compaction summary]\n\n${parts.join("\n\n")}`;
|
|
259
|
+
}
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
// buildForgeCompactionFactory — ExtensionFactory builder
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
/**
|
|
264
|
+
* Build an ExtensionFactory that registers a session_before_compact handler
|
|
265
|
+
* returning a deterministically-composed CompactionResult.
|
|
266
|
+
*
|
|
267
|
+
* The handler:
|
|
268
|
+
* 1. Validates that event.preparation is present and well-formed.
|
|
269
|
+
* 2. Extracts Forge facts from event.preparation.messagesToSummarize
|
|
270
|
+
* (no LLM call, provider-neutral).
|
|
271
|
+
* 3. Reads the warm-tier {PHASE}-SUMMARY.json if opts provide path context,
|
|
272
|
+
* or invokes opts.summaryReader("") as a test seam.
|
|
273
|
+
* 4. Assembles a compact structured summary string.
|
|
274
|
+
* 5. Returns { compaction: { summary, firstKeptEntryId, tokensBefore } }.
|
|
275
|
+
* 6. Returns undefined on any error (IL7 — lets pi compact normally).
|
|
276
|
+
*
|
|
277
|
+
* Pack 07: reads summary files but never writes .forge/store/.
|
|
278
|
+
* IL10: no pi-mono edits, no dispatch contract changes.
|
|
279
|
+
* Wired per-phase by run-task.ts via RunSubagentOptions.extensionFactories.
|
|
280
|
+
*
|
|
281
|
+
* Project config (store-ID prefix, paths.engineering) is loaded ONCE here at
|
|
282
|
+
* factory construction from `<opts.cwd>/.forge/config.json` — never per
|
|
283
|
+
* compaction event. Without cwd the historical defaults apply (FORGE-BUG-043 PR 2).
|
|
284
|
+
*
|
|
285
|
+
* @param opts ForgeCompactionOptions (default: empty — no warm-tier).
|
|
286
|
+
* @returns ExtensionFactory for passing to DefaultResourceLoader.extensionFactories.
|
|
287
|
+
*/
|
|
288
|
+
export function buildForgeCompactionFactory(opts = {}) {
|
|
289
|
+
const projectConfig = loadGovernorProjectConfig(opts.cwd);
|
|
290
|
+
return (pi) => {
|
|
291
|
+
pi.on("session_before_compact", (event) => {
|
|
292
|
+
try {
|
|
293
|
+
// Validate preparation is present and has the required pass-through fields.
|
|
294
|
+
const prep = event?.preparation;
|
|
295
|
+
if (!prep || typeof prep !== "object") {
|
|
296
|
+
return undefined; // IL7 — malformed preparation
|
|
297
|
+
}
|
|
298
|
+
const { firstKeptEntryId, tokensBefore, messagesToSummarize } = prep;
|
|
299
|
+
if (typeof firstKeptEntryId !== "string" || typeof tokensBefore !== "number") {
|
|
300
|
+
return undefined; // IL7 — malformed preparation fields
|
|
301
|
+
}
|
|
302
|
+
// Extract Forge facts from message history (patterns built from
|
|
303
|
+
// the project config loaded at factory construction).
|
|
304
|
+
const msgs = Array.isArray(messagesToSummarize) ? messagesToSummarize : [];
|
|
305
|
+
const facts = extractForgeFacts(msgs, {
|
|
306
|
+
prefix: projectConfig.prefix,
|
|
307
|
+
engineeringPath: projectConfig.engineeringPath,
|
|
308
|
+
});
|
|
309
|
+
// Read warm-tier summary (best-effort, IL7).
|
|
310
|
+
const warmTier = readWarmTierSummary(opts, projectConfig.engineeringPath);
|
|
311
|
+
// Assemble summary string.
|
|
312
|
+
const summary = assembleSummary(facts, warmTier);
|
|
313
|
+
const compaction = {
|
|
314
|
+
summary,
|
|
315
|
+
firstKeptEntryId,
|
|
316
|
+
tokensBefore,
|
|
317
|
+
};
|
|
318
|
+
return { compaction };
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
// IL7: unexpected error → return undefined, let pi compact normally.
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=context-governor-compaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-governor-compaction.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/context-governor-compaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { ExtensionContext, ExtensionFactory, ToolCallEvent, ToolCallEventResult, ToolResultEvent } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { ModelRegistry } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
/**
|
|
4
|
+
* Return type for tool_result pi handlers — matches ToolResultEventResult from
|
|
5
|
+
* @earendil-works/pi-coding-agent (not exported from the package root).
|
|
6
|
+
* Structural equivalence is sufficient for TypeScript assignability.
|
|
7
|
+
*/
|
|
8
|
+
export interface ToolResultEventResult {
|
|
9
|
+
content?: Array<{
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: "image";
|
|
14
|
+
source: unknown;
|
|
15
|
+
}>;
|
|
16
|
+
details?: unknown;
|
|
17
|
+
isError?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Policy for a single persona/phase combination.
|
|
21
|
+
*
|
|
22
|
+
* residentFields — names of task/sprint record fields that are always retained
|
|
23
|
+
* in context (not trimmed by Mechanism A).
|
|
24
|
+
* toolBudgets — per-tool soft token budget caps (keyed by tool name).
|
|
25
|
+
* T04 reads these when deciding how aggressively to trim tool_result content.
|
|
26
|
+
* steerThreshold — fraction of contextWindow at which Mechanism B fires a
|
|
27
|
+
* budget-steer note (0–1; e.g. 0.80 = steer when 80% of window is used).
|
|
28
|
+
*/
|
|
29
|
+
export interface PhasePolicy {
|
|
30
|
+
residentFields: string[];
|
|
31
|
+
toolBudgets: Record<string, number>;
|
|
32
|
+
steerThreshold: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Lookup table keyed by `"${persona}/${phase}"` (e.g. `"architect/plan"`,
|
|
36
|
+
* `"engineer/review"`) plus a `"default"` entry for unknown combinations.
|
|
37
|
+
*/
|
|
38
|
+
export type PhasePolicyTable = Record<string, PhasePolicy>;
|
|
39
|
+
/**
|
|
40
|
+
* Governor interface wired into hook-dispatcher.ts.
|
|
41
|
+
* T03: both methods return undefined/void (no-op). T04 supplies live curation
|
|
42
|
+
* logic via createGovernor.
|
|
43
|
+
*
|
|
44
|
+
* MUST NOT throw — IL7. Any internal failure must return undefined silently.
|
|
45
|
+
*/
|
|
46
|
+
export interface ContextGovernor {
|
|
47
|
+
/**
|
|
48
|
+
* Called after the triage-error block in the tool_result handler.
|
|
49
|
+
* Return a ToolResultEventResult to replace the event content, or undefined
|
|
50
|
+
* to pass through unchanged.
|
|
51
|
+
*/
|
|
52
|
+
applyToolResult(event: ToolResultEvent, ctx: ExtensionContext): ToolResultEventResult | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Called at the tail of the tool_call handler (after all existing guards).
|
|
55
|
+
* Return a ToolCallEventResult to block or modify the call, or undefined/void
|
|
56
|
+
* to pass through unchanged.
|
|
57
|
+
*/
|
|
58
|
+
applyToolCall(event: ToolCallEvent, ctx: ExtensionContext): ToolCallEventResult | void;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns a ContextGovernor whose methods are pure pass-throughs.
|
|
62
|
+
* Used as the default in registerHookDispatcher so existing callers that do
|
|
63
|
+
* not pass a governor see zero behavioural change.
|
|
64
|
+
*/
|
|
65
|
+
export declare function createNoOpGovernor(): ContextGovernor;
|
|
66
|
+
/**
|
|
67
|
+
* Create a governor backed by the given policy table and model registry.
|
|
68
|
+
*
|
|
69
|
+
* Implements Mechanism A curation rules (T04):
|
|
70
|
+
* Rule 1 — Dedup/reference-ize
|
|
71
|
+
* Rule 2 — Schema-trim (forge_store results)
|
|
72
|
+
* Rule 3 — Span-clamp (bash/grep/find/read results)
|
|
73
|
+
*
|
|
74
|
+
* Implements Mechanism B (T05):
|
|
75
|
+
* Budget meter: per-turn ctx.getContextUsage() → ctx.ui.setStatus("forge:ctx-budget", ...)
|
|
76
|
+
* Steer: one-shot note at policy.steerThreshold, injected via steerFn
|
|
77
|
+
*
|
|
78
|
+
* Implements Mechanism C (T06):
|
|
79
|
+
* Checkpoint-and-shed: forge_store results for summarized entities are evicted
|
|
80
|
+
* and replaced with an eviction pointer; unsummarized material is retained.
|
|
81
|
+
* Shed criterion: summarySentinel(phaseKey, entityId) returns true.
|
|
82
|
+
*
|
|
83
|
+
* @param table Phase-policy table (keyed by "persona/phase").
|
|
84
|
+
* @param _modelRegistry Model registry (fallback contextWindow resolution only).
|
|
85
|
+
* @param steerFn Optional callback injected at construction by registerHookDispatcher.
|
|
86
|
+
* Receives the steer message string; called at most once per governor
|
|
87
|
+
* instance (single-fire invariant). Callers that omit this see no steer.
|
|
88
|
+
* @param summarySentinel Optional read-only probe injected at construction (Mechanism C / T06).
|
|
89
|
+
* Receives (phaseKey, entityId); returns true when a {PHASE}-SUMMARY.json
|
|
90
|
+
* has been durably written for that entity. When true, the forge_store result
|
|
91
|
+
* is replaced with an eviction pointer. Callers that omit this param see no
|
|
92
|
+
* shedding (backwards-compatible; undefined default).
|
|
93
|
+
* The sentinel MUST NOT write to .forge/store/ or the summary itself (Pack 07).
|
|
94
|
+
* Errors inside the sentinel are silently caught and cause retain, not eviction (IL7).
|
|
95
|
+
*
|
|
96
|
+
* contextWindow resolution (provider-neutral): usage.contextWindow from
|
|
97
|
+
* ctx.getContextUsage(), used directly when available; otherwise the budget
|
|
98
|
+
* meter is cleared for the turn and no steer/compact decision is made.
|
|
99
|
+
* @param compactFn opt callback injected at construction (Mechanism E / T09).
|
|
100
|
+
* Called proactively once when fraction >= policy.steerThreshold,
|
|
101
|
+
* via a single-fire `compactFired` flag distinct from `steerFired`.
|
|
102
|
+
* Callers pass `compactFn = () => session.compact()`. Errors inside
|
|
103
|
+
* compactFn are caught and written to stderr (IL7). Omitting this
|
|
104
|
+
* param is backwards-compatible — no compact trigger fires.
|
|
105
|
+
* @param phaseKey opt construction-time phase key override ("persona/role").
|
|
106
|
+
* Production paths MUST pass this (via buildGovernorFactory) —
|
|
107
|
+
* pi never populates persona/phase on ExtensionContext, so the
|
|
108
|
+
* ctx probe always resolves "default" at runtime. Omitting it
|
|
109
|
+
* preserves the legacy ctx-probe behaviour (test harnesses).
|
|
110
|
+
*/
|
|
111
|
+
export declare function createGovernor(table: PhasePolicyTable, _modelRegistry: ModelRegistry, steerFn?: (message: string) => void, summarySentinel?: (phaseKey: string, entityId: string) => boolean, compactFn?: () => void, phaseKey?: string): ContextGovernor;
|
|
112
|
+
/**
|
|
113
|
+
* Load the built-in phase-policy table.
|
|
114
|
+
*
|
|
115
|
+
* Ships an entry for every governed run-task PHASE_PIPELINE key
|
|
116
|
+
* (`${personaNoun}/${role}` — engineer/plan, supervisor/review-plan,
|
|
117
|
+
* engineer/implement, supervisor/review-code, qa-engineer/validate,
|
|
118
|
+
* architect/approve) plus "default" for any unlisted persona/phase.
|
|
119
|
+
* writeback/commit intentionally stay on "default" — small phases whose
|
|
120
|
+
* git/store output must not be clamped.
|
|
121
|
+
*
|
|
122
|
+
* `read` budgets are deliberately more generous than `bash` — clamping file
|
|
123
|
+
* reads too tightly degrades implement/review quality (the agent cannot see
|
|
124
|
+
* whole files), while bash output (store-cli reads, test logs, greps) is the
|
|
125
|
+
* dominant context bloat observed in the CART-S02-T03 baseline.
|
|
126
|
+
*
|
|
127
|
+
* Legacy design-time keys ("architect/plan", "engineer/review") are retained
|
|
128
|
+
* for existing test fixtures; the pipeline never produces them.
|
|
129
|
+
*
|
|
130
|
+
* Values are conservative design-time decisions; a future task can promote
|
|
131
|
+
* specific fields to project config once per-project tuning evidence exists.
|
|
132
|
+
*/
|
|
133
|
+
export declare function loadDefaultPolicyTable(): PhasePolicyTable;
|
|
134
|
+
/** Options for buildGovernorFactory. */
|
|
135
|
+
export interface GovernorFactoryOptions {
|
|
136
|
+
/**
|
|
137
|
+
* Pipeline phase key, `${personaNoun}/${role}` (e.g. "supervisor/review-code").
|
|
138
|
+
* Known to run-task.ts at dispatch time; injected here because pi never
|
|
139
|
+
* populates persona/phase on ExtensionContext.
|
|
140
|
+
*/
|
|
141
|
+
phaseKey: string;
|
|
142
|
+
/** Project cwd — root containing `.forge/store/` (sentinel reads only). */
|
|
143
|
+
cwd: string;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Build an ExtensionFactory that registers a fully-wired context governor in a
|
|
147
|
+
* subagent session. Constructed per-phase by run-task.ts (which knows the
|
|
148
|
+
* persona/role) and passed via RunSubagentOptions.extensionFactories —
|
|
149
|
+
* the same injection channel as buildForgeCompactionFactory (Mechanism E).
|
|
150
|
+
*
|
|
151
|
+
* This is the production wiring the original FORGE-S30-T07 integration missed:
|
|
152
|
+
* registerHookDispatcher(pi, …, governor) in index.ts only governs the PARENT
|
|
153
|
+
* session, while every phase runs in an isolated createAgentSession subagent
|
|
154
|
+
* that the parent's hooks never see. The CART-S02-T03 benchmark confirmed the
|
|
155
|
+
* result: zero curation markers across a full FORGE_CTX_GOVERNOR=1 phase.
|
|
156
|
+
*
|
|
157
|
+
* Wiring supplied here:
|
|
158
|
+
* phaseKey — construction-time (Mechanism D policies finally reachable)
|
|
159
|
+
* steerFn — pi.sendUserMessage(msg, { deliverAs: "steer" }) (Mechanism B)
|
|
160
|
+
* summarySentinel — storeSummarySentinel against .forge/store/ (Mechanism C)
|
|
161
|
+
* compactFn — ctx.compact() proactive trigger (Mechanism E)
|
|
162
|
+
*
|
|
163
|
+
* steer uses the session-scoped ExtensionAPI directly; compact rides the
|
|
164
|
+
* ExtensionContext captured at the start of each handler invocation — it only
|
|
165
|
+
* fires synchronously inside applyToolResult, so the captured ctx is always
|
|
166
|
+
* the live one. All callbacks are guarded: failures fall through silently
|
|
167
|
+
* (IL7); the factory never writes to .forge/store/ (Pack 07).
|
|
168
|
+
*/
|
|
169
|
+
export declare function buildGovernorFactory(opts: GovernorFactoryOptions): ExtensionFactory;
|