@entelligentsia/forgecli 1.0.2 → 1.0.10
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 +67 -0
- package/README.md +2 -1
- package/dist/CHANGELOG-forge-plugin.md +124 -0
- package/dist/CHANGELOG-pi.md +94 -0
- package/dist/extensions/forgecli/audience-gate.js +1 -1
- package/dist/extensions/forgecli/audience-gate.js.map +1 -1
- package/dist/extensions/forgecli/fix-bug.d.ts +1 -2
- package/dist/extensions/forgecli/fix-bug.js +678 -609
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js +42 -7
- package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +17 -0
- package/dist/extensions/forgecli/forge-subagent.js +31 -12
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-tools.d.ts +6 -0
- package/dist/extensions/forgecli/forge-tools.js +71 -8
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/run-task.js +461 -391
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/session-registry.d.ts +12 -0
- package/dist/extensions/forgecli/session-registry.js +23 -0
- package/dist/extensions/forgecli/session-registry.js.map +1 -1
- package/dist/extensions/forgecli/subagent/caller-context.d.ts +35 -11
- package/dist/extensions/forgecli/subagent/caller-context.js +49 -21
- package/dist/extensions/forgecli/subagent/caller-context.js.map +1 -1
- package/dist/extensions/forgecli/subagent/orchestrator-transcript.d.ts +66 -0
- package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +66 -0
- package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -0
- package/dist/extensions/forgecli/subagent/phase-guard.d.ts +34 -0
- package/dist/extensions/forgecli/subagent/phase-guard.js +149 -0
- package/dist/extensions/forgecli/subagent/phase-guard.js.map +1 -0
- package/dist/extensions/forgecli/subagent/phase-summary-map.d.ts +2 -0
- package/dist/extensions/forgecli/subagent/phase-summary-map.js +39 -0
- package/dist/extensions/forgecli/subagent/phase-summary-map.js.map +1 -0
- package/dist/extensions/forgecli/thread-switcher.js +2 -2
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
- package/dist/extensions/forgecli/viewport-events.d.ts +4 -0
- package/dist/extensions/forgecli/viewport-events.js +18 -1
- package/dist/extensions/forgecli/viewport-events.js.map +1 -1
- package/dist/extensions/forgecli/viewport-renderer.d.ts +12 -2
- package/dist/extensions/forgecli/viewport-renderer.js +8 -6
- package/dist/extensions/forgecli/viewport-renderer.js.map +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/store-cli-verbs.md +18 -3
- package/dist/forge-payload/.base-pack/workflows/architect_approve.md +4 -5
- package/dist/forge-payload/.base-pack/workflows/collator_agent.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +2 -3
- package/dist/forge-payload/.base-pack/workflows/fix_bug.md +10 -28
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -2
- package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +41 -47
- package/dist/forge-payload/.base-pack/workflows/triage.md +190 -0
- package/dist/forge-payload/.base-pack/workflows/validate_task.md +2 -3
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/_defs/locator.schema.json +13 -0
- package/dist/forge-payload/.schemas/bug.schema.json +1 -0
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/migrations.json +72 -0
- package/dist/forge-payload/.schemas/sprint.schema.json +1 -0
- package/dist/forge-payload/.schemas/task.schema.json +1 -0
- package/dist/forge-payload/integrity.json +3 -3
- package/dist/forge-payload/meta/fragments/tool-discipline.md +21 -2
- package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +18 -3
- package/dist/forge-payload/meta/workflows/meta-approve.md +4 -5
- package/dist/forge-payload/meta/workflows/meta-bug-triage.md +210 -0
- package/dist/forge-payload/meta/workflows/meta-collate.md +1 -1
- package/dist/forge-payload/meta/workflows/meta-commit.md +2 -3
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +10 -28
- package/dist/forge-payload/meta/workflows/meta-implement.md +3 -2
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +41 -47
- package/dist/forge-payload/meta/workflows/meta-validate.md +2 -3
- package/dist/forge-payload/schemas/_defs/locator.schema.json +13 -0
- package/dist/forge-payload/schemas/bug.schema.json +1 -0
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/sprint.schema.json +1 -0
- package/dist/forge-payload/schemas/structure-manifest.json +22 -2
- package/dist/forge-payload/schemas/task.schema.json +1 -0
- package/dist/forge-payload/tools/artifact-store.cjs +242 -0
- package/dist/forge-payload/tools/artifact.cjs +69 -100
- package/dist/forge-payload/tools/lib/artifact-kinds.cjs +95 -0
- package/dist/forge-payload/tools/lib/store-nlp.cjs +6 -0
- package/dist/forge-payload/tools/lib/store-query-exec.cjs +39 -5
- package/dist/forge-payload/tools/lib/suggest.cjs +2 -1
- package/dist/forge-payload/tools/preflight-gate.cjs +55 -5
- package/dist/forge-payload/tools/store-cli.cjs +50 -15
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts +5 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +81 -18
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +19 -24
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +14 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +22 -8
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/README.md +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +374 -122
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +424 -232
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +38 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +21 -12
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +6 -10
- package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.js +5 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js +3 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js +2 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +159 -78
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +16 -11
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js +4 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +6 -10
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/stream.js +14 -2
- package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +14 -4
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js +34 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts +9 -7
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js +8 -7
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts +10 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js +179 -79
- package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-coding-agent/CHANGELOG.md +94 -0
- package/node_modules/@earendil-works/pi-coding-agent/README.md +9 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.d.ts +3 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.js +27 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/config.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/config.js +15 -2
- package/node_modules/@earendil-works/pi-coding-agent/dist/config.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.d.ts +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts +5 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js +28 -4
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js +18 -24
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js +8 -2
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts +7 -5
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js +65 -13
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.d.ts +9 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.js +134 -11
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.d.ts +2 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js +10 -6
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.d.ts +6 -7
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js +75 -28
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts +2 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js +14 -9
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.js +0 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js +7 -10
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js +5 -7
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js +6 -7
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.d.ts +5 -2
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.js +17 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js +5 -6
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts +2 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/index.js +2 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/main.js +69 -16
- package/node_modules/@earendil-works/pi-coding-agent/dist/main.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.js +118 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +1 -3
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +2 -4
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js +59 -6
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.js +10 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +3 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.d.ts +4 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.js +13 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.js.map +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.d.ts +3 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.js +7 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.js.map +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/docs/custom-provider.md +13 -10
- package/node_modules/@earendil-works/pi-coding-agent/docs/development.md +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/extensions.md +12 -6
- package/node_modules/@earendil-works/pi-coding-agent/docs/models.md +25 -12
- package/node_modules/@earendil-works/pi-coding-agent/docs/providers.md +13 -5
- package/node_modules/@earendil-works/pi-coding-agent/docs/quickstart.md +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/docs/rpc.md +2 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/sdk.md +6 -0
- package/node_modules/@earendil-works/pi-coding-agent/docs/session-format.md +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/docs/sessions.md +8 -0
- package/node_modules/@earendil-works/pi-coding-agent/docs/settings.md +7 -3
- package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +2 -0
- package/node_modules/@earendil-works/pi-coding-agent/docs/tui.md +2 -2
- package/node_modules/@earendil-works/pi-coding-agent/docs/usage.md +9 -0
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/README.md +1 -0
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/index.ts +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts +54 -3
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/git-merge-and-resolve.ts +115 -0
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/input-transform-streaming.ts +39 -0
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package.json +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +443 -61
- package/node_modules/@earendil-works/pi-coding-agent/package.json +6 -6
- package/node_modules/@earendil-works/pi-tui/README.md +2 -2
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +24 -83
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/input.js +7 -55
- package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +7 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +12 -2
- package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +34 -7
- package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +33 -10
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +172 -37
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts +6 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.js +27 -15
- package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts +25 -0
- package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js +96 -0
- package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/package.json +2 -2
- package/node_modules/@entelligentsia/forge-compress/LICENSE +21 -0
- package/node_modules/@entelligentsia/forge-compress/README.md +85 -0
- package/node_modules/@entelligentsia/forge-compress/dist/compressor.d.ts +6 -0
- package/node_modules/@entelligentsia/forge-compress/dist/compressor.js +137 -0
- package/node_modules/@entelligentsia/forge-compress/dist/entropy.d.ts +3 -0
- package/node_modules/@entelligentsia/forge-compress/dist/entropy.js +99 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/entity.d.ts +8 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/entity.js +149 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/index.d.ts +7 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/index.js +4 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/markdown.d.ts +5 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/markdown.js +92 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/query.d.ts +7 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/query.js +60 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/validate.d.ts +1 -0
- package/node_modules/@entelligentsia/forge-compress/dist/forge/validate.js +82 -0
- package/node_modules/@entelligentsia/forge-compress/dist/index.d.ts +6 -0
- package/node_modules/@entelligentsia/forge-compress/dist/index.js +5 -0
- package/node_modules/@entelligentsia/forge-compress/dist/progressive.d.ts +1 -0
- package/node_modules/@entelligentsia/forge-compress/dist/progressive.js +108 -0
- package/node_modules/@entelligentsia/forge-compress/dist/strip.d.ts +4 -0
- package/node_modules/@entelligentsia/forge-compress/dist/strip.js +55 -0
- package/node_modules/@entelligentsia/forge-compress/dist/tokens.d.ts +2 -0
- package/node_modules/@entelligentsia/forge-compress/dist/tokens.js +17 -0
- package/node_modules/@entelligentsia/forge-compress/package.json +45 -0
- package/node_modules/@entelligentsia/forge-compress/src/__tests__/compress.test.ts +409 -0
- package/node_modules/@entelligentsia/forge-compress/src/compressor.ts +147 -0
- package/node_modules/@entelligentsia/forge-compress/src/entropy.ts +105 -0
- package/node_modules/@entelligentsia/forge-compress/src/forge/entity.ts +184 -0
- package/node_modules/@entelligentsia/forge-compress/src/forge/index.ts +10 -0
- package/node_modules/@entelligentsia/forge-compress/src/forge/markdown.ts +122 -0
- package/node_modules/@entelligentsia/forge-compress/src/forge/query.ts +105 -0
- package/node_modules/@entelligentsia/forge-compress/src/forge/validate.ts +86 -0
- package/node_modules/@entelligentsia/forge-compress/src/index.ts +22 -0
- package/node_modules/@entelligentsia/forge-compress/src/progressive.ts +123 -0
- package/node_modules/@entelligentsia/forge-compress/src/strip.ts +58 -0
- package/node_modules/@entelligentsia/forge-compress/src/tokens.ts +19 -0
- package/node_modules/@mariozechner/clipboard/Cargo.toml +3 -3
- package/node_modules/@mariozechner/clipboard/index.d.ts +34 -20
- package/node_modules/@mariozechner/clipboard/index.js +546 -257
- package/node_modules/@mariozechner/clipboard/package.json +5 -6
- package/node_modules/@mariozechner/clipboard/package.json.prepack-backup +14 -14
- package/node_modules/@mariozechner/clipboard/src/lib.rs +4 -9
- package/node_modules/@mariozechner/clipboard-linux-x64-gnu/clipboard.linux-x64-gnu.node +0 -0
- package/node_modules/@mariozechner/clipboard-linux-x64-gnu/package.json +2 -2
- package/package.json +11 -16
- package/dist/forge-payload/.base-pack/commands/quiz-agent.md +0 -6
- package/dist/forge-payload/.base-pack/commands/retrospective.md +0 -6
- package/dist/forge-payload/.base-pack/commands/sprint-intake.md +0 -6
- package/dist/forge-payload/.base-pack/commands/sprint-plan.md +0 -6
- package/dist/forge-payload/commands/calibrate.md +0 -10
- package/dist/forge-payload/commands/materialize.md +0 -119
- package/dist/forge-payload/commands/migrate.md +0 -12
- package/dist/forge-payload/commands/quiz-agent.md +0 -6
- package/dist/forge-payload/commands/regenerate.md +0 -6
- package/dist/forge-payload/commands/store-query.md +0 -6
- package/dist/forge-payload/commands/store-repair.md +0 -6
- package/dist/forge-payload/commands/update-tools.md +0 -10
- package/dist/forge-payload/meta/templates/meta-retrospective.md +0 -28
- package/dist/forge-payload/tools/prompts/sprint-plan-prompt.md +0 -70
- package/dist/forge-payload/tools/schemas/task-list.schema.json +0 -53
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.d.ts +0 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js +0 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.d.ts +0 -20
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js +0 -92
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.d.ts +0 -18
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js +0 -42
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.d.ts +0 -10
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js +0 -31
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.d.ts +0 -30
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js +0 -170
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.d.ts +0 -26
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js +0 -90
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js.map +0 -1
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +0 -3
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/clipboard.linux-x64-musl.node +0 -0
- package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +0 -25
|
@@ -32,14 +32,29 @@ Notes for subagents:
|
|
|
32
32
|
The three-arg form `update-status task {taskId} {value}` is WRONG and will
|
|
33
33
|
error. Always include `status` between the id and the value.
|
|
34
34
|
- **`emit`** appends an event. There is no `append-event` / `add-event`.
|
|
35
|
-
- **`set-summary
|
|
36
|
-
|
|
35
|
+
- **`set-summary <id> <phase>`** / **`set-bug-summary <id> <phase>`** link a
|
|
36
|
+
phase summary onto the entity record. The JSON-file argument is **optional**:
|
|
37
|
+
when omitted, the sidecar is auto-resolved from the record's `path` plus the
|
|
38
|
+
canonical phase→filename map (so `set-summary {taskId} validation` just works).
|
|
39
|
+
Never pass a hand-built `engineering/sprints/.../…-SUMMARY.json` path. Do not
|
|
40
|
+
inline summaries into the entity via `write`.
|
|
37
41
|
- **Artifact I/O:** Use `forge_artifact` for ALL phase artifact reads and writes
|
|
38
42
|
(PLAN.md, PROGRESS.md, *-SUMMARY.json, CODE_REVIEW.md, etc.). Never construct
|
|
39
43
|
artifact file paths manually — the tool resolves paths from entity IDs and
|
|
40
44
|
validates JSON summary schemas on write. After writing a summary JSON via
|
|
41
|
-
`forge_artifact`, link it to the store record via `forge_store set-summary
|
|
45
|
+
`forge_artifact`, link it to the store record via `forge_store set-summary {id} {phase}` (no path).
|
|
42
46
|
Example: `forge_artifact({ command:"write", entity:"task", entityId:"{taskId}", artifact:"progress", content:"..." })`
|
|
47
|
+
- **Artifact addressing (canonical) — never reconstruct a path.** Address an
|
|
48
|
+
artifact by `(entity, entityId, kind)` via `forge_artifact`, or read the
|
|
49
|
+
entity's `path` field from the store record. The on-disk directory is owned by
|
|
50
|
+
the record's `path`, NOT by any id template. Token glossary:
|
|
51
|
+
- `{sprintId}` / `{taskId}` / `{bugId}` — the **store record filenames**
|
|
52
|
+
(`.forge/store/<kind>s/<id>.json`); deterministic and safe to use as IDs.
|
|
53
|
+
- `{sprint}` / `{task}` / `{bug}` — runtime path-template substitutions used by
|
|
54
|
+
the **preflight gate**, derived from the record's `path` (not the bare ID).
|
|
55
|
+
- The engineering artifact directory always comes from `record.path`.
|
|
56
|
+
These spellings are parsed literally by tools (`preflight-gate.cjs`,
|
|
57
|
+
`collate.cjs`) — do not invent new spellings or rename them in prose.
|
|
43
58
|
- If you need a verb not on this list, run
|
|
44
59
|
`node "$FORGE_ROOT/tools/store-cli.cjs" --help` before improvising.
|
|
45
60
|
- If you supply an unknown verb, entity type, enum value, or field name,
|
|
@@ -98,15 +98,14 @@ deps:
|
|
|
98
98
|
"artifact_ref":"ARCHITECT_APPROVAL.md"
|
|
99
99
|
}
|
|
100
100
|
```
|
|
101
|
-
- Call (task mode) — optional for tasks, since `task.status` is the canonical signal
|
|
101
|
+
- Call (task mode) — optional for tasks, since `task.status` is the canonical signal.
|
|
102
|
+
The sidecar path is auto-resolved from the record's `path` — never pass it:
|
|
102
103
|
```
|
|
103
|
-
node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} approve
|
|
104
|
-
engineering/sprints/{sprint}/{task}/APPROVE-SUMMARY.json
|
|
104
|
+
node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} approve
|
|
105
105
|
```
|
|
106
106
|
Or (bug mode) — REQUIRED for bugs, this is the canonical verdict signal:
|
|
107
107
|
```
|
|
108
|
-
node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} approve
|
|
109
|
-
engineering/bugs/{bugDir}/APPROVE-SUMMARY.json
|
|
108
|
+
node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} approve
|
|
110
109
|
```
|
|
111
110
|
- In bug mode, if the set-bug-summary call exits non-zero, fix the sidecar JSON and retry. Do not return without a valid summary — the downstream commit gate has no other way to read the approval verdict.
|
|
112
111
|
```
|
|
@@ -67,7 +67,7 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
|
|
|
67
67
|
|
|
68
68
|
4. Finalize:
|
|
69
69
|
- **Do NOT emit a phase event yourself.** The orchestrator (or kickoff handler) owns event emission — it composes the canonical event from runtime telemetry (model, provider, tokens, wall times) plus the SUMMARY you write in the next step. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (see Plan 11 / Slice 2). Write the SUMMARY and return.
|
|
70
|
-
- Write `WRITEBACK-SUMMARY.json` to the sprint directory (`engineering/sprints/{sprintId}/`
|
|
70
|
+
- Write `WRITEBACK-SUMMARY.json` to the sprint's artifact directory — use the sprint record's `path` field (read it from the store), not a reconstructed `engineering/sprints/{sprintId}/` template — with the following shape:
|
|
71
71
|
```json
|
|
72
72
|
{
|
|
73
73
|
"objective": "<one sentence — what views were regenerated>",
|
|
@@ -57,9 +57,8 @@ deps:
|
|
|
57
57
|
|
|
58
58
|
1. Load Context:
|
|
59
59
|
- Read the record manifest (task or bug, per entity_kind).
|
|
60
|
-
- Read ARCHITECT_APPROVAL.md
|
|
61
|
-
|
|
62
|
-
- Bug mode: `engineering/bugs/{bugDir}/ARCHITECT_APPROVAL.md`
|
|
60
|
+
- Read ARCHITECT_APPROVAL.md by kind — never construct the path:
|
|
61
|
+
`forge_artifact({ command:"read", entity:"{entity_kind}", entityId:"{record_id}", artifact:"architect-approval" })`
|
|
63
62
|
|
|
64
63
|
2. Staging:
|
|
65
64
|
- Stage all record-related artifacts and the code changes:
|
|
@@ -23,7 +23,7 @@ Phases`):
|
|
|
23
23
|
|
|
24
24
|
| Phase | Role | Persona | Workflow | Path A | Path B |
|
|
25
25
|
|---|---|---|---|---|---|
|
|
26
|
-
| triage | `triage` | bug-fixer |
|
|
26
|
+
| triage | `triage` | bug-fixer | `triage.md` | yes | yes |
|
|
27
27
|
| plan-fix | `plan` | engineer | `plan_task.md` (bug-mode) | no | yes |
|
|
28
28
|
| review-plan | `review-plan` | supervisor | `review_plan.md` | no | yes |
|
|
29
29
|
| implement | `implement` | engineer | `implement_plan.md` (bug-mode) | yes | yes |
|
|
@@ -93,24 +93,11 @@ The `route` field is required. Allowed values: `"A"` or `"B"`.
|
|
|
93
93
|
> Triage subagents MUST NOT touch `bug.path` — that field is set at bug
|
|
94
94
|
> creation and never modified by triage.
|
|
95
95
|
|
|
96
|
-
### Path A
|
|
96
|
+
### Path A / Path B eligibility
|
|
97
97
|
|
|
98
|
-
Path A
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
- `bug.severity ∈ {minor}`
|
|
102
|
-
- Fix is contained in a single file
|
|
103
|
-
- Estimated diff ≤ ~20 lines (judgement call; one screen)
|
|
104
|
-
- No schema, API, migration, security, or build-system change
|
|
105
|
-
- A regression test is obvious from the reproduction script (single short
|
|
106
|
-
test case, no new fixtures, no test-harness change)
|
|
107
|
-
|
|
108
|
-
If any criterion fails, the triage subagent MUST select Path B.
|
|
109
|
-
|
|
110
|
-
### Path B — full loop (default)
|
|
111
|
-
|
|
112
|
-
Path B runs the same plan/review/implement/review/approve/commit shape as
|
|
113
|
-
`meta-orchestrate.md`. It is the default. Any uncertainty defaults Path B.
|
|
98
|
+
See `triage.md § Path A / Path B Eligibility` for the criteria the triage
|
|
99
|
+
subagent applies. The criteria are single-sourced in the triage workflow;
|
|
100
|
+
this orchestrator only reads the resulting `summaries.triage.route` value.
|
|
114
101
|
|
|
115
102
|
### Pipeline selection by path
|
|
116
103
|
|
|
@@ -156,16 +143,11 @@ Differences are confined to the **triage** step and the **path branch**.
|
|
|
156
143
|
b. If .forge/store/bugs/{BUG_ID}.json does NOT exist, write a fresh record
|
|
157
144
|
via store-cli with status="reported".
|
|
158
145
|
c. Read the now-guaranteed record.
|
|
159
|
-
- Spawn the triage subagent (persona: bug-fixer).
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
forge_artifact({ command:"write", entity:"bug", entityId:"{bugId}", artifact:"triage", content:"<markdown>" })
|
|
165
|
-
• Write triage-summary artifact (JSON shape documented in § Triage Judgement):
|
|
166
|
-
forge_artifact({ command:"write", entity:"bug", entityId:"{bugId}", artifact:"triage-summary", content:"<JSON>" })
|
|
167
|
-
• Call set-bug-summary {bugId} triage via forge_store:
|
|
168
|
-
forge_store({ command:"set-bug-summary", bugId:"{bugId}", phase:"triage", file:"TRIAGE-SUMMARY.json" })
|
|
146
|
+
- Spawn the triage subagent (workflow: `triage.md`, persona: bug-fixer).
|
|
147
|
+
It MUST write `TRIAGE.md` + `TRIAGE-SUMMARY.json` with a `route` field
|
|
148
|
+
(`"A"` or `"B"`) and call `set-bug-summary {bugId} triage` per
|
|
149
|
+
`triage.md`. The triage workflow is `audience: subagent`, `phase: triage`;
|
|
150
|
+
the orchestrator MUST NOT pass any other workflow body to this subagent.
|
|
169
151
|
- On return, orchestrator transitions status:
|
|
170
152
|
store-cli update-status bug {bugId} status triaged
|
|
171
153
|
store-cli update-status bug {bugId} status in-progress
|
|
@@ -92,9 +92,10 @@ deps:
|
|
|
92
92
|
JSON shape: `{"objective":"<one sentence>", "key_changes":["<up to 12 bullets>"], "verdict":"n/a", "written_at":"<ISO 8601>", "artifact_ref":"PROGRESS.md"}`
|
|
93
93
|
The tool validates required fields automatically — fix and retry if it rejects.
|
|
94
94
|
- Then link sidecar to store (task mode):
|
|
95
|
-
`forge_store({ command:"set-summary", args:["{taskId}", "implementation"
|
|
95
|
+
`forge_store({ command:"set-summary", args:["{taskId}", "implementation"] })`
|
|
96
96
|
Or (bug mode):
|
|
97
|
-
`forge_store({ command:"set-bug-summary", args:["{bugId}", "implementation"
|
|
97
|
+
`forge_store({ command:"set-bug-summary", args:["{bugId}", "implementation"] })`
|
|
98
|
+
The sidecar path is auto-resolved from the record's `path` — never pass it.
|
|
98
99
|
```
|
|
99
100
|
|
|
100
101
|
<!-- See _fragments/iron-laws.md for Iron Laws section structure guidance -->
|
|
@@ -561,28 +561,32 @@ for each task in dependency_sorted(tasks):
|
|
|
561
561
|
/compact
|
|
562
562
|
continue
|
|
563
563
|
|
|
564
|
-
# --- Review phase: detect verdict via
|
|
565
|
-
#
|
|
566
|
-
#
|
|
564
|
+
# --- Review phase: detect verdict via read-verdict.cjs (see Verdict Detection below) ---
|
|
565
|
+
# Verdicts come from the STORE record (phase summaries / task.status), NOT from a
|
|
566
|
+
# markdown review artifact — the orchestrator never constructs an artifact path.
|
|
567
|
+
# stdout is one of: approved | revision | n/a | unknown. Never pattern-match a
|
|
568
|
+
# **Verdict:** line — the closed vocabulary lives in the tool.
|
|
567
569
|
verdict_result = run_bash(
|
|
568
|
-
f'node "$FORGE_ROOT/tools/
|
|
570
|
+
f'node "$FORGE_ROOT/tools/read-verdict.cjs" --phase {phase.role} --task {task_id}'
|
|
569
571
|
)
|
|
570
|
-
|
|
572
|
+
verdict_token = verdict_result.stdout.strip()
|
|
573
|
+
if verdict_token == "approved":
|
|
571
574
|
verdict = "Approved"
|
|
572
|
-
elif
|
|
575
|
+
elif verdict_token == "revision":
|
|
573
576
|
verdict = "Revision Required"
|
|
574
577
|
else:
|
|
575
|
-
#
|
|
578
|
+
# "n/a" / "unknown" (no verdict recorded) or exit 2 (record not found / bad args).
|
|
579
|
+
# Never guess.
|
|
576
580
|
print(f" ⚠ {task_id} {phase.role} — verdict_malformed, escalating\n")
|
|
577
581
|
emit_event(task, phase, action="verdict_malformed",
|
|
578
|
-
notes=f"
|
|
582
|
+
notes=f"read-verdict stdout='{verdict_token}' exit={verdict_result.exit_code}")
|
|
579
583
|
# ---- ESCALATION (mandatory hard stop — do NOT continue) ----
|
|
580
584
|
run_bash(f'node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {task_id} status escalated')
|
|
581
585
|
emit_event(task, phase, eventId=event_id, iteration=iteration,
|
|
582
586
|
action="escalated", verdict="escalated",
|
|
583
|
-
notes="verdict_malformed:
|
|
584
|
-
print(f" ⚠ Task {task_id} escalated: verdict_malformed —
|
|
585
|
-
print(f"
|
|
587
|
+
notes="verdict_malformed: no verdict recorded in the phase summary / record")
|
|
588
|
+
print(f" ⚠ Task {task_id} escalated: verdict_malformed — no verdict recorded for {phase.role}\n")
|
|
589
|
+
print(f" Inspect with: node \"$FORGE_ROOT/tools/read-verdict.cjs\" --phase {phase.role} --task {task_id}\n")
|
|
586
590
|
print(f" Resume with: /{phase.command} {task_id} after addressing the issues.\n")
|
|
587
591
|
break
|
|
588
592
|
|
|
@@ -604,7 +608,7 @@ for each task in dependency_sorted(tasks):
|
|
|
604
608
|
action="escalated", verdict="escalated",
|
|
605
609
|
notes="max iterations reached")
|
|
606
610
|
print(f" ⚠ Task {task_id} escalated: max iterations reached\n")
|
|
607
|
-
print(f"
|
|
611
|
+
print(f" Inspect with: node \"$FORGE_ROOT/tools/read-verdict.cjs\" --phase {phase.role} --task {task_id}\n")
|
|
608
612
|
print(f" Resume with: /{phase.command} {task_id} after addressing the issues.\n")
|
|
609
613
|
break
|
|
610
614
|
break # stop processing this task
|
|
@@ -616,7 +620,7 @@ for each task in dependency_sorted(tasks):
|
|
|
616
620
|
print(f"[checkpoint] task={task_id} sprint={sprint_id} phase_index={i} iterations={iteration_counts}")
|
|
617
621
|
/compact
|
|
618
622
|
|
|
619
|
-
# No `else:` branch needed —
|
|
623
|
+
# No `else:` branch needed — read-verdict.cjs already exhausts the
|
|
620
624
|
# possibilities (approved | revision | verdict_malformed), and the
|
|
621
625
|
# malformed case is handled above before this if/elif chain.
|
|
622
626
|
```
|
|
@@ -676,45 +680,35 @@ Examples:
|
|
|
676
680
|
## Verdict Detection
|
|
677
681
|
|
|
678
682
|
After each review phase completes, the orchestrator MUST read the verdict
|
|
679
|
-
before branching. Do not infer the verdict from conversation context alone
|
|
680
|
-
|
|
683
|
+
before branching. Do not infer the verdict from conversation context alone, and
|
|
684
|
+
**never construct or read a markdown artifact path** to find it — the verdict
|
|
685
|
+
lives in the **store record** (the phase summary written by `set-summary`, or
|
|
686
|
+
`task.status` for the approve phase).
|
|
681
687
|
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
| `validate` | `{engineering}/sprints/{sprintDir}/{taskDir}/VALIDATION_REPORT.md` | Line matching `**Verdict:**` |
|
|
687
|
-
|
|
688
|
-
The verdict line format is:
|
|
689
|
-
|
|
690
|
-
```
|
|
691
|
-
**Verdict:** Approved
|
|
692
|
-
```
|
|
693
|
-
or
|
|
694
|
-
```
|
|
695
|
-
**Verdict:** Revision Required
|
|
696
|
-
```
|
|
697
|
-
|
|
698
|
-
**Parse the verdict via `parse-verdict.cjs`** — do NOT pattern-match the
|
|
699
|
-
line manually. The tool enforces a closed verdict vocabulary so typos, case
|
|
700
|
-
drift, and reviewer prose cannot cause silent misclassification:
|
|
688
|
+
**Read the verdict via `read-verdict.cjs`** — addressed by entity ID and phase
|
|
689
|
+
role, never by file path. The tool sources the verdict from the record and
|
|
690
|
+
enforces a closed vocabulary so typos, case drift, and reviewer prose cannot
|
|
691
|
+
cause silent misclassification:
|
|
701
692
|
|
|
702
693
|
```
|
|
703
694
|
FORGE_ROOT = resolve_forge_root()
|
|
704
|
-
result = run_bash(f'node "$FORGE_ROOT/tools/
|
|
705
|
-
#
|
|
706
|
-
#
|
|
707
|
-
#
|
|
695
|
+
result = run_bash(f'node "$FORGE_ROOT/tools/read-verdict.cjs" --phase {phase.role} --task {task_id}')
|
|
696
|
+
# stdout "approved" → approved
|
|
697
|
+
# stdout "revision" → revision
|
|
698
|
+
# stdout "n/a" | "unknown" → no verdict recorded (treat as malformed; do NOT guess)
|
|
699
|
+
# exit 2 → record not found / invalid args (treat as malformed)
|
|
708
700
|
```
|
|
709
701
|
|
|
710
|
-
|
|
702
|
+
Branch on the **stdout token** (exit 1 bundles both `revision` and the
|
|
703
|
+
no-verdict cases, so the token is authoritative). Recognised verdict values:
|
|
711
704
|
|
|
712
|
-
- **approved** — `
|
|
713
|
-
- **revision** — `
|
|
705
|
+
- **approved** — written as `verdict: "approved"` in the phase summary (or `task.status == approved` for the approve phase).
|
|
706
|
+
- **revision** — `verdict: "revision"`.
|
|
714
707
|
|
|
715
|
-
Anything else —
|
|
716
|
-
|
|
717
|
-
|
|
708
|
+
Anything else — `n/a`, `unknown`, a missing summary, or a missing record —
|
|
709
|
+
must NOT be treated as approved or revision; halt the loop and escalate via
|
|
710
|
+
`verdict_malformed`. (In bug mode pass `--bug {bug_id}`; `read-verdict.cjs`
|
|
711
|
+
applies the bug-specific phase→summary map.)
|
|
718
712
|
|
|
719
713
|
## Escalation Procedure
|
|
720
714
|
|
|
@@ -750,8 +744,8 @@ Grammar (one directive per line):
|
|
|
750
744
|
`in [v1, v2, ...]`. Fields are dotted paths against the store record, e.g.
|
|
751
745
|
`task.status`.
|
|
752
746
|
- `forbid <field> <op> <value>` — predicate must NOT hold.
|
|
753
|
-
- `after <phase> = <approved|revision>` — predecessor phase's
|
|
754
|
-
must
|
|
747
|
+
- `after <phase> = <approved|revision>` — predecessor phase's stored verdict
|
|
748
|
+
must match (read from the record by `read-verdict.cjs`, not from markdown).
|
|
755
749
|
|
|
756
750
|
```gates phase=plan
|
|
757
751
|
forbid task.status == committed
|
|
@@ -849,7 +843,7 @@ is a violation of the Iron Laws.
|
|
|
849
843
|
- Subagent empty/crash/timeout response: retry once with simplified prompt
|
|
850
844
|
(strip summary and architecture blocks). Escalate on second failure.
|
|
851
845
|
See Subagent Response Validation in the Execution Algorithm.
|
|
852
|
-
- Subagent non-zero exit code (not
|
|
846
|
+
- Subagent non-zero exit code (not read-verdict): same as above — retry
|
|
853
847
|
once, escalate on second failure. The crash reason is captured in the
|
|
854
848
|
escalation event notes.
|
|
855
849
|
- Verdict malformed or missing: escalate to human immediately. Never guess.
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
---
|
|
2
|
+
requirements:
|
|
3
|
+
reasoning: High
|
|
4
|
+
context: Medium
|
|
5
|
+
speed: Medium
|
|
6
|
+
audience: subagent
|
|
7
|
+
phase: triage
|
|
8
|
+
context:
|
|
9
|
+
architecture: false
|
|
10
|
+
prior_summaries: delta
|
|
11
|
+
persona: summary
|
|
12
|
+
master_index: false
|
|
13
|
+
diff_mode: false
|
|
14
|
+
deps:
|
|
15
|
+
personas: [bug-fixer]
|
|
16
|
+
skills: [bug-fixer, generic]
|
|
17
|
+
templates: []
|
|
18
|
+
sub_workflows: []
|
|
19
|
+
kb_docs: [architecture/stack.md]
|
|
20
|
+
config_fields: [commands.test, paths.engineering]
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Bug Triage
|
|
25
|
+
## Iron Laws
|
|
26
|
+
|
|
27
|
+
- Reproduce the bug before deciding anything. A bug without a confirmed
|
|
28
|
+
reproduction has no business going to plan-fix or implement.
|
|
29
|
+
- Read `.forge/personas/bug-fixer.md` first; print the persona identity
|
|
30
|
+
line (emoji, name, tagline) to stdout before any other tool use.
|
|
31
|
+
- All store I/O via `forge_store` (or `node "$FORGE_ROOT/tools/store-cli.cjs"`).
|
|
32
|
+
Never edit `.forge/store/*.json` directly.
|
|
33
|
+
- **Triage NEVER writes `bug.status`.** The orchestrator (`meta-fix-bug.md`)
|
|
34
|
+
owns the `reported → triaged` and `triaged → in-progress` transitions.
|
|
35
|
+
Writing `bug.status` from this workflow violates `meta-fix-bug.md
|
|
36
|
+
§ Iron Laws #2` (parallel to `meta-review-plan.md`'s "Supervisor NEVER
|
|
37
|
+
writes entity status" rule).
|
|
38
|
+
- Triage is a **single phase**. Do NOT call `forge_preflight` with any
|
|
39
|
+
other `--phase` value. Do NOT call `forge_store update-status`,
|
|
40
|
+
`set-bug-summary` for any non-triage phase, or `forge_store emit`.
|
|
41
|
+
These are orchestrator-owned or other-phase-owned actions. The
|
|
42
|
+
phase-ownership guard in forge-cli will reject violations at the tool
|
|
43
|
+
layer, but the Iron Law names the rule.
|
|
44
|
+
|
|
45
|
+
## Store-Write Verification
|
|
46
|
+
|
|
47
|
+
<!-- See _fragments/store-write-verification.md for the canonical block content -->
|
|
48
|
+
|
|
49
|
+
## Algorithm
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
0. Pre-flight Gate Check:
|
|
54
|
+
- Resolve FORGE_ROOT (`node -e "console.log(require('./.forge/config.json').paths.forgeRoot)"`).
|
|
55
|
+
- Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase triage --bug {bugId}`
|
|
56
|
+
- Exit 1 (gate failed) → print stderr and HALT. Do not proceed.
|
|
57
|
+
- Exit 2 (misconfiguration) → print stderr and HALT.
|
|
58
|
+
- Exit 0 → continue.
|
|
59
|
+
|
|
60
|
+
1. Load Context:
|
|
61
|
+
- Read `.forge/personas/bug-fixer.md` first; print the persona identity
|
|
62
|
+
line to stdout before any other tool use.
|
|
63
|
+
- Read the bug record:
|
|
64
|
+
`forge_store({ command:"read", entity:"bug", id:"{bugId}" })`
|
|
65
|
+
- Read business domain docs relevant to the reported symptom.
|
|
66
|
+
- store-cli verbs: `read` | `list` | `write` | `emit` |
|
|
67
|
+
`update-status` | `set-summary` | `set-bug-summary` | `describe` |
|
|
68
|
+
`nlp` | `query` | `delete` — there is no `get`/`set`/`find`. See
|
|
69
|
+
`_fragments/store-cli-verbs.md` for full notes.
|
|
70
|
+
|
|
71
|
+
2. Reproduce:
|
|
72
|
+
- Construct a minimal reproduction: a failing test, a short script,
|
|
73
|
+
or a documented manual sequence that triggers the reported symptom.
|
|
74
|
+
- If reproduction cannot be achieved with the information in the bug
|
|
75
|
+
record, write what was tried in TRIAGE.md, set the route to "B"
|
|
76
|
+
(any uncertainty defaults to Path B), and continue to root-cause
|
|
77
|
+
research with the reporter's narrative as the working hypothesis.
|
|
78
|
+
|
|
79
|
+
3. Root-Cause Research:
|
|
80
|
+
- Read the code paths implicated by the reproduction.
|
|
81
|
+
- Confirm (or revise) the reporter's stated root cause via direct
|
|
82
|
+
inspection of source files and tests.
|
|
83
|
+
- Note collateral damage: which other call sites, schemas, or
|
|
84
|
+
workflows share the defective shape.
|
|
85
|
+
|
|
86
|
+
4. Path A / Path B Eligibility:
|
|
87
|
+
- Apply the criteria in § "Path A / Path B Eligibility" below.
|
|
88
|
+
- Record the route decision and the explicit enumeration of each
|
|
89
|
+
criterion in the findings section of the triage summary.
|
|
90
|
+
|
|
91
|
+
5. Write Triage Artifacts:
|
|
92
|
+
- Write the triage artifact (markdown narrative):
|
|
93
|
+
`forge_artifact({ command:"write", entity:"bug", entityId:"{bugId}",
|
|
94
|
+
artifact:"triage", content:"<markdown>" })`
|
|
95
|
+
- Write the triage-summary sidecar (JSON shape below):
|
|
96
|
+
`forge_artifact({ command:"write", entity:"bug", entityId:"{bugId}",
|
|
97
|
+
artifact:"triage-summary", content:"<JSON>" })`
|
|
98
|
+
|
|
99
|
+
6. Finalize:
|
|
100
|
+
- **No status write.** The orchestrator (`meta-fix-bug.md`) writes the
|
|
101
|
+
`reported → triaged` and `triaged → in-progress` transitions on
|
|
102
|
+
return. Writing `bug.status` from this workflow is forbidden by
|
|
103
|
+
Iron Laws above and is rejected by the phase-ownership guard.
|
|
104
|
+
- **Do NOT emit a phase event yourself.** The orchestrator owns event
|
|
105
|
+
emission — it composes the canonical event from runtime telemetry
|
|
106
|
+
(model, provider, tokens, wall times) plus the SUMMARY you write
|
|
107
|
+
in the next step.
|
|
108
|
+
|
|
109
|
+
7. Emit Summary Sidecar:
|
|
110
|
+
- The JSON written in step 5 MUST have this shape (the `route` field
|
|
111
|
+
is required; allowed values: `"A"` or `"B"`):
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"objective": "Triage FORGE-BUG-NNN — reproduce, locate, decide route.",
|
|
116
|
+
"key_changes": ["<up to 12 bullets, 200 chars each — findings or actions>"],
|
|
117
|
+
"findings": [
|
|
118
|
+
"Root cause: <one line>",
|
|
119
|
+
"Reproduction: <one line>",
|
|
120
|
+
"Route decision: A | B",
|
|
121
|
+
"Rationale: <one line>"
|
|
122
|
+
],
|
|
123
|
+
"verdict": "n/a",
|
|
124
|
+
"written_at": "<current ISO 8601 timestamp>",
|
|
125
|
+
"artifact_ref":"TRIAGE.md",
|
|
126
|
+
"route": "A"
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
- Call:
|
|
131
|
+
```
|
|
132
|
+
forge_store({ command:"set-bug-summary", entity:"bug",
|
|
133
|
+
id:"{bugId}", phase:"triage" })
|
|
134
|
+
// sidecar path auto-resolved from the bug record's `path` — never pass it
|
|
135
|
+
```
|
|
136
|
+
- If the set-bug-summary call exits non-zero, fix the sidecar JSON
|
|
137
|
+
and retry (up to 3 attempts per the Store-Write Verification rule).
|
|
138
|
+
Do not proceed without a valid summary.
|
|
139
|
+
|
|
140
|
+
> **Field-naming caution — runtime-tested.** The route field is named
|
|
141
|
+
> `route`, never `path`. The bug schema's top-level `path` field is the
|
|
142
|
+
> bug's **artifact directory** (e.g. `engineering/bugs/EMG-BUG-001-...`).
|
|
143
|
+
> Conflating the two caused EMBERGLOW-BUG-001 (v0.44.0 first run) to land
|
|
144
|
+
> its `TRIAGE.md` under `.forge/store/bugs/` instead of `engineering/bugs/`.
|
|
145
|
+
> Triage MUST NOT touch `bug.path` — that field is set at bug creation
|
|
146
|
+
> and never modified by triage.
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Path A / Path B Eligibility
|
|
150
|
+
|
|
151
|
+
Path A is **eligible only when ALL** of the following hold. The triage
|
|
152
|
+
summary `findings` array MUST enumerate each criterion explicitly with a
|
|
153
|
+
pass/fail mark, so reviewers can audit the decision:
|
|
154
|
+
|
|
155
|
+
- `bug.severity ∈ {minor}`
|
|
156
|
+
- Fix is contained in a single file
|
|
157
|
+
- Estimated diff ≤ ~20 lines (judgement call; one screen)
|
|
158
|
+
- No schema, API, migration, security, or build-system change
|
|
159
|
+
- A regression test is obvious from the reproduction script (single short
|
|
160
|
+
test case, no new fixtures, no test-harness change)
|
|
161
|
+
|
|
162
|
+
If any criterion fails, the triage subagent MUST select Path B.
|
|
163
|
+
|
|
164
|
+
**Path B is the default.** Any uncertainty resolves to Path B. It runs the
|
|
165
|
+
same plan/review/implement/review/approve/commit shape as
|
|
166
|
+
`meta-orchestrate.md`. Picking Path A under uncertainty is the documented
|
|
167
|
+
failure mode (over-eager short-circuit).
|
|
168
|
+
|
|
169
|
+
## Triage Artifact Contents (TRIAGE.md)
|
|
170
|
+
|
|
171
|
+
The narrative artifact MUST contain:
|
|
172
|
+
|
|
173
|
+
1. **Reported symptom** — one paragraph summarising the bug report.
|
|
174
|
+
2. **Reproduction** — exact steps, commands, or test case that triggers
|
|
175
|
+
the symptom; copy of the failing output.
|
|
176
|
+
3. **Root cause** — one or two paragraphs naming the defective code path,
|
|
177
|
+
schema, or workflow. Cite file paths and line numbers.
|
|
178
|
+
4. **Path A / Path B enumeration** — for each criterion above, mark
|
|
179
|
+
pass/fail with one-line evidence.
|
|
180
|
+
5. **Route decision and rationale** — the chosen route and the
|
|
181
|
+
single-sentence justification.
|
|
182
|
+
6. **Collateral findings** — any related shapes, call sites, or
|
|
183
|
+
workflows that share the defective pattern (filed as follow-ups in
|
|
184
|
+
the commit phase, not fixed here).
|
|
185
|
+
|
|
186
|
+
<!-- See _fragments/generation-instructions.md for Generation Instructions template -->
|
|
187
|
+
## Friction Emit
|
|
188
|
+
|
|
189
|
+
Emit `type:friction` `{workflow:triage, persona:bug-fixer, issue}` per
|
|
190
|
+
`_fragments/friction-emit.md`.
|
|
@@ -110,10 +110,9 @@ deps:
|
|
|
110
110
|
"artifact_ref":"VALIDATION_REPORT.md"
|
|
111
111
|
}
|
|
112
112
|
```
|
|
113
|
-
- Call:
|
|
113
|
+
- Call (the sidecar path is auto-resolved from the task record's `path` — never pass it):
|
|
114
114
|
```
|
|
115
|
-
node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} validation
|
|
116
|
-
engineering/sprints/{sprint}/{task}/VALIDATION-SUMMARY.json
|
|
115
|
+
node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} validation
|
|
117
116
|
```
|
|
118
117
|
- If set-summary exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
|
|
119
118
|
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forge/_defs/locator.schema.json",
|
|
4
|
+
"title": "ArtifactLocator",
|
|
5
|
+
"description": "Backend-agnostic artifact locator (ADR doc/decisions/artifact-resolution-abstraction.md, issue #111 Phase 3). Single-sourced under _defs/ and $ref'd from task/bug/sprint schemas. `record.path` remains the required back-compat alias during migration; `locator` is the forward-looking form so a non-fs backend (s3/cms/db) is a drop-in. `ref` is an opaque, backend-specific reference (a URI is a fine encoding): fs → 'engineering/sprints/<dir>/<task>/', s3 → 's3://bucket/key', cms → 'cms://collection/<id>', db → 'blob:<uuid>'.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["backend", "ref"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"backend": { "type": "string", "description": "Storage backend identifier — e.g. fs, s3, gcs, azure, cms, db." },
|
|
10
|
+
"ref": { "type": "string", "description": "Opaque backend-specific reference (URI-encodable)." }
|
|
11
|
+
},
|
|
12
|
+
"additionalProperties": false
|
|
13
|
+
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"severity": { "type": "string", "enum": ["critical", "major", "minor"] },
|
|
12
12
|
"status": { "type": "string", "enum": ["reported", "triaged", "in-progress", "fixed"] },
|
|
13
13
|
"path": { "type": "string" },
|
|
14
|
+
"locator": { "$ref": "_defs/locator.schema.json" },
|
|
14
15
|
"rootCauseCategory": {
|
|
15
16
|
"type": "string",
|
|
16
17
|
"enum": ["validation", "auth", "business-rule", "data-integrity", "race-condition", "integration", "configuration", "regression"]
|