@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
|
@@ -566,28 +566,32 @@ for each task in dependency_sorted(tasks):
|
|
|
566
566
|
/compact
|
|
567
567
|
continue
|
|
568
568
|
|
|
569
|
-
# --- Review phase: detect verdict via
|
|
570
|
-
#
|
|
571
|
-
#
|
|
569
|
+
# --- Review phase: detect verdict via read-verdict.cjs (see Verdict Detection below) ---
|
|
570
|
+
# Verdicts come from the STORE record (phase summaries / task.status), NOT from a
|
|
571
|
+
# markdown review artifact β the orchestrator never constructs an artifact path.
|
|
572
|
+
# stdout is one of: approved | revision | n/a | unknown. Never pattern-match a
|
|
573
|
+
# **Verdict:** line β the closed vocabulary lives in the tool.
|
|
572
574
|
verdict_result = run_bash(
|
|
573
|
-
f'node "$FORGE_ROOT/tools/
|
|
575
|
+
f'node "$FORGE_ROOT/tools/read-verdict.cjs" --phase {phase.role} --task {task_id}'
|
|
574
576
|
)
|
|
575
|
-
|
|
577
|
+
verdict_token = verdict_result.stdout.strip()
|
|
578
|
+
if verdict_token == "approved":
|
|
576
579
|
verdict = "Approved"
|
|
577
|
-
elif
|
|
580
|
+
elif verdict_token == "revision":
|
|
578
581
|
verdict = "Revision Required"
|
|
579
582
|
else:
|
|
580
|
-
#
|
|
583
|
+
# "n/a" / "unknown" (no verdict recorded) or exit 2 (record not found / bad args).
|
|
584
|
+
# Never guess.
|
|
581
585
|
print(f" β {task_id} {phase.role} β verdict_malformed, escalating\n")
|
|
582
586
|
emit_event(task, phase, action="verdict_malformed",
|
|
583
|
-
notes=f"
|
|
587
|
+
notes=f"read-verdict stdout='{verdict_token}' exit={verdict_result.exit_code}")
|
|
584
588
|
# ---- ESCALATION (mandatory hard stop β do NOT continue) ----
|
|
585
589
|
run_bash(f'node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {task_id} status escalated')
|
|
586
590
|
emit_event(task, phase, eventId=event_id, iteration=iteration,
|
|
587
591
|
action="escalated", verdict="escalated",
|
|
588
|
-
notes="verdict_malformed:
|
|
589
|
-
print(f" β Task {task_id} escalated: verdict_malformed β
|
|
590
|
-
print(f"
|
|
592
|
+
notes="verdict_malformed: no verdict recorded in the phase summary / record")
|
|
593
|
+
print(f" β Task {task_id} escalated: verdict_malformed β no verdict recorded for {phase.role}\n")
|
|
594
|
+
print(f" Inspect with: node \"$FORGE_ROOT/tools/read-verdict.cjs\" --phase {phase.role} --task {task_id}\n")
|
|
591
595
|
print(f" Resume with: /{phase.command} {task_id} after addressing the issues.\n")
|
|
592
596
|
break
|
|
593
597
|
|
|
@@ -609,7 +613,7 @@ for each task in dependency_sorted(tasks):
|
|
|
609
613
|
action="escalated", verdict="escalated",
|
|
610
614
|
notes="max iterations reached")
|
|
611
615
|
print(f" β Task {task_id} escalated: max iterations reached\n")
|
|
612
|
-
print(f"
|
|
616
|
+
print(f" Inspect with: node \"$FORGE_ROOT/tools/read-verdict.cjs\" --phase {phase.role} --task {task_id}\n")
|
|
613
617
|
print(f" Resume with: /{phase.command} {task_id} after addressing the issues.\n")
|
|
614
618
|
break
|
|
615
619
|
break # stop processing this task
|
|
@@ -621,7 +625,7 @@ for each task in dependency_sorted(tasks):
|
|
|
621
625
|
print(f"[checkpoint] task={task_id} sprint={sprint_id} phase_index={i} iterations={iteration_counts}")
|
|
622
626
|
/compact
|
|
623
627
|
|
|
624
|
-
# No `else:` branch needed β
|
|
628
|
+
# No `else:` branch needed β read-verdict.cjs already exhausts the
|
|
625
629
|
# possibilities (approved | revision | verdict_malformed), and the
|
|
626
630
|
# malformed case is handled above before this if/elif chain.
|
|
627
631
|
```
|
|
@@ -681,45 +685,35 @@ Examples:
|
|
|
681
685
|
## Verdict Detection
|
|
682
686
|
|
|
683
687
|
After each review phase completes, the orchestrator MUST read the verdict
|
|
684
|
-
before branching. Do not infer the verdict from conversation context alone
|
|
685
|
-
|
|
688
|
+
before branching. Do not infer the verdict from conversation context alone, and
|
|
689
|
+
**never construct or read a markdown artifact path** to find it β the verdict
|
|
690
|
+
lives in the **store record** (the phase summary written by `set-summary`, or
|
|
691
|
+
`task.status` for the approve phase).
|
|
686
692
|
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
| `validate` | `{engineering}/sprints/{sprintDir}/{taskDir}/VALIDATION_REPORT.md` | Line matching `**Verdict:**` |
|
|
692
|
-
|
|
693
|
-
The verdict line format is:
|
|
694
|
-
|
|
695
|
-
```
|
|
696
|
-
**Verdict:** Approved
|
|
697
|
-
```
|
|
698
|
-
or
|
|
699
|
-
```
|
|
700
|
-
**Verdict:** Revision Required
|
|
701
|
-
```
|
|
702
|
-
|
|
703
|
-
**Parse the verdict via `parse-verdict.cjs`** β do NOT pattern-match the
|
|
704
|
-
line manually. The tool enforces a closed verdict vocabulary so typos, case
|
|
705
|
-
drift, and reviewer prose cannot cause silent misclassification:
|
|
693
|
+
**Read the verdict via `read-verdict.cjs`** β addressed by entity ID and phase
|
|
694
|
+
role, never by file path. The tool sources the verdict from the record and
|
|
695
|
+
enforces a closed vocabulary so typos, case drift, and reviewer prose cannot
|
|
696
|
+
cause silent misclassification:
|
|
706
697
|
|
|
707
698
|
```
|
|
708
699
|
FORGE_ROOT = resolve_forge_root()
|
|
709
|
-
result = run_bash(f'node "$FORGE_ROOT/tools/
|
|
710
|
-
#
|
|
711
|
-
#
|
|
712
|
-
#
|
|
700
|
+
result = run_bash(f'node "$FORGE_ROOT/tools/read-verdict.cjs" --phase {phase.role} --task {task_id}')
|
|
701
|
+
# stdout "approved" β approved
|
|
702
|
+
# stdout "revision" β revision
|
|
703
|
+
# stdout "n/a" | "unknown" β no verdict recorded (treat as malformed; do NOT guess)
|
|
704
|
+
# exit 2 β record not found / invalid args (treat as malformed)
|
|
713
705
|
```
|
|
714
706
|
|
|
715
|
-
|
|
707
|
+
Branch on the **stdout token** (exit 1 bundles both `revision` and the
|
|
708
|
+
no-verdict cases, so the token is authoritative). Recognised verdict values:
|
|
716
709
|
|
|
717
|
-
- **approved** β `
|
|
718
|
-
- **revision** β `
|
|
710
|
+
- **approved** β written as `verdict: "approved"` in the phase summary (or `task.status == approved` for the approve phase).
|
|
711
|
+
- **revision** β `verdict: "revision"`.
|
|
719
712
|
|
|
720
|
-
Anything else β
|
|
721
|
-
|
|
722
|
-
|
|
713
|
+
Anything else β `n/a`, `unknown`, a missing summary, or a missing record β
|
|
714
|
+
must NOT be treated as approved or revision; halt the loop and escalate via
|
|
715
|
+
`verdict_malformed`. (In bug mode pass `--bug {bug_id}`; `read-verdict.cjs`
|
|
716
|
+
applies the bug-specific phaseβsummary map.)
|
|
723
717
|
|
|
724
718
|
## Escalation Procedure
|
|
725
719
|
|
|
@@ -755,8 +749,8 @@ Grammar (one directive per line):
|
|
|
755
749
|
`in [v1, v2, ...]`. Fields are dotted paths against the store record, e.g.
|
|
756
750
|
`task.status`.
|
|
757
751
|
- `forbid <field> <op> <value>` β predicate must NOT hold.
|
|
758
|
-
- `after <phase> = <approved|revision>` β predecessor phase's
|
|
759
|
-
must
|
|
752
|
+
- `after <phase> = <approved|revision>` β predecessor phase's stored verdict
|
|
753
|
+
must match (read from the record by `read-verdict.cjs`, not from markdown).
|
|
760
754
|
|
|
761
755
|
```gates phase=plan
|
|
762
756
|
forbid task.status == committed
|
|
@@ -854,7 +848,7 @@ is a violation of the Iron Laws.
|
|
|
854
848
|
- Subagent empty/crash/timeout response: retry once with simplified prompt
|
|
855
849
|
(strip summary and architecture blocks). Escalate on second failure.
|
|
856
850
|
See Subagent Response Validation in the Execution Algorithm.
|
|
857
|
-
- Subagent non-zero exit code (not
|
|
851
|
+
- Subagent non-zero exit code (not read-verdict): same as above β retry
|
|
858
852
|
once, escalate on second failure. The crash reason is captured in the
|
|
859
853
|
escalation event notes.
|
|
860
854
|
- Verdict malformed or missing: escalate to human immediately. Never guess.
|
|
@@ -115,10 +115,9 @@ The Supervisor performs a final validation of the implementation against the acc
|
|
|
115
115
|
"artifact_ref":"VALIDATION_REPORT.md"
|
|
116
116
|
}
|
|
117
117
|
```
|
|
118
|
-
- Call:
|
|
118
|
+
- Call (the sidecar path is auto-resolved from the task record's `path` β never pass it):
|
|
119
119
|
```
|
|
120
|
-
node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} validation
|
|
121
|
-
engineering/sprints/{sprint}/{task}/VALIDATION-SUMMARY.json
|
|
120
|
+
node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} validation
|
|
122
121
|
```
|
|
123
122
|
- If set-summary exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
|
|
124
123
|
```
|
|
@@ -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"]
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"createdAt": { "type": "string", "format": "date-time" },
|
|
21
21
|
"completedAt": { "type": "string", "format": "date-time" },
|
|
22
22
|
"path": { "type": "string" },
|
|
23
|
+
"locator": { "$ref": "_defs/locator.schema.json" },
|
|
23
24
|
"humanEstimates": { "type": "object" },
|
|
24
25
|
"features": { "type": "array", "items": { "type": "string" } }
|
|
25
26
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.0.
|
|
3
|
-
"generatedAt": "2026-05-
|
|
2
|
+
"version": "1.0.10",
|
|
3
|
+
"generatedAt": "2026-05-31T03:19:45.318Z",
|
|
4
4
|
"generatedByTool": "build-manifest.cjs",
|
|
5
5
|
"namespaces": {
|
|
6
6
|
"personas": {
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
"review_plan.md",
|
|
49
49
|
"run_sprint.md",
|
|
50
50
|
"sprint_retrospective.md",
|
|
51
|
+
"triage.md",
|
|
51
52
|
"update_implementation.md",
|
|
52
53
|
"update_plan.md",
|
|
53
54
|
"validate_task.md"
|
|
@@ -109,6 +110,7 @@
|
|
|
109
110
|
"logicalKey": "schemas",
|
|
110
111
|
"dir": ".forge/schemas",
|
|
111
112
|
"files": [
|
|
113
|
+
"_defs/locator.schema.json",
|
|
112
114
|
"_defs/phaseSummary.schema.json",
|
|
113
115
|
"bug.schema.json",
|
|
114
116
|
"collation-state.schema.json",
|
|
@@ -180,6 +182,24 @@
|
|
|
180
182
|
"paths.engineering"
|
|
181
183
|
]
|
|
182
184
|
},
|
|
185
|
+
"triage": {
|
|
186
|
+
"personas": [
|
|
187
|
+
".forge/personas/bug-fixer.md"
|
|
188
|
+
],
|
|
189
|
+
"skills": [
|
|
190
|
+
".forge/skills/bug-fixer-skills.md",
|
|
191
|
+
".forge/skills/generic-skills.md"
|
|
192
|
+
],
|
|
193
|
+
"templates": [],
|
|
194
|
+
"sub_workflows": [],
|
|
195
|
+
"kb_docs": [
|
|
196
|
+
"{KB_PATH}/architecture/stack.md"
|
|
197
|
+
],
|
|
198
|
+
"config_fields": [
|
|
199
|
+
"commands.test",
|
|
200
|
+
"paths.engineering"
|
|
201
|
+
]
|
|
202
|
+
},
|
|
183
203
|
"fix_bug": {
|
|
184
204
|
"personas": [
|
|
185
205
|
".forge/personas/bug-fixer.md",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
]
|
|
20
20
|
},
|
|
21
21
|
"path": { "type": "string" },
|
|
22
|
+
"locator": { "$ref": "_defs/locator.schema.json" },
|
|
22
23
|
"estimate": { "type": "string", "enum": ["S", "M", "L", "XL"] },
|
|
23
24
|
"dependencies": { "type": "array", "items": { "type": "string" } },
|
|
24
25
|
"knowledgeUpdates": { "type": "array" },
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// ββ ArtifactStore β backend-agnostic artifact provider βββββββββββββββββββββββ
|
|
4
|
+
//
|
|
5
|
+
// Mirrors the store.cjs `Store`/`FSImpl` pattern (ADR
|
|
6
|
+
// `doc/decisions/artifact-resolution-abstraction.md`, issue #111 Phase 3):
|
|
7
|
+
// a backend-agnostic facade delegating to a swappable, SYNCHRONOUS impl,
|
|
8
|
+
// default-wired to the filesystem, impl exported for substitution.
|
|
9
|
+
//
|
|
10
|
+
// class ArtifactStore { read|write|exists|url|list|delete(handle) β impl }
|
|
11
|
+
// class FsArtifactImpl { engineering/ files }
|
|
12
|
+
// module.exports = new ArtifactStore(new FsArtifactImpl())
|
|
13
|
+
// module.exports.FsArtifactImpl = FsArtifactImpl // swap for S3Impl / CmsImpl / DbBlobImpl
|
|
14
|
+
//
|
|
15
|
+
// A `handle` is the logical address (entityType, entityId, artifactKind) β never
|
|
16
|
+
// a path. The fs impl resolves it from the store record's `path` (the locator)
|
|
17
|
+
// plus the canonical kind registry, so callers never construct paths.
|
|
18
|
+
//
|
|
19
|
+
// SYNC CONSTRAINT (load-bearing): in-process callers (store-cli.cjs,
|
|
20
|
+
// preflight-gate.cjs, collate.cjs) invoke this without `await`, so every method
|
|
21
|
+
// is synchronous β same constraint that blocks the store's async InstantDbImpl
|
|
22
|
+
// (see doc/decisions/instantdb-store-backend.md). A future remote impl must
|
|
23
|
+
// either stay sync or be reached only through the forge-cli subprocess surface.
|
|
24
|
+
|
|
25
|
+
const fs = require('fs');
|
|
26
|
+
const path = require('path');
|
|
27
|
+
const { execFileSync } = require('child_process');
|
|
28
|
+
const { resolveArtifactFilename } = require('./lib/artifact-kinds.cjs');
|
|
29
|
+
|
|
30
|
+
// ββ Locator helpers ({ backend, ref }) βββββββββββββββββββββββββββββββββββββββ
|
|
31
|
+
|
|
32
|
+
// Derive the backend-agnostic locator from a store record. Prefers an explicit
|
|
33
|
+
// `record.locator`; otherwise treats the legacy `record.path` as an fs locator
|
|
34
|
+
// (the back-compat alias maintained during migration).
|
|
35
|
+
function toLocator(record) {
|
|
36
|
+
if (record && record.locator && record.locator.backend) return record.locator;
|
|
37
|
+
if (record && typeof record.path === 'string' && record.path.length > 0) {
|
|
38
|
+
return { backend: 'fs', ref: record.path };
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// For an fs locator ref, return the entity *directory* (strip a trailing filename).
|
|
44
|
+
function fsRefToDir(ref) {
|
|
45
|
+
const norm = String(ref).replace(/\\/g, '/').replace(/\/+$/, '');
|
|
46
|
+
return /\.[a-zA-Z0-9]+$/.test(norm) ? norm.replace(/\/[^/]*$/, '') : norm;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ββ Default dir resolution (store record path) βββββββββββββββββββββββββββββββ
|
|
50
|
+
// Reads a record's `path` via store-cli (out-of-process) so this module has no
|
|
51
|
+
// hard dependency on store internals. Returns the entity directory or null.
|
|
52
|
+
function readStorePath(entity, entityId, toolDir, projectRoot) {
|
|
53
|
+
const cliPath = path.join(toolDir, 'store-cli.cjs');
|
|
54
|
+
try {
|
|
55
|
+
const result = execFileSync('node', [cliPath, 'read', entity, entityId, '--json'], {
|
|
56
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10_000,
|
|
57
|
+
});
|
|
58
|
+
const record = JSON.parse(result);
|
|
59
|
+
const loc = toLocator(record);
|
|
60
|
+
if (loc && loc.backend === 'fs') return fsRefToDir(loc.ref);
|
|
61
|
+
} catch (_) { /* store unavailable / record not found β fall through */ }
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Resolve entity directory from the store record's path, falling back to
|
|
66
|
+
// ID-only construction. (Moved verbatim from artifact.cjs; re-exported there.)
|
|
67
|
+
function resolveEntityDir(entity, entityId, engineeringPath, toolDir, projectRoot) {
|
|
68
|
+
switch (entity) {
|
|
69
|
+
case 'bug': {
|
|
70
|
+
const storePath = readStorePath('bug', entityId, toolDir, projectRoot);
|
|
71
|
+
if (storePath) return storePath;
|
|
72
|
+
return path.join(engineeringPath, 'bugs', entityId);
|
|
73
|
+
}
|
|
74
|
+
case 'sprint': {
|
|
75
|
+
const storePath = readStorePath('sprint', entityId, toolDir, projectRoot);
|
|
76
|
+
if (storePath) return storePath;
|
|
77
|
+
return path.join(engineeringPath, 'sprints', entityId);
|
|
78
|
+
}
|
|
79
|
+
case 'task': {
|
|
80
|
+
const storePath = readStorePath('task', entityId, toolDir, projectRoot);
|
|
81
|
+
if (storePath) return storePath;
|
|
82
|
+
const match = entityId.match(/^(.+-S\d+)-T\d+$/);
|
|
83
|
+
if (!match) return null;
|
|
84
|
+
const sprintId = match[1];
|
|
85
|
+
const sprintPath = readStorePath('sprint', sprintId, toolDir, projectRoot);
|
|
86
|
+
if (sprintPath) return path.join(sprintPath, entityId);
|
|
87
|
+
return path.join(engineeringPath, 'sprints', sprintId, entityId);
|
|
88
|
+
}
|
|
89
|
+
default:
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ββ Facade βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
95
|
+
|
|
96
|
+
class ArtifactStore {
|
|
97
|
+
// The constructor impl is the default backend (`fs`). Additional backends are
|
|
98
|
+
// added with register(name, impl) β Phase 4. Each call routes to the impl for
|
|
99
|
+
// the handle's `backend` (default 'fs'), so adding a backend requires
|
|
100
|
+
// implementing the method surface only β no call-site or prompt changes.
|
|
101
|
+
constructor(impl) {
|
|
102
|
+
this.impl = impl; // default (fs) backend
|
|
103
|
+
this._backends = new Map([['fs', impl]]);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Register an additional backend impl (e.g. an S3/CMS/DB provider). Returns
|
|
107
|
+
// `this` for chaining; re-registering the same name replaces the impl.
|
|
108
|
+
register(backend, impl) {
|
|
109
|
+
this._backends.set(backend, impl);
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
_implFor(handle) {
|
|
114
|
+
const backend = (handle && handle.backend) || 'fs';
|
|
115
|
+
const impl = this._backends.get(backend);
|
|
116
|
+
if (!impl) {
|
|
117
|
+
throw new Error(
|
|
118
|
+
`No ArtifactStore backend registered for "${backend}". ` +
|
|
119
|
+
`Registered: ${[...this._backends.keys()].join(', ')}. ` +
|
|
120
|
+
`Add one with artifactStore.register("${backend}", impl).`
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
return impl;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
read(handle) { return this._implFor(handle).read(handle); }
|
|
127
|
+
write(handle, content) { return this._implFor(handle).write(handle, content); }
|
|
128
|
+
exists(handle) { return this._implFor(handle).exists(handle); }
|
|
129
|
+
url(handle) { return this._implFor(handle).url(handle); }
|
|
130
|
+
list(handle) { return this._implFor(handle).list(handle); }
|
|
131
|
+
delete(handle) { return this._implFor(handle).delete(handle); }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ββ Filesystem impl βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
135
|
+
|
|
136
|
+
class FsArtifactImpl {
|
|
137
|
+
// opts: { projectRoot, engineeringPath, toolDir, resolveDir }
|
|
138
|
+
// resolveDir(entity, entityId) β dir (relative to projectRoot) | null.
|
|
139
|
+
// Injectable for testing; defaults to the store-record resolver above.
|
|
140
|
+
constructor(opts = {}) {
|
|
141
|
+
this.projectRoot = opts.projectRoot || process.cwd();
|
|
142
|
+
this.engineeringPath = opts.engineeringPath || 'engineering';
|
|
143
|
+
this.toolDir = opts.toolDir || __dirname;
|
|
144
|
+
this._resolveDir = opts.resolveDir
|
|
145
|
+
|| ((entity, entityId) => resolveEntityDir(entity, entityId, this.engineeringPath, this.toolDir, this.projectRoot));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
_absDir(handle) {
|
|
149
|
+
const dir = this._resolveDir(handle.entity, handle.entityId);
|
|
150
|
+
if (!dir) {
|
|
151
|
+
throw new Error(
|
|
152
|
+
`Cannot resolve ${handle.entity} directory for "${handle.entityId}". ` +
|
|
153
|
+
`Expected ID pattern: task=PREFIX-SNN-TNN, bug=PREFIX-BNN[-slug], sprint=PREFIX-SNN.`
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
return path.resolve(this.projectRoot, dir);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
_absFile(handle) {
|
|
160
|
+
return path.join(this._absDir(handle), resolveArtifactFilename(handle.entity, handle.kind));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
read(handle) {
|
|
164
|
+
const file = this._absFile(handle);
|
|
165
|
+
if (!fs.existsSync(file)) {
|
|
166
|
+
const err = new Error(`Artifact not found: ${path.relative(this.projectRoot, file)}`);
|
|
167
|
+
err.code = 'ENOENT';
|
|
168
|
+
throw err;
|
|
169
|
+
}
|
|
170
|
+
return fs.readFileSync(file, 'utf8');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
write(handle, content) {
|
|
174
|
+
const dir = this._absDir(handle);
|
|
175
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
176
|
+
const file = path.join(dir, resolveArtifactFilename(handle.entity, handle.kind));
|
|
177
|
+
fs.writeFileSync(file, content, 'utf8');
|
|
178
|
+
return { bytes: Buffer.byteLength(content, 'utf8'), ref: path.relative(this.projectRoot, file) };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
exists(handle) {
|
|
182
|
+
try { return fs.existsSync(this._absFile(handle)); }
|
|
183
|
+
catch (_) { return false; }
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
url(handle) {
|
|
187
|
+
return 'file://' + this._absFile(handle);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Entity-level listing: handle without `kind`. Returns existing filenames.
|
|
191
|
+
list(handle) {
|
|
192
|
+
const dir = this._absDir(handle);
|
|
193
|
+
if (!fs.existsSync(dir)) return [];
|
|
194
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith('.md') || f.endsWith('.json'));
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
delete(handle) {
|
|
198
|
+
const file = this._absFile(handle);
|
|
199
|
+
if (fs.existsSync(file)) { fs.unlinkSync(file); return true; }
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ββ Reference non-fs backend (Phase 4) βββββββββββββββββββββββββββββββββββββββ
|
|
205
|
+
//
|
|
206
|
+
// A complete, synchronous, in-memory implementation of the ArtifactStore method
|
|
207
|
+
// surface. It exists as the canonical *reference* for adding a backend: a real
|
|
208
|
+
// S3/CMS/DB provider implements these same six methods and is wired with
|
|
209
|
+
// `artifactStore.register('<backend>', new XxxArtifactImpl(...))` β no prompt or
|
|
210
|
+
// call-site changes. (A networked impl is sync-bound for in-process callers per
|
|
211
|
+
// the ADR; it is reachable async-internally only through the forge-cli
|
|
212
|
+
// subprocess surface. This in-memory impl is fully functional and dependency-free.)
|
|
213
|
+
class MemArtifactImpl {
|
|
214
|
+
constructor() { this.files = new Map(); }
|
|
215
|
+
_key(h) { return `${h.entity}/${h.entityId}/${resolveArtifactFilename(h.entity, h.kind)}`; }
|
|
216
|
+
read(handle) {
|
|
217
|
+
const k = this._key(handle);
|
|
218
|
+
if (!this.files.has(k)) { const e = new Error(`Artifact not found: mem:${k}`); e.code = 'ENOENT'; throw e; }
|
|
219
|
+
return this.files.get(k);
|
|
220
|
+
}
|
|
221
|
+
write(handle, content) {
|
|
222
|
+
const k = this._key(handle);
|
|
223
|
+
this.files.set(k, content);
|
|
224
|
+
return { bytes: Buffer.byteLength(content, 'utf8'), ref: `mem:${k}` };
|
|
225
|
+
}
|
|
226
|
+
exists(handle) { return this.files.has(this._key(handle)); }
|
|
227
|
+
url(handle) { return `mem://${this._key(handle)}`; }
|
|
228
|
+
list(handle) {
|
|
229
|
+
const prefix = `${handle.entity}/${handle.entityId}/`;
|
|
230
|
+
return [...this.files.keys()].filter((k) => k.startsWith(prefix)).map((k) => k.slice(prefix.length));
|
|
231
|
+
}
|
|
232
|
+
delete(handle) { return this.files.delete(this._key(handle)); }
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
module.exports = new ArtifactStore(new FsArtifactImpl());
|
|
236
|
+
module.exports.ArtifactStore = ArtifactStore;
|
|
237
|
+
module.exports.FsArtifactImpl = FsArtifactImpl;
|
|
238
|
+
module.exports.MemArtifactImpl = MemArtifactImpl;
|
|
239
|
+
module.exports.toLocator = toLocator;
|
|
240
|
+
module.exports.fsRefToDir = fsRefToDir;
|
|
241
|
+
module.exports.resolveEntityDir = resolveEntityDir;
|
|
242
|
+
module.exports.readStorePath = readStorePath;
|