@entelligentsia/forgecli 1.0.25 → 1.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +258 -0
- package/README.md +2 -0
- package/dist/CHANGELOG-forge-plugin.md +163 -0
- package/dist/bin/argv.d.ts +2 -2
- package/dist/bin/argv.js +25 -0
- package/dist/bin/argv.js.map +1 -1
- package/dist/bin/forge.js +12 -0
- package/dist/bin/forge.js.map +1 -1
- package/dist/bin/init.d.ts +23 -0
- package/dist/bin/init.js +123 -0
- package/dist/bin/init.js.map +1 -0
- package/dist/bin/uninstall.d.ts +20 -0
- package/dist/bin/uninstall.js +141 -0
- package/dist/bin/uninstall.js.map +1 -0
- package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
- package/dist/extensions/forgecli/add-pipeline.js +143 -0
- package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/add-task.d.ts +20 -0
- package/dist/extensions/forgecli/add-task.js +154 -0
- package/dist/extensions/forgecli/add-task.js.map +1 -0
- package/dist/extensions/forgecli/approve.d.ts +22 -0
- package/dist/extensions/forgecli/approve.js +152 -0
- package/dist/extensions/forgecli/approve.js.map +1 -0
- package/dist/extensions/forgecli/banner.d.ts +10 -0
- package/dist/extensions/forgecli/banner.js +36 -0
- package/dist/extensions/forgecli/banner.js.map +1 -0
- package/dist/extensions/forgecli/calibrate.d.ts +64 -0
- package/dist/extensions/forgecli/calibrate.js +481 -0
- package/dist/extensions/forgecli/calibrate.js.map +1 -0
- package/dist/extensions/forgecli/claude-bootstrap/bootstrap.d.ts +40 -0
- package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js +593 -0
- package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js.map +1 -0
- package/dist/extensions/forgecli/claude-bootstrap/settings-merge.d.ts +46 -0
- package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js +245 -0
- package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js.map +1 -0
- package/dist/extensions/forgecli/claude-bootstrap/uninstall.d.ts +23 -0
- package/dist/extensions/forgecli/claude-bootstrap/uninstall.js +215 -0
- package/dist/extensions/forgecli/claude-bootstrap/uninstall.js.map +1 -0
- package/dist/extensions/forgecli/collate.d.ts +22 -0
- package/dist/extensions/forgecli/collate.js +134 -0
- package/dist/extensions/forgecli/collate.js.map +1 -0
- package/dist/extensions/forgecli/commit.d.ts +22 -0
- package/dist/extensions/forgecli/commit.js +152 -0
- package/dist/extensions/forgecli/commit.js.map +1 -0
- package/dist/extensions/forgecli/config-command.d.ts +8 -0
- package/dist/extensions/forgecli/config-command.js +67 -0
- package/dist/extensions/forgecli/config-command.js.map +1 -0
- package/dist/extensions/forgecli/config-layer.d.ts +53 -0
- package/dist/extensions/forgecli/config-layer.js +72 -0
- package/dist/extensions/forgecli/config-layer.js.map +1 -0
- package/dist/extensions/forgecli/config-writer.d.ts +16 -0
- package/dist/extensions/forgecli/config-writer.js +69 -0
- package/dist/extensions/forgecli/config-writer.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/component.js +10 -7
- package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
- package/dist/extensions/forgecli/enhance.d.ts +27 -0
- package/dist/extensions/forgecli/enhance.js +199 -0
- package/dist/extensions/forgecli/enhance.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.d.ts +85 -0
- package/dist/extensions/forgecli/fix-bug.js +1580 -0
- package/dist/extensions/forgecli/fix-bug.js.map +1 -0
- package/dist/extensions/forgecli/forge-header.d.ts +12 -0
- package/dist/extensions/forgecli/forge-header.js +114 -0
- package/dist/extensions/forgecli/forge-header.js.map +1 -0
- package/dist/extensions/forgecli/forge-init.d.ts +26 -0
- package/dist/extensions/forgecli/forge-init.js +514 -0
- package/dist/extensions/forgecli/forge-init.js.map +1 -0
- package/dist/extensions/forgecli/forge-root.d.ts +10 -0
- package/dist/extensions/forgecli/forge-root.js +62 -0
- package/dist/extensions/forgecli/forge-root.js.map +1 -0
- package/dist/extensions/forgecli/forge-update-command.d.ts +100 -0
- package/dist/extensions/forgecli/forge-update-command.js +435 -0
- package/dist/extensions/forgecli/forge-update-command.js.map +1 -0
- package/dist/extensions/forgecli/friction-emit.d.ts +99 -0
- package/dist/extensions/forgecli/friction-emit.js +245 -0
- package/dist/extensions/forgecli/friction-emit.js.map +1 -0
- package/dist/extensions/forgecli/implement.d.ts +22 -0
- package/dist/extensions/forgecli/implement.js +170 -0
- package/dist/extensions/forgecli/implement.js.map +1 -0
- package/dist/extensions/forgecli/init-context.d.ts +99 -0
- package/dist/extensions/forgecli/init-context.js +178 -0
- package/dist/extensions/forgecli/init-context.js.map +1 -0
- package/dist/extensions/forgecli/init-progress.d.ts +39 -0
- package/dist/extensions/forgecli/init-progress.js +117 -0
- package/dist/extensions/forgecli/init-progress.js.map +1 -0
- package/dist/extensions/forgecli/input-router.d.ts +33 -0
- package/dist/extensions/forgecli/input-router.js +136 -0
- package/dist/extensions/forgecli/input-router.js.map +1 -0
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +59 -0
- package/dist/extensions/forgecli/lib/halt-advisor.js +113 -0
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -0
- package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +46 -0
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js +64 -0
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +1 -0
- package/dist/extensions/forgecli/materialize.d.ts +16 -0
- package/dist/extensions/forgecli/materialize.js +195 -0
- package/dist/extensions/forgecli/materialize.js.map +1 -0
- package/dist/extensions/forgecli/migrate.d.ts +22 -0
- package/dist/extensions/forgecli/migrate.js +260 -0
- package/dist/extensions/forgecli/migrate.js.map +1 -0
- package/dist/extensions/forgecli/migration-engine.d.ts +117 -0
- package/dist/extensions/forgecli/migration-engine.js +563 -0
- package/dist/extensions/forgecli/migration-engine.js.map +1 -0
- package/dist/extensions/forgecli/model-registry.d.ts +61 -0
- package/dist/extensions/forgecli/model-registry.js +127 -0
- package/dist/extensions/forgecli/model-registry.js.map +1 -0
- package/dist/extensions/forgecli/model-resolver.d.ts +32 -0
- package/dist/extensions/forgecli/model-resolver.js +65 -0
- package/dist/extensions/forgecli/model-resolver.js.map +1 -0
- package/dist/extensions/forgecli/model-validator.d.ts +29 -0
- package/dist/extensions/forgecli/model-validator.js +107 -0
- package/dist/extensions/forgecli/model-validator.js.map +1 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +26 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.js +213 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-body.d.ts +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-body.js +65 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-body.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-id.d.ts +23 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-id.js +140 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-id.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.d.ts +54 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js +349 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phases.d.ts +8 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js +60 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-state.d.ts +14 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-state.js +100 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-state.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.d.ts +72 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js +204 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.d.ts +38 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js +166 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.d.ts +3 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js +55 -0
- package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.d.ts +7 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js +293 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.d.ts +2 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js +501 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.d.ts +41 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js +5 -0
- package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.d.ts +43 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js +85 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.d.ts +8 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js +37 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.d.ts +28 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js +45 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.d.ts +26 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js +75 -0
- package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/common/summary-recovery.d.ts +24 -0
- package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js +37 -0
- package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +9 -93
- package/dist/extensions/forgecli/orchestrators/fix-bug.js +23 -1721
- package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +3 -12
- package/dist/extensions/forgecli/orchestrators/run-sprint.js +48 -270
- package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/run-task.d.ts +10 -214
- package/dist/extensions/forgecli/orchestrators/run-task.js +31 -1481
- package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -1
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.d.ts +33 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js +135 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.d.ts +18 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js +55 -0
- package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-command.d.ts +9 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-command.js +174 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-command.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.d.ts +2 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js +494 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-types.d.ts +62 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-types.js +5 -0
- package/dist/extensions/forgecli/orchestrators/task/run-task-types.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-body.d.ts +4 -0
- package/dist/extensions/forgecli/orchestrators/task/task-body.js +48 -0
- package/dist/extensions/forgecli/orchestrators/task/task-body.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-events.d.ts +63 -0
- package/dist/extensions/forgecli/orchestrators/task/task-events.js +185 -0
- package/dist/extensions/forgecli/orchestrators/task/task-events.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-gates.d.ts +34 -0
- package/dist/extensions/forgecli/orchestrators/task/task-gates.js +78 -0
- package/dist/extensions/forgecli/orchestrators/task/task-gates.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.d.ts +42 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js +370 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phases.d.ts +14 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phases.js +26 -0
- package/dist/extensions/forgecli/orchestrators/task/task-phases.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-record.d.ts +9 -0
- package/dist/extensions/forgecli/orchestrators/task/task-record.js +58 -0
- package/dist/extensions/forgecli/orchestrators/task/task-record.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-state.d.ts +14 -0
- package/dist/extensions/forgecli/orchestrators/task/task-state.js +35 -0
- package/dist/extensions/forgecli/orchestrators/task/task-state.js.map +1 -0
- package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.d.ts +36 -0
- package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js +152 -0
- package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js.map +1 -0
- package/dist/extensions/forgecli/plan.d.ts +22 -0
- package/dist/extensions/forgecli/plan.js +167 -0
- package/dist/extensions/forgecli/plan.js.map +1 -0
- package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
- package/dist/extensions/forgecli/quiz-agent.js +98 -0
- package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
- package/dist/extensions/forgecli/read-command.d.ts +2 -0
- package/dist/extensions/forgecli/read-command.js +100 -0
- package/dist/extensions/forgecli/read-command.js.map +1 -0
- package/dist/extensions/forgecli/regenerate.d.ts +40 -0
- package/dist/extensions/forgecli/regenerate.js +438 -0
- package/dist/extensions/forgecli/regenerate.js.map +1 -0
- package/dist/extensions/forgecli/remove-command.d.ts +17 -0
- package/dist/extensions/forgecli/remove-command.js +124 -0
- package/dist/extensions/forgecli/remove-command.js.map +1 -0
- package/dist/extensions/forgecli/report-bug.d.ts +25 -0
- package/dist/extensions/forgecli/report-bug.js +159 -0
- package/dist/extensions/forgecli/report-bug.js.map +1 -0
- package/dist/extensions/forgecli/retrospective.d.ts +20 -0
- package/dist/extensions/forgecli/retrospective.js +126 -0
- package/dist/extensions/forgecli/retrospective.js.map +1 -0
- package/dist/extensions/forgecli/review-code.d.ts +35 -0
- package/dist/extensions/forgecli/review-code.js +196 -0
- package/dist/extensions/forgecli/review-code.js.map +1 -0
- package/dist/extensions/forgecli/review-plan.d.ts +35 -0
- package/dist/extensions/forgecli/review-plan.js +200 -0
- package/dist/extensions/forgecli/review-plan.js.map +1 -0
- package/dist/extensions/forgecli/run-sprint.d.ts +27 -0
- package/dist/extensions/forgecli/run-sprint.js +716 -0
- package/dist/extensions/forgecli/run-sprint.js.map +1 -0
- package/dist/extensions/forgecli/run-task.d.ts +204 -0
- package/dist/extensions/forgecli/run-task.js +1403 -0
- package/dist/extensions/forgecli/run-task.js.map +1 -0
- package/dist/extensions/forgecli/skill-curation-flag.d.ts +21 -0
- package/dist/extensions/forgecli/skill-curation-flag.js +71 -0
- package/dist/extensions/forgecli/skill-curation-flag.js.map +1 -0
- package/dist/extensions/forgecli/skill-curator-subagent.d.ts +102 -0
- package/dist/extensions/forgecli/skill-curator-subagent.js +339 -0
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +1 -0
- package/dist/extensions/forgecli/skill-retriever.d.ts +84 -0
- package/dist/extensions/forgecli/skill-retriever.js +246 -0
- package/dist/extensions/forgecli/skill-retriever.js.map +1 -0
- package/dist/extensions/forgecli/skill-usage-tracker.d.ts +91 -0
- package/dist/extensions/forgecli/skill-usage-tracker.js +224 -0
- package/dist/extensions/forgecli/skill-usage-tracker.js.map +1 -0
- package/dist/extensions/forgecli/sprint-intake.d.ts +10 -0
- package/dist/extensions/forgecli/sprint-intake.js +91 -0
- package/dist/extensions/forgecli/sprint-intake.js.map +1 -0
- package/dist/extensions/forgecli/sprint-plan.d.ts +14 -0
- package/dist/extensions/forgecli/sprint-plan.js +122 -0
- package/dist/extensions/forgecli/sprint-plan.js.map +1 -0
- package/dist/extensions/forgecli/status-command.d.ts +19 -0
- package/dist/extensions/forgecli/status-command.js +140 -0
- package/dist/extensions/forgecli/status-command.js.map +1 -0
- package/dist/extensions/forgecli/store-error-remediation.d.ts +65 -0
- package/dist/extensions/forgecli/store-error-remediation.js +307 -0
- package/dist/extensions/forgecli/store-error-remediation.js.map +1 -0
- package/dist/extensions/forgecli/store-query.d.ts +22 -0
- package/dist/extensions/forgecli/store-query.js +107 -0
- package/dist/extensions/forgecli/store-query.js.map +1 -0
- package/dist/extensions/forgecli/store-repair.d.ts +17 -0
- package/dist/extensions/forgecli/store-repair.js +123 -0
- package/dist/extensions/forgecli/store-repair.js.map +1 -0
- package/dist/extensions/forgecli/store-resolver.d.ts +56 -0
- package/dist/extensions/forgecli/store-resolver.js +263 -0
- package/dist/extensions/forgecli/store-resolver.js.map +1 -0
- package/dist/extensions/forgecli/store-validator.d.ts +16 -0
- package/dist/extensions/forgecli/store-validator.js +32 -0
- package/dist/extensions/forgecli/store-validator.js.map +1 -0
- package/dist/extensions/forgecli/test-orchestrate.d.ts +2 -0
- package/dist/extensions/forgecli/test-orchestrate.js +182 -0
- package/dist/extensions/forgecli/test-orchestrate.js.map +1 -0
- package/dist/extensions/forgecli/thread-switcher.d.ts +5 -0
- package/dist/extensions/forgecli/thread-switcher.js +189 -0
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -0
- package/dist/extensions/forgecli/transition-guard.d.ts +20 -0
- package/dist/extensions/forgecli/transition-guard.js +89 -0
- package/dist/extensions/forgecli/transition-guard.js.map +1 -0
- package/dist/extensions/forgecli/update/forge-update-command.js +10 -7
- package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -1
- package/dist/extensions/forgecli/update-check.d.ts +37 -0
- package/dist/extensions/forgecli/update-check.js +185 -0
- package/dist/extensions/forgecli/update-check.js.map +1 -0
- package/dist/extensions/forgecli/update-tools.d.ts +23 -0
- package/dist/extensions/forgecli/update-tools.js +135 -0
- package/dist/extensions/forgecli/update-tools.js.map +1 -0
- package/dist/extensions/forgecli/validate.d.ts +22 -0
- package/dist/extensions/forgecli/validate.js +152 -0
- package/dist/extensions/forgecli/validate.js.map +1 -0
- package/dist/extensions/forgecli/viewport-events.d.ts +78 -0
- package/dist/extensions/forgecli/viewport-events.js +243 -0
- package/dist/extensions/forgecli/viewport-events.js.map +1 -0
- package/dist/extensions/forgecli/viewport-renderer.d.ts +83 -0
- package/dist/extensions/forgecli/viewport-renderer.js +233 -0
- package/dist/extensions/forgecli/viewport-renderer.js.map +1 -0
- package/dist/extensions/forgecli/viewport-theme.d.ts +11 -0
- package/dist/extensions/forgecli/viewport-theme.js +128 -0
- package/dist/extensions/forgecli/viewport-theme.js.map +1 -0
- package/dist/extensions/forgecli/whats-new-widget.d.ts +26 -0
- package/dist/extensions/forgecli/whats-new-widget.js +376 -0
- package/dist/extensions/forgecli/whats-new-widget.js.map +1 -0
- package/dist/extensions/forgecli/whats-new.d.ts +120 -0
- package/dist/extensions/forgecli/whats-new.js +470 -0
- package/dist/extensions/forgecli/whats-new.js.map +1 -0
- package/dist/forge-payload/.base-pack/commands/approve.md +2 -2
- package/dist/forge-payload/.base-pack/commands/check-agent.md +2 -2
- package/dist/forge-payload/.base-pack/commands/collate.md +2 -2
- package/dist/forge-payload/.base-pack/commands/commit.md +2 -2
- package/dist/forge-payload/.base-pack/commands/enhance.md +2 -2
- package/dist/forge-payload/.base-pack/commands/fix-bug.md +2 -2
- package/dist/forge-payload/.base-pack/commands/implement.md +2 -2
- package/dist/forge-payload/.base-pack/commands/init.md +278 -0
- package/dist/forge-payload/.base-pack/commands/new-sprint.md +2 -2
- package/dist/forge-payload/.base-pack/commands/plan-sprint.md +2 -2
- package/dist/forge-payload/.base-pack/commands/plan.md +2 -2
- package/dist/forge-payload/.base-pack/commands/retro.md +2 -2
- package/dist/forge-payload/.base-pack/commands/review-code.md +2 -2
- package/dist/forge-payload/.base-pack/commands/review-plan.md +2 -2
- package/dist/forge-payload/.base-pack/commands/run-sprint.md +2 -2
- package/dist/forge-payload/.base-pack/commands/run-task.md +2 -2
- package/dist/forge-payload/.base-pack/commands/validate.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/collator_agent.md +5 -6
- package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +1 -1
- package/dist/forge-payload/.base-pack/workflows-js/wfl-init.js +449 -0
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/migrations.json +85 -0
- package/dist/forge-payload/commands/add-pipeline.md +1 -1
- package/dist/forge-payload/commands/add-task.md +3 -3
- package/dist/forge-payload/commands/ask.md +1 -1
- package/dist/forge-payload/commands/check-agent.md +1 -1
- package/dist/forge-payload/commands/config.md +1 -1
- package/dist/forge-payload/commands/health.md +1 -1
- package/dist/forge-payload/commands/init.md +62 -7
- package/dist/forge-payload/commands/rebuild.md +3 -3
- package/dist/forge-payload/commands/remove.md +1 -1
- package/dist/forge-payload/commands/repair.md +1 -1
- package/dist/forge-payload/commands/report-bug.md +1 -1
- package/dist/forge-payload/commands/status.md +1 -1
- package/dist/forge-payload/commands/update.md +3 -3
- package/dist/forge-payload/hooks/lib/common.cjs +228 -0
- package/dist/forge-payload/hooks/lib/plugin-detection.cjs +106 -0
- package/dist/forge-payload/hooks/lib/update-msg.cjs +23 -0
- package/dist/forge-payload/hooks/lib/update-url.cjs +46 -0
- package/dist/forge-payload/hooks/lib/write-registry.js +53 -0
- package/dist/forge-payload/init/discovery/discover-database.md +32 -0
- package/dist/forge-payload/init/discovery/discover-processes.md +31 -0
- package/dist/forge-payload/init/discovery/discover-routing.md +31 -0
- package/dist/forge-payload/init/discovery/discover-stack.md +33 -0
- package/dist/forge-payload/init/discovery/discover-testing.md +34 -0
- package/dist/forge-payload/init/generation/generate-commands.md +171 -0
- package/dist/forge-payload/init/generation/generate-kb-doc.md +60 -0
- package/dist/forge-payload/init/generation/generate-knowledge-base.md +56 -0
- package/dist/forge-payload/init/generation/generate-persona.md +73 -0
- package/dist/forge-payload/init/generation/generate-personas.md +54 -0
- package/dist/forge-payload/init/generation/generate-skill.md +66 -0
- package/dist/forge-payload/init/generation/generate-skills.md +36 -0
- package/dist/forge-payload/init/generation/generate-template.md +60 -0
- package/dist/forge-payload/init/generation/generate-templates.md +39 -0
- package/dist/forge-payload/init/generation/generate-tools.md +133 -0
- package/dist/forge-payload/init/generation/generate-workflows.md +78 -0
- package/dist/forge-payload/init/phases/phase-1-collect.md +10 -2
- package/dist/forge-payload/init/phases/phase-3-materialize.md +1 -1
- package/dist/forge-payload/init/phases/phase-4-register.md +8 -0
- package/dist/forge-payload/init/workflow-gen-plan.json +17 -0
- package/dist/forge-payload/integrity.json +16 -16
- package/dist/forge-payload/meta/workflows/meta-collate.md +5 -6
- package/dist/forge-payload/meta/workflows/meta-migrate.md +1 -1
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/structure-manifest.json +3 -12
- package/dist/forge-payload/tools/forge-preflight.cjs +268 -0
- package/dist/forge-payload/tools/lib/paths.cjs +12 -11
- package/dist/forge-payload/tools/lib/pricing.cjs +31 -11
- package/dist/forge-payload/tools/query-logger.cjs +34 -0
- package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -6
- package/node_modules/@mariozechner/clipboard/package.json +1 -2
- package/package.json +2 -2
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +0 -3
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +0 -25
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
/**
|
|
3
|
+
* Parse one tail line into prefix + body, then colour both halves.
|
|
4
|
+
* Returns the line unchanged if no theme is available.
|
|
5
|
+
*/
|
|
6
|
+
export declare function paintTailLine(line: string, theme: Theme | undefined): string;
|
|
7
|
+
/**
|
|
8
|
+
* Build the sticky token-meter footer. Right-aligned to the viewport width,
|
|
9
|
+
* preceded by a thin separator line so it visually anchors to the prompt.
|
|
10
|
+
*/
|
|
11
|
+
export declare function paintFooterLine(text: string, width: number, theme: Theme | undefined): string;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// viewport-theme.ts
|
|
2
|
+
//
|
|
3
|
+
// Paints subagent-tail lines using pi's Theme. The tail buffer (see
|
|
4
|
+
// viewport-renderer.ts) stores plain strings so transcripts and audit logs
|
|
5
|
+
// stay ANSI-clean; this module is the single place that maps line categories
|
|
6
|
+
// to theme colors at render time.
|
|
7
|
+
//
|
|
8
|
+
// Why parse at render time rather than colour at emit time:
|
|
9
|
+
// 1. Theme may change after a line is emitted (user toggles theme).
|
|
10
|
+
// 2. The tail buffer doubles as a fall-back trace; ANSI escapes there would
|
|
11
|
+
// bleed into any plaintext consumer (clipboard, transcript debugging).
|
|
12
|
+
// 3. Run-task.ts has no direct theme access — it runs as a command handler;
|
|
13
|
+
// Theme lives in the TUI widget callback. Painting at render keeps the
|
|
14
|
+
// emit path theme-agnostic and testable in isolation.
|
|
15
|
+
//
|
|
16
|
+
// Mapping (single source of truth for line category → ThemeColor):
|
|
17
|
+
//
|
|
18
|
+
// prefix `[role HH:MM:SS …]` → dim
|
|
19
|
+
// `$ bash …` → bashMode (glyph) + text (rest)
|
|
20
|
+
// `⌕ read/grep/glob …` → accent (glyph)
|
|
21
|
+
// `✎ write/edit …` → warning (glyph) -- mutation
|
|
22
|
+
// `⚙ store-cli …` → toolTitle (glyph)
|
|
23
|
+
// `→ …` fallback → muted (glyph)
|
|
24
|
+
// `← tool ok 247L` → success (glyph + "ok N L")
|
|
25
|
+
// `⚠ tool failed: …` → error
|
|
26
|
+
// `🔒 …` → error bold (glyph)
|
|
27
|
+
// `✱ thinking line` → thinkingText italic
|
|
28
|
+
// `» "preview"` → muted italic
|
|
29
|
+
// `⇉ batched N` → dim
|
|
30
|
+
// `▣ summary` → accent bold
|
|
31
|
+
// `─── phase X/Y …` → accent bold
|
|
32
|
+
import { visibleWidth } from "@earendil-works/pi-tui";
|
|
33
|
+
/**
|
|
34
|
+
* Parse one tail line into prefix + body, then colour both halves.
|
|
35
|
+
* Returns the line unchanged if no theme is available.
|
|
36
|
+
*/
|
|
37
|
+
export function paintTailLine(line, theme) {
|
|
38
|
+
if (!theme)
|
|
39
|
+
return line;
|
|
40
|
+
// Prefix: `[role HH:MM:SS t<turn> ↑X↓Y]` — everything up to the first `]`.
|
|
41
|
+
const closeIdx = line.indexOf("]");
|
|
42
|
+
if (closeIdx === -1) {
|
|
43
|
+
// No structured prefix — phase begin lines like `─── phase … ───`
|
|
44
|
+
// still get themed via body matcher.
|
|
45
|
+
return paintBody(line, theme);
|
|
46
|
+
}
|
|
47
|
+
const prefix = line.slice(0, closeIdx + 1);
|
|
48
|
+
const body = line.slice(closeIdx + 1);
|
|
49
|
+
const paintedPrefix = theme.fg("dim", prefix);
|
|
50
|
+
const paintedBody = paintBody(body, theme);
|
|
51
|
+
return `${paintedPrefix}${paintedBody}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Build the sticky token-meter footer. Right-aligned to the viewport width,
|
|
55
|
+
* preceded by a thin separator line so it visually anchors to the prompt.
|
|
56
|
+
*/
|
|
57
|
+
export function paintFooterLine(text, width, theme) {
|
|
58
|
+
const w = Math.max(visibleWidth(text), 0);
|
|
59
|
+
const padLen = Math.max(0, width - w);
|
|
60
|
+
const pad = " ".repeat(padLen);
|
|
61
|
+
if (!theme)
|
|
62
|
+
return `${pad}${text}`;
|
|
63
|
+
return `${pad}${theme.bold(theme.fg("accent", text))}`;
|
|
64
|
+
}
|
|
65
|
+
function paintBody(body, theme) {
|
|
66
|
+
const trimmed = body.replace(/^\s+/, "");
|
|
67
|
+
if (trimmed.length === 0)
|
|
68
|
+
return body;
|
|
69
|
+
const leadingWs = body.slice(0, body.length - trimmed.length);
|
|
70
|
+
// Tree connector at the start (`╭`/`│`/`╰`/`─`): paint dim then recurse so
|
|
71
|
+
// the inner glyph still gets its category colour. `─` only when followed by
|
|
72
|
+
// whitespace and NOT another `─` — that disambiguates a single-line-turn
|
|
73
|
+
// connector from a phase-boundary line (`─── phase X/Y …`).
|
|
74
|
+
const conn = trimmed.match(/^([╭│╰]|─(?=\s))\s+(.*)$/);
|
|
75
|
+
if (conn) {
|
|
76
|
+
const connector = conn[1];
|
|
77
|
+
const rest = conn[2];
|
|
78
|
+
return `${leadingWs}${theme.fg("dim", connector)} ${paintInner(rest, theme)}`;
|
|
79
|
+
}
|
|
80
|
+
return `${leadingWs}${paintInner(trimmed, theme)}`;
|
|
81
|
+
}
|
|
82
|
+
function paintInner(trimmed, theme) {
|
|
83
|
+
if (trimmed.length === 0)
|
|
84
|
+
return trimmed;
|
|
85
|
+
// Use codePointAt so non-BMP emoji like 🔒 (U+1F512, surrogate pair in
|
|
86
|
+
// UTF-16) match correctly. `trimmed[0]` returns only the high surrogate.
|
|
87
|
+
const cp = trimmed.codePointAt(0);
|
|
88
|
+
const first = cp !== undefined ? String.fromCodePoint(cp) : "";
|
|
89
|
+
switch (first) {
|
|
90
|
+
case "$": // bash
|
|
91
|
+
return `${theme.fg("bashMode", "$")}${trimmed.slice(1)}`;
|
|
92
|
+
case "⌕": // read/grep/glob
|
|
93
|
+
return `${theme.fg("accent", "⌕")}${trimmed.slice(1)}`;
|
|
94
|
+
case "✎": // write/edit
|
|
95
|
+
return `${theme.fg("warning", "✎")}${trimmed.slice(1)}`;
|
|
96
|
+
case "⚙": // store-cli
|
|
97
|
+
return `${theme.fg("toolTitle", "⚙")}${trimmed.slice(1)}`;
|
|
98
|
+
case "→": // fallback tool
|
|
99
|
+
return `${theme.fg("muted", "→")}${trimmed.slice(1)}`;
|
|
100
|
+
case "←": // tool result OK
|
|
101
|
+
return theme.fg("success", trimmed);
|
|
102
|
+
case "⚠": // tool failed
|
|
103
|
+
return theme.fg("error", trimmed);
|
|
104
|
+
case "🔒": // risky bash
|
|
105
|
+
return theme.bold(theme.fg("error", trimmed));
|
|
106
|
+
case "✱": // thinking
|
|
107
|
+
return theme.italic(theme.fg("thinkingText", trimmed));
|
|
108
|
+
case "»": // model preview text
|
|
109
|
+
return theme.italic(theme.fg("muted", trimmed));
|
|
110
|
+
case "⇉": // batched
|
|
111
|
+
return theme.fg("dim", trimmed);
|
|
112
|
+
case "▣": // phase summary
|
|
113
|
+
return theme.bold(theme.fg("accent", trimmed));
|
|
114
|
+
case "─": // phase boundary line `─── phase X/Y begin · taskId ───`
|
|
115
|
+
return theme.bold(theme.fg("accent", trimmed));
|
|
116
|
+
case "↻": // auto retry
|
|
117
|
+
return theme.fg("warning", trimmed);
|
|
118
|
+
case "◌": // compaction
|
|
119
|
+
return theme.fg("muted", trimmed);
|
|
120
|
+
case "⊘": // cancelled
|
|
121
|
+
return theme.fg("muted", trimmed);
|
|
122
|
+
case "⏳": // cancelling
|
|
123
|
+
return theme.fg("warning", trimmed);
|
|
124
|
+
default:
|
|
125
|
+
return trimmed;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=viewport-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewport-theme.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/viewport-theme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type ChangeSummary, type WhatsNewRuntime } from "./whats-new.js";
|
|
3
|
+
/**
|
|
4
|
+
* Compute startup summaries and, if any, emit a one-line passive notify
|
|
5
|
+
* pointing the user at `/changelog`. Marks versions as seen via the
|
|
6
|
+
* standard cache so subsequent sessions won't re-notify unless a new bump
|
|
7
|
+
* occurs. Returns true when a notify was emitted.
|
|
8
|
+
*
|
|
9
|
+
* Pre-FORGE-BUG-001 this mounted the interactive strip directly; that was
|
|
10
|
+
* removed because the strip captured the ↓ key for the whole session and
|
|
11
|
+
* the auto-mount happened before the user had any chance to opt in.
|
|
12
|
+
*/
|
|
13
|
+
export declare function mountWhatsNewWidgetOnStartup(_pi: ExtensionAPI, ctx: ExtensionContext, rt: WhatsNewRuntime): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Mount the strip with a pre-computed summary list. Idempotent — a second
|
|
16
|
+
* call unregisters the prior handler and replaces the widget surface.
|
|
17
|
+
* Only `/changelog` calls this; startup notify does not.
|
|
18
|
+
*/
|
|
19
|
+
export declare function mountStripWithSummaries(_pi: ExtensionAPI, ctx: ExtensionContext, rt: WhatsNewRuntime, summaries: ChangeSummary[]): void;
|
|
20
|
+
/**
|
|
21
|
+
* Register the /changelog slash command (overrides pi's built-in): re-mounts
|
|
22
|
+
* the interactive strip widget covering pi + forge-plugin + forge-cli changelogs.
|
|
23
|
+
* `/changelog dismiss` clears the replay baseline. Headless / non-TTY callers
|
|
24
|
+
* fall through to a text notify so the command is still usable.
|
|
25
|
+
*/
|
|
26
|
+
export declare function registerChangelogCommand(pi: ExtensionAPI, rt: WhatsNewRuntime): void;
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
// What's-New strip + detail widget.
|
|
2
|
+
//
|
|
3
|
+
// Startup behavior (post-FORGE-BUG-001 refactor): on session_start we emit
|
|
4
|
+
// a one-line passive notify pointing the user at `/changelog` — we do NOT
|
|
5
|
+
// auto-mount the interactive strip and we do NOT hook the input router.
|
|
6
|
+
// The strip used to live below the editor for the entire session and steal
|
|
7
|
+
// every ↓ key; users hated it.
|
|
8
|
+
//
|
|
9
|
+
// The interactive strip is now ONLY mounted in response to `/changelog`.
|
|
10
|
+
// UX once mounted:
|
|
11
|
+
//
|
|
12
|
+
// INACTIVE (default): "what's new ─ pi 30 · forge-plugin 8 · forge-cli 2 ↓ to view"
|
|
13
|
+
// ACTIVE (↓): "what's new ─ ▸● pi 30 ○ forge-plugin 8 ○ forge-cli 2 ←→ · enter · esc hide · d forget"
|
|
14
|
+
//
|
|
15
|
+
// Enter on a chip → setOutputSource(WhatsNewDetailComponent).
|
|
16
|
+
// Esc → soft hide for this session (unmounts widget, drops input handler;
|
|
17
|
+
// /changelog cache is untouched, so /changelog still replays).
|
|
18
|
+
// d → permanent forget (collapses prev baseline so /changelog returns
|
|
19
|
+
// "no recent updates" until the next version bump).
|
|
20
|
+
//
|
|
21
|
+
// Activation key (↓) requires an empty editor (no text at all), not just
|
|
22
|
+
// "no newlines" — single-line text used to be enough and that was too
|
|
23
|
+
// eager.
|
|
24
|
+
//
|
|
25
|
+
// Mount is idempotent: a second /changelog while the strip is already
|
|
26
|
+
// mounted unregisters the prior input-router handler before re-registering,
|
|
27
|
+
// so handlers don't stack.
|
|
28
|
+
import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
29
|
+
import { getInputRouter } from "./input-router.js";
|
|
30
|
+
import { getUserCacheDir } from "./paths/paths.js";
|
|
31
|
+
import { computeAndPersistStartupPanel, computeSummaries, computeWhatsNewView, dismissWhatsNew, readSeenState, renderComponentDetail, renderSummaryPanel, resolveChangelogPaths, } from "./whats-new.js";
|
|
32
|
+
const WIDGET_KEY = "forge:whats-new";
|
|
33
|
+
// ── Detail-view component: rendered into chat viewport on Enter ──────────
|
|
34
|
+
class WhatsNewDetailComponent {
|
|
35
|
+
lines;
|
|
36
|
+
invalidationCb;
|
|
37
|
+
constructor(lines) {
|
|
38
|
+
this.lines = lines;
|
|
39
|
+
}
|
|
40
|
+
render(width) {
|
|
41
|
+
return this.lines.map((l) => (visibleWidth(l) <= width ? l : truncateToWidth(l, width)));
|
|
42
|
+
}
|
|
43
|
+
invalidate() {
|
|
44
|
+
// Static content — re-render only when caller updates `lines`.
|
|
45
|
+
}
|
|
46
|
+
setInvalidationCallback(cb) {
|
|
47
|
+
this.invalidationCb = cb;
|
|
48
|
+
}
|
|
49
|
+
updateLines(lines) {
|
|
50
|
+
this.lines = lines;
|
|
51
|
+
this.invalidationCb?.();
|
|
52
|
+
}
|
|
53
|
+
dispose = () => { };
|
|
54
|
+
}
|
|
55
|
+
// ── Strip component: single row below the editor ─────────────────────────
|
|
56
|
+
class WhatsNewStripComponent {
|
|
57
|
+
summaries;
|
|
58
|
+
theme;
|
|
59
|
+
cursorIdx = 0;
|
|
60
|
+
stripActive = false;
|
|
61
|
+
/** Component currently focused into the chat viewport. */
|
|
62
|
+
focusedComponent = null;
|
|
63
|
+
invalidationCb;
|
|
64
|
+
constructor(summaries, theme) {
|
|
65
|
+
this.summaries = summaries;
|
|
66
|
+
this.theme = theme;
|
|
67
|
+
}
|
|
68
|
+
setInvalidationCallback(cb) {
|
|
69
|
+
this.invalidationCb = cb;
|
|
70
|
+
}
|
|
71
|
+
invalidate() {
|
|
72
|
+
// Re-render driven by caller via invalidationCb → tui.requestRender().
|
|
73
|
+
}
|
|
74
|
+
hasContent() {
|
|
75
|
+
return this.summaries.length > 0;
|
|
76
|
+
}
|
|
77
|
+
getStripActive() {
|
|
78
|
+
return this.stripActive;
|
|
79
|
+
}
|
|
80
|
+
cursorSummary() {
|
|
81
|
+
return this.summaries[this.cursorIdx];
|
|
82
|
+
}
|
|
83
|
+
setStripActive(active) {
|
|
84
|
+
if (this.stripActive === active)
|
|
85
|
+
return;
|
|
86
|
+
this.stripActive = active;
|
|
87
|
+
this.invalidationCb?.();
|
|
88
|
+
}
|
|
89
|
+
moveCursor(delta) {
|
|
90
|
+
if (this.summaries.length === 0)
|
|
91
|
+
return;
|
|
92
|
+
this.cursorIdx = Math.max(0, Math.min(this.summaries.length - 1, this.cursorIdx + delta));
|
|
93
|
+
this.invalidationCb?.();
|
|
94
|
+
}
|
|
95
|
+
setFocused(id) {
|
|
96
|
+
this.focusedComponent = id;
|
|
97
|
+
this.invalidationCb?.();
|
|
98
|
+
}
|
|
99
|
+
clearSummaries() {
|
|
100
|
+
this.summaries = [];
|
|
101
|
+
this.focusedComponent = null;
|
|
102
|
+
this.invalidationCb?.();
|
|
103
|
+
}
|
|
104
|
+
render(width) {
|
|
105
|
+
if (!this.hasContent())
|
|
106
|
+
return [];
|
|
107
|
+
const dim = (s) => this.theme.fg("dim", s);
|
|
108
|
+
const accent = (s) => this.theme.fg("accent", s);
|
|
109
|
+
const bold = (s) => this.theme.bold(s);
|
|
110
|
+
const prefix = this.stripActive ? accent("what's new ─ ") : dim("what's new ─ ");
|
|
111
|
+
const hint = this.stripActive ? dim(" ←→ · enter · esc hide · d forget") : dim(" ↓ to view (empty editor)");
|
|
112
|
+
const parts = this.summaries.map((s, i) => {
|
|
113
|
+
const focusedGlyph = this.focusedComponent === s.component ? "●" : "○";
|
|
114
|
+
const inner = `${focusedGlyph} ${s.label} ${s.totalChanges}`;
|
|
115
|
+
if (this.stripActive && i === this.cursorIdx)
|
|
116
|
+
return accent(bold(`▸${inner}`));
|
|
117
|
+
return dim(inner);
|
|
118
|
+
});
|
|
119
|
+
const chips = parts.join(" ");
|
|
120
|
+
let line = `${prefix}${chips}${hint}`;
|
|
121
|
+
if (visibleWidth(line) > width)
|
|
122
|
+
line = truncateToWidth(line, width);
|
|
123
|
+
return [line];
|
|
124
|
+
}
|
|
125
|
+
dispose = () => { };
|
|
126
|
+
}
|
|
127
|
+
// ── Key recognition (mirrors thread-switcher.ts) ─────────────────────────
|
|
128
|
+
function isLeftArrow(d) {
|
|
129
|
+
return d === "\x1b[D";
|
|
130
|
+
}
|
|
131
|
+
function isRightArrow(d) {
|
|
132
|
+
return d === "\x1b[C";
|
|
133
|
+
}
|
|
134
|
+
function isDownArrow(d) {
|
|
135
|
+
return d === "\x1b[B" || d === "\x1bOB";
|
|
136
|
+
}
|
|
137
|
+
function isUpArrow(d) {
|
|
138
|
+
return d === "\x1b[A" || d === "\x1bOA";
|
|
139
|
+
}
|
|
140
|
+
function isEnter(d) {
|
|
141
|
+
return d === "\r" || d === "\n";
|
|
142
|
+
}
|
|
143
|
+
function isEsc(d) {
|
|
144
|
+
return d === "\x1b";
|
|
145
|
+
}
|
|
146
|
+
// ── Mount ────────────────────────────────────────────────────────────────
|
|
147
|
+
/**
|
|
148
|
+
* Compute startup summaries and, if any, emit a one-line passive notify
|
|
149
|
+
* pointing the user at `/changelog`. Marks versions as seen via the
|
|
150
|
+
* standard cache so subsequent sessions won't re-notify unless a new bump
|
|
151
|
+
* occurs. Returns true when a notify was emitted.
|
|
152
|
+
*
|
|
153
|
+
* Pre-FORGE-BUG-001 this mounted the interactive strip directly; that was
|
|
154
|
+
* removed because the strip captured the ↓ key for the whole session and
|
|
155
|
+
* the auto-mount happened before the user had any chance to opt in.
|
|
156
|
+
*/
|
|
157
|
+
export async function mountWhatsNewWidgetOnStartup(_pi, ctx, rt) {
|
|
158
|
+
const result = await computeAndPersistStartupPanel(rt);
|
|
159
|
+
if (!result || result.summaries.length === 0)
|
|
160
|
+
return false;
|
|
161
|
+
const parts = result.summaries.map((s) => `${s.label} ${s.totalChanges}`).join(" · ");
|
|
162
|
+
try {
|
|
163
|
+
ctx.ui.notify(`forge: what's new — ${parts}. Type /changelog to view.`, "info");
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
/* stale ctx — non-fatal */
|
|
167
|
+
}
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Module-level mount state — used to make `mountStripWithSummaries`
|
|
172
|
+
* idempotent. Calling /changelog twice used to stack input-router
|
|
173
|
+
* handlers; we now tear down the previous mount first.
|
|
174
|
+
*/
|
|
175
|
+
let currentUnregister = null;
|
|
176
|
+
/**
|
|
177
|
+
* Mount the strip with a pre-computed summary list. Idempotent — a second
|
|
178
|
+
* call unregisters the prior handler and replaces the widget surface.
|
|
179
|
+
* Only `/changelog` calls this; startup notify does not.
|
|
180
|
+
*/
|
|
181
|
+
export function mountStripWithSummaries(_pi, ctx, rt, summaries) {
|
|
182
|
+
let stripRef;
|
|
183
|
+
let tuiRef;
|
|
184
|
+
let detailRef;
|
|
185
|
+
// FORGE-BUG-001: the captured ExtensionContext goes stale after pi's
|
|
186
|
+
// session replacement events. Touching ctx.ui after that throws.
|
|
187
|
+
const safeUi = (fn) => {
|
|
188
|
+
try {
|
|
189
|
+
return fn();
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
// Idempotency: drop any prior input-router handler before re-registering.
|
|
196
|
+
if (currentUnregister) {
|
|
197
|
+
try {
|
|
198
|
+
currentUnregister();
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
/* ignore */
|
|
202
|
+
}
|
|
203
|
+
currentUnregister = null;
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
ctx.ui.setWidget(WIDGET_KEY, (tui, theme) => {
|
|
207
|
+
tuiRef = tui;
|
|
208
|
+
const strip = new WhatsNewStripComponent(summaries, theme);
|
|
209
|
+
strip.setInvalidationCallback(() => tui.requestRender());
|
|
210
|
+
stripRef = strip;
|
|
211
|
+
return strip;
|
|
212
|
+
}, { placement: "belowEditor" });
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
if (process.env.FORGE_DEBUG_WHATS_NEW === "1") {
|
|
216
|
+
console.error("[forge-cli whats-new] setWidget failed:", err);
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const setFocusToMain = () => {
|
|
221
|
+
stripRef?.setFocused(null);
|
|
222
|
+
detailRef?.dispose?.();
|
|
223
|
+
detailRef = undefined;
|
|
224
|
+
safeUi(() => ctx.ui.setOutputSource(null));
|
|
225
|
+
};
|
|
226
|
+
const commitFocus = () => {
|
|
227
|
+
if (!stripRef)
|
|
228
|
+
return;
|
|
229
|
+
const summary = stripRef.cursorSummary();
|
|
230
|
+
if (!summary)
|
|
231
|
+
return;
|
|
232
|
+
stripRef.setFocused(summary.component);
|
|
233
|
+
const lines = renderComponentDetail(summary).split("\n");
|
|
234
|
+
if (detailRef) {
|
|
235
|
+
detailRef.updateLines(lines);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
detailRef = new WhatsNewDetailComponent(lines);
|
|
239
|
+
if (tuiRef)
|
|
240
|
+
detailRef.setInvalidationCallback(() => tuiRef?.requestRender());
|
|
241
|
+
}
|
|
242
|
+
if (detailRef)
|
|
243
|
+
safeUi(() => ctx.ui.setOutputSource(detailRef));
|
|
244
|
+
};
|
|
245
|
+
// Tear down the entire mount — used by Esc (hide for this session) and
|
|
246
|
+
// by `d` (permanent forget). Both unmount the widget surface and drop
|
|
247
|
+
// the input-router handler so ↓ stops being captured. The difference is
|
|
248
|
+
// whether dismissWhatsNew() is invoked to collapse the prev baseline.
|
|
249
|
+
const tearDown = () => {
|
|
250
|
+
setFocusToMain();
|
|
251
|
+
safeUi(() => ctx.ui.setWidget(WIDGET_KEY, undefined));
|
|
252
|
+
stripRef?.clearSummaries();
|
|
253
|
+
stripRef = undefined;
|
|
254
|
+
if (currentUnregister) {
|
|
255
|
+
try {
|
|
256
|
+
currentUnregister();
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
/* ignore */
|
|
260
|
+
}
|
|
261
|
+
currentUnregister = null;
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
const unregister = getInputRouter().register((data) => {
|
|
265
|
+
if (!stripRef || !stripRef.hasContent())
|
|
266
|
+
return undefined;
|
|
267
|
+
if (!stripRef.getStripActive()) {
|
|
268
|
+
if (!isDownArrow(data))
|
|
269
|
+
return undefined;
|
|
270
|
+
const editorText = safeUi(() => ctx.ui.getEditorText());
|
|
271
|
+
if (editorText === undefined)
|
|
272
|
+
return undefined; // stale ctx
|
|
273
|
+
// Stricter than the legacy "no newlines" check — only an
|
|
274
|
+
// empty editor activates the strip. Any in-progress text
|
|
275
|
+
// (single-line included) means ↓ belongs to the editor.
|
|
276
|
+
if (editorText !== "")
|
|
277
|
+
return undefined;
|
|
278
|
+
stripRef.setStripActive(true);
|
|
279
|
+
return { consume: true };
|
|
280
|
+
}
|
|
281
|
+
if (isLeftArrow(data)) {
|
|
282
|
+
stripRef.moveCursor(-1);
|
|
283
|
+
return { consume: true };
|
|
284
|
+
}
|
|
285
|
+
if (isRightArrow(data)) {
|
|
286
|
+
stripRef.moveCursor(1);
|
|
287
|
+
return { consume: true };
|
|
288
|
+
}
|
|
289
|
+
if (isUpArrow(data)) {
|
|
290
|
+
stripRef.setStripActive(false);
|
|
291
|
+
return { consume: true };
|
|
292
|
+
}
|
|
293
|
+
if (isEnter(data)) {
|
|
294
|
+
commitFocus();
|
|
295
|
+
return { consume: true };
|
|
296
|
+
}
|
|
297
|
+
if (isEsc(data)) {
|
|
298
|
+
// Soft hide for this session — strip disappears, ↓ is
|
|
299
|
+
// released, but the cache is untouched so /changelog can
|
|
300
|
+
// re-summon the same set.
|
|
301
|
+
tearDown();
|
|
302
|
+
return { consume: true };
|
|
303
|
+
}
|
|
304
|
+
if (isForgetKey(data)) {
|
|
305
|
+
// Permanent forget — collapse prev baseline so /changelog
|
|
306
|
+
// returns "no recent updates" until the next version bump.
|
|
307
|
+
void dismissWhatsNew(rt).catch(() => undefined);
|
|
308
|
+
tearDown();
|
|
309
|
+
return { consume: true };
|
|
310
|
+
}
|
|
311
|
+
return undefined;
|
|
312
|
+
}, { name: "whats-new-strip", skipWhenOverlayActive: true });
|
|
313
|
+
currentUnregister = unregister;
|
|
314
|
+
}
|
|
315
|
+
function isForgetKey(d) {
|
|
316
|
+
return d === "d" || d === "D";
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Compute the summaries that should populate the strip when /whats-new is
|
|
320
|
+
* invoked: prev baseline first (post auto-dismiss), then lastShown frozen
|
|
321
|
+
* baseline (post explicit dismiss). Returns empty when neither yields a
|
|
322
|
+
* set — caller falls back to a notify message.
|
|
323
|
+
*/
|
|
324
|
+
async function computeReplaySummaries(rt) {
|
|
325
|
+
const cacheDir = rt.cacheDir ?? getUserCacheDir();
|
|
326
|
+
const seen = await readSeenState(cacheDir);
|
|
327
|
+
const sources = resolveChangelogPaths(rt.pkgRoot);
|
|
328
|
+
let s = computeSummaries({ sources, current: rt.current, seen, baseline: "prev" });
|
|
329
|
+
if (s.length === 0)
|
|
330
|
+
s = computeSummaries({ sources, current: rt.current, seen, baseline: "lastShown" });
|
|
331
|
+
return s;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Register the /changelog slash command (overrides pi's built-in): re-mounts
|
|
335
|
+
* the interactive strip widget covering pi + forge-plugin + forge-cli changelogs.
|
|
336
|
+
* `/changelog dismiss` clears the replay baseline. Headless / non-TTY callers
|
|
337
|
+
* fall through to a text notify so the command is still usable.
|
|
338
|
+
*/
|
|
339
|
+
export function registerChangelogCommand(pi, rt) {
|
|
340
|
+
pi.registerCommand("changelog", {
|
|
341
|
+
description: "Show What's New across pi, forge-plugin, and forge-cli (or /changelog dismiss to clear)",
|
|
342
|
+
async handler(args, ctx) {
|
|
343
|
+
const arg = args.trim().toLowerCase();
|
|
344
|
+
try {
|
|
345
|
+
if (arg === "dismiss" || arg === "--dismiss") {
|
|
346
|
+
await dismissWhatsNew(rt);
|
|
347
|
+
ctx.ui.notify("changelog: dismissed.", "info");
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const summaries = await computeReplaySummaries(rt);
|
|
351
|
+
if (summaries.length === 0) {
|
|
352
|
+
ctx.ui.notify("changelog: no recent updates.", "info");
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
if (!ctx.hasUI) {
|
|
356
|
+
// Headless / RPC mode — widget surface unavailable; dump text.
|
|
357
|
+
const view = await computeWhatsNewView(rt, arg.length > 0 ? arg : null);
|
|
358
|
+
ctx.ui.notify(view, "info");
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
// Echo the overall summary into the main chat container so
|
|
362
|
+
// users have a record of the change counts, then mount the
|
|
363
|
+
// strip below the editor for arrow-key drill-down.
|
|
364
|
+
ctx.ui.notify(`${renderSummaryPanel(summaries)}\n\n(Strip is below the editor — ↓ on an empty prompt to activate, ←→ to navigate, Enter to expand, Esc to hide, d to forget.)`, "info");
|
|
365
|
+
mountStripWithSummaries(pi, ctx, rt, summaries);
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
if (process.env.FORGE_DEBUG_WHATS_NEW === "1") {
|
|
369
|
+
console.error("[forge-cli changelog] handler failed:", err);
|
|
370
|
+
}
|
|
371
|
+
ctx.ui.notify("changelog: failed to render — set FORGE_DEBUG_WHATS_NEW=1 for details.", "warning");
|
|
372
|
+
}
|
|
373
|
+
},
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=whats-new-widget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whats-new-widget.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/whats-new-widget.ts"],"names":[],"mappings":"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"}
|