@entelligentsia/forgecli 1.0.20 → 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 +43 -0
- package/README.md +7 -1
- 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-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 +13 -2
- package/dist/extensions/forgecli/context-governor-compaction.js +66 -41
- package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -1
- package/dist/extensions/forgecli/context-governor.d.ts +3 -7
- package/dist/extensions/forgecli/context-governor.js +43 -69
- package/dist/extensions/forgecli/context-governor.js.map +1 -1
- package/dist/extensions/forgecli/dashboard/component.d.ts +10 -1
- package/dist/extensions/forgecli/dashboard/component.js +84 -18
- package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
- package/dist/extensions/forgecli/dashboard/register.js +1 -1
- package/dist/extensions/forgecli/dashboard/register.js.map +1 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js +1 -1
- 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 +22 -0
- package/dist/extensions/forgecli/forge-subagent.js +42 -15
- 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 +6 -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.js +2 -2
- 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 +37 -35
- 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/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-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/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/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/package.json +4 -2
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { BrowseAction, BrowseState } from "../state/model.js";
|
|
3
|
+
export type InputResult = {
|
|
4
|
+
kind: "consumed";
|
|
5
|
+
} | {
|
|
6
|
+
kind: "no-op";
|
|
7
|
+
} | {
|
|
8
|
+
kind: "dispatch";
|
|
9
|
+
action: BrowseAction;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "dispatch-seq";
|
|
12
|
+
actions: BrowseAction[];
|
|
13
|
+
} | {
|
|
14
|
+
kind: "quit";
|
|
15
|
+
} | {
|
|
16
|
+
kind: "error";
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
export interface Screen {
|
|
20
|
+
render(state: BrowseState, width: number, theme: Theme): string[];
|
|
21
|
+
handleInput(data: string, state: BrowseState): InputResult;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/transcripts-tui/screens/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,4EAA4E"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { BrowseAction, BrowseFilters, BrowseState, KindFilter, ListRow, OutcomeFilter, SinceFilter, } from "./model.js";
|
|
2
|
+
export { type BrowseInitOptions, initialBrowseState } from "./init.js";
|
|
3
|
+
export { reducer } from "./reducer.js";
|
|
4
|
+
export { activeFilterSummary, filteredRows, nextKind, nextOutcome, nextProject, nextSince, } from "./selectors.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Barrel for the browse-TUI state layer.
|
|
2
|
+
export { initialBrowseState } from "./init.js";
|
|
3
|
+
export { reducer } from "./reducer.js";
|
|
4
|
+
export { activeFilterSummary, filteredRows, nextKind, nextOutcome, nextProject, nextSince, } from "./selectors.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/transcripts-tui/state/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAWzC,OAAO,EAA0B,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACN,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,SAAS,GACT,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BrowseState, ListRow } from "./model.js";
|
|
2
|
+
export interface BrowseInitOptions {
|
|
3
|
+
rows: ListRow[];
|
|
4
|
+
knownProjects: string[];
|
|
5
|
+
/** Test seam; defaults to Date.now(). */
|
|
6
|
+
now?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function initialBrowseState(opts: BrowseInitOptions): BrowseState;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Initial browse state. Pure — the caller does the archive I/O
|
|
2
|
+
// (collectListRows / readProjects) and hands the data in.
|
|
3
|
+
export function initialBrowseState(opts) {
|
|
4
|
+
return {
|
|
5
|
+
// Most recent first, guaranteed here rather than trusted from the
|
|
6
|
+
// caller — ISO startedAt compares lexicographically as time.
|
|
7
|
+
rows: [...opts.rows].sort((a, b) => b.startedAt.localeCompare(a.startedAt)),
|
|
8
|
+
knownProjects: opts.knownProjects,
|
|
9
|
+
cursor: 0,
|
|
10
|
+
filters: { kind: "all", outcome: "all", projectKey: null, sinceDays: null },
|
|
11
|
+
searchActive: false,
|
|
12
|
+
searchQuery: "",
|
|
13
|
+
shouldExit: false,
|
|
14
|
+
selectedRunId: null,
|
|
15
|
+
now: opts.now ?? Date.now(),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/transcripts-tui/state/init.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,0DAA0D;AAW1D,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACzD,OAAO;QACN,kEAAkE;QAClE,6DAA6D;QAC7D,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3E,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;QAC3E,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,KAAK;QACjB,aAAa,EAAE,IAAI;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;KAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ListRow } from "../../commands/transcripts-command.js";
|
|
2
|
+
export type { ListRow };
|
|
3
|
+
export type KindFilter = "all" | "task" | "bug" | "sprint";
|
|
4
|
+
export type OutcomeFilter = "all" | "complete" | "halted" | "error" | "incomplete" | "cancelled";
|
|
5
|
+
/** Recency window in days; null = no limit. Cycles 7 → 30 → 90 → null. */
|
|
6
|
+
export type SinceFilter = 7 | 30 | 90 | null;
|
|
7
|
+
export interface BrowseFilters {
|
|
8
|
+
kind: KindFilter;
|
|
9
|
+
outcome: OutcomeFilter;
|
|
10
|
+
/** Project key to pin, or null for all projects. */
|
|
11
|
+
projectKey: string | null;
|
|
12
|
+
sinceDays: SinceFilter;
|
|
13
|
+
}
|
|
14
|
+
export interface BrowseState {
|
|
15
|
+
/** All archived runs, loaded once by the caller (I/O stays outside). */
|
|
16
|
+
rows: ListRow[];
|
|
17
|
+
/** Known project keys, cycle order for the project filter. */
|
|
18
|
+
knownProjects: string[];
|
|
19
|
+
/** Cursor index into filteredRows(state) — NOT into rows. */
|
|
20
|
+
cursor: number;
|
|
21
|
+
filters: BrowseFilters;
|
|
22
|
+
searchActive: boolean;
|
|
23
|
+
searchQuery: string;
|
|
24
|
+
shouldExit: boolean;
|
|
25
|
+
/** Set by select-run; the component surfaces it via onSelect. */
|
|
26
|
+
selectedRunId: string | null;
|
|
27
|
+
/** Captured at init so the since-filter cutoff is pure + testable. */
|
|
28
|
+
now: number;
|
|
29
|
+
}
|
|
30
|
+
export type BrowseAction = {
|
|
31
|
+
kind: "cursor-move";
|
|
32
|
+
delta: number;
|
|
33
|
+
} | {
|
|
34
|
+
kind: "cursor-clamp";
|
|
35
|
+
max: number;
|
|
36
|
+
} | {
|
|
37
|
+
kind: "cycle-kind";
|
|
38
|
+
} | {
|
|
39
|
+
kind: "cycle-outcome";
|
|
40
|
+
} | {
|
|
41
|
+
kind: "cycle-project";
|
|
42
|
+
} | {
|
|
43
|
+
kind: "cycle-since";
|
|
44
|
+
} | {
|
|
45
|
+
kind: "enter-search";
|
|
46
|
+
} | {
|
|
47
|
+
kind: "set-search";
|
|
48
|
+
query: string;
|
|
49
|
+
} | {
|
|
50
|
+
kind: "exit-search";
|
|
51
|
+
} | {
|
|
52
|
+
kind: "select-run";
|
|
53
|
+
runId: string;
|
|
54
|
+
} | {
|
|
55
|
+
kind: "request-quit";
|
|
56
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Browse-TUI state model — pure data, no I/O (three-layer architecture).
|
|
2
|
+
//
|
|
3
|
+
// One screen (the run browser) plus an overlaid incremental-search mode, so
|
|
4
|
+
// no view stack is needed — far simpler than config-tui's View[] stack.
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/transcripts-tui/state/model.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,4EAA4E;AAC5E,wEAAwE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Pure (state, action) → state reducer for the browse TUI.
|
|
2
|
+
//
|
|
3
|
+
// Cursor lower-bound clamps here; the UPPER bound depends on
|
|
4
|
+
// filteredRows().length, which the component knows — it dispatches an
|
|
5
|
+
// explicit cursor-clamp after every state change (mirrors config-tui's
|
|
6
|
+
// documented reducer/component split).
|
|
7
|
+
import { nextKind, nextOutcome, nextProject, nextSince } from "./selectors.js";
|
|
8
|
+
export function reducer(state, action) {
|
|
9
|
+
switch (action.kind) {
|
|
10
|
+
case "cursor-move":
|
|
11
|
+
return { ...state, cursor: Math.max(0, state.cursor + action.delta) };
|
|
12
|
+
case "cursor-clamp":
|
|
13
|
+
return { ...state, cursor: Math.max(0, Math.min(state.cursor, action.max)) };
|
|
14
|
+
case "cycle-kind":
|
|
15
|
+
return {
|
|
16
|
+
...state,
|
|
17
|
+
cursor: 0,
|
|
18
|
+
filters: { ...state.filters, kind: nextKind(state.filters.kind) },
|
|
19
|
+
};
|
|
20
|
+
case "cycle-outcome":
|
|
21
|
+
return {
|
|
22
|
+
...state,
|
|
23
|
+
cursor: 0,
|
|
24
|
+
filters: { ...state.filters, outcome: nextOutcome(state.filters.outcome) },
|
|
25
|
+
};
|
|
26
|
+
case "cycle-project":
|
|
27
|
+
return {
|
|
28
|
+
...state,
|
|
29
|
+
cursor: 0,
|
|
30
|
+
filters: { ...state.filters, projectKey: nextProject(state.filters.projectKey, state.knownProjects) },
|
|
31
|
+
};
|
|
32
|
+
case "cycle-since":
|
|
33
|
+
return {
|
|
34
|
+
...state,
|
|
35
|
+
cursor: 0,
|
|
36
|
+
filters: { ...state.filters, sinceDays: nextSince(state.filters.sinceDays) },
|
|
37
|
+
};
|
|
38
|
+
case "enter-search":
|
|
39
|
+
return { ...state, searchActive: true };
|
|
40
|
+
case "set-search":
|
|
41
|
+
// Query change invalidates the selection — reset to the top match.
|
|
42
|
+
return { ...state, searchQuery: action.query, cursor: 0 };
|
|
43
|
+
case "exit-search":
|
|
44
|
+
return { ...state, searchActive: false };
|
|
45
|
+
case "select-run":
|
|
46
|
+
return { ...state, selectedRunId: action.runId, shouldExit: true };
|
|
47
|
+
case "request-quit":
|
|
48
|
+
return { ...state, shouldExit: true };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=reducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/transcripts-tui/state/reducer.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,6DAA6D;AAC7D,sEAAsE;AACtE,uEAAuE;AACvE,uCAAuC;AAGvC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE/E,MAAM,UAAU,OAAO,CAAC,KAAkB,EAAE,MAAoB;IAC/D,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,aAAa;YACjB,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,KAAK,cAAc;YAClB,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC9E,KAAK,YAAY;YAChB,OAAO;gBACN,GAAG,KAAK;gBACR,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;aACjE,CAAC;QACH,KAAK,eAAe;YACnB,OAAO;gBACN,GAAG,KAAK;gBACR,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;aAC1E,CAAC;QACH,KAAK,eAAe;YACnB,OAAO;gBACN,GAAG,KAAK;gBACR,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE;aACrG,CAAC;QACH,KAAK,aAAa;YACjB,OAAO;gBACN,GAAG,KAAK;gBACR,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;aAC5E,CAAC;QACH,KAAK,cAAc;YAClB,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QACzC,KAAK,YAAY;YAChB,mEAAmE;YACnE,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC3D,KAAK,aAAa;YACjB,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC1C,KAAK,YAAY;YAChB,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACpE,KAAK,cAAc;YAClB,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BrowseState, KindFilter, ListRow, OutcomeFilter, SinceFilter } from "./model.js";
|
|
2
|
+
export declare function filteredRows(state: BrowseState): ListRow[];
|
|
3
|
+
/** Header line summarizing the active filters, e.g.
|
|
4
|
+
* "kind:bug · outcome:all · project:Cartographer · since:7d · /cart". */
|
|
5
|
+
export declare function activeFilterSummary(state: BrowseState): string;
|
|
6
|
+
export declare function nextKind(current: KindFilter): KindFilter;
|
|
7
|
+
export declare function nextOutcome(current: OutcomeFilter): OutcomeFilter;
|
|
8
|
+
export declare function nextSince(current: SinceFilter): SinceFilter;
|
|
9
|
+
/** null → first known project → … → last → null. */
|
|
10
|
+
export declare function nextProject(current: string | null, known: string[]): string | null;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Pure read helpers over BrowseState. filteredRows is the single source of
|
|
2
|
+
// truth for what's visible — the screen renders it and the component's
|
|
3
|
+
// Enter handler indexes into it, so cursor↔row mapping can never drift.
|
|
4
|
+
export function filteredRows(state) {
|
|
5
|
+
const { kind, outcome, projectKey, sinceDays } = state.filters;
|
|
6
|
+
const cutoff = sinceDays === null ? null : new Date(state.now - sinceDays * 86_400_000).toISOString();
|
|
7
|
+
const query = state.searchQuery.trim().toLowerCase();
|
|
8
|
+
return state.rows.filter((row) => {
|
|
9
|
+
if (kind !== "all" && row.entityKind !== kind)
|
|
10
|
+
return false;
|
|
11
|
+
if (outcome !== "all" && row.outcome !== outcome)
|
|
12
|
+
return false;
|
|
13
|
+
if (projectKey !== null && row.projectKey !== projectKey)
|
|
14
|
+
return false;
|
|
15
|
+
if (cutoff !== null && row.startedAt < cutoff)
|
|
16
|
+
return false;
|
|
17
|
+
if (query) {
|
|
18
|
+
const haystack = `${row.entityId} ${row.sprintId ?? ""} ${row.projectName}`.toLowerCase();
|
|
19
|
+
if (!haystack.includes(query))
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Header line summarizing the active filters, e.g.
|
|
26
|
+
* "kind:bug · outcome:all · project:Cartographer · since:7d · /cart". */
|
|
27
|
+
export function activeFilterSummary(state) {
|
|
28
|
+
const { kind, outcome, projectKey, sinceDays } = state.filters;
|
|
29
|
+
const parts = [
|
|
30
|
+
`kind:${kind}`,
|
|
31
|
+
`outcome:${outcome}`,
|
|
32
|
+
`project:${projectKey ?? "all"}`,
|
|
33
|
+
`since:${sinceDays === null ? "all" : `${sinceDays}d`}`,
|
|
34
|
+
];
|
|
35
|
+
if (state.searchQuery)
|
|
36
|
+
parts.push(`/${state.searchQuery}`);
|
|
37
|
+
return parts.join(" · ");
|
|
38
|
+
}
|
|
39
|
+
const KIND_CYCLE = ["all", "task", "bug", "sprint"];
|
|
40
|
+
const OUTCOME_CYCLE = ["all", "complete", "halted", "error", "incomplete", "cancelled"];
|
|
41
|
+
const SINCE_CYCLE = [null, 7, 30, 90];
|
|
42
|
+
export function nextKind(current) {
|
|
43
|
+
return KIND_CYCLE[(KIND_CYCLE.indexOf(current) + 1) % KIND_CYCLE.length];
|
|
44
|
+
}
|
|
45
|
+
export function nextOutcome(current) {
|
|
46
|
+
return OUTCOME_CYCLE[(OUTCOME_CYCLE.indexOf(current) + 1) % OUTCOME_CYCLE.length];
|
|
47
|
+
}
|
|
48
|
+
export function nextSince(current) {
|
|
49
|
+
return SINCE_CYCLE[(SINCE_CYCLE.indexOf(current) + 1) % SINCE_CYCLE.length];
|
|
50
|
+
}
|
|
51
|
+
/** null → first known project → … → last → null. */
|
|
52
|
+
export function nextProject(current, known) {
|
|
53
|
+
if (known.length === 0)
|
|
54
|
+
return null;
|
|
55
|
+
if (current === null)
|
|
56
|
+
return known[0];
|
|
57
|
+
const idx = known.indexOf(current);
|
|
58
|
+
if (idx < 0 || idx === known.length - 1)
|
|
59
|
+
return null;
|
|
60
|
+
return known[idx + 1];
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=selectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/transcripts-tui/state/selectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
export type { Theme };
|
|
3
|
+
/** Horizontal rule spanning the full width, themed as a border. */
|
|
4
|
+
export declare function rule(width: number, theme: Theme): string;
|
|
5
|
+
export declare function cursor(isSelected: boolean, theme: Theme): string;
|
|
6
|
+
export declare function muted(text: string, theme: Theme): string;
|
|
7
|
+
export declare function accent(text: string, theme: Theme): string;
|
|
8
|
+
export declare function accentBold(text: string, theme: Theme): string;
|
|
9
|
+
/**
|
|
10
|
+
* Truncate a potentially-ANSI string to a visible width, padding with
|
|
11
|
+
* spaces if shorter. ANSI-safe column alignment (Iron Law 10).
|
|
12
|
+
*/
|
|
13
|
+
export declare function padOrTruncate(text: string, width: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Truncate every line to the given visible width. Final safety guard in
|
|
16
|
+
* every screen's render (Iron Law 2, layer 1).
|
|
17
|
+
*/
|
|
18
|
+
export declare function truncateLines(lines: string[], width: number): string[];
|
|
19
|
+
/** Alias matching the config-tui screens/shared.ts vocabulary. */
|
|
20
|
+
export declare function safeLines(lines: string[], width: number): string[];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Transcripts-TUI theme helpers — wraps pi Theme for consistent styling.
|
|
2
|
+
//
|
|
3
|
+
// Local copies of the handful of helpers this TUI needs (config-tui keeps
|
|
4
|
+
// its own set; copying ~6 trivial theme-only helpers avoids cross-TUI
|
|
5
|
+
// coupling — see forge-cli-ui-engineer skill, module layout).
|
|
6
|
+
//
|
|
7
|
+
// Every render function receives a Theme instance and routes all visible
|
|
8
|
+
// text through these helpers or theme.fg/bg/bold directly (Iron Law 1).
|
|
9
|
+
import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
10
|
+
/** Horizontal rule spanning the full width, themed as a border. */
|
|
11
|
+
export function rule(width, theme) {
|
|
12
|
+
return theme.fg("border", "─".repeat(Math.max(1, width)));
|
|
13
|
+
}
|
|
14
|
+
export function cursor(isSelected, theme) {
|
|
15
|
+
return isSelected ? theme.fg("accent", "▸") : " ";
|
|
16
|
+
}
|
|
17
|
+
export function muted(text, theme) {
|
|
18
|
+
return theme.fg("muted", text);
|
|
19
|
+
}
|
|
20
|
+
export function accent(text, theme) {
|
|
21
|
+
return theme.fg("accent", text);
|
|
22
|
+
}
|
|
23
|
+
export function accentBold(text, theme) {
|
|
24
|
+
return theme.fg("accent", theme.bold(text));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Truncate a potentially-ANSI string to a visible width, padding with
|
|
28
|
+
* spaces if shorter. ANSI-safe column alignment (Iron Law 10).
|
|
29
|
+
*/
|
|
30
|
+
export function padOrTruncate(text, width) {
|
|
31
|
+
const vis = visibleWidth(text);
|
|
32
|
+
if (vis >= width)
|
|
33
|
+
return truncateToWidth(text, width, "");
|
|
34
|
+
return text + " ".repeat(width - vis);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Truncate every line to the given visible width. Final safety guard in
|
|
38
|
+
* every screen's render (Iron Law 2, layer 1).
|
|
39
|
+
*/
|
|
40
|
+
export function truncateLines(lines, width) {
|
|
41
|
+
return lines.map((line) => truncateToWidth(line, width, ""));
|
|
42
|
+
}
|
|
43
|
+
/** Alias matching the config-tui screens/shared.ts vocabulary. */
|
|
44
|
+
export function safeLines(lines, width) {
|
|
45
|
+
return truncateLines(lines, width);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/transcripts-tui/theme.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,0EAA0E;AAC1E,sEAAsE;AACtE,8DAA8D;AAC9D,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AAGxE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAIvE,mEAAmE;AACnE,MAAM,UAAU,IAAI,CAAC,KAAa,EAAE,KAAY;IAC/C,OAAO,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,UAAmB,EAAE,KAAY;IACvD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,KAAY;IAC/C,OAAO,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,KAAY;IAChD,OAAO,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAY;IACpD,OAAO,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAa;IACxD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1D,OAAO,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAe,EAAE,KAAa;IAC3D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,SAAS,CAAC,KAAe,EAAE,KAAa;IACvD,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ProjectMeta {
|
|
2
|
+
name: string;
|
|
3
|
+
prefix: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Read project.name and project.prefix from a `.forge/config.json` path.
|
|
7
|
+
* Returns null when the file is missing, unreadable, malformed, or lacks
|
|
8
|
+
* the required fields. Never throws.
|
|
9
|
+
*/
|
|
10
|
+
export declare function readProjectMeta(configPath: string): ProjectMeta | null;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Banner helpers — reads .forge/config.json for project metadata.
|
|
2
|
+
//
|
|
3
|
+
// Pure utility module; no side effects on import.
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
/**
|
|
6
|
+
* Read project.name and project.prefix from a `.forge/config.json` path.
|
|
7
|
+
* Returns null when the file is missing, unreadable, malformed, or lacks
|
|
8
|
+
* the required fields. Never throws.
|
|
9
|
+
*/
|
|
10
|
+
export function readProjectMeta(configPath) {
|
|
11
|
+
let raw;
|
|
12
|
+
try {
|
|
13
|
+
raw = fs.readFileSync(configPath, "utf8");
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
let config;
|
|
19
|
+
try {
|
|
20
|
+
config = JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
if (!config || typeof config !== "object")
|
|
26
|
+
return null;
|
|
27
|
+
const cfg = config;
|
|
28
|
+
const name = cfg.project?.name;
|
|
29
|
+
const prefix = cfg.project?.prefix;
|
|
30
|
+
if (typeof name !== "string" || name.length === 0)
|
|
31
|
+
return null;
|
|
32
|
+
if (typeof prefix !== "string" || prefix.length === 0)
|
|
33
|
+
return null;
|
|
34
|
+
return { name, prefix };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/tui/banner.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,kDAAkD;AAElD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAc9B;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IACjD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACJ,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,GAAG,GAAG,MAAqB,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;IAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;IAEnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { Component } from "@earendil-works/pi-tui";
|
|
3
|
+
import { type TUI } from "@earendil-works/pi-tui";
|
|
4
|
+
export interface ForgeHeader extends Component {
|
|
5
|
+
dispose?(): void;
|
|
6
|
+
setStartupDone(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function createForgeHeader(versions: {
|
|
9
|
+
cliVersion: string;
|
|
10
|
+
bundledForgeVersion: string;
|
|
11
|
+
piVersion: string;
|
|
12
|
+
}): (tui: TUI, theme: Theme) => ForgeHeader;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// forge-header.ts — branded header component with animated startup loader.
|
|
2
|
+
//
|
|
3
|
+
// Renders an animated "kindling forge" spinner during session_start, then
|
|
4
|
+
// transitions to the full ANSI-Shadow logo + keybinding hints once startup
|
|
5
|
+
// tasks are complete. The caller calls setStartupDone() to trigger the swap.
|
|
6
|
+
import { keyHint, keyText, rawKeyHint } from "@earendil-works/pi-coding-agent";
|
|
7
|
+
import { Container, Loader, Spacer, Text } from "@earendil-works/pi-tui";
|
|
8
|
+
const SPINNER_FRAMES = ["⠋", "⠙", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
9
|
+
const LOGO_SEP_WIDTH = 46;
|
|
10
|
+
const LOGO_LINES_FORGE = [
|
|
11
|
+
"███████╗ ██████╗ ██████╗ ██████╗ ███████╗",
|
|
12
|
+
"██╔════╝ ██╔═══██╗██╔══██╗ ██╔════╝ ██╔════╝",
|
|
13
|
+
"█████╗ ██║ ██║██████╔╝ ██║ ███╗█████╗ ",
|
|
14
|
+
"██╔══╝ ██║ ██║██╔══██╗ ██║ ██║██╔══╝ ",
|
|
15
|
+
"██║ ╚██████╔╝██║ ██║ ╚██████╔╝███████╗",
|
|
16
|
+
"╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝",
|
|
17
|
+
];
|
|
18
|
+
const LOGO_LINES = [
|
|
19
|
+
" ▄██ ",
|
|
20
|
+
" ▄█▀██ ▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄ ",
|
|
21
|
+
" ▄█▀ ██ ██ ██ ██ ██",
|
|
22
|
+
"██▄▄▄▄██▄ ▀█▄▄▄▄▄██ ██▀▀▀▀▀▀▀",
|
|
23
|
+
" ██ ██ ▀█▄▄▄▄▄█▀",
|
|
24
|
+
" ▀▀ ▀▀▀▀▀▀▀▀ ",
|
|
25
|
+
];
|
|
26
|
+
class ExpandableText extends Text {
|
|
27
|
+
getCollapsedText;
|
|
28
|
+
getExpandedText;
|
|
29
|
+
constructor(getCollapsedText, getExpandedText, expanded = false, paddingX = 0, paddingY = 0) {
|
|
30
|
+
super(expanded ? getExpandedText() : getCollapsedText(), paddingX, paddingY);
|
|
31
|
+
this.getCollapsedText = getCollapsedText;
|
|
32
|
+
this.getExpandedText = getExpandedText;
|
|
33
|
+
}
|
|
34
|
+
setExpanded(expanded) {
|
|
35
|
+
this.setText(expanded ? this.getExpandedText() : this.getCollapsedText());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
class ForgeHeaderContainer extends Container {
|
|
39
|
+
tui;
|
|
40
|
+
loader;
|
|
41
|
+
builtInHeader;
|
|
42
|
+
done = false;
|
|
43
|
+
constructor(tui, theme, versions) {
|
|
44
|
+
super();
|
|
45
|
+
this.tui = tui;
|
|
46
|
+
// ── Loading state ──────────────────────────────────────────────────────
|
|
47
|
+
this.loader = new Loader(tui, (s) => theme.bold(theme.fg("accent", s)), (s) => " " + theme.fg("muted", s), "kindling forge", { frames: SPINNER_FRAMES, intervalMs: 80 });
|
|
48
|
+
// ── Static state ───────────────────────────────────────────────────────
|
|
49
|
+
const asciiLogo = LOGO_LINES.map((line) => theme.bold(theme.fg("accent", line))).join("\n");
|
|
50
|
+
const sep = theme.fg("dim", "─".repeat(LOGO_SEP_WIDTH));
|
|
51
|
+
const versionLine = " " +
|
|
52
|
+
theme.bold(theme.fg("accent", "Forge")) +
|
|
53
|
+
" " +
|
|
54
|
+
theme.fg("dim", `v${versions.cliVersion}`) +
|
|
55
|
+
" " +
|
|
56
|
+
theme.fg("dim", `(forgecli v${versions.cliVersion}, forge-plugin v${versions.bundledForgeVersion}, pi v${versions.piVersion})`);
|
|
57
|
+
const logoBlock = `\n${asciiLogo}\n${sep}\n${versionLine}`;
|
|
58
|
+
const hint = (keybinding, description) => keyHint(keybinding, description);
|
|
59
|
+
const dot = theme.fg("muted", " · ");
|
|
60
|
+
const expandedInstructions = [
|
|
61
|
+
hint("app.interrupt", "to interrupt"),
|
|
62
|
+
hint("app.clear", "to clear"),
|
|
63
|
+
rawKeyHint(`${keyText("app.clear")} twice`, "to exit"),
|
|
64
|
+
hint("app.exit", "to exit (empty)"),
|
|
65
|
+
hint("app.suspend", "to suspend"),
|
|
66
|
+
keyHint("tui.editor.deleteToLineEnd", "to delete to end"),
|
|
67
|
+
hint("app.thinking.cycle", "to cycle thinking level"),
|
|
68
|
+
rawKeyHint(`${keyText("app.model.cycleForward")}/${keyText("app.model.cycleBackward")}`, "to cycle models"),
|
|
69
|
+
hint("app.model.select", "to select model"),
|
|
70
|
+
hint("app.tools.expand", "to expand tools"),
|
|
71
|
+
hint("app.thinking.toggle", "to expand thinking"),
|
|
72
|
+
hint("app.editor.external", "for external editor"),
|
|
73
|
+
rawKeyHint("/", "for commands"),
|
|
74
|
+
rawKeyHint("!", "to run bash"),
|
|
75
|
+
rawKeyHint("!!", "to run bash (no context)"),
|
|
76
|
+
hint("app.message.followUp", "to queue follow-up"),
|
|
77
|
+
hint("app.message.dequeue", "to edit all queued messages"),
|
|
78
|
+
hint("app.clipboard.pasteImage", "to paste image"),
|
|
79
|
+
rawKeyHint("drop files", "to attach"),
|
|
80
|
+
].join("\n");
|
|
81
|
+
const compactInstructions = [
|
|
82
|
+
hint("app.interrupt", "interrupt"),
|
|
83
|
+
rawKeyHint(`${keyText("app.clear")}/${keyText("app.exit")}`, "clear/exit"),
|
|
84
|
+
rawKeyHint("/", "commands"),
|
|
85
|
+
rawKeyHint("!", "bash"),
|
|
86
|
+
hint("app.tools.expand", "more"),
|
|
87
|
+
].join(dot);
|
|
88
|
+
const compactOnboarding = theme.fg("dim", `Press ${keyText("app.tools.expand")} to show full startup help and loaded resources.`);
|
|
89
|
+
const onboarding = theme.fg("dim", "Pi can explain its own features and look up its docs. Ask it how to use or extend Pi.");
|
|
90
|
+
this.builtInHeader = new ExpandableText(() => `${logoBlock}\n${compactInstructions}\n${compactOnboarding}\n\n${onboarding}`, () => `${logoBlock}\n${expandedInstructions}\n\n${onboarding}`, false, 1, 0);
|
|
91
|
+
this.addChild(this.loader);
|
|
92
|
+
this.addChild(new Spacer(1));
|
|
93
|
+
this.loader.start();
|
|
94
|
+
}
|
|
95
|
+
setStartupDone() {
|
|
96
|
+
if (this.done)
|
|
97
|
+
return;
|
|
98
|
+
this.done = true;
|
|
99
|
+
this.loader.stop();
|
|
100
|
+
this.clear();
|
|
101
|
+
this.addChild(this.builtInHeader);
|
|
102
|
+
this.addChild(new Spacer(1));
|
|
103
|
+
this.tui.requestRender();
|
|
104
|
+
}
|
|
105
|
+
dispose() {
|
|
106
|
+
this.loader.stop();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function createForgeHeader(versions) {
|
|
110
|
+
return (tui, theme) => {
|
|
111
|
+
return new ForgeHeaderContainer(tui, theme, versions);
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=forge-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge-header.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/tui/forge-header.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type RouterResult = {
|
|
2
|
+
consume?: boolean;
|
|
3
|
+
data?: string;
|
|
4
|
+
} | undefined;
|
|
5
|
+
export type RouterListener = (data: string) => RouterResult;
|
|
6
|
+
export interface RegisterOptions {
|
|
7
|
+
/** Stable name for debugging and unsubscription tracking. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** When true, this listener is bypassed while any overlay is active.
|
|
10
|
+
* Use for keys that "activate" a widget (e.g. ↓ to open a strip) — the
|
|
11
|
+
* overlay needs the same key for navigation. Default: false. */
|
|
12
|
+
skipWhenOverlayActive?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class ForgeInputRouter {
|
|
15
|
+
private listeners;
|
|
16
|
+
private overlayDepth;
|
|
17
|
+
register(listener: RouterListener, opts: RegisterOptions): () => void;
|
|
18
|
+
pushOverlay(): void;
|
|
19
|
+
popOverlay(): void;
|
|
20
|
+
isOverlayActive(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Mirrors pi's listener-chain semantics (tui.ts:544-560):
|
|
23
|
+
* - Each listener may return { consume: true } to stop dispatch.
|
|
24
|
+
* - Each listener may return { data: rewritten } to alter the value the
|
|
25
|
+
* next listener (and ultimately the focused overlay) sees.
|
|
26
|
+
* - Listeners flagged skipWhenOverlayActive=true are silently bypassed
|
|
27
|
+
* whenever overlayDepth > 0.
|
|
28
|
+
*/
|
|
29
|
+
dispatch(data: string): RouterResult;
|
|
30
|
+
}
|
|
31
|
+
export declare function getInputRouter(): ForgeInputRouter;
|
|
32
|
+
/** Test helper — replace the singleton with a fresh router. */
|
|
33
|
+
export declare function __resetInputRouterForTesting(): void;
|