@entelligentsia/forgecli 1.0.20 → 1.0.25
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 +131 -0
- package/README.md +7 -1
- package/dist/CHANGELOG-forge-plugin.md +118 -0
- package/dist/bin/config.js +4 -4
- package/dist/bin/config.js.map +1 -1
- package/dist/bin/update-cli.d.ts +1 -1
- package/dist/bin/update-cli.js +1 -1
- package/dist/bin/update-cli.js.map +1 -1
- package/dist/extensions/forgecli/ask-user-tool.js +1 -1
- package/dist/extensions/forgecli/ask-user-tool.js.map +1 -1
- package/dist/extensions/forgecli/{add-pipeline.js → commands/add-pipeline.js} +1 -1
- package/dist/extensions/forgecli/commands/add-pipeline.js.map +1 -0
- package/dist/extensions/forgecli/{add-task.js → commands/add-task.js} +1 -1
- package/dist/extensions/forgecli/commands/add-task.js.map +1 -0
- package/dist/extensions/forgecli/{approve.d.ts → commands/approve.d.ts} +2 -2
- package/dist/extensions/forgecli/{approve.js → commands/approve.js} +8 -8
- package/dist/extensions/forgecli/commands/approve.js.map +1 -0
- package/dist/extensions/forgecli/{collate.d.ts → commands/collate.d.ts} +2 -2
- package/dist/extensions/forgecli/{collate.js → commands/collate.js} +6 -6
- package/dist/extensions/forgecli/commands/collate.js.map +1 -0
- package/dist/extensions/forgecli/{commit.d.ts → commands/commit.d.ts} +2 -2
- package/dist/extensions/forgecli/{commit.js → commands/commit.js} +8 -8
- package/dist/extensions/forgecli/commands/commit.js.map +1 -0
- package/dist/extensions/forgecli/{config-command.js → commands/config-command.js} +3 -3
- package/dist/extensions/forgecli/commands/config-command.js.map +1 -0
- package/dist/extensions/forgecli/commands/enhance.d.ts +45 -0
- package/dist/extensions/forgecli/{enhance.js → commands/enhance.js} +95 -75
- package/dist/extensions/forgecli/commands/enhance.js.map +1 -0
- package/dist/extensions/forgecli/{implement.d.ts → commands/implement.d.ts} +2 -2
- package/dist/extensions/forgecli/{implement.js → commands/implement.js} +8 -8
- package/dist/extensions/forgecli/commands/implement.js.map +1 -0
- package/dist/extensions/forgecli/{plan.d.ts → commands/plan.d.ts} +2 -2
- package/dist/extensions/forgecli/{plan.js → commands/plan.js} +8 -8
- package/dist/extensions/forgecli/commands/plan.js.map +1 -0
- package/dist/extensions/forgecli/{quiz-agent.js → commands/quiz-agent.js} +1 -1
- package/dist/extensions/forgecli/commands/quiz-agent.js.map +1 -0
- package/dist/extensions/forgecli/{read-command.js → commands/read-command.js} +2 -2
- package/dist/extensions/forgecli/commands/read-command.js.map +1 -0
- package/dist/extensions/forgecli/{regenerate.js → commands/regenerate.js} +7 -19
- package/dist/extensions/forgecli/commands/regenerate.js.map +1 -0
- package/dist/extensions/forgecli/{remove-command.js → commands/remove-command.js} +1 -1
- package/dist/extensions/forgecli/commands/remove-command.js.map +1 -0
- package/dist/extensions/forgecli/{report-bug.js → commands/report-bug.js} +1 -1
- package/dist/extensions/forgecli/commands/report-bug.js.map +1 -0
- package/dist/extensions/forgecli/{retrospective.d.ts → commands/retrospective.d.ts} +1 -1
- package/dist/extensions/forgecli/{retrospective.js → commands/retrospective.js} +5 -5
- package/dist/extensions/forgecli/commands/retrospective.js.map +1 -0
- package/dist/extensions/forgecli/{review-code.d.ts → commands/review-code.d.ts} +2 -2
- package/dist/extensions/forgecli/{review-code.js → commands/review-code.js} +9 -9
- package/dist/extensions/forgecli/commands/review-code.js.map +1 -0
- package/dist/extensions/forgecli/{review-plan.d.ts → commands/review-plan.d.ts} +2 -2
- package/dist/extensions/forgecli/{review-plan.js → commands/review-plan.js} +9 -9
- package/dist/extensions/forgecli/commands/review-plan.js.map +1 -0
- package/dist/extensions/forgecli/commands/sprint-intake.js.map +1 -0
- package/dist/extensions/forgecli/commands/sprint-plan.js.map +1 -0
- package/dist/extensions/forgecli/{status-command.js → commands/status-command.js} +1 -1
- package/dist/extensions/forgecli/commands/status-command.js.map +1 -0
- package/dist/extensions/forgecli/{store-query.js → commands/store-query.js} +1 -1
- package/dist/extensions/forgecli/commands/store-query.js.map +1 -0
- package/dist/extensions/forgecli/{store-repair.js → commands/store-repair.js} +1 -1
- package/dist/extensions/forgecli/commands/store-repair.js.map +1 -0
- package/dist/extensions/forgecli/{test-orchestrate.js → commands/test-orchestrate.js} +1 -1
- package/dist/extensions/forgecli/commands/test-orchestrate.js.map +1 -0
- package/dist/extensions/forgecli/commands/transcripts-command.d.ts +87 -0
- package/dist/extensions/forgecli/commands/transcripts-command.js +418 -0
- package/dist/extensions/forgecli/commands/transcripts-command.js.map +1 -0
- package/dist/extensions/forgecli/{validate.d.ts → commands/validate.d.ts} +2 -2
- package/dist/extensions/forgecli/{validate.js → commands/validate.js} +8 -8
- package/dist/extensions/forgecli/commands/validate.js.map +1 -0
- package/dist/extensions/forgecli/{config-layer.js → config/config-layer.js} +2 -2
- package/dist/extensions/forgecli/config/config-layer.js.map +1 -0
- package/dist/extensions/forgecli/{config-writer.js → config/config-writer.js} +2 -2
- package/dist/extensions/forgecli/config/config-writer.js.map +1 -0
- package/dist/extensions/forgecli/{model-registry.js → config/model-registry.js} +1 -1
- package/dist/extensions/forgecli/config/model-registry.js.map +1 -0
- package/dist/extensions/forgecli/config/model-resolver.js.map +1 -0
- package/dist/extensions/forgecli/config/model-validator.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/component.js +1 -1
- package/dist/extensions/forgecli/config-tui/component.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/handler.js +1 -1
- package/dist/extensions/forgecli/config-tui/handler.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/override-editor.js +1 -1
- package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +1 -1
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +1 -1
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/state/model.d.ts +1 -1
- package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -1
- package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +2 -2
- package/dist/extensions/forgecli/config-tui/state/selectors.js +1 -1
- package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -1
- package/dist/extensions/forgecli/context-governor-compaction.d.ts +13 -2
- package/dist/extensions/forgecli/context-governor-compaction.js +66 -41
- package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -1
- package/dist/extensions/forgecli/context-governor.d.ts +3 -7
- package/dist/extensions/forgecli/context-governor.js +43 -69
- package/dist/extensions/forgecli/context-governor.js.map +1 -1
- package/dist/extensions/forgecli/dashboard/component.d.ts +10 -1
- package/dist/extensions/forgecli/dashboard/component.js +84 -18
- package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
- package/dist/extensions/forgecli/dashboard/register.js +1 -1
- package/dist/extensions/forgecli/dashboard/register.js.map +1 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js +1 -1
- package/dist/extensions/forgecli/forge-commands.js +1 -1
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/{forge-init.js → forge-init/forge-init.js} +10 -10
- package/dist/extensions/forgecli/forge-init/forge-init.js.map +1 -0
- package/dist/extensions/forgecli/forge-init/init-context.js.map +1 -0
- package/dist/extensions/forgecli/forge-init/init-progress.js.map +1 -0
- package/dist/extensions/forgecli/forge-init/phase4-register.js +1 -1
- package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/run-phases.js +2 -2
- package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +22 -0
- package/dist/extensions/forgecli/forge-subagent.js +42 -15
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-tools.d.ts +1 -25
- package/dist/extensions/forgecli/forge-tools.js +79 -37
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/governor-config.d.ts +19 -0
- package/dist/extensions/forgecli/governor-config.js +58 -0
- package/dist/extensions/forgecli/governor-config.js.map +1 -0
- package/dist/extensions/forgecli/health-check.js +1 -1
- package/dist/extensions/forgecli/health-check.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +2 -2
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-init-hook.js +11 -6
- package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js +11 -6
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
- package/dist/extensions/forgecli/hooks/write-guard.js +1 -1
- package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -1
- package/dist/extensions/forgecli/index.js +37 -35
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/kickoff.d.ts +9 -0
- package/dist/extensions/forgecli/kickoff.js +15 -0
- package/dist/extensions/forgecli/kickoff.js.map +1 -1
- package/dist/extensions/forgecli/lib/forge-config.d.ts +1 -1
- package/dist/extensions/forgecli/lib/forge-config.js +1 -1
- package/dist/extensions/forgecli/lib/forge-config.js.map +1 -1
- package/dist/extensions/forgecli/{forge-root.d.ts → lib/forge-root.d.ts} +5 -0
- package/dist/extensions/forgecli/{forge-root.js → lib/forge-root.js} +14 -1
- package/dist/extensions/forgecli/lib/forge-root.js.map +1 -0
- package/dist/extensions/forgecli/lib/run-cjs.d.ts +26 -0
- package/dist/extensions/forgecli/lib/run-cjs.js +42 -0
- package/dist/extensions/forgecli/lib/run-cjs.js.map +1 -0
- package/dist/extensions/forgecli/orchestrator-tree.d.ts +4 -0
- package/dist/extensions/forgecli/orchestrator-tree.js +21 -3
- package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -1
- package/dist/extensions/forgecli/{calibrate.d.ts → orchestrators/calibrate.d.ts} +2 -2
- package/dist/extensions/forgecli/{calibrate.js → orchestrators/calibrate.js} +4 -4
- package/dist/extensions/forgecli/orchestrators/calibrate.js.map +1 -0
- package/dist/extensions/forgecli/{fix-bug.d.ts → orchestrators/fix-bug.d.ts} +14 -5
- package/dist/extensions/forgecli/{fix-bug.js → orchestrators/fix-bug.js} +212 -61
- package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -0
- package/dist/extensions/forgecli/{lib → orchestrators}/halt-advisor.d.ts +1 -1
- package/dist/extensions/forgecli/{lib → orchestrators}/halt-advisor.js +1 -1
- package/dist/extensions/forgecli/orchestrators/halt-advisor.js.map +1 -0
- package/dist/extensions/forgecli/{materialize.js → orchestrators/materialize.js} +1 -1
- package/dist/extensions/forgecli/orchestrators/materialize.js.map +1 -0
- package/dist/extensions/forgecli/{migrate.d.ts → orchestrators/migrate.d.ts} +1 -1
- package/dist/extensions/forgecli/{migrate.js → orchestrators/migrate.js} +5 -5
- package/dist/extensions/forgecli/orchestrators/migrate.js.map +1 -0
- package/dist/extensions/forgecli/{lib → orchestrators}/orchestrator-preflight.d.ts +2 -2
- package/dist/extensions/forgecli/{lib → orchestrators}/orchestrator-preflight.js +2 -2
- package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js.map +1 -0
- package/dist/extensions/forgecli/{run-sprint.d.ts → orchestrators/run-sprint.d.ts} +1 -1
- package/dist/extensions/forgecli/{run-sprint.js → orchestrators/run-sprint.js} +85 -18
- package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -0
- package/dist/extensions/forgecli/{run-task.d.ts → orchestrators/run-task.d.ts} +14 -3
- package/dist/extensions/forgecli/{run-task.js → orchestrators/run-task.js} +121 -33
- package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -0
- package/dist/extensions/forgecli/paths/paths.d.ts +8 -0
- package/dist/extensions/forgecli/paths/paths.js +17 -0
- package/dist/extensions/forgecli/paths/paths.js.map +1 -1
- package/dist/extensions/forgecli/phase-vocab.d.ts +31 -0
- package/dist/extensions/forgecli/phase-vocab.js +82 -0
- package/dist/extensions/forgecli/phase-vocab.js.map +1 -0
- package/dist/extensions/forgecli/session-registry.d.ts +2 -2
- package/dist/extensions/forgecli/session-registry.js +6 -2
- package/dist/extensions/forgecli/session-registry.js.map +1 -1
- package/dist/extensions/forgecli/{friction-emit.d.ts → skill-curation/friction-emit.d.ts} +1 -1
- package/dist/extensions/forgecli/{friction-emit.js → skill-curation/friction-emit.js} +2 -2
- package/dist/extensions/forgecli/skill-curation/friction-emit.js.map +1 -0
- package/dist/extensions/forgecli/{skill-curation-flag.js → skill-curation/skill-curation-flag.js} +1 -1
- package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js.map +1 -0
- package/dist/extensions/forgecli/{skill-curator-subagent.d.ts → skill-curation/skill-curator-subagent.d.ts} +2 -2
- package/dist/extensions/forgecli/{skill-curator-subagent.js → skill-curation/skill-curator-subagent.js} +1 -1
- package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js.map +1 -0
- package/dist/extensions/forgecli/{skill-retriever.js → skill-curation/skill-retriever.js} +1 -1
- package/dist/extensions/forgecli/skill-curation/skill-retriever.js.map +1 -0
- package/dist/extensions/forgecli/{skill-usage-tracker.js → skill-curation/skill-usage-tracker.js} +1 -1
- package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js.map +1 -0
- package/dist/extensions/forgecli/store/store-error-remediation.js.map +1 -0
- package/dist/extensions/forgecli/{store-resolver.js → store/store-resolver.js} +2 -2
- package/dist/extensions/forgecli/store/store-resolver.js.map +1 -0
- package/dist/extensions/forgecli/{store-validator.js → store/store-validator.js} +1 -1
- package/dist/extensions/forgecli/store/store-validator.js.map +1 -0
- package/dist/extensions/forgecli/{transition-guard.js → store/transition-guard.js} +2 -2
- package/dist/extensions/forgecli/store/transition-guard.js.map +1 -0
- package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +5 -0
- package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -1
- package/dist/extensions/forgecli/transcript-archive-types.d.ts +171 -0
- package/dist/extensions/forgecli/transcript-archive-types.js +130 -0
- package/dist/extensions/forgecli/transcript-archive-types.js.map +1 -0
- package/dist/extensions/forgecli/transcript-archive.d.ts +127 -0
- package/dist/extensions/forgecli/transcript-archive.js +656 -0
- package/dist/extensions/forgecli/transcript-archive.js.map +1 -0
- package/dist/extensions/forgecli/transcript-replay.d.ts +28 -0
- package/dist/extensions/forgecli/transcript-replay.js +153 -0
- package/dist/extensions/forgecli/transcript-replay.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/component.d.ts +36 -0
- package/dist/extensions/forgecli/transcripts-tui/component.js +112 -0
- package/dist/extensions/forgecli/transcripts-tui/component.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/index.d.ts +4 -0
- package/dist/extensions/forgecli/transcripts-tui/index.js +5 -0
- package/dist/extensions/forgecli/transcripts-tui/index.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/browse.d.ts +21 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/browse.js +172 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/browse.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/types.d.ts +22 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/types.js +4 -0
- package/dist/extensions/forgecli/transcripts-tui/screens/types.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/index.d.ts +4 -0
- package/dist/extensions/forgecli/transcripts-tui/state/index.js +5 -0
- package/dist/extensions/forgecli/transcripts-tui/state/index.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/init.d.ts +8 -0
- package/dist/extensions/forgecli/transcripts-tui/state/init.js +18 -0
- package/dist/extensions/forgecli/transcripts-tui/state/init.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/model.d.ts +56 -0
- package/dist/extensions/forgecli/transcripts-tui/state/model.js +6 -0
- package/dist/extensions/forgecli/transcripts-tui/state/model.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/reducer.d.ts +2 -0
- package/dist/extensions/forgecli/transcripts-tui/state/reducer.js +51 -0
- package/dist/extensions/forgecli/transcripts-tui/state/reducer.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/state/selectors.d.ts +10 -0
- package/dist/extensions/forgecli/transcripts-tui/state/selectors.js +62 -0
- package/dist/extensions/forgecli/transcripts-tui/state/selectors.js.map +1 -0
- package/dist/extensions/forgecli/transcripts-tui/theme.d.ts +20 -0
- package/dist/extensions/forgecli/transcripts-tui/theme.js +47 -0
- package/dist/extensions/forgecli/transcripts-tui/theme.js.map +1 -0
- package/dist/extensions/forgecli/tui/banner.js.map +1 -0
- package/dist/extensions/forgecli/tui/forge-header.js.map +1 -0
- package/dist/extensions/forgecli/tui/input-router.js.map +1 -0
- package/dist/extensions/forgecli/{orchestrator-status-bar.d.ts → tui/orchestrator-status-bar.d.ts} +1 -1
- package/dist/extensions/forgecli/{orchestrator-status-bar.js → tui/orchestrator-status-bar.js} +1 -1
- package/dist/extensions/forgecli/tui/orchestrator-status-bar.js.map +1 -0
- package/dist/extensions/forgecli/tui/thread-switcher.d.ts +18 -0
- package/dist/extensions/forgecli/{thread-switcher.js → tui/thread-switcher.js} +17 -12
- package/dist/extensions/forgecli/tui/thread-switcher.js.map +1 -0
- package/dist/extensions/forgecli/{forge-update-command.js → update/forge-update-command.js} +3 -3
- package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -0
- package/dist/extensions/forgecli/{migration-engine.js → update/migration-engine.js} +1 -1
- package/dist/extensions/forgecli/update/migration-engine.js.map +1 -0
- package/dist/extensions/forgecli/{update-check.js → update/update-check.js} +1 -1
- package/dist/extensions/forgecli/update/update-check.js.map +1 -0
- package/dist/extensions/forgecli/{update-tools.js → update/update-tools.js} +1 -1
- package/dist/extensions/forgecli/update/update-tools.js.map +1 -0
- package/dist/extensions/forgecli/{whats-new-widget.js → update/whats-new-widget.js} +2 -2
- package/dist/extensions/forgecli/update/whats-new-widget.js.map +1 -0
- package/dist/extensions/forgecli/{whats-new.js → update/whats-new.js} +1 -1
- package/dist/extensions/forgecli/update/whats-new.js.map +1 -0
- package/dist/extensions/forgecli/{viewport-events.d.ts → viewport/events.d.ts} +37 -2
- package/dist/extensions/forgecli/{viewport-events.js → viewport/events.js} +70 -23
- package/dist/extensions/forgecli/viewport/events.js.map +1 -0
- package/dist/extensions/forgecli/{viewport-renderer.d.ts → viewport/renderer.d.ts} +19 -0
- package/dist/extensions/forgecli/{viewport-renderer.js → viewport/renderer.js} +46 -2
- package/dist/extensions/forgecli/viewport/renderer.js.map +1 -0
- package/dist/extensions/forgecli/{viewport-theme.js → viewport/theme.js} +13 -10
- package/dist/extensions/forgecli/viewport/theme.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/engine.js +1 -1
- package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
- package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
- 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/event.schema.json +8 -3
- package/dist/forge-payload/.schemas/migrations.json +56 -0
- package/dist/forge-payload/integrity.json +3 -3
- package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
- package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
- package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
- package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/event.schema.json +8 -3
- package/dist/forge-payload/schemas/structure-manifest.json +4 -2
- package/dist/forge-payload/tools/commit-task.cjs +218 -0
- package/dist/forge-payload/tools/store-cli.cjs +6 -1
- package/node_modules/@mariozechner/clipboard/package.json +2 -1
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
- package/package.json +5 -3
- package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
- package/dist/extensions/forgecli/add-task.js.map +0 -1
- package/dist/extensions/forgecli/approve.js.map +0 -1
- package/dist/extensions/forgecli/banner.js.map +0 -1
- package/dist/extensions/forgecli/calibrate.js.map +0 -1
- package/dist/extensions/forgecli/collate.js.map +0 -1
- package/dist/extensions/forgecli/commit.js.map +0 -1
- package/dist/extensions/forgecli/config-command.js.map +0 -1
- package/dist/extensions/forgecli/config-layer.js.map +0 -1
- package/dist/extensions/forgecli/config-writer.js.map +0 -1
- package/dist/extensions/forgecli/enhance.d.ts +0 -27
- package/dist/extensions/forgecli/enhance.js.map +0 -1
- package/dist/extensions/forgecli/fix-bug.js.map +0 -1
- package/dist/extensions/forgecli/forge-header.js.map +0 -1
- package/dist/extensions/forgecli/forge-init.js.map +0 -1
- package/dist/extensions/forgecli/forge-root.js.map +0 -1
- package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
- package/dist/extensions/forgecli/friction-emit.js.map +0 -1
- package/dist/extensions/forgecli/implement.js.map +0 -1
- package/dist/extensions/forgecli/init-context.js.map +0 -1
- package/dist/extensions/forgecli/init-progress.js.map +0 -1
- package/dist/extensions/forgecli/input-router.js.map +0 -1
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
- package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
- package/dist/extensions/forgecli/materialize.js.map +0 -1
- package/dist/extensions/forgecli/migrate.js.map +0 -1
- package/dist/extensions/forgecli/migration-engine.js.map +0 -1
- package/dist/extensions/forgecli/model-registry.js.map +0 -1
- package/dist/extensions/forgecli/model-resolver.js.map +0 -1
- package/dist/extensions/forgecli/model-validator.js.map +0 -1
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
- package/dist/extensions/forgecli/plan.js.map +0 -1
- package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
- package/dist/extensions/forgecli/read-command.js.map +0 -1
- package/dist/extensions/forgecli/regenerate.js.map +0 -1
- package/dist/extensions/forgecli/remove-command.js.map +0 -1
- package/dist/extensions/forgecli/report-bug.js.map +0 -1
- package/dist/extensions/forgecli/retrospective.js.map +0 -1
- package/dist/extensions/forgecli/review-code.js.map +0 -1
- package/dist/extensions/forgecli/review-plan.js.map +0 -1
- package/dist/extensions/forgecli/run-sprint.js.map +0 -1
- package/dist/extensions/forgecli/run-task.js.map +0 -1
- package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
- package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
- package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
- package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
- package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
- package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
- package/dist/extensions/forgecli/status-command.js.map +0 -1
- package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
- package/dist/extensions/forgecli/store-query.js.map +0 -1
- package/dist/extensions/forgecli/store-repair.js.map +0 -1
- package/dist/extensions/forgecli/store-resolver.js.map +0 -1
- package/dist/extensions/forgecli/store-validator.js.map +0 -1
- package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
- package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
- package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
- package/dist/extensions/forgecli/transition-guard.js.map +0 -1
- package/dist/extensions/forgecli/update-check.js.map +0 -1
- package/dist/extensions/forgecli/update-tools.js.map +0 -1
- package/dist/extensions/forgecli/validate.js.map +0 -1
- package/dist/extensions/forgecli/viewport-events.js.map +0 -1
- package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
- package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
- package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
- package/dist/extensions/forgecli/whats-new.js.map +0 -1
- /package/dist/extensions/forgecli/{add-pipeline.d.ts → commands/add-pipeline.d.ts} +0 -0
- /package/dist/extensions/forgecli/{add-task.d.ts → commands/add-task.d.ts} +0 -0
- /package/dist/extensions/forgecli/{config-command.d.ts → commands/config-command.d.ts} +0 -0
- /package/dist/extensions/forgecli/{quiz-agent.d.ts → commands/quiz-agent.d.ts} +0 -0
- /package/dist/extensions/forgecli/{read-command.d.ts → commands/read-command.d.ts} +0 -0
- /package/dist/extensions/forgecli/{regenerate.d.ts → commands/regenerate.d.ts} +0 -0
- /package/dist/extensions/forgecli/{remove-command.d.ts → commands/remove-command.d.ts} +0 -0
- /package/dist/extensions/forgecli/{report-bug.d.ts → commands/report-bug.d.ts} +0 -0
- /package/dist/extensions/forgecli/{sprint-intake.d.ts → commands/sprint-intake.d.ts} +0 -0
- /package/dist/extensions/forgecli/{sprint-intake.js → commands/sprint-intake.js} +0 -0
- /package/dist/extensions/forgecli/{sprint-plan.d.ts → commands/sprint-plan.d.ts} +0 -0
- /package/dist/extensions/forgecli/{sprint-plan.js → commands/sprint-plan.js} +0 -0
- /package/dist/extensions/forgecli/{status-command.d.ts → commands/status-command.d.ts} +0 -0
- /package/dist/extensions/forgecli/{store-query.d.ts → commands/store-query.d.ts} +0 -0
- /package/dist/extensions/forgecli/{store-repair.d.ts → commands/store-repair.d.ts} +0 -0
- /package/dist/extensions/forgecli/{test-orchestrate.d.ts → commands/test-orchestrate.d.ts} +0 -0
- /package/dist/extensions/forgecli/{config-layer.d.ts → config/config-layer.d.ts} +0 -0
- /package/dist/extensions/forgecli/{config-writer.d.ts → config/config-writer.d.ts} +0 -0
- /package/dist/extensions/forgecli/{model-registry.d.ts → config/model-registry.d.ts} +0 -0
- /package/dist/extensions/forgecli/{model-resolver.d.ts → config/model-resolver.d.ts} +0 -0
- /package/dist/extensions/forgecli/{model-resolver.js → config/model-resolver.js} +0 -0
- /package/dist/extensions/forgecli/{model-validator.d.ts → config/model-validator.d.ts} +0 -0
- /package/dist/extensions/forgecli/{model-validator.js → config/model-validator.js} +0 -0
- /package/dist/extensions/forgecli/{forge-init.d.ts → forge-init/forge-init.d.ts} +0 -0
- /package/dist/extensions/forgecli/{init-context.d.ts → forge-init/init-context.d.ts} +0 -0
- /package/dist/extensions/forgecli/{init-context.js → forge-init/init-context.js} +0 -0
- /package/dist/extensions/forgecli/{init-progress.d.ts → forge-init/init-progress.d.ts} +0 -0
- /package/dist/extensions/forgecli/{init-progress.js → forge-init/init-progress.js} +0 -0
- /package/dist/extensions/forgecli/{materialize.d.ts → orchestrators/materialize.d.ts} +0 -0
- /package/dist/extensions/forgecli/{skill-curation-flag.d.ts → skill-curation/skill-curation-flag.d.ts} +0 -0
- /package/dist/extensions/forgecli/{skill-retriever.d.ts → skill-curation/skill-retriever.d.ts} +0 -0
- /package/dist/extensions/forgecli/{skill-usage-tracker.d.ts → skill-curation/skill-usage-tracker.d.ts} +0 -0
- /package/dist/extensions/forgecli/{store-error-remediation.d.ts → store/store-error-remediation.d.ts} +0 -0
- /package/dist/extensions/forgecli/{store-error-remediation.js → store/store-error-remediation.js} +0 -0
- /package/dist/extensions/forgecli/{store-resolver.d.ts → store/store-resolver.d.ts} +0 -0
- /package/dist/extensions/forgecli/{store-validator.d.ts → store/store-validator.d.ts} +0 -0
- /package/dist/extensions/forgecli/{transition-guard.d.ts → store/transition-guard.d.ts} +0 -0
- /package/dist/extensions/forgecli/{banner.d.ts → tui/banner.d.ts} +0 -0
- /package/dist/extensions/forgecli/{banner.js → tui/banner.js} +0 -0
- /package/dist/extensions/forgecli/{forge-header.d.ts → tui/forge-header.d.ts} +0 -0
- /package/dist/extensions/forgecli/{forge-header.js → tui/forge-header.js} +0 -0
- /package/dist/extensions/forgecli/{input-router.d.ts → tui/input-router.d.ts} +0 -0
- /package/dist/extensions/forgecli/{input-router.js → tui/input-router.js} +0 -0
- /package/dist/extensions/forgecli/{forge-update-command.d.ts → update/forge-update-command.d.ts} +0 -0
- /package/dist/extensions/forgecli/{migration-engine.d.ts → update/migration-engine.d.ts} +0 -0
- /package/dist/extensions/forgecli/{update-check.d.ts → update/update-check.d.ts} +0 -0
- /package/dist/extensions/forgecli/{update-tools.d.ts → update/update-tools.d.ts} +0 -0
- /package/dist/extensions/forgecli/{whats-new-widget.d.ts → update/whats-new-widget.d.ts} +0 -0
- /package/dist/extensions/forgecli/{whats-new.d.ts → update/whats-new.d.ts} +0 -0
- /package/dist/extensions/forgecli/{viewport-theme.d.ts → viewport/theme.d.ts} +0 -0
|
@@ -10,6 +10,13 @@
|
|
|
10
10
|
|
|
11
11
|
Example: `20260415T141523000Z_ACME-S02-T03_engineer_implement`
|
|
12
12
|
|
|
13
|
+
## Type Vocabulary
|
|
14
|
+
|
|
15
|
+
The optional `type` field, when present, must come from the canonical
|
|
16
|
+
phase→type tables in `meta/workflows/_fragments/event-vocabulary.md`
|
|
17
|
+
(task / bug / sprint / friction / skill_usage families). The schema enum in
|
|
18
|
+
`schemas/event.schema.json` mirrors that fragment.
|
|
19
|
+
|
|
13
20
|
## Fields
|
|
14
21
|
|
|
15
22
|
| Field | Type | Required | Description |
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
orchestrator stitches runtime telemetry + judgement into the canonical
|
|
5
5
|
event and emits it. Referenced by meta-orchestrate.md and meta-fix-bug.md.
|
|
6
6
|
|
|
7
|
+
Companion: _fragments/event-vocabulary.md owns the `type` token
|
|
8
|
+
vocabulary (phase→type tables for task/bug/sprint events). This fragment
|
|
9
|
+
owns WHO emits; that one owns WHAT token.
|
|
10
|
+
|
|
7
11
|
PLAN-11 / SLICE-2 (2026-05-14): the LLM no longer hand-builds event JSON.
|
|
8
12
|
Runtime facts (model, provider, eventId, timestamps, iteration, tokens)
|
|
9
13
|
are owned by the orchestrator, never the subagent. The subagent only
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Fragment: Event Type Vocabulary
|
|
2
|
+
|
|
3
|
+
<!-- Canonical phase→type vocabulary for store events (forge-engineering#39).
|
|
4
|
+
This fragment OWNS the `type` token vocabulary; `schemas/event.schema.json`
|
|
5
|
+
mirrors it. Any vocabulary change lands here first, then in the schema enum
|
|
6
|
+
(test-first via tools/__tests__/event-schema-variants.test.cjs), then in
|
|
7
|
+
emitters (forge-cli orchestrators, wfl JS drivers, meta workflows).
|
|
8
|
+
|
|
9
|
+
Companion: _fragments/event-emission-schema.md owns WHO emits (orchestrator
|
|
10
|
+
vs subagent field ownership). This fragment owns WHAT token each phase emits.
|
|
11
|
+
|
|
12
|
+
Invariant: every token emitted by any surface MUST appear in the schema
|
|
13
|
+
enum, and every enum token MUST have a named emitter below. Dead tokens are
|
|
14
|
+
removed (bug-fixed was retired by forge-engineering#39 — defined, never
|
|
15
|
+
emitted by anything). -->
|
|
16
|
+
|
|
17
|
+
## Rules
|
|
18
|
+
|
|
19
|
+
1. **Emitted tokens ⊆ schema enum.** An emitter never invents a token. If a new
|
|
20
|
+
phase outcome needs a token, add it here + the schema enum first.
|
|
21
|
+
2. **`type` is optional** on events. An untyped event is valid (task-pipeline
|
|
22
|
+
events from forge-cli run-task are currently untyped). When a `type` IS set,
|
|
23
|
+
it must come from the tables below.
|
|
24
|
+
3. **Kebab-case for lifecycle tokens.** Underscore names are reserved for the
|
|
25
|
+
`friction` and `skill_usage` event families.
|
|
26
|
+
4. **Conditional fields.** Typed events trigger schema conditionals — see the
|
|
27
|
+
"Requires" column. Driver-emitted skip events have no model/provider; emit
|
|
28
|
+
the literal `"n/a"` for both (never guess a model string — see
|
|
29
|
+
`_fragments/event-emission-schema.md` §Why no example record here).
|
|
30
|
+
5. **Skip reasons ride in `notes`.** `reason` is not a declared event property
|
|
31
|
+
(`additionalProperties: false` rejects it).
|
|
32
|
+
|
|
33
|
+
## Task pipeline (orchestrate_task / run-task / wfl:run-task)
|
|
34
|
+
|
|
35
|
+
| Phase | Pass token | Fail token | Requires |
|
|
36
|
+
|---|---|---|---|
|
|
37
|
+
| plan | `task-planned` | `task-planned` | taskId, phase, iteration |
|
|
38
|
+
| review-plan | `plan-approved` | `review-failed` | taskId, phase, iteration |
|
|
39
|
+
| implement | `task-implemented` | `task-implemented` | taskId, phase, iteration |
|
|
40
|
+
| review-code | `review-passed` | `review-failed` | taskId, phase, iteration |
|
|
41
|
+
| validate | `task-validated` | `review-failed` | taskId, phase, iteration |
|
|
42
|
+
| approve | `task-approved` | `review-failed` | taskId, phase, iteration |
|
|
43
|
+
| commit | `task-committed` | `task-committed` | taskId, phase, iteration |
|
|
44
|
+
|
|
45
|
+
`plan-complete` is a legacy alias accepted by the enum for plan-phase events;
|
|
46
|
+
new emitters use `task-planned`.
|
|
47
|
+
|
|
48
|
+
## Bug pipeline (fix_bug / fix-bug / wfl:fix-bug)
|
|
49
|
+
|
|
50
|
+
| Phase | Pass token | Fail token | Requires |
|
|
51
|
+
|---|---|---|---|
|
|
52
|
+
| pre-loop skip | `bug-skipped` | — | bugId (no phase/iteration; model/provider `"n/a"`) |
|
|
53
|
+
| triage | `bug-triaged` | `bug-triaged` | bugId, phase, iteration |
|
|
54
|
+
| plan-fix | `fix-planned` | `fix-planned` | bugId, phase, iteration |
|
|
55
|
+
| review-plan | `fix-review-passed` | `fix-review-failed` | bugId, phase, iteration |
|
|
56
|
+
| implement | `fix-implemented` | `fix-implemented` | bugId, phase, iteration |
|
|
57
|
+
| review-code | `fix-code-review-passed` | `fix-code-review-failed` | bugId, phase, iteration |
|
|
58
|
+
| approve | `fix-approved` | `fix-revision-requested` | bugId, phase, iteration |
|
|
59
|
+
| commit | `bug-committed` | `bug-commit-failed` | bugId, phase, iteration |
|
|
60
|
+
|
|
61
|
+
Non-review phases emit their single token regardless of outcome (the verdict
|
|
62
|
+
field carries the judgement); review phases (review-plan, review-code, approve)
|
|
63
|
+
select pass/fail on `verdict == "revision"`.
|
|
64
|
+
|
|
65
|
+
## Sprint grain (run_sprint / run-sprint / wfl:run-sprint)
|
|
66
|
+
|
|
67
|
+
| Moment | Token | Requires |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| before wave loop | `sprint-start` | sprintId (taskCount optional) |
|
|
70
|
+
| before each task dispatch | `task-dispatch` | taskId (convention; phase/iteration carried but not schema-enforced) |
|
|
71
|
+
| sprint finished | `sprint-complete` | taskCount, completedTaskIds, verdict |
|
|
72
|
+
| sprint aborted | `sprint-halted` | haltedAtTaskIndex, haltedAtTaskId, lastError |
|
|
73
|
+
|
|
74
|
+
## Other families
|
|
75
|
+
|
|
76
|
+
| Token | Emitter | Spec |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| `friction` | any persona, drained by orchestrator | `_fragments/friction-emit.md` |
|
|
79
|
+
| `skill_usage` | forge-cli skill-curation telemetry | `event.schema.json` skill_usage conditional |
|
|
80
|
+
|
|
81
|
+
## Out of scope (known follow-ups)
|
|
82
|
+
|
|
83
|
+
- **Feature events** have no lifecycle tokens; feature-related events are
|
|
84
|
+
emitted untyped. Defining a feature vocabulary is a future change to this
|
|
85
|
+
fragment + the enum.
|
|
86
|
+
- **Task-pipeline typed emission in forge-cli** — run-task currently emits
|
|
87
|
+
untyped events (valid under Rule 2); adopting the task table above is
|
|
88
|
+
forward work tracked in forge-engineering#39 step 3.
|
|
@@ -32,6 +32,8 @@ Seal a completed and approved task by committing its artifacts to the VCS and up
|
|
|
32
32
|
- Commit only the artifacts produced for this task; do not sweep unrelated working-tree changes into the commit. The commit boundary mirrors the task boundary.
|
|
33
33
|
- Read `.forge/personas/engineer.md` first; print the persona identity line (emoji, name, tagline) to stdout before any other tool use.
|
|
34
34
|
- All store I/O via `forge_store` (or `node .forge/tools/store-cli.cjs`). Never edit `.forge/store/*.json` directly.
|
|
35
|
+
- **Never run `git add`/`git commit`/`git reset` yourself** — `commit-task.cjs` owns staging, boundary checks, committing, and the terminal transition (#40). Your judgement input is the message.
|
|
36
|
+
- **Commit writes NO summary** (`commit` ∉ `VALID_SUMMARY_PHASES` — any `set-summary` is rejected); the tool's terminal `update-status` is this phase's only store write.
|
|
35
37
|
|
|
36
38
|
## Store-Write Verification
|
|
37
39
|
|
|
@@ -41,55 +43,56 @@ Seal a completed and approved task by committing its artifacts to the VCS and up
|
|
|
41
43
|
|
|
42
44
|
```
|
|
43
45
|
|
|
44
|
-
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
`
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
-
|
|
46
|
+
0. Entity-mode resolution:
|
|
47
|
+
- Read the kickoff arguments. `--task {id}` → `entity_kind = "task"`, `record_id = {id}`. `--bug {id}` → `entity_kind = "bug"`, `record_id = {id}`.
|
|
48
|
+
|
|
49
|
+
1. Inspect ONCE (message material only — #40 batched-inspection rule):
|
|
50
|
+
- One `git diff --stat`; at most ONE combined `git diff` if the message needs detail.
|
|
51
|
+
Never per-file diffs, never repeated `git status` — each extra turn re-pays full context.
|
|
52
|
+
- Staging is NOT your decision — the tool derives it from the store record.
|
|
53
|
+
|
|
54
|
+
2. Craft the commit message:
|
|
55
|
+
- Follow project conventions; include the record ID ({taskId} / {bugId}) in the subject.
|
|
56
|
+
- `Co-authored-by:` trailer from the host runtime: Claude Code →
|
|
57
|
+
`Co-authored-by: Claude <noreply@anthropic.com>`; pi / Ollama / other →
|
|
58
|
+
`Co-authored-by: {modelId} <noreply@{provider}.ai>` from the session's `provider` and
|
|
59
|
+
`modelId`; if unresolvable, omit rather than guess. Never hardcode
|
|
60
|
+
`Claude Opus 4.6 <noreply@anthropic.com>` (forge#82 regression).
|
|
61
|
+
- Git's configured `user.name`/`user.email` own authorship; never `--author`.
|
|
62
|
+
|
|
63
|
+
3. Commit via the tool — ONE call:
|
|
64
|
+
- If the `forge_commit` named tool is available (forgecli): call it —
|
|
65
|
+
`forge_commit({ entity:"{entity_kind}", id:"{record_id}", message:"<message>", trailer:"<line>" })`.
|
|
66
|
+
Never pass the message through a bash string when the typed tool exists.
|
|
67
|
+
- Otherwise (Claude Code): `node .forge/tools/commit-task.cjs --{entity_kind} {record_id} --message "<message>" [--trailer "<Co-authored-by line>"]`
|
|
68
|
+
- The tool owns the choreography: preflight gate (`preflight-gate.cjs --phase commit`
|
|
69
|
+
internally), status precondition (task `approved` / bug `in-progress` — wrong-state runs
|
|
70
|
+
halt with `× {record_id} is in state '{status}' …; /forge:approve must complete first`),
|
|
71
|
+
staging (artifact dir + `summaries.implementation.files_changed` provenance),
|
|
72
|
+
commit-boundary guard (aborts on a pre-staged index), `git commit`, terminal transition
|
|
73
|
+
(task → `committed`; bug → `fixed`, the ONLY post-triage `bug.status` write).
|
|
74
|
+
- On `no files_changed provenance` warning: ONE `git status --porcelain`, then re-run the
|
|
75
|
+
tool with `--also <path>` per source file. Never manual `git add`.
|
|
76
|
+
- Success → JSON with `ok:true`. `committed:true` carries `sha` + `staged`;
|
|
77
|
+
`committed:false, reason:"nothing-to-commit"` is ALSO success (fix already at HEAD /
|
|
78
|
+
staging set clean — the tool still sealed the record's terminal status). Do not
|
|
79
|
+
"fix" a no-op by staging things yourself.
|
|
80
|
+
- Failure (exit 1 / ok:false) → print stderr and HALT — no manual staging, no
|
|
81
|
+
`git reset`, no `--force` retry (operator-gated). Tool file missing → HALT;
|
|
82
|
+
instruct `/forge:update` + `/forge:rebuild tools`.
|
|
83
|
+
- NEVER commit before the tool reports `ok: true` — the premature-commit/reset/redo loop
|
|
84
|
+
is forbidden.
|
|
85
|
+
|
|
86
|
+
4. Finalize:
|
|
87
|
+
- No summary, no `set-summary` (see Iron Laws). **Do NOT emit a phase event yourself** —
|
|
88
|
+
the orchestrator owns event emission. Return the tool's JSON result as your phase output.
|
|
86
89
|
```
|
|
87
90
|
|
|
88
91
|
<!-- See _fragments/generation-instructions.md for Generation Instructions template -->
|
|
89
92
|
## Generation Instructions
|
|
90
93
|
|
|
91
94
|
- **Workflow Structure:** The generated `commit_task.md` must follow the strict "Algorithm" block format.
|
|
92
|
-
- **
|
|
95
|
+
- **Tool Ownership:** All git operations route through `commit-task.cjs` (forge-engineering#40) — the generated workflow must never instruct manual `git add`/`git commit`/`git reset`.
|
|
93
96
|
- **Project Specifics:**
|
|
94
97
|
- Embed project's commit message conventions.
|
|
95
98
|
- **Token Reporting:** See `_fragments/finalize.md` — wire via `file_ref:`.
|
|
@@ -148,7 +148,9 @@ Differences are confined to the **triage** step and the **path branch**.
|
|
|
148
148
|
- Detect execution cluster from ANTHROPIC_DEFAULT_*_MODEL env vars.
|
|
149
149
|
- Clear progress log: store-cli progress-clear bugs
|
|
150
150
|
- Read bug record. If status ∈ {blocked, escalated, fixed, abandoned}:
|
|
151
|
-
skip the run, emit a single `
|
|
151
|
+
skip the run, emit a single `bug-skipped` event (token + payload shape per
|
|
152
|
+
`_fragments/event-vocabulary.md` § Bug pipeline: requires `bugId`, no
|
|
153
|
+
phase/iteration; model/provider `"n/a"`; skip reason in `notes`), return.
|
|
152
154
|
|
|
153
155
|
2. Triage:
|
|
154
156
|
- Locate or create the bug record (MANDATORY — do this before anything else):
|
|
@@ -503,7 +505,10 @@ After each subagent returns: `✓` for completed/approved, `↻` for revision re
|
|
|
503
505
|
<!-- See _fragments/event-emission-schema.md for canonical contract -->
|
|
504
506
|
> See `_fragments/event-emission-schema.md` for the actor split (subagent
|
|
505
507
|
> writes judgement-only SUMMARY; orchestrator composes the canonical event
|
|
506
|
-
> from runtime telemetry + SUMMARY and emits it)
|
|
508
|
+
> from runtime telemetry + SUMMARY and emits it), and
|
|
509
|
+
> `_fragments/event-vocabulary.md` § Bug pipeline for the canonical
|
|
510
|
+
> phase→`type` token table (pass/fail tokens per phase, `bug-skipped`
|
|
511
|
+
> pre-loop skip shape). Emitted tokens MUST come from that table.
|
|
507
512
|
|
|
508
513
|
The orchestrator is the only actor that calls `store-cli emit` for phase
|
|
509
514
|
events. All bug-phase events use `sprintId="bugs"` (the reserved virtual
|
|
@@ -87,13 +87,13 @@ The Engineer implements the approved plan: write code, run tests, verify, and do
|
|
|
87
87
|
`node .forge/tools/store-cli.cjs update-status task {taskId} status implementing`
|
|
88
88
|
`node .forge/tools/store-cli.cjs update-status task {taskId} status implemented`
|
|
89
89
|
- **Bug mode** — NO status write. The bug remains `in-progress` until the commit phase transitions it to `fixed`. Writing `bug.status` here violates `meta-fix-bug.md § Iron Laws #2`.
|
|
90
|
-
- **Do NOT emit a phase event yourself.** The orchestrator owns event emission — it composes the canonical event from runtime telemetry
|
|
90
|
+
- **Do NOT emit a phase event yourself.** The orchestrator owns event emission — it composes the canonical event from runtime telemetry plus the SUMMARY you write next. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (Plan 11 / Slice 2). Write the SUMMARY and return.
|
|
91
91
|
|
|
92
92
|
7. Emit Summary Sidecar:
|
|
93
93
|
- Write `IMPLEMENTATION-SUMMARY.json` via `forge_artifact`:
|
|
94
94
|
`forge_artifact({ command:"write", entity:"{entity_kind}", entityId:"{record_id}", artifact:"implementation-summary", content:"<JSON>" })`
|
|
95
|
-
JSON shape: `{"objective":"<one sentence>", "key_changes":["<up to 12 bullets>"], "verdict":"n/a", "written_at":"<ISO 8601>", "artifact_ref":"PROGRESS.md"}`
|
|
96
|
-
|
|
95
|
+
JSON shape: `{"objective":"<one sentence>", "key_changes":["<up to 12 bullets>"], "files_changed":["<path>"], "verdict":"n/a", "written_at":"<ISO 8601>", "artifact_ref":"PROGRESS.md"}`
|
|
96
|
+
- `files_changed`: every repo path this phase changed (one `git status --porcelain`); `commit-task.cjs` stages from it.
|
|
97
97
|
- Then link sidecar to store (task mode):
|
|
98
98
|
`forge_store({ command:"set-summary", args:["{taskId}", "implementation"] })`
|
|
99
99
|
Or (bug mode):
|
|
@@ -950,7 +950,10 @@ is a violation of the Iron Laws.
|
|
|
950
950
|
<!-- See _fragments/event-emission-schema.md for canonical contract -->
|
|
951
951
|
> See `_fragments/event-emission-schema.md` for the actor split (subagent
|
|
952
952
|
> writes judgement-only SUMMARY; orchestrator composes the canonical event
|
|
953
|
-
> from runtime telemetry + SUMMARY and emits it)
|
|
953
|
+
> from runtime telemetry + SUMMARY and emits it), and
|
|
954
|
+
> `_fragments/event-vocabulary.md` § Task pipeline / § Sprint grain for the
|
|
955
|
+
> canonical phase→`type` token tables. When setting `type` on a phase or
|
|
956
|
+
> sprint event, the token MUST come from those tables.
|
|
954
957
|
|
|
955
958
|
The **orchestrator** is the only actor that calls `store-cli emit` for phase
|
|
956
959
|
events. Phase subagents write `{PHASE}-SUMMARY.json` and return. After each
|
|
@@ -59,11 +59,11 @@
|
|
|
59
59
|
"sprint-complete",
|
|
60
60
|
"sprint-halted",
|
|
61
61
|
"task-dispatch",
|
|
62
|
-
"bug-fixed",
|
|
63
62
|
|
|
64
63
|
"bug-triaged", "fix-planned", "fix-review-passed", "fix-review-failed",
|
|
65
64
|
"fix-implemented", "fix-code-review-passed", "fix-code-review-failed",
|
|
66
|
-
"fix-approved", "bug-committed",
|
|
65
|
+
"fix-approved", "fix-revision-requested", "bug-committed",
|
|
66
|
+
"bug-commit-failed", "bug-skipped",
|
|
67
67
|
|
|
68
68
|
"skill_usage"
|
|
69
69
|
]
|
|
@@ -129,7 +129,8 @@
|
|
|
129
129
|
"enum": [
|
|
130
130
|
"bug-triaged", "fix-planned", "fix-review-passed", "fix-review-failed",
|
|
131
131
|
"fix-implemented", "fix-code-review-passed", "fix-code-review-failed",
|
|
132
|
-
"fix-approved", "
|
|
132
|
+
"fix-approved", "fix-revision-requested", "bug-committed",
|
|
133
|
+
"bug-commit-failed"
|
|
133
134
|
]
|
|
134
135
|
}
|
|
135
136
|
},
|
|
@@ -137,6 +138,10 @@
|
|
|
137
138
|
},
|
|
138
139
|
"then": { "required": ["bugId", "phase", "iteration"] }
|
|
139
140
|
},
|
|
141
|
+
{
|
|
142
|
+
"if": { "properties": { "type": { "const": "bug-skipped" } }, "required": ["type"] },
|
|
143
|
+
"then": { "required": ["bugId"] }
|
|
144
|
+
},
|
|
140
145
|
{
|
|
141
146
|
"if": { "properties": { "type": { "const": "sprint-start" } }, "required": ["type"] },
|
|
142
147
|
"then": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.2.
|
|
3
|
-
"generatedAt": "2026-06-
|
|
2
|
+
"version": "1.2.21",
|
|
3
|
+
"generatedAt": "2026-06-06T15:46:43.003Z",
|
|
4
4
|
"generatedByTool": "build-manifest.cjs",
|
|
5
5
|
"namespaces": {
|
|
6
6
|
"personas": {
|
|
@@ -94,6 +94,7 @@
|
|
|
94
94
|
"files": [
|
|
95
95
|
"context-injection.md",
|
|
96
96
|
"event-emission-schema.md",
|
|
97
|
+
"event-vocabulary.md",
|
|
97
98
|
"finalize.md",
|
|
98
99
|
"friction-emit.md",
|
|
99
100
|
"generation-instructions.md",
|
|
@@ -151,6 +152,7 @@
|
|
|
151
152
|
"check-no-skipped-tests.cjs",
|
|
152
153
|
"check-structure.cjs",
|
|
153
154
|
"collate.cjs",
|
|
155
|
+
"commit-task.cjs",
|
|
154
156
|
"compression-gate.cjs",
|
|
155
157
|
"delete-candidate-detector.cjs",
|
|
156
158
|
"estimate-usage.cjs",
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// commit-task.cjs — deterministic commit choreography (forge-engineering#40).
|
|
4
|
+
//
|
|
5
|
+
// The commit phase was the most expensive phase of the SDLC pipeline
|
|
6
|
+
// (15–31% of run input tokens across instrumented runs) because an LLM
|
|
7
|
+
// re-derived deterministic choreography turn-by-turn: gate, state check,
|
|
8
|
+
// staging-set discovery, boundary verification, commit, terminal status
|
|
9
|
+
// transition. This tool owns the whole sequence; the agent supplies only the
|
|
10
|
+
// commit message (the single judgement-worthy step).
|
|
11
|
+
//
|
|
12
|
+
// Staging-set derivation (the commit boundary mirrors the task boundary):
|
|
13
|
+
// 1. record.path — the task/bug artifact directory (always staged)
|
|
14
|
+
// 2. record.summaries.implementation.files_changed — provenance recorded
|
|
15
|
+
// by the implement phase (PHASE_SUMMARY_SCHEMA.files_changed)
|
|
16
|
+
// 3. --also <path> extras (each validated to stay inside the project root)
|
|
17
|
+
//
|
|
18
|
+
// Usage:
|
|
19
|
+
// node commit-task.cjs --task <id> | --bug <id>
|
|
20
|
+
// --message <msg> commit subject/body (required unless --dry-run)
|
|
21
|
+
// [--trailer <line>] optional Co-authored-by trailer
|
|
22
|
+
// [--also <path>] extra path to stage (repeatable)
|
|
23
|
+
// [--skip-gate] skip preflight-gate (orchestrator already ran it)
|
|
24
|
+
// [--force] bypass the status precondition
|
|
25
|
+
// [--dry-run] print the staging plan as JSON; no writes
|
|
26
|
+
//
|
|
27
|
+
// Exit codes: 0 ok | 1 failure (message on stderr).
|
|
28
|
+
|
|
29
|
+
const fs = require('node:fs');
|
|
30
|
+
const path = require('node:path');
|
|
31
|
+
const { spawnSync } = require('node:child_process');
|
|
32
|
+
const { findProjectRoot } = require('./lib/project-root.cjs');
|
|
33
|
+
|
|
34
|
+
const ALLOWED_STATUS = { task: 'approved', bug: 'in-progress' };
|
|
35
|
+
const TERMINAL_STATUS = { task: 'committed', bug: 'fixed' };
|
|
36
|
+
|
|
37
|
+
function fail(msg) {
|
|
38
|
+
console.error(`commit-task: ${msg}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function parseArgs(argv) {
|
|
43
|
+
const opts = { also: [] };
|
|
44
|
+
for (let i = 0; i < argv.length; i++) {
|
|
45
|
+
const a = argv[i];
|
|
46
|
+
switch (a) {
|
|
47
|
+
case '--task': opts.entityKind = 'task'; opts.recordId = argv[++i]; break;
|
|
48
|
+
case '--bug': opts.entityKind = 'bug'; opts.recordId = argv[++i]; break;
|
|
49
|
+
case '--message': opts.message = argv[++i]; break;
|
|
50
|
+
case '--trailer': opts.trailer = argv[++i]; break;
|
|
51
|
+
case '--also': opts.also.push(argv[++i]); break;
|
|
52
|
+
case '--skip-gate': opts.skipGate = true; break;
|
|
53
|
+
case '--force': opts.force = true; break;
|
|
54
|
+
case '--dry-run': opts.dryRun = true; break;
|
|
55
|
+
default: fail(`unknown argument: ${a}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!opts.entityKind || !opts.recordId) {
|
|
59
|
+
fail('usage: commit-task.cjs --task <id> | --bug <id> --message <msg> [--trailer <line>] [--also <path>]... [--skip-gate] [--force] [--dry-run]');
|
|
60
|
+
}
|
|
61
|
+
if (!opts.dryRun && (!opts.message || !opts.message.trim())) {
|
|
62
|
+
fail('--message is required (the commit message is the only input the agent supplies)');
|
|
63
|
+
}
|
|
64
|
+
return opts;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function git(root, args, { allowFail = false } = {}) {
|
|
68
|
+
const r = spawnSync('git', args, { cwd: root, encoding: 'utf8' });
|
|
69
|
+
if (r.status !== 0 && !allowFail) {
|
|
70
|
+
fail(`git ${args.join(' ')} failed: ${(r.stderr || r.stdout || '').trim()}`);
|
|
71
|
+
}
|
|
72
|
+
return r;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Resolve a repo-relative path and reject anything escaping the project root.
|
|
76
|
+
function insideRoot(root, p) {
|
|
77
|
+
const abs = path.resolve(root, p);
|
|
78
|
+
const rel = path.relative(root, abs);
|
|
79
|
+
if (rel.startsWith('..') || path.isAbsolute(rel)) return null;
|
|
80
|
+
return rel;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function main() {
|
|
84
|
+
const opts = parseArgs(process.argv.slice(2));
|
|
85
|
+
const root = findProjectRoot();
|
|
86
|
+
if (!root) fail('no .forge/config.json found above the current directory');
|
|
87
|
+
|
|
88
|
+
// 1. Record read (store facade — never raw .forge/store writes).
|
|
89
|
+
const store = require('./store.cjs');
|
|
90
|
+
const record = opts.entityKind === 'task' ? store.getTask(opts.recordId) : store.getBug(opts.recordId);
|
|
91
|
+
if (!record) fail(`${opts.entityKind} ${opts.recordId} not found in the store`);
|
|
92
|
+
|
|
93
|
+
// 2. Status precondition (deterministic version of the Pipeline Step Guard).
|
|
94
|
+
const allowed = ALLOWED_STATUS[opts.entityKind];
|
|
95
|
+
if (record.status !== allowed && !opts.force) {
|
|
96
|
+
const hint = opts.entityKind === 'task' ? "; /forge:approve must complete first" : '';
|
|
97
|
+
fail(`× ${opts.recordId} is in state '${record.status}' — commit requires '${allowed}'${hint}. Use --force to bypass (operator-gated, user-invoked re-runs only).`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 3. Preflight gate (skippable when the orchestrator already ran it).
|
|
101
|
+
if (!opts.skipGate) {
|
|
102
|
+
const gate = spawnSync(process.execPath,
|
|
103
|
+
[path.join(__dirname, 'preflight-gate.cjs'), '--phase', 'commit', `--${opts.entityKind}`, opts.recordId],
|
|
104
|
+
{ cwd: root, encoding: 'utf8' });
|
|
105
|
+
if (gate.status !== 0) {
|
|
106
|
+
fail(`preflight gate failed (exit ${gate.status}):\n${(gate.stderr || gate.stdout || '').trim()}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 4. Staging set: artifact dir + implementation provenance + --also extras.
|
|
111
|
+
const stage = [];
|
|
112
|
+
const warnings = [];
|
|
113
|
+
if (record.path) {
|
|
114
|
+
const rel = insideRoot(root, record.path);
|
|
115
|
+
if (rel && fs.existsSync(path.join(root, rel))) stage.push(rel);
|
|
116
|
+
else warnings.push(`artifact dir missing on disk: ${record.path}`);
|
|
117
|
+
}
|
|
118
|
+
const provenance = record.summaries?.implementation?.files_changed;
|
|
119
|
+
if (Array.isArray(provenance) && provenance.length > 0) {
|
|
120
|
+
for (const p of provenance) {
|
|
121
|
+
const rel = insideRoot(root, p);
|
|
122
|
+
if (rel === null) { warnings.push(`provenance path outside the project root, skipped: ${p}`); continue; }
|
|
123
|
+
if (!fs.existsSync(path.join(root, rel))) {
|
|
124
|
+
// Deleted files are legitimate changes — git add stages deletions of
|
|
125
|
+
// tracked paths; only warn when git knows nothing about the path.
|
|
126
|
+
const known = git(root, ['ls-files', '--error-unmatch', '--', rel], { allowFail: true });
|
|
127
|
+
if (known.status !== 0) { warnings.push(`provenance path not found (skipped): ${p}`); continue; }
|
|
128
|
+
}
|
|
129
|
+
stage.push(rel);
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
warnings.push('no files_changed provenance in summaries.implementation — staging the artifact dir only. Pass source files via --also if the task changed code.');
|
|
133
|
+
}
|
|
134
|
+
for (const p of opts.also) {
|
|
135
|
+
const rel = insideRoot(root, p);
|
|
136
|
+
if (rel === null) fail(`--also path outside the project root: ${p}`);
|
|
137
|
+
stage.push(rel);
|
|
138
|
+
}
|
|
139
|
+
let stageSet = [...new Set(stage)];
|
|
140
|
+
if (stageSet.length === 0) fail('nothing to stage — no artifact dir, no provenance, no --also paths');
|
|
141
|
+
|
|
142
|
+
// Pre-filter gitignored paths (live-run finding, forge-engineering#40):
|
|
143
|
+
// `git add` of the whole set is all-or-nothing — one ignored path aborts
|
|
144
|
+
// everything. check-ignore each path; warn-skip the ignored ones.
|
|
145
|
+
const ignored = [];
|
|
146
|
+
for (const rel of stageSet) {
|
|
147
|
+
const ci = git(root, ['check-ignore', '-q', '--', rel], { allowFail: true });
|
|
148
|
+
if (ci.status === 0) ignored.push(rel);
|
|
149
|
+
}
|
|
150
|
+
if (ignored.length > 0) {
|
|
151
|
+
warnings.push(`gitignored path(s) skipped from the staging set: ${ignored.join(', ')} — track them or stage explicitly with git add -f outside this tool.`);
|
|
152
|
+
stageSet = stageSet.filter((p) => !ignored.includes(p));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
for (const w of warnings) console.error(`commit-task: warning: ${w}`);
|
|
156
|
+
|
|
157
|
+
if (opts.dryRun) {
|
|
158
|
+
process.stdout.write(JSON.stringify({ dryRun: true, entityKind: opts.entityKind, recordId: opts.recordId, stage: stageSet }, null, 2) + '\n');
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// 5. Commit-boundary guard: a pre-populated index means someone else's
|
|
163
|
+
// changes would be swept into this commit. Abort loudly (Iron Law:
|
|
164
|
+
// the commit boundary mirrors the task boundary).
|
|
165
|
+
const preStaged = git(root, ['diff', '--cached', '--name-only']).stdout.trim();
|
|
166
|
+
if (preStaged) {
|
|
167
|
+
fail(`index already has staged changes — refusing to sweep them into the ${opts.recordId} commit:\n${preStaged}\nUnstage them (git reset) or commit them separately, then re-run.`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// 6. Terminal status transition helper — through store-cli (single source
|
|
171
|
+
// of truth for transition legality — never reimplemented here).
|
|
172
|
+
const target = TERMINAL_STATUS[opts.entityKind];
|
|
173
|
+
const transition = (context) => {
|
|
174
|
+
const updArgs = [path.join(__dirname, 'store-cli.cjs'), 'update-status', opts.entityKind, opts.recordId, 'status', target];
|
|
175
|
+
if (opts.force) updArgs.push('--force'); // --force bypasses the transition map too (user-invoked re-runs)
|
|
176
|
+
const upd = spawnSync(process.execPath, updArgs, { cwd: root, encoding: 'utf8' });
|
|
177
|
+
if (upd.status !== 0) {
|
|
178
|
+
fail(`${context} but status transition to '${target}' failed:\n${(upd.stderr || upd.stdout || '').trim()}`);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// 7. Stage exactly the derived set. A clean staging set is a legitimate
|
|
183
|
+
// terminal state (e.g. a bug whose fix is already at HEAD): no commit,
|
|
184
|
+
// but the record is still sealed (live-run finding, forge-engineering#40).
|
|
185
|
+
const noop = (why) => {
|
|
186
|
+
console.error(`commit-task: ${why} — nothing to commit; sealing the record without a commit.`);
|
|
187
|
+
transition('no-op commit');
|
|
188
|
+
process.stdout.write(JSON.stringify(
|
|
189
|
+
{ ok: true, committed: false, reason: 'nothing-to-commit', skippedIgnored: ignored, status: target }, null, 2) + '\n');
|
|
190
|
+
};
|
|
191
|
+
if (stageSet.length === 0) {
|
|
192
|
+
noop('entire staging set is gitignored');
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
git(root, ['add', '--', ...stageSet]);
|
|
196
|
+
const staged = git(root, ['diff', '--cached', '--name-only']).stdout.trim().split('\n').filter(Boolean);
|
|
197
|
+
if (staged.length === 0) {
|
|
198
|
+
noop('working tree already clean for the staging set');
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// 8. Commit. Message comes from the agent; the optional trailer is appended
|
|
203
|
+
// after a blank line per git convention.
|
|
204
|
+
const message = opts.trailer ? `${opts.message.trim()}\n\n${opts.trailer.trim()}\n` : `${opts.message.trim()}\n`;
|
|
205
|
+
git(root, ['commit', '-m', message]);
|
|
206
|
+
const sha = git(root, ['rev-parse', 'HEAD']).stdout.trim();
|
|
207
|
+
|
|
208
|
+
transition(`commit ${sha} created`);
|
|
209
|
+
|
|
210
|
+
process.stdout.write(JSON.stringify({ ok: true, committed: true, sha, staged, status: target }, null, 2) + '\n');
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
try {
|
|
214
|
+
main();
|
|
215
|
+
} catch (err) {
|
|
216
|
+
console.error(`commit-task: ${err.message}`);
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
@@ -77,7 +77,12 @@ const PHASE_SUMMARY_SCHEMA = {
|
|
|
77
77
|
verdict: { type: 'string', enum: ['approved', 'revision', 'n/a'] },
|
|
78
78
|
written_at: { type: 'string' },
|
|
79
79
|
artifact_ref:{ type: 'string' },
|
|
80
|
-
route: { type: 'string', enum: ['A', 'B'] }
|
|
80
|
+
route: { type: 'string', enum: ['A', 'B'] },
|
|
81
|
+
// forge-engineering#40: implement-phase file provenance. The implement
|
|
82
|
+
// workflow records the repo-relative paths it created/modified;
|
|
83
|
+
// commit-task.cjs derives its staging set from this list instead of the
|
|
84
|
+
// LLM re-deriving the change surface from git each run.
|
|
85
|
+
files_changed: { type: 'array', items: { type: 'string', maxLength: 300 }, maxItems: 100 }
|
|
81
86
|
},
|
|
82
87
|
additionalProperties: false
|
|
83
88
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mariozechner/clipboard-linux-x64-musl",
|
|
3
|
+
"version": "0.3.9",
|
|
4
|
+
"os": [
|
|
5
|
+
"linux"
|
|
6
|
+
],
|
|
7
|
+
"cpu": [
|
|
8
|
+
"x64"
|
|
9
|
+
],
|
|
10
|
+
"main": "clipboard.linux-x64-musl.node",
|
|
11
|
+
"files": [
|
|
12
|
+
"clipboard.linux-x64-musl.node"
|
|
13
|
+
],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">= 10"
|
|
17
|
+
},
|
|
18
|
+
"libc": [
|
|
19
|
+
"musl"
|
|
20
|
+
],
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/badlogic/clipboard.git"
|
|
24
|
+
}
|
|
25
|
+
}
|