@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6
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/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/help-text.js +5 -0
- package/dist/project-sessions.js +4 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
- package/dist/resources/extensions/gsd/auto/phases.js +28 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
- package/dist/resources/extensions/gsd/auto-start.js +12 -23
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
- package/dist/resources/extensions/gsd/auto.js +73 -471
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/debug-logger.js +10 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/gsd-db.js +12 -0
- package/dist/resources/extensions/gsd/guided-flow.js +36 -470
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
- package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
- package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +147 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
- package/dist/resources/extensions/gsd/state.js +13 -5
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
- package/dist/resources/extensions/gsd/uat-policy.js +16 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
- package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/package.json +17 -11
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +30 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +8 -127
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +47 -166
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/deps.js +10 -0
- package/scripts/link-workspace-packages.cjs +7 -40
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
- package/src/resources/extensions/gsd/auto/phases.ts +35 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
- package/src/resources/extensions/gsd/auto-start.ts +17 -20
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
- package/src/resources/extensions/gsd/auto.ts +96 -508
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/debug-logger.ts +11 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +49 -560
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
- package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
- package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +173 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
- package/src/resources/extensions/gsd/state.ts +15 -5
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
- package/src/resources/extensions/gsd/uat-policy.ts +19 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
- package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/dist/web/standalone/.next/server/chunks/678.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
- package/scripts/ensure-workspace-builds.cjs +0 -129
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
|
@@ -17,9 +17,11 @@ import {
|
|
|
17
17
|
getRequiredWorkflowToolsForAutoUnit,
|
|
18
18
|
getRequiredWorkflowToolsForGuidedUnit,
|
|
19
19
|
resolveWorkflowMcpProjectRoot,
|
|
20
|
+
isWorkflowMcpSurfaceTool,
|
|
20
21
|
supportsStructuredQuestions,
|
|
21
22
|
usesWorkflowMcpTransport,
|
|
22
23
|
} from "../workflow-mcp.ts";
|
|
24
|
+
import { DB_WORKFLOW_TOOL_NAMES } from "../workflow-tool-surface.ts";
|
|
23
25
|
|
|
24
26
|
const MCP_STDIO_TIMEOUT_MS = 90_000;
|
|
25
27
|
|
|
@@ -109,6 +111,18 @@ test("workflow MCP capability surface includes native legacy gsd aliases", () =>
|
|
|
109
111
|
assert.equal(err, null);
|
|
110
112
|
});
|
|
111
113
|
|
|
114
|
+
test("workflow MCP capability surface includes every shared workflow contract tool", () => {
|
|
115
|
+
for (const name of DB_WORKFLOW_TOOL_NAMES) {
|
|
116
|
+
assert.equal(isWorkflowMcpSurfaceTool(name), true, `${name} should be in workflow MCP surface`);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("workflow MCP capability surface preserves session and read tools outside DB contracts", () => {
|
|
121
|
+
for (const name of ["gsd_execute", "gsd_status", "gsd_progress", "gsd_doctor", "gsd_graph"]) {
|
|
122
|
+
assert.equal(isWorkflowMcpSurfaceTool(name), true, `${name} should stay in workflow MCP surface`);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
112
126
|
test("deep project setup units declare required workflow MCP tools", () => {
|
|
113
127
|
assert.deepEqual(getRequiredWorkflowToolsForGuidedUnit("discuss-project"), [
|
|
114
128
|
"ask_user_questions",
|
|
@@ -615,23 +629,47 @@ test("usesWorkflowMcpTransport matches local externalCli providers", () => {
|
|
|
615
629
|
assert.equal(usesWorkflowMcpTransport("oauth", "local://custom"), false);
|
|
616
630
|
});
|
|
617
631
|
|
|
618
|
-
test("supportsStructuredQuestions
|
|
632
|
+
test("supportsStructuredQuestions recognizes workflow MCP question tools", () => {
|
|
619
633
|
assert.equal(
|
|
620
634
|
supportsStructuredQuestions(["ask_user_questions"], {
|
|
621
635
|
authMode: "externalCli",
|
|
622
636
|
baseUrl: "local://claude-code",
|
|
623
637
|
env: {},
|
|
624
638
|
}),
|
|
625
|
-
|
|
639
|
+
true,
|
|
626
640
|
);
|
|
627
641
|
assert.equal(
|
|
628
642
|
supportsStructuredQuestions(["mcp__gsd-workflow__ask_user_questions"], {
|
|
629
643
|
authMode: "externalCli",
|
|
630
644
|
baseUrl: "local://claude-code",
|
|
631
|
-
env: {
|
|
645
|
+
env: {},
|
|
646
|
+
}),
|
|
647
|
+
true,
|
|
648
|
+
);
|
|
649
|
+
assert.equal(
|
|
650
|
+
supportsStructuredQuestions(["mcp__gsd-workflow__*"], {
|
|
651
|
+
authMode: "externalCli",
|
|
652
|
+
baseUrl: "local://claude-code",
|
|
653
|
+
env: {},
|
|
632
654
|
}),
|
|
633
655
|
true,
|
|
634
656
|
);
|
|
657
|
+
assert.equal(
|
|
658
|
+
supportsStructuredQuestions(["mcp__gsd-browser__*"], {
|
|
659
|
+
authMode: "externalCli",
|
|
660
|
+
baseUrl: "local://claude-code",
|
|
661
|
+
env: {},
|
|
662
|
+
}),
|
|
663
|
+
false,
|
|
664
|
+
);
|
|
665
|
+
assert.equal(
|
|
666
|
+
supportsStructuredQuestions(["mcp__gsd-workflow__ask_user_questions"], {
|
|
667
|
+
authMode: "externalCli",
|
|
668
|
+
baseUrl: "local://claude-code",
|
|
669
|
+
env: { GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS: "0" } as NodeJS.ProcessEnv,
|
|
670
|
+
}),
|
|
671
|
+
false,
|
|
672
|
+
);
|
|
635
673
|
assert.equal(
|
|
636
674
|
supportsStructuredQuestions(["ask_user_questions"], {
|
|
637
675
|
authMode: "oauth",
|
|
@@ -648,6 +686,39 @@ test("supportsStructuredQuestions disables local workflow MCP questions unless e
|
|
|
648
686
|
);
|
|
649
687
|
});
|
|
650
688
|
|
|
689
|
+
test("supportsStructuredQuestions gates non-local externalCli providers", () => {
|
|
690
|
+
assert.equal(
|
|
691
|
+
supportsStructuredQuestions(["ask_user_questions"], {
|
|
692
|
+
authMode: "externalCli",
|
|
693
|
+
env: {},
|
|
694
|
+
}),
|
|
695
|
+
true,
|
|
696
|
+
);
|
|
697
|
+
assert.equal(
|
|
698
|
+
supportsStructuredQuestions(["ask_user_questions"], {
|
|
699
|
+
authMode: "externalCli",
|
|
700
|
+
baseUrl: "https://api.example.com",
|
|
701
|
+
env: {},
|
|
702
|
+
}),
|
|
703
|
+
true,
|
|
704
|
+
);
|
|
705
|
+
assert.equal(
|
|
706
|
+
supportsStructuredQuestions(["ask_user_questions"], {
|
|
707
|
+
authMode: "externalCli",
|
|
708
|
+
env: { GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS: "0" } as NodeJS.ProcessEnv,
|
|
709
|
+
}),
|
|
710
|
+
false,
|
|
711
|
+
);
|
|
712
|
+
assert.equal(
|
|
713
|
+
supportsStructuredQuestions(["ask_user_questions"], {
|
|
714
|
+
authMode: "externalCli",
|
|
715
|
+
baseUrl: "https://api.example.com",
|
|
716
|
+
env: { GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS: "0" } as NodeJS.ProcessEnv,
|
|
717
|
+
}),
|
|
718
|
+
false,
|
|
719
|
+
);
|
|
720
|
+
});
|
|
721
|
+
|
|
651
722
|
test("transport compatibility passes when required tools fit current MCP surface", () => {
|
|
652
723
|
const error = getWorkflowTransportSupportError(
|
|
653
724
|
"claude-code",
|
|
@@ -835,7 +906,7 @@ test("transport compatibility now allows replan-slice over workflow MCP surface"
|
|
|
835
906
|
assert.equal(error, null);
|
|
836
907
|
});
|
|
837
908
|
|
|
838
|
-
test("transport compatibility
|
|
909
|
+
test("transport compatibility accepts workflow MCP tools absent from parent active tool surface", () => {
|
|
839
910
|
const error = getWorkflowTransportSupportError(
|
|
840
911
|
"claude-code",
|
|
841
912
|
["gsd_summary_save"],
|
|
@@ -850,10 +921,10 @@ test("transport compatibility rejects MCP tools not connected in active tool sur
|
|
|
850
921
|
},
|
|
851
922
|
);
|
|
852
923
|
|
|
853
|
-
assert.
|
|
924
|
+
assert.equal(error, null);
|
|
854
925
|
});
|
|
855
926
|
|
|
856
|
-
test("transport compatibility checks
|
|
927
|
+
test("transport compatibility still checks non-MCP tools against parent active tool surface", () => {
|
|
857
928
|
const error = getWorkflowTransportSupportError(
|
|
858
929
|
"claude-code",
|
|
859
930
|
["gsd_summary_save", "secure_env_collect"],
|
|
@@ -868,9 +939,54 @@ test("transport compatibility checks all required tools against active tool surf
|
|
|
868
939
|
},
|
|
869
940
|
);
|
|
870
941
|
|
|
871
|
-
assert.match(error ?? "", /requires
|
|
872
|
-
assert.
|
|
873
|
-
|
|
942
|
+
assert.match(error ?? "", /requires secure_env_collect/);
|
|
943
|
+
assert.doesNotMatch(error ?? "", /gsd_summary_save/);
|
|
944
|
+
});
|
|
945
|
+
|
|
946
|
+
test("transport compatibility allows plan-slice MCP tools when parent surface is scoped (regression #457)", () => {
|
|
947
|
+
const error = getWorkflowTransportSupportError(
|
|
948
|
+
"claude-code",
|
|
949
|
+
getRequiredWorkflowToolsForAutoUnit("plan-slice"),
|
|
950
|
+
{
|
|
951
|
+
projectRoot: "/tmp/project",
|
|
952
|
+
env: { GSD_WORKFLOW_MCP_COMMAND: "node" },
|
|
953
|
+
surface: "auto-mode",
|
|
954
|
+
unitType: "plan-slice",
|
|
955
|
+
authMode: "externalCli",
|
|
956
|
+
baseUrl: "local://claude-code",
|
|
957
|
+
activeTools: [
|
|
958
|
+
"ScheduleWakeup",
|
|
959
|
+
"ToolSearch",
|
|
960
|
+
"ask_user_questions",
|
|
961
|
+
"async_bash",
|
|
962
|
+
"await_job",
|
|
963
|
+
"bash",
|
|
964
|
+
"bg_shell",
|
|
965
|
+
"cancel_job",
|
|
966
|
+
"capture_thought",
|
|
967
|
+
"discover_configs",
|
|
968
|
+
"edit",
|
|
969
|
+
"fetch_page",
|
|
970
|
+
"get_library_docs",
|
|
971
|
+
"gsd_checkpoint_db",
|
|
972
|
+
"gsd_exec",
|
|
973
|
+
"gsd_exec_search",
|
|
974
|
+
"gsd_milestone_status",
|
|
975
|
+
"gsd_resume",
|
|
976
|
+
"mcp_call",
|
|
977
|
+
"mcp_discover",
|
|
978
|
+
"mcp_servers",
|
|
979
|
+
"memory_query",
|
|
980
|
+
"read",
|
|
981
|
+
"resolve_library",
|
|
982
|
+
"secure_env_collect",
|
|
983
|
+
"subagent",
|
|
984
|
+
"write",
|
|
985
|
+
],
|
|
986
|
+
},
|
|
987
|
+
);
|
|
988
|
+
|
|
989
|
+
assert.equal(error, null);
|
|
874
990
|
});
|
|
875
991
|
|
|
876
992
|
test("transport compatibility still blocks units whose MCP tools are not exposed", () => {
|
|
@@ -895,6 +1011,7 @@ test("discuss-milestone guided flow does not abort when all required tools are o
|
|
|
895
1011
|
// Guided flow starts the workflow MCP server as part of dispatch, so the
|
|
896
1012
|
// parent session active-tool list is not authoritative for MCP tools.
|
|
897
1013
|
const discussMilestoneTools = [
|
|
1014
|
+
"ask_user_questions",
|
|
898
1015
|
"gsd_summary_save",
|
|
899
1016
|
"gsd_requirement_save",
|
|
900
1017
|
"gsd_requirement_update",
|
|
@@ -109,6 +109,21 @@ test("ensureWorkspaceGitReadyForPath blocks product file conflicts", async () =>
|
|
|
109
109
|
}
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
+
test("ensureWorkspaceGitReadyForPath does not block on staged files with trailing whitespace", async () => {
|
|
113
|
+
// Regression test for #599: git diff --check exits non-zero for whitespace
|
|
114
|
+
// errors as well as conflict markers. Staged files from auto-generated code
|
|
115
|
+
// often have trailing whitespace; these must not trigger the conflict gate.
|
|
116
|
+
const base = makeTempRepo("gsd-ws-git-whitespace-");
|
|
117
|
+
try {
|
|
118
|
+
writeFileSync(join(base, "app.ts"), "const x = 1; \n"); // trailing whitespace
|
|
119
|
+
git(base, "add", "app.ts");
|
|
120
|
+
const ready = await ensureWorkspaceGitReadyForPath(base);
|
|
121
|
+
assert.equal(ready.ok, true, "trailing whitespace in staged files must not block");
|
|
122
|
+
} finally {
|
|
123
|
+
cleanup(base);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
112
127
|
test("isWorkspaceGitAllowedCommand allowlists doctor, closeout, and dispatch complete-milestone", () => {
|
|
113
128
|
assert.equal(isWorkspaceGitAllowedCommand("doctor"), true);
|
|
114
129
|
assert.equal(isWorkspaceGitAllowedCommand("doctor fix"), true);
|
|
@@ -121,6 +121,27 @@ describe("createWorktree", () => {
|
|
|
121
121
|
run("git rev-parse --git-dir", info.path);
|
|
122
122
|
assert.ok(!existsSync(join(info.path, "orphan.txt")), "stale file removed by recovery");
|
|
123
123
|
});
|
|
124
|
+
|
|
125
|
+
test("removes stale worktree directory with .git file not registered with git and recreates", () => {
|
|
126
|
+
// Simulate the scenario from issue #590: removeWorktree() failed to delete
|
|
127
|
+
// the directory (e.g. EPERM on Windows) but git worktree prune cleaned up
|
|
128
|
+
// the registry — leaving an orphaned directory with a .git *file* (not
|
|
129
|
+
// directory) that git no longer knows about.
|
|
130
|
+
const staleDir = worktreePath(base, "M010");
|
|
131
|
+
mkdirSync(staleDir, { recursive: true });
|
|
132
|
+
// Write a .git file (worktree gitdir pointer) — not a directory
|
|
133
|
+
writeFileSync(join(staleDir, ".git"), "gitdir: ../../../../.git/worktrees/M010\n", "utf-8");
|
|
134
|
+
writeFileSync(join(staleDir, "orphan.txt"), "stale leftover\n", "utf-8");
|
|
135
|
+
|
|
136
|
+
// createWorktree must detect the orphan (not in git worktree list), clean it
|
|
137
|
+
// up, and succeed — not throw GSD_STALE_STATE as if it were a live conflict.
|
|
138
|
+
const info = createWorktree(base, "M010");
|
|
139
|
+
assert.strictEqual(info.name, "M010");
|
|
140
|
+
assert.ok(existsSync(info.path));
|
|
141
|
+
assert.ok(existsSync(join(info.path, ".git")), "recovered worktree has .git marker");
|
|
142
|
+
run("git rev-parse --git-dir", info.path);
|
|
143
|
+
assert.ok(!existsSync(join(info.path, "orphan.txt")), "stale file removed by recovery");
|
|
144
|
+
});
|
|
124
145
|
});
|
|
125
146
|
|
|
126
147
|
describe("createWorktree — duplicate rejection", () => {
|
|
@@ -171,7 +171,7 @@ test("validate-milestone invoked from the project root writes VALIDATION under t
|
|
|
171
171
|
const projectProjection = join(projectRoot, ".gsd", "milestones", MID, "M001-VALIDATION.md");
|
|
172
172
|
assert.equal(result.validationPath, expected);
|
|
173
173
|
assert.equal(existsSync(expected), true);
|
|
174
|
-
assert.equal(existsSync(projectProjection),
|
|
174
|
+
assert.equal(existsSync(projectProjection), true, "VALIDATION should mirror to project root for consistent reads");
|
|
175
175
|
});
|
|
176
176
|
|
|
177
177
|
test("complete-milestone writes SUMMARY under the active worktree projection", async (t) => {
|
|
@@ -150,6 +150,30 @@ describe("Worktree Safety module", () => {
|
|
|
150
150
|
assert.equal(result.kind, "safe");
|
|
151
151
|
});
|
|
152
152
|
|
|
153
|
+
test("accepts project root for source-writing Unit when isolation mode is branch", () => {
|
|
154
|
+
const safety = createWorktreeSafetyModule({
|
|
155
|
+
existsSync: () => true,
|
|
156
|
+
lstatSync: () => ({ isFile: () => false }),
|
|
157
|
+
listRegisteredWorktrees: () => [{ path: projectRoot, branch: "milestone/M001" }],
|
|
158
|
+
getCurrentBranch: () => "milestone/M001",
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const result = safety.validateUnitRoot({
|
|
162
|
+
unitType: "execute-task",
|
|
163
|
+
unitId: "M001/S01/T01",
|
|
164
|
+
writeScope: "source-writing",
|
|
165
|
+
projectRoot,
|
|
166
|
+
unitRoot: projectRoot,
|
|
167
|
+
milestoneId: "M001",
|
|
168
|
+
isolationMode: "branch",
|
|
169
|
+
expectedBranch: "milestone/M001",
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
assert.equal(result.ok, true);
|
|
173
|
+
assert.equal(result.kind, "safe");
|
|
174
|
+
assert.equal(result.branch, "milestone/M001");
|
|
175
|
+
});
|
|
176
|
+
|
|
153
177
|
test("rejects non-project root for source-writing Unit when isolation mode is none", () => {
|
|
154
178
|
const safety = createWorktreeSafetyModule({
|
|
155
179
|
existsSync: () => true,
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
emitWorktreeOrphaned,
|
|
19
19
|
emitAutoExit,
|
|
20
20
|
emitCanonicalRootRedirect,
|
|
21
|
+
autoExitReasonForTerminalOutcome,
|
|
21
22
|
normalizeAutoExitReason,
|
|
22
23
|
summarizeWorktreeTelemetry,
|
|
23
24
|
percentile,
|
|
@@ -117,6 +118,27 @@ test("normalizeAutoExitReason maps new buckets and ignores casing", () => {
|
|
|
117
118
|
}
|
|
118
119
|
});
|
|
119
120
|
|
|
121
|
+
test("autoExitReasonForTerminalOutcome maps typed terminal outcomes", () => {
|
|
122
|
+
assert.equal(
|
|
123
|
+
autoExitReasonForTerminalOutcome({
|
|
124
|
+
code: "all-complete",
|
|
125
|
+
displayReason: "All milestones complete",
|
|
126
|
+
allMilestonesComplete: true,
|
|
127
|
+
}),
|
|
128
|
+
"all-complete",
|
|
129
|
+
);
|
|
130
|
+
assert.equal(
|
|
131
|
+
autoExitReasonForTerminalOutcome({
|
|
132
|
+
code: "settlement-blocked",
|
|
133
|
+
displayReason: "Milestone complete, merge blocked",
|
|
134
|
+
nextAction: "Retry closeout",
|
|
135
|
+
milestoneId: "M001",
|
|
136
|
+
allMilestonesComplete: false,
|
|
137
|
+
}),
|
|
138
|
+
"blocked",
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
|
|
120
142
|
test("summarizeWorktreeTelemetry only counts unmerged exits from active worktrees", (t) => {
|
|
121
143
|
const base = makeTmpBase();
|
|
122
144
|
t.after(() => cleanup(base));
|
|
@@ -9,7 +9,7 @@ import test from 'node:test';
|
|
|
9
9
|
import assert from 'node:assert/strict';
|
|
10
10
|
import { join, sep } from 'node:path';
|
|
11
11
|
|
|
12
|
-
import { GSD_PHASE_SCOPE_DISPLAY_REASON } from '../auto-unit-tool-scope.ts';
|
|
12
|
+
import { GSD_PHASE_SCOPE_DISPLAY_REASON, GSD_SECTION_CLOSE_GATE_DISPLAY_REASON } from '../auto-unit-tool-scope.ts';
|
|
13
13
|
import { ALLOWED_PLANNING_DISPATCH_AGENTS, shouldBlockPlanningUnit } from '../bootstrap/write-gate.ts';
|
|
14
14
|
import { extractSubagentAgentClasses } from '../bootstrap/subagent-input.ts';
|
|
15
15
|
import { isDeterministicPolicyError } from '../auto-tool-tracking.ts';
|
|
@@ -377,14 +377,26 @@ test('auto-unit scope: execute-task allows only its task completion lifecycle to
|
|
|
377
377
|
);
|
|
378
378
|
assert.strictEqual(allowed.block, false);
|
|
379
379
|
|
|
380
|
+
// execute-task closes gates from summary sections, so gsd_save_gate_result gets
|
|
381
|
+
// the softer deterministic redirect instead of the normal HARD BLOCK wall.
|
|
380
382
|
const blocked = shouldBlockPlanningUnit('gsd_save_gate_result', '', BASE, 'execute-task', ALL);
|
|
381
383
|
assert.strictEqual(blocked.block, true);
|
|
382
|
-
assert.
|
|
384
|
+
assert.doesNotMatch(blocked.reason!, /HARD BLOCK/);
|
|
383
385
|
assert.match(blocked.reason!, /gsd_save_gate_result/);
|
|
384
|
-
assert.
|
|
386
|
+
assert.match(blocked.reason!, /summary sections/);
|
|
387
|
+
assert.strictEqual(blocked.displayReason, GSD_SECTION_CLOSE_GATE_DISPLAY_REASON);
|
|
385
388
|
assert.strictEqual(isDeterministicPolicyError(blocked.reason!), true);
|
|
386
389
|
});
|
|
387
390
|
|
|
391
|
+
test('auto-unit scope: section-close gate units get the calm gsd_save_gate_result redirect', () => {
|
|
392
|
+
for (const unit of ['execute-task', 'complete-slice', 'validate-milestone']) {
|
|
393
|
+
const r = shouldBlockPlanningUnit('gsd_save_gate_result', '', BASE, unit, ALL);
|
|
394
|
+
assert.strictEqual(r.block, true, `${unit} should still block the call`);
|
|
395
|
+
assert.doesNotMatch(r.reason!, /HARD BLOCK/, `${unit} should use the calm redirect`);
|
|
396
|
+
assert.strictEqual(isDeterministicPolicyError(r.reason!), true, `${unit} redirect must stay deterministic`);
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
|
|
388
400
|
test('auto-unit scope: execute-task blocks sibling task completion', () => {
|
|
389
401
|
const r = shouldBlockPlanningUnit(
|
|
390
402
|
'gsd_complete_task',
|
|
@@ -340,6 +340,8 @@ test('write-gate: reopening a gate revokes its previous verified approval', () =
|
|
|
340
340
|
// ═══════════════════════════════════════════════════════════════════════
|
|
341
341
|
|
|
342
342
|
import {
|
|
343
|
+
applyAskUserQuestionsGateResult,
|
|
344
|
+
formatPendingAskUserQuestionsGateMessage,
|
|
343
345
|
isGateQuestionId,
|
|
344
346
|
shouldBlockPendingGate,
|
|
345
347
|
shouldBlockPendingGateBash,
|
|
@@ -379,6 +381,83 @@ test('write-gate: pending gate lifecycle (set, get, clear)', () => {
|
|
|
379
381
|
assert.strictEqual(getPendingGate(), null, 'clearDiscussionFlowState clears pending gate');
|
|
380
382
|
});
|
|
381
383
|
|
|
384
|
+
test('write-gate: applyAskUserQuestionsGateResult keeps cancelled pending gate waiting', () => {
|
|
385
|
+
const base = join(tmpdir(), `gsd-write-gate-ask-waiting-${randomUUID()}`);
|
|
386
|
+
const gateId = 'depth_verification_M001_confirm';
|
|
387
|
+
|
|
388
|
+
try {
|
|
389
|
+
mkdirSync(base, { recursive: true });
|
|
390
|
+
clearDiscussionFlowState(base);
|
|
391
|
+
setPendingGate(gateId, base);
|
|
392
|
+
|
|
393
|
+
const result = applyAskUserQuestionsGateResult({
|
|
394
|
+
basePath: base,
|
|
395
|
+
questions: [{
|
|
396
|
+
id: gateId,
|
|
397
|
+
options: [{ label: 'Confirm depth (Recommended)' }, { label: 'Needs adjustment' }],
|
|
398
|
+
}],
|
|
399
|
+
details: { cancelled: true, interrupted: true },
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
assert.deepEqual(result, {
|
|
403
|
+
status: 'waiting',
|
|
404
|
+
pendingGateId: gateId,
|
|
405
|
+
interrupted: true,
|
|
406
|
+
});
|
|
407
|
+
assert.strictEqual(getPendingGate(base), gateId, 'cancelled question must leave gate pending');
|
|
408
|
+
assert.strictEqual(isMilestoneDepthVerified('M001', base), false, 'cancelled question must not verify depth');
|
|
409
|
+
assert.match(
|
|
410
|
+
formatPendingAskUserQuestionsGateMessage(gateId, true),
|
|
411
|
+
/Re-call ask_user_questions with the same gate question id/,
|
|
412
|
+
);
|
|
413
|
+
} finally {
|
|
414
|
+
clearDiscussionFlowState(base);
|
|
415
|
+
rmSync(base, { recursive: true, force: true });
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
test('write-gate: applyAskUserQuestionsGateResult verifies confirmed pending gate', () => {
|
|
420
|
+
const base = join(tmpdir(), `gsd-write-gate-ask-verified-${randomUUID()}`);
|
|
421
|
+
const gateId = 'depth_verification_M001_confirm';
|
|
422
|
+
const confirmLabel = 'Confirm depth (Recommended)';
|
|
423
|
+
|
|
424
|
+
try {
|
|
425
|
+
mkdirSync(base, { recursive: true });
|
|
426
|
+
clearDiscussionFlowState(base);
|
|
427
|
+
setPendingGate(gateId, base);
|
|
428
|
+
|
|
429
|
+
const result = applyAskUserQuestionsGateResult({
|
|
430
|
+
basePath: base,
|
|
431
|
+
questions: [{
|
|
432
|
+
id: gateId,
|
|
433
|
+
options: [{ label: confirmLabel }, { label: 'Needs adjustment' }],
|
|
434
|
+
}],
|
|
435
|
+
details: {
|
|
436
|
+
response: {
|
|
437
|
+
answers: {
|
|
438
|
+
[gateId]: { selected: confirmLabel },
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
assert.deepEqual(result, {
|
|
445
|
+
status: 'verified',
|
|
446
|
+
gateId,
|
|
447
|
+
milestoneId: 'M001',
|
|
448
|
+
});
|
|
449
|
+
assert.strictEqual(getPendingGate(base), null, 'confirmed gate must clear pending state');
|
|
450
|
+
assert.strictEqual(isMilestoneDepthVerified('M001', base), true, 'confirmed gate must verify milestone depth');
|
|
451
|
+
assert.ok(
|
|
452
|
+
loadWriteGateSnapshot(base).verifiedApprovalGates?.includes(gateId) ?? false,
|
|
453
|
+
'confirmed gate must record verified approval',
|
|
454
|
+
);
|
|
455
|
+
} finally {
|
|
456
|
+
clearDiscussionFlowState(base);
|
|
457
|
+
rmSync(base, { recursive: true, force: true });
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
|
|
382
461
|
// ─── Scenario 21: shouldBlockPendingGate blocks non-safe tools when gate is pending ──
|
|
383
462
|
|
|
384
463
|
test('write-gate: shouldBlockPendingGate blocks write/edit during pending gate', () => {
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
import {
|
|
5
5
|
resolveManifest,
|
|
6
6
|
type ArtifactKey,
|
|
7
|
+
type ComputedArtifactId,
|
|
7
8
|
type ContextModePolicy,
|
|
8
9
|
type ToolsPolicy,
|
|
10
|
+
type UnitContextManifest,
|
|
9
11
|
} from "./unit-context-manifest.js";
|
|
10
12
|
import { getRequiredWorkflowToolsForAutoUnit } from "./workflow-mcp.js";
|
|
11
13
|
import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
|
|
@@ -21,6 +23,7 @@ export interface UnitToolContract {
|
|
|
21
23
|
requiredWorkflowTools: readonly string[];
|
|
22
24
|
forbiddenWorkflowTools: readonly { name: string; reason: string }[];
|
|
23
25
|
promptObligations: readonly string[];
|
|
26
|
+
promptContext: UnitPromptContextContract;
|
|
24
27
|
validationRules: readonly string[];
|
|
25
28
|
closeoutTools: readonly string[];
|
|
26
29
|
sourceObservations: UnitSourceObservationContract;
|
|
@@ -31,6 +34,22 @@ export interface UnitToolContract {
|
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
export interface UnitPromptContextContract {
|
|
38
|
+
unitType: string;
|
|
39
|
+
contextMode: ContextModePolicy;
|
|
40
|
+
toolsPolicy: ToolsPolicy;
|
|
41
|
+
obligations: readonly string[];
|
|
42
|
+
sourceObservations: UnitSourceObservationContract;
|
|
43
|
+
artifacts: {
|
|
44
|
+
inline: readonly ArtifactKey[];
|
|
45
|
+
excerpt: readonly ArtifactKey[];
|
|
46
|
+
onDemand: readonly ArtifactKey[];
|
|
47
|
+
computed: readonly ComputedArtifactId[];
|
|
48
|
+
prepend: readonly ComputedArtifactId[];
|
|
49
|
+
};
|
|
50
|
+
maxSystemPromptChars: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
34
53
|
export type UnitSourceObservationContract =
|
|
35
54
|
| { mode: "none" }
|
|
36
55
|
| {
|
|
@@ -45,6 +64,22 @@ export type ToolContractResult =
|
|
|
45
64
|
| { ok: true; contract: UnitToolContract }
|
|
46
65
|
| { ok: false; reason: "unknown-unit-type" | "missing-closeout-tool"; detail: string };
|
|
47
66
|
|
|
67
|
+
export type UnitContextContractResult =
|
|
68
|
+
| { ok: true; contract: UnitPromptContextContract }
|
|
69
|
+
| { ok: false; reason: "unknown-unit-type"; detail: string };
|
|
70
|
+
|
|
71
|
+
export function compileUnitContextContract(unitType: string): UnitContextContractResult {
|
|
72
|
+
const manifest = resolveManifest(unitType);
|
|
73
|
+
if (!manifest) {
|
|
74
|
+
return {
|
|
75
|
+
ok: false,
|
|
76
|
+
reason: "unknown-unit-type",
|
|
77
|
+
detail: `No Unit manifest is registered for ${unitType}`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { ok: true, contract: buildPromptContextContract(unitType, manifest) };
|
|
81
|
+
}
|
|
82
|
+
|
|
48
83
|
export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
49
84
|
const manifest = resolveManifest(unitType);
|
|
50
85
|
const surfaceContract = getUnitToolSurfaceContract(unitType);
|
|
@@ -71,6 +106,8 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
|
71
106
|
};
|
|
72
107
|
}
|
|
73
108
|
|
|
109
|
+
const promptContext = buildPromptContextContract(unitType, manifest);
|
|
110
|
+
|
|
74
111
|
return {
|
|
75
112
|
ok: true,
|
|
76
113
|
contract: {
|
|
@@ -79,10 +116,8 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
|
79
116
|
toolsPolicy: manifest.tools,
|
|
80
117
|
requiredWorkflowTools,
|
|
81
118
|
forbiddenWorkflowTools,
|
|
82
|
-
promptObligations:
|
|
83
|
-
|
|
84
|
-
`tools-policy:${manifest.tools.mode}`,
|
|
85
|
-
],
|
|
119
|
+
promptObligations: promptContext.obligations,
|
|
120
|
+
promptContext,
|
|
86
121
|
validationRules: [
|
|
87
122
|
"unit-manifest-present",
|
|
88
123
|
"workflow-tool-surface-present",
|
|
@@ -90,16 +125,59 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
|
90
125
|
...(unitType === "execute-task" ? ["source-observation-contract-present"] : []),
|
|
91
126
|
],
|
|
92
127
|
closeoutTools,
|
|
93
|
-
sourceObservations:
|
|
128
|
+
sourceObservations: promptContext.sourceObservations,
|
|
94
129
|
artifacts: {
|
|
95
|
-
inline:
|
|
96
|
-
excerpt:
|
|
97
|
-
onDemand:
|
|
130
|
+
inline: promptContext.artifacts.inline,
|
|
131
|
+
excerpt: promptContext.artifacts.excerpt,
|
|
132
|
+
onDemand: promptContext.artifacts.onDemand,
|
|
98
133
|
},
|
|
99
134
|
},
|
|
100
135
|
};
|
|
101
136
|
}
|
|
102
137
|
|
|
138
|
+
function buildPromptContextContract(
|
|
139
|
+
unitType: string,
|
|
140
|
+
manifest: UnitContextManifest,
|
|
141
|
+
): UnitPromptContextContract {
|
|
142
|
+
const sourceObservations = sourceObservationContractForUnit(unitType);
|
|
143
|
+
return {
|
|
144
|
+
unitType,
|
|
145
|
+
contextMode: manifest.contextMode,
|
|
146
|
+
toolsPolicy: manifest.tools,
|
|
147
|
+
obligations: promptContextObligations(manifest, sourceObservations),
|
|
148
|
+
sourceObservations,
|
|
149
|
+
artifacts: {
|
|
150
|
+
inline: manifest.artifacts.inline,
|
|
151
|
+
excerpt: manifest.artifacts.excerpt,
|
|
152
|
+
onDemand: manifest.artifacts.onDemand,
|
|
153
|
+
computed: manifest.artifacts.computed ?? [],
|
|
154
|
+
prepend: manifest.prepend ?? [],
|
|
155
|
+
},
|
|
156
|
+
maxSystemPromptChars: manifest.maxSystemPromptChars,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function promptContextObligations(
|
|
161
|
+
manifest: UnitContextManifest,
|
|
162
|
+
sourceObservations: UnitSourceObservationContract,
|
|
163
|
+
): string[] {
|
|
164
|
+
const obligations = [
|
|
165
|
+
`context-mode:${manifest.contextMode}`,
|
|
166
|
+
`tools-policy:${manifest.tools.mode}`,
|
|
167
|
+
artifactObligation("context-inline", manifest.artifacts.inline),
|
|
168
|
+
artifactObligation("context-excerpt", manifest.artifacts.excerpt),
|
|
169
|
+
artifactObligation("context-on-demand", manifest.artifacts.onDemand),
|
|
170
|
+
];
|
|
171
|
+
if (sourceObservations.mode !== "none") {
|
|
172
|
+
obligations.push(`source-observations:${sourceObservations.mode}`);
|
|
173
|
+
}
|
|
174
|
+
return obligations;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function artifactObligation(label: string, artifacts: readonly ArtifactKey[]): string {
|
|
178
|
+
return `${label}:${artifacts.length > 0 ? artifacts.join(",") : "none"}`;
|
|
179
|
+
}
|
|
180
|
+
|
|
103
181
|
function sourceObservationContractForUnit(unitType: string): UnitSourceObservationContract {
|
|
104
182
|
if (unitType !== "execute-task") return { mode: "none" };
|
|
105
183
|
return {
|