@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,40 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
export interface ModifiedFile {
|
|
3
|
+
category: string;
|
|
4
|
+
relativePath: string;
|
|
5
|
+
/** "modified" = manifest hash mismatch; "untracked" = no manifest entry (file exists but never recorded). */
|
|
6
|
+
state: "modified" | "untracked";
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Enumerate files in .forge/{personas,skills,workflows,templates}/ and return
|
|
10
|
+
* those whose state diverges from the manifest baseline. Two divergence states
|
|
11
|
+
* are surfaced (both warrant a prompt before overwrite):
|
|
12
|
+
*
|
|
13
|
+
* - "modified": file content differs from the recorded manifest hash. Typically
|
|
14
|
+
* caused by /forge:enhance Phase 2 applying edits in-place.
|
|
15
|
+
* - "untracked": file exists on disk but has NO manifest entry. Caused by a
|
|
16
|
+
* prior regenerate that ran `clear-namespace` without re-recording. A fresh
|
|
17
|
+
* /forge:init records hashes for every generated file, so "untracked" should
|
|
18
|
+
* never appear in a clean install — its presence signals user content that's
|
|
19
|
+
* been disconnected from the tracking system. See forge-cli#30.
|
|
20
|
+
*
|
|
21
|
+
* Pure function (no I/O beyond fs reads + manifest tool spawns).
|
|
22
|
+
*/
|
|
23
|
+
export declare function findModifiedStructuralFiles(cwd: string, toolsRoot: string): ModifiedFile[];
|
|
24
|
+
/**
|
|
25
|
+
* Copy bundled tools (*.cjs, *.js, lib/) from bundleToolsRoot into cwd/.forge/tools/.
|
|
26
|
+
*
|
|
27
|
+
* Atomic handler pattern: no LLM in the loop, errors surfaced via returned messages[],
|
|
28
|
+
* not throw. Accepts _testBundleToolsRoot for test isolation (defaults to getBundledToolsRoot()).
|
|
29
|
+
*
|
|
30
|
+
* When singleTool is provided (e.g. "store-cli"), only that file is copied (both .cjs
|
|
31
|
+
* variant checked first). Used by the `forge:rebuild tools <name>` sub-target.
|
|
32
|
+
*
|
|
33
|
+
* @param cwd Project root directory (must contain .forge/)
|
|
34
|
+
* @param _testBundleToolsRoot Override bundle tools root for tests; omit to use getBundledToolsRoot()
|
|
35
|
+
* @param singleTool Optional: copy only this one tool by stem name (without extension)
|
|
36
|
+
*/
|
|
37
|
+
export declare function runRebuildTools(cwd: string, _testBundleToolsRoot?: string, singleTool?: string): {
|
|
38
|
+
messages: string[];
|
|
39
|
+
};
|
|
40
|
+
export declare function registerRegenerate(pi: ExtensionAPI): void;
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
// regenerate.ts — native handler for /forge:rebuild (renamed from /forge:regenerate in v1.0).
|
|
2
|
+
//
|
|
3
|
+
// v0 scope: re-materialize the project's .forge/ and .claude/commands/ trees
|
|
4
|
+
// from the bundled forge-payload (.base-pack + substitute-placeholders.cjs).
|
|
5
|
+
// This is the deterministic subset of the plugin's /forge:rebuild
|
|
6
|
+
// behaviour — the meta-driven persona/skill/workflow fan-out (which spawns
|
|
7
|
+
// generation subagents) is NOT covered here. v0 is sufficient for the
|
|
8
|
+
// common dogfooding case: "I just rebundled a new plugin payload and want
|
|
9
|
+
// the testbench to pick up the new workflows / commands / templates."
|
|
10
|
+
//
|
|
11
|
+
// FORGE-S26-T11: `--enrich` flag added. When present, skips the base-pack
|
|
12
|
+
// re-materialization and dispatches to the enhance workflow (Phase 2 behavior,
|
|
13
|
+
// equivalent to former /forge:enhance). Mirrors T03's absorption of enhance
|
|
14
|
+
// into rebuild --enrich.
|
|
15
|
+
//
|
|
16
|
+
// No sub-target filtering yet; full re-materialization on every call.
|
|
17
|
+
// Idempotent — re-running with no changes overwrites with identical bytes.
|
|
18
|
+
//
|
|
19
|
+
// See forge-cli companion to forge#83 / #85.
|
|
20
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
21
|
+
import * as fs from "node:fs";
|
|
22
|
+
import * as path from "node:path";
|
|
23
|
+
// FORGE-S26-T11: registerEnhance imported to power `forge:rebuild --enrich`
|
|
24
|
+
import { registerEnhance } from "./enhance.js";
|
|
25
|
+
import { getBundledPayloadRoot, getBundledToolsRoot } from "./forge-init.js";
|
|
26
|
+
// ── Pre-write modification guard (forge-cli#26 / forge#106 / FORGE-BUG-037) ──
|
|
27
|
+
//
|
|
28
|
+
// `substitute-placeholders.cjs` blanket-overwrites every file in the four
|
|
29
|
+
// structural-element categories. Before invoking it, enumerate each .forge/<cat>/
|
|
30
|
+
// file and run `generation-manifest.cjs check`. Any file whose recorded hash
|
|
31
|
+
// no longer matches its on-disk content is a manual modification — typically
|
|
32
|
+
// applied by /forge:enhance Phase 2 — and would be silently destroyed.
|
|
33
|
+
// Surface the list to the user and require explicit confirmation.
|
|
34
|
+
const STRUCTURAL_CATEGORIES = ["personas", "skills", "workflows", "templates"];
|
|
35
|
+
/**
|
|
36
|
+
* Enumerate files in .forge/{personas,skills,workflows,templates}/ and return
|
|
37
|
+
* those whose state diverges from the manifest baseline. Two divergence states
|
|
38
|
+
* are surfaced (both warrant a prompt before overwrite):
|
|
39
|
+
*
|
|
40
|
+
* - "modified": file content differs from the recorded manifest hash. Typically
|
|
41
|
+
* caused by /forge:enhance Phase 2 applying edits in-place.
|
|
42
|
+
* - "untracked": file exists on disk but has NO manifest entry. Caused by a
|
|
43
|
+
* prior regenerate that ran `clear-namespace` without re-recording. A fresh
|
|
44
|
+
* /forge:init records hashes for every generated file, so "untracked" should
|
|
45
|
+
* never appear in a clean install — its presence signals user content that's
|
|
46
|
+
* been disconnected from the tracking system. See forge-cli#30.
|
|
47
|
+
*
|
|
48
|
+
* Pure function (no I/O beyond fs reads + manifest tool spawns).
|
|
49
|
+
*/
|
|
50
|
+
export function findModifiedStructuralFiles(cwd, toolsRoot) {
|
|
51
|
+
const manifestTool = path.join(toolsRoot, "generation-manifest.cjs");
|
|
52
|
+
if (!fs.existsSync(manifestTool))
|
|
53
|
+
return [];
|
|
54
|
+
const modified = [];
|
|
55
|
+
for (const category of STRUCTURAL_CATEGORIES) {
|
|
56
|
+
const dir = path.join(cwd, ".forge", category);
|
|
57
|
+
if (!fs.existsSync(dir))
|
|
58
|
+
continue;
|
|
59
|
+
const files = fs.readdirSync(dir).filter((f) => f.endsWith(".md"));
|
|
60
|
+
for (const f of files) {
|
|
61
|
+
const relPath = path.posix.join(".forge", category, f);
|
|
62
|
+
const result = spawnSync("node", [manifestTool, "check", relPath], {
|
|
63
|
+
cwd,
|
|
64
|
+
encoding: "utf8",
|
|
65
|
+
timeout: 5_000,
|
|
66
|
+
});
|
|
67
|
+
// generation-manifest check exit codes:
|
|
68
|
+
// 0 = pristine, 1 = modified, 2 = untracked, 3 = file missing
|
|
69
|
+
if (result.status === 1) {
|
|
70
|
+
modified.push({ category, relativePath: relPath, state: "modified" });
|
|
71
|
+
}
|
|
72
|
+
else if (result.status === 2) {
|
|
73
|
+
modified.push({ category, relativePath: relPath, state: "untracked" });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return modified;
|
|
78
|
+
}
|
|
79
|
+
async function runTool(toolPath, argv, cwd, ctx, label, timeoutMs = 60_000) {
|
|
80
|
+
return await new Promise((resolve) => {
|
|
81
|
+
const child = spawn("node", [toolPath, ...argv], { cwd, stdio: ["ignore", "pipe", "pipe"] });
|
|
82
|
+
let stdoutBuf = "";
|
|
83
|
+
let stderrBuf = "";
|
|
84
|
+
const timer = setTimeout(() => {
|
|
85
|
+
child.kill("SIGKILL");
|
|
86
|
+
ctx.ui.notify(`× forge:rebuild — ${label} timed out after ${timeoutMs}ms`, "error");
|
|
87
|
+
resolve(false);
|
|
88
|
+
}, timeoutMs);
|
|
89
|
+
child.stdout?.on("data", (d) => {
|
|
90
|
+
stdoutBuf += d.toString();
|
|
91
|
+
});
|
|
92
|
+
child.stderr?.on("data", (d) => {
|
|
93
|
+
stderrBuf += d.toString();
|
|
94
|
+
});
|
|
95
|
+
child.on("close", (code) => {
|
|
96
|
+
clearTimeout(timer);
|
|
97
|
+
if (code === 0) {
|
|
98
|
+
ctx.ui.notify(`〇 ${label} complete`, "info");
|
|
99
|
+
resolve(true);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const msg = (stderrBuf || stdoutBuf).trim().split("\n").slice(-3).join(" | ") || "unknown error";
|
|
103
|
+
ctx.ui.notify(`× forge:rebuild — ${label} exit ${code}: ${msg}`, "error");
|
|
104
|
+
resolve(false);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
child.on("error", (err) => {
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
ctx.ui.notify(`× forge:rebuild — ${label} spawn failed: ${err.message}`, "error");
|
|
110
|
+
resolve(false);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Copy bundled tools (*.cjs, *.js, lib/) from bundleToolsRoot into cwd/.forge/tools/.
|
|
116
|
+
*
|
|
117
|
+
* Atomic handler pattern: no LLM in the loop, errors surfaced via returned messages[],
|
|
118
|
+
* not throw. Accepts _testBundleToolsRoot for test isolation (defaults to getBundledToolsRoot()).
|
|
119
|
+
*
|
|
120
|
+
* When singleTool is provided (e.g. "store-cli"), only that file is copied (both .cjs
|
|
121
|
+
* variant checked first). Used by the `forge:rebuild tools <name>` sub-target.
|
|
122
|
+
*
|
|
123
|
+
* @param cwd Project root directory (must contain .forge/)
|
|
124
|
+
* @param _testBundleToolsRoot Override bundle tools root for tests; omit to use getBundledToolsRoot()
|
|
125
|
+
* @param singleTool Optional: copy only this one tool by stem name (without extension)
|
|
126
|
+
*/
|
|
127
|
+
export function runRebuildTools(cwd, _testBundleToolsRoot, singleTool) {
|
|
128
|
+
const messages = [];
|
|
129
|
+
const toolsSrc = _testBundleToolsRoot ?? getBundledToolsRoot();
|
|
130
|
+
if (!fs.existsSync(toolsSrc)) {
|
|
131
|
+
messages.push(`× forge:rebuild tools — bundle tools dir not found: ${toolsSrc}`);
|
|
132
|
+
return { messages };
|
|
133
|
+
}
|
|
134
|
+
const toolsDest = path.join(cwd, ".forge", "tools");
|
|
135
|
+
try {
|
|
136
|
+
fs.mkdirSync(toolsDest, { recursive: true });
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
messages.push(`× forge:rebuild tools — could not create .forge/tools/: ${err.message ?? String(err)}`);
|
|
140
|
+
return { messages };
|
|
141
|
+
}
|
|
142
|
+
if (singleTool) {
|
|
143
|
+
// Single-file sub-target: copy only the named tool
|
|
144
|
+
const srcCjs = path.join(toolsSrc, `${singleTool}.cjs`);
|
|
145
|
+
const srcJs = path.join(toolsSrc, `${singleTool}.js`);
|
|
146
|
+
const resolvedSrc = fs.existsSync(srcCjs) ? srcCjs : fs.existsSync(srcJs) ? srcJs : null;
|
|
147
|
+
if (resolvedSrc) {
|
|
148
|
+
const destFile = path.join(toolsDest, path.basename(resolvedSrc));
|
|
149
|
+
try {
|
|
150
|
+
fs.copyFileSync(resolvedSrc, destFile);
|
|
151
|
+
messages.push(`〇 forge:rebuild tools — copied ${path.basename(resolvedSrc)}`);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
messages.push(`× forge:rebuild tools — copy failed for ${singleTool}: ${err.message ?? String(err)}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
messages.push(`△ forge:rebuild tools — tool not found: ${singleTool} (neither .cjs nor .js)`);
|
|
159
|
+
}
|
|
160
|
+
return { messages };
|
|
161
|
+
}
|
|
162
|
+
// Full copy: all .cjs and .js files
|
|
163
|
+
let copiedCount = 0;
|
|
164
|
+
try {
|
|
165
|
+
const entries = fs.readdirSync(toolsSrc, { withFileTypes: true });
|
|
166
|
+
for (const entry of entries) {
|
|
167
|
+
if (!entry.isFile())
|
|
168
|
+
continue;
|
|
169
|
+
if (!entry.name.endsWith(".cjs") && !entry.name.endsWith(".js"))
|
|
170
|
+
continue;
|
|
171
|
+
try {
|
|
172
|
+
fs.copyFileSync(path.join(toolsSrc, entry.name), path.join(toolsDest, entry.name));
|
|
173
|
+
copiedCount++;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// non-fatal per-file
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
messages.push(`× forge:rebuild tools — could not read bundle tools dir: ${err.message ?? String(err)}`);
|
|
182
|
+
return { messages };
|
|
183
|
+
}
|
|
184
|
+
// Copy lib/ subdirectory
|
|
185
|
+
const libSrc = path.join(toolsSrc, "lib");
|
|
186
|
+
const libDest = path.join(toolsDest, "lib");
|
|
187
|
+
if (fs.existsSync(libSrc)) {
|
|
188
|
+
try {
|
|
189
|
+
fs.mkdirSync(libDest, { recursive: true });
|
|
190
|
+
const libEntries = fs.readdirSync(libSrc, { withFileTypes: true });
|
|
191
|
+
for (const entry of libEntries) {
|
|
192
|
+
if (!entry.isFile())
|
|
193
|
+
continue;
|
|
194
|
+
if (!entry.name.endsWith(".cjs") && !entry.name.endsWith(".js"))
|
|
195
|
+
continue;
|
|
196
|
+
try {
|
|
197
|
+
fs.copyFileSync(path.join(libSrc, entry.name), path.join(libDest, entry.name));
|
|
198
|
+
copiedCount++;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// non-fatal per-file
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// non-fatal lib copy failure
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
messages.push(`〇 forge:rebuild tools — copied ${copiedCount} tool file(s) to .forge/tools/`);
|
|
210
|
+
return { messages };
|
|
211
|
+
}
|
|
212
|
+
export function registerRegenerate(pi) {
|
|
213
|
+
pi.registerCommand("forge:rebuild", {
|
|
214
|
+
description: "Re-materialize .forge/ and .claude/commands/ from the bundled forge-payload " +
|
|
215
|
+
"(deterministic subset of the plugin's /forge:rebuild — runs substitute-placeholders.cjs). " +
|
|
216
|
+
"--enrich: trigger enhancement workflow (Phase 2) instead of base-pack re-materialization.",
|
|
217
|
+
async handler(args, ctx) {
|
|
218
|
+
const cwd = process.cwd();
|
|
219
|
+
// FORGE-S26-T11: --enrich flag dispatches to enhance behavior (absorbed from forge:enhance).
|
|
220
|
+
// FORGE-S29-T05: `tools` sub-arg dispatches to runRebuildTools.
|
|
221
|
+
const parts = (args ?? "").trim().split(/\s+/).filter(Boolean);
|
|
222
|
+
const hasEnrich = parts.includes("--enrich");
|
|
223
|
+
const toolsIdx = parts.indexOf("tools");
|
|
224
|
+
if (toolsIdx !== -1) {
|
|
225
|
+
// forge:rebuild tools [<name>]
|
|
226
|
+
// Optional single tool name follows the "tools" keyword.
|
|
227
|
+
const singleTool = parts[toolsIdx + 1];
|
|
228
|
+
const result = runRebuildTools(cwd, undefined, singleTool);
|
|
229
|
+
for (const msg of result.messages) {
|
|
230
|
+
ctx.ui.notify(msg, msg.startsWith("×") ? "error" : "info");
|
|
231
|
+
}
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (hasEnrich) {
|
|
235
|
+
// Strip --enrich, pass remaining args to enhance handler (Phase 2 default)
|
|
236
|
+
const enhanceArgs = parts.filter((p) => p !== "--enrich").join(" ");
|
|
237
|
+
let enhanceHandler;
|
|
238
|
+
const syntheticPi = {
|
|
239
|
+
...pi,
|
|
240
|
+
registerCommand: (name, def) => {
|
|
241
|
+
if (name === "forge:enhance")
|
|
242
|
+
enhanceHandler = def.handler;
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
registerEnhance(syntheticPi);
|
|
246
|
+
if (enhanceHandler) {
|
|
247
|
+
await enhanceHandler(enhanceArgs, ctx);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
ctx.ui.notify("× forge:rebuild --enrich — enhance handler unavailable", "error");
|
|
251
|
+
}
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const configPath = path.join(cwd, ".forge", "config.json");
|
|
255
|
+
if (!fs.existsSync(configPath)) {
|
|
256
|
+
ctx.ui.notify("× forge:rebuild — no .forge/config.json at cwd. Run /forge:init first.", "error");
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const bundleRoot = getBundledPayloadRoot();
|
|
260
|
+
const toolsRoot = getBundledToolsRoot();
|
|
261
|
+
const buildInitContextTool = path.join(toolsRoot, "build-init-context.cjs");
|
|
262
|
+
const substituteTool = path.join(toolsRoot, "substitute-placeholders.cjs");
|
|
263
|
+
const basePackDir = path.join(bundleRoot, ".base-pack");
|
|
264
|
+
if (!fs.existsSync(substituteTool)) {
|
|
265
|
+
ctx.ui.notify(`× forge:rebuild — substitute-placeholders.cjs missing at ${substituteTool}`, "error");
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (!fs.existsSync(basePackDir)) {
|
|
269
|
+
ctx.ui.notify(`× forge:rebuild — base-pack missing at ${basePackDir}`, "error");
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// Pre-write modification guard (forge-cli#26 / forge#106 / FORGE-BUG-037).
|
|
273
|
+
// Skip with --force (e.g. CI / dogfood reset). Otherwise, surface any
|
|
274
|
+
// manual modifications (typically applied by /forge:enhance Phase 2)
|
|
275
|
+
// and require explicit confirmation before overwriting them.
|
|
276
|
+
const force = (args ?? []).includes("--force");
|
|
277
|
+
if (!force) {
|
|
278
|
+
const divergent = findModifiedStructuralFiles(cwd, toolsRoot);
|
|
279
|
+
if (divergent.length > 0) {
|
|
280
|
+
const modCount = divergent.filter((m) => m.state === "modified").length;
|
|
281
|
+
const untCount = divergent.filter((m) => m.state === "untracked").length;
|
|
282
|
+
const summary = [
|
|
283
|
+
`${divergent.length} file(s) in .forge/ diverge from the manifest baseline:`,
|
|
284
|
+
` ${modCount} modified (hash mismatch — typical /forge:enhance Phase 2 edit)`,
|
|
285
|
+
` ${untCount} untracked (no manifest entry — usually means a prior regenerate cleared the namespace)`,
|
|
286
|
+
"",
|
|
287
|
+
"Divergent files:",
|
|
288
|
+
...divergent.map((m) => ` △ [${m.state}] ${m.relativePath}`),
|
|
289
|
+
"",
|
|
290
|
+
"Edits CAPTURED by /forge:enhance Phase 2 snapshots (.forge/archive/snap-N/)",
|
|
291
|
+
"will be RESTORED automatically post-regenerate via `manage-versions replay`",
|
|
292
|
+
"(forge#107 / Approach A — overlay semantics, later snapshots win).",
|
|
293
|
+
"",
|
|
294
|
+
"Edits NOT captured in any snapshot will be lost. To capture before regen, run",
|
|
295
|
+
"/forge:enhance Phase 2 → approve edits → ensure `add-snapshot` was called.",
|
|
296
|
+
"",
|
|
297
|
+
"Answer 'yes' to proceed (snapshot-captured edits survive automatically).",
|
|
298
|
+
"Answer 'no' to abort.",
|
|
299
|
+
"Use --force to skip this prompt AND skip replay (pristine base-pack).",
|
|
300
|
+
].join("\n");
|
|
301
|
+
const proceed = await ctx.ui.confirm(`Proceed with regenerate? (${divergent.length} divergent file(s): ${modCount} modified, ${untCount} untracked)`, summary);
|
|
302
|
+
if (!proceed) {
|
|
303
|
+
ctx.ui.notify(`〇 forge:rebuild cancelled — ${divergent.length} divergent file(s) preserved.`, "info");
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
ctx.ui.setStatus?.("forge:rebuild", "rebuilding init-context…");
|
|
309
|
+
// 1. Rebuild init-context.json so substitute has fresh placeholders.
|
|
310
|
+
if (fs.existsSync(buildInitContextTool)) {
|
|
311
|
+
const ok = await runTool(buildInitContextTool, [
|
|
312
|
+
"--config",
|
|
313
|
+
configPath,
|
|
314
|
+
"--personas",
|
|
315
|
+
path.join(cwd, ".forge", "personas"),
|
|
316
|
+
"--templates",
|
|
317
|
+
path.join(cwd, ".forge", "templates"),
|
|
318
|
+
"--kb",
|
|
319
|
+
cwd,
|
|
320
|
+
"--out",
|
|
321
|
+
path.join(cwd, ".forge", "init-context.md"),
|
|
322
|
+
"--json-out",
|
|
323
|
+
path.join(cwd, ".forge", "init-context.json"),
|
|
324
|
+
], cwd, ctx, "build-init-context", 30_000);
|
|
325
|
+
if (!ok) {
|
|
326
|
+
ctx.ui.setStatus?.("forge:rebuild", undefined);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
ctx.ui.setStatus?.("forge:rebuild", "materializing .forge/ + .claude/commands/…");
|
|
331
|
+
// 2. Re-run substitute-placeholders against the bundled base-pack.
|
|
332
|
+
const ok = await runTool(substituteTool, [
|
|
333
|
+
"--forge-root",
|
|
334
|
+
bundleRoot,
|
|
335
|
+
"--base-pack",
|
|
336
|
+
basePackDir,
|
|
337
|
+
"--config",
|
|
338
|
+
configPath,
|
|
339
|
+
"--context",
|
|
340
|
+
path.join(cwd, ".forge", "init-context.json"),
|
|
341
|
+
"--out",
|
|
342
|
+
cwd,
|
|
343
|
+
], cwd, ctx, "substitute-placeholders", 60_000);
|
|
344
|
+
// 3a. Replay user enhancements (forge#107 / forge-cli#27 — Approach A layer 3).
|
|
345
|
+
// After substitute-placeholders wrote fresh base-pack content over
|
|
346
|
+
// .forge/{personas,skills,workflows,templates}/, restore any user-enhanced
|
|
347
|
+
// files captured by /forge:enhance Phase 2 snapshots from .forge/archive/snap-N/.
|
|
348
|
+
// Mirrors regenerate.md's per-category replay step. Pure additive — replay
|
|
349
|
+
// is a no-op when no snapshots match. Skipped when --force is used (force
|
|
350
|
+
// is "I want pristine base-pack content, no overlay").
|
|
351
|
+
const manageVersionsTool = path.join(toolsRoot, "manage-versions.cjs");
|
|
352
|
+
let replayTotal = 0;
|
|
353
|
+
if (ok && !force && fs.existsSync(manageVersionsTool)) {
|
|
354
|
+
ctx.ui.setStatus?.("forge:rebuild", "replaying user enhancements…");
|
|
355
|
+
const replayCategories = ["personas", "skills", "workflows", "templates"];
|
|
356
|
+
for (const category of replayCategories) {
|
|
357
|
+
await new Promise((resolve) => {
|
|
358
|
+
const child = spawn("node", [manageVersionsTool, "replay", "--target", category], {
|
|
359
|
+
cwd,
|
|
360
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
361
|
+
});
|
|
362
|
+
let stdoutBuf = "";
|
|
363
|
+
child.stdout?.on("data", (d) => {
|
|
364
|
+
stdoutBuf += d.toString();
|
|
365
|
+
});
|
|
366
|
+
child.on("close", (code) => {
|
|
367
|
+
if (code === 0) {
|
|
368
|
+
// Parse "restored — N file(s)" out of stdout to track total
|
|
369
|
+
const m = stdoutBuf.match(/(\d+)\s+file\(s\)\s+restored/);
|
|
370
|
+
if (m) {
|
|
371
|
+
replayTotal += parseInt(m[1], 10);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Non-zero exit (e.g. structure-versions.json missing on a
|
|
375
|
+
// project that never ran /forge:enhance): treat as no-op.
|
|
376
|
+
resolve();
|
|
377
|
+
});
|
|
378
|
+
child.on("error", () => resolve());
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
if (replayTotal > 0) {
|
|
382
|
+
ctx.ui.notify(`〇 replay: ${replayTotal} user enhancement(s) restored from snapshots`, "info");
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// 3b. Refresh schemas from bundled .schemas/. substitute-placeholders does
|
|
386
|
+
// not touch .forge/schemas/, but a forge plugin version bump can ship
|
|
387
|
+
// schema changes (e.g. 0.43.13 added `provider` required + dropped
|
|
388
|
+
// `estimatedCostUSD`). Without this step, regenerated workflows assume
|
|
389
|
+
// the new contract while the schemas on disk still enforce the old one
|
|
390
|
+
// — leading to silent validation drift. Mirrors forge-init.ts copy.
|
|
391
|
+
let schemaCount = 0;
|
|
392
|
+
if (ok) {
|
|
393
|
+
const schemasSrc = path.join(bundleRoot, ".schemas");
|
|
394
|
+
const schemasDest = path.join(cwd, ".forge", "schemas");
|
|
395
|
+
if (fs.existsSync(schemasSrc)) {
|
|
396
|
+
fs.mkdirSync(schemasDest, { recursive: true });
|
|
397
|
+
const files = fs.readdirSync(schemasSrc).filter((f) => f.endsWith(".json"));
|
|
398
|
+
for (const f of files) {
|
|
399
|
+
try {
|
|
400
|
+
fs.copyFileSync(path.join(schemasSrc, f), path.join(schemasDest, f));
|
|
401
|
+
schemaCount++;
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
// non-fatal — surfaced in count below
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
ctx.ui.setStatus?.("forge:rebuild", undefined);
|
|
410
|
+
if (ok) {
|
|
411
|
+
// 4. Update forgeRoot in .forge/config.json to point to the bundled payload.
|
|
412
|
+
// Without this, projects initialized under a different runtime (e.g. Claude
|
|
413
|
+
// Code plugin cache) keep pointing to the stale forgeRoot. This causes
|
|
414
|
+
// subagent bash calls to $FORGE_ROOT to hit outdated store-cli, schema
|
|
415
|
+
// validators, etc. that lack new enum values and status transitions.
|
|
416
|
+
if (bundleRoot) {
|
|
417
|
+
try {
|
|
418
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
419
|
+
const oldRoot = config?.paths?.forgeRoot;
|
|
420
|
+
if (oldRoot !== bundleRoot) {
|
|
421
|
+
config.paths = config.paths || {};
|
|
422
|
+
config.paths.forgeRoot = bundleRoot;
|
|
423
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf8");
|
|
424
|
+
ctx.ui.notify(`Updated forgeRoot in config.json: ${oldRoot ?? "(unset)"} → ${bundleRoot}`, "info");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (e) {
|
|
428
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
429
|
+
ctx.ui.notify(`⚠ forge:rebuild — could not update forgeRoot in config.json: ${msg}`, "warning");
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
ctx.ui.notify("〇 forge:rebuild complete — .forge/workflows, .forge/personas, .forge/skills, " +
|
|
433
|
+
`.forge/templates, .claude/commands/ re-materialized from bundled payload; ${schemaCount} schemas refreshed.`, "info");
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=regenerate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regenerate.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/regenerate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
export interface ParsedRemoveArgs {
|
|
3
|
+
apply: boolean;
|
|
4
|
+
seed: string;
|
|
5
|
+
sourceLabel: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseRemoveArgs(rawArgs: string, cwd: string): ParsedRemoveArgs;
|
|
8
|
+
export interface ComposeRemoveKickoffOpts {
|
|
9
|
+
commandMd: string;
|
|
10
|
+
parsed: ParsedRemoveArgs;
|
|
11
|
+
}
|
|
12
|
+
export declare function composeRemoveKickoff(opts: ComposeRemoveKickoffOpts): string;
|
|
13
|
+
export interface RegisterRemoveCommandOptions {
|
|
14
|
+
forgeRoot: string | null;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function registerRemoveCommand(pi: ExtensionAPI, options: RegisterRemoveCommandOptions): void;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// forge:remove — native kickoff handler (FORGE-S23-T11).
|
|
2
|
+
//
|
|
3
|
+
// Replaces the auto-generated stub previously installed by
|
|
4
|
+
// registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
|
|
5
|
+
// (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
|
|
6
|
+
//
|
|
7
|
+
// File is named remove-command.ts (not remove.ts) to avoid naming
|
|
8
|
+
// conflicts with Node.js built-in patterns (consistent with read-command.ts
|
|
9
|
+
// and status-command.ts in this directory).
|
|
10
|
+
//
|
|
11
|
+
// --apply flag bypasses the per-bucket LLM confirmation prompts by including
|
|
12
|
+
// the flag value in the kickoff body so the LLM skips interactive confirmation.
|
|
13
|
+
//
|
|
14
|
+
// Workflow source: <forgeRoot>/commands/remove.md (command file).
|
|
15
|
+
// File-existence check only — command files lack Pack-06 workflow markers.
|
|
16
|
+
//
|
|
17
|
+
// Iron Laws:
|
|
18
|
+
// IL1 — code only under forge-cli/src/extensions/forgecli/.
|
|
19
|
+
// IL4 — no JSON.stringify-into-subagent dispatch.
|
|
20
|
+
// IL6 — no shell-string interpolation; no spawn calls here.
|
|
21
|
+
// IL7 — every failure path emits ctx.ui.notify and returns; no silent
|
|
22
|
+
// continuation.
|
|
23
|
+
import * as fs from "node:fs";
|
|
24
|
+
import * as path from "node:path";
|
|
25
|
+
import { sendKickoff } from "./kickoff.js";
|
|
26
|
+
export function parseRemoveArgs(rawArgs, cwd) {
|
|
27
|
+
const trimmed = (rawArgs ?? "").trim();
|
|
28
|
+
const result = {
|
|
29
|
+
apply: false,
|
|
30
|
+
seed: "",
|
|
31
|
+
sourceLabel: "",
|
|
32
|
+
};
|
|
33
|
+
if (!trimmed) {
|
|
34
|
+
result.sourceLabel = "(no args — interactive removal)";
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
const tokens = trimmed.split(/\s+/);
|
|
38
|
+
const remaining = [];
|
|
39
|
+
for (const tok of tokens) {
|
|
40
|
+
if (tok === "--apply") {
|
|
41
|
+
result.apply = true;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
remaining.push(tok);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const tail = remaining.join(" ").trim();
|
|
48
|
+
if (tail.startsWith("@")) {
|
|
49
|
+
const ref = tail.slice(1).trim();
|
|
50
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
|
|
51
|
+
result.seed = fs.readFileSync(filePath, "utf8");
|
|
52
|
+
result.sourceLabel = `(seed from file: ${ref})`;
|
|
53
|
+
}
|
|
54
|
+
else if (tail) {
|
|
55
|
+
result.seed = tail;
|
|
56
|
+
result.sourceLabel = "(seed from inline text)";
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
result.sourceLabel = result.apply ? "(--apply provided)" : "(no args — interactive removal)";
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
export function composeRemoveKickoff(opts) {
|
|
64
|
+
const { commandMd, parsed } = opts;
|
|
65
|
+
const sections = ["# /forge:remove", ""];
|
|
66
|
+
sections.push("## Dispatch", "");
|
|
67
|
+
sections.push("Run the remove command below to remove Forge artifacts from this project.");
|
|
68
|
+
if (parsed.apply) {
|
|
69
|
+
sections.push("", "**`--apply` flag provided.** Proceed with removal of each bucket without asking for per-bucket confirmation. " +
|
|
70
|
+
"Still show a final summary of what will be removed before executing, but do not prompt for each individual bucket.");
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
sections.push("", "Interactive mode: ask for confirmation before removing each bucket (default behavior).");
|
|
74
|
+
}
|
|
75
|
+
sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
|
|
76
|
+
if (parsed.seed) {
|
|
77
|
+
sections.push("", `## Additional Input — ${parsed.sourceLabel}`, "", parsed.seed.trim());
|
|
78
|
+
}
|
|
79
|
+
return sections.join("\n");
|
|
80
|
+
}
|
|
81
|
+
// ── Registration ──────────────────────────────────────────────────────────
|
|
82
|
+
const COMMAND_NAME = "remove";
|
|
83
|
+
export function registerRemoveCommand(pi, options) {
|
|
84
|
+
pi.registerCommand("forge:remove", {
|
|
85
|
+
description: "Remove Forge artifacts from this project — interactive by default. " +
|
|
86
|
+
"Usage: /forge:remove [--apply] [@<file> | <text>]. " +
|
|
87
|
+
"--apply skips per-bucket confirmation prompts.",
|
|
88
|
+
async handler(args, ctx) {
|
|
89
|
+
const { forgeRoot } = options;
|
|
90
|
+
const cwd = options.cwd ?? process.cwd();
|
|
91
|
+
if (!forgeRoot) {
|
|
92
|
+
ctx.ui.notify("× forge:remove — no Forge project at cwd; run /forge:init to bootstrap", "warning");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
|
|
96
|
+
let commandMd;
|
|
97
|
+
try {
|
|
98
|
+
commandMd = fs.readFileSync(commandPath, "utf8");
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
const e = err;
|
|
102
|
+
if (e.code === "ENOENT") {
|
|
103
|
+
ctx.ui.notify(`× forge:remove — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
ctx.ui.notify(`× forge:remove — failed to read command file: ${e.message ?? "unknown error"}`, "error");
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let parsed;
|
|
111
|
+
try {
|
|
112
|
+
parsed = parseRemoveArgs(args, cwd);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
const e = err;
|
|
116
|
+
ctx.ui.notify(`× forge:remove — failed to parse args: ${e.message ?? "unknown"}`, "error");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const kickoff = composeRemoveKickoff({ commandMd, parsed });
|
|
120
|
+
sendKickoff(pi, kickoff);
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=remove-command.js.map
|