@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
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Canonical quality-gate closure from durable DB and artifact evidence.
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { extractSection } from "./files.js";
|
|
5
|
+
import { getGateDefinition } from "./gate-registry.js";
|
|
6
|
+
import { getMilestoneSlices, getPendingGates, saveGateResult } from "./gsd-db.js";
|
|
7
|
+
import { resolveSliceFile, resolveTaskFile } from "./paths.js";
|
|
8
|
+
const GATE_SECTION_HEADINGS = {
|
|
9
|
+
Q3: ["Threat Surface", "Abuse Surface"],
|
|
10
|
+
Q4: ["Requirement Impact", "Broken Promises"],
|
|
11
|
+
Q5: ["Failure Modes"],
|
|
12
|
+
Q6: ["Load Profile"],
|
|
13
|
+
Q7: ["Negative Tests"],
|
|
14
|
+
Q8: ["Operational Readiness"],
|
|
15
|
+
};
|
|
16
|
+
function readFile(path) {
|
|
17
|
+
if (!path || !existsSync(path))
|
|
18
|
+
return null;
|
|
19
|
+
return readFileSync(path, "utf-8");
|
|
20
|
+
}
|
|
21
|
+
function firstSection(content, gateId) {
|
|
22
|
+
if (!content)
|
|
23
|
+
return null;
|
|
24
|
+
for (const heading of GATE_SECTION_HEADINGS[gateId] ?? []) {
|
|
25
|
+
const section = extractSection(content, heading);
|
|
26
|
+
if (section)
|
|
27
|
+
return section;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function evidenceArtifactContent(row, basePath) {
|
|
32
|
+
const def = getGateDefinition(row.gate_id);
|
|
33
|
+
switch (def?.ownerTurn) {
|
|
34
|
+
case "gate-evaluate":
|
|
35
|
+
return readFile(resolveSliceFile(basePath, row.milestone_id, row.slice_id, "PLAN"));
|
|
36
|
+
case "execute-task":
|
|
37
|
+
return readFile(resolveTaskFile(basePath, row.milestone_id, row.slice_id, row.task_id, "SUMMARY"));
|
|
38
|
+
case "complete-slice":
|
|
39
|
+
return readFile(resolveSliceFile(basePath, row.milestone_id, row.slice_id, "SUMMARY"));
|
|
40
|
+
default:
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function closureEvidence(row, options) {
|
|
45
|
+
const def = getGateDefinition(row.gate_id);
|
|
46
|
+
if (!def)
|
|
47
|
+
return null;
|
|
48
|
+
if (def.ownerTurn === "validate-milestone" && options.milestoneValidationPassed) {
|
|
49
|
+
return {
|
|
50
|
+
verdict: "pass",
|
|
51
|
+
rationale: `${def.promptSection} covered by passing milestone validation`,
|
|
52
|
+
findings: "",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (!options.artifactBasePath)
|
|
56
|
+
return null;
|
|
57
|
+
const section = firstSection(evidenceArtifactContent(row, options.artifactBasePath), row.gate_id);
|
|
58
|
+
if (section) {
|
|
59
|
+
return {
|
|
60
|
+
verdict: "pass",
|
|
61
|
+
rationale: `${def.promptSection} evidence found in durable artifact`,
|
|
62
|
+
findings: section,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (!options.milestoneValidationPassed)
|
|
66
|
+
return null;
|
|
67
|
+
return {
|
|
68
|
+
verdict: "omitted",
|
|
69
|
+
rationale: `${def.promptSection} has no durable artifact section; milestone validation passed`,
|
|
70
|
+
findings: "",
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function closeGate(row, evidence) {
|
|
74
|
+
saveGateResult({
|
|
75
|
+
milestoneId: row.milestone_id,
|
|
76
|
+
sliceId: row.slice_id,
|
|
77
|
+
gateId: row.gate_id,
|
|
78
|
+
taskId: row.task_id,
|
|
79
|
+
verdict: evidence.verdict,
|
|
80
|
+
rationale: evidence.rationale,
|
|
81
|
+
findings: evidence.findings,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export function closeQualityGatesFromEvidence(milestoneId, options = {}) {
|
|
85
|
+
const repaired = [];
|
|
86
|
+
const unresolved = [];
|
|
87
|
+
for (const slice of getMilestoneSlices(milestoneId)) {
|
|
88
|
+
const sliceId = slice.id;
|
|
89
|
+
for (const row of getPendingGates(milestoneId, sliceId)) {
|
|
90
|
+
if (!getGateDefinition(row.gate_id)) {
|
|
91
|
+
unresolved.push(row);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const evidence = closureEvidence(row, options);
|
|
95
|
+
if (!evidence) {
|
|
96
|
+
unresolved.push(row);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
closeGate(row, evidence);
|
|
100
|
+
repaired.push({
|
|
101
|
+
gateId: row.gate_id,
|
|
102
|
+
sliceId: row.slice_id,
|
|
103
|
+
...(row.task_id ? { taskId: row.task_id } : {}),
|
|
104
|
+
verdict: evidence.verdict,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { repaired, unresolved };
|
|
109
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Resolve how workflow units should ask the user for input.
|
|
3
|
+
import { parseMcpToolName, toMcpToolName } from "./mcp-tool-name.js";
|
|
4
|
+
function isWorkflowMcpServerName(serverName) {
|
|
5
|
+
const normalized = serverName.toLowerCase();
|
|
6
|
+
return normalized === "gsd" || normalized.includes("workflow");
|
|
7
|
+
}
|
|
8
|
+
export function usesWorkflowMcpTransport(authMode, baseUrl) {
|
|
9
|
+
return authMode === "externalCli" && typeof baseUrl === "string" && baseUrl.startsWith("local://");
|
|
10
|
+
}
|
|
11
|
+
export function hasAskUserQuestionsTool(activeTools) {
|
|
12
|
+
return activeTools.some((toolName) => {
|
|
13
|
+
if (toolName === "ask_user_questions")
|
|
14
|
+
return true;
|
|
15
|
+
const mcp = parseMcpToolName(toolName);
|
|
16
|
+
if (!mcp)
|
|
17
|
+
return false;
|
|
18
|
+
if (mcp.toolName === "ask_user_questions")
|
|
19
|
+
return true;
|
|
20
|
+
return mcp.toolName === "*" && isWorkflowMcpServerName(mcp.serverName);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function workflowMcpStructuredQuestionsEnabled(env = process.env) {
|
|
24
|
+
const value = env.GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS?.trim().toLowerCase();
|
|
25
|
+
return value !== "0" && value !== "false" && value !== "off";
|
|
26
|
+
}
|
|
27
|
+
export function resolveQuestionTransport(options) {
|
|
28
|
+
const questionToolAvailable = hasAskUserQuestionsTool(options.activeTools);
|
|
29
|
+
const usesWorkflowMcp = usesWorkflowMcpTransport(options.authMode, options.baseUrl);
|
|
30
|
+
if (!questionToolAvailable) {
|
|
31
|
+
return {
|
|
32
|
+
structuredQuestionsAvailable: "false",
|
|
33
|
+
questionToolAvailable,
|
|
34
|
+
usesWorkflowMcp,
|
|
35
|
+
reason: "question-tool-missing",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (options.authMode === "externalCli" && !workflowMcpStructuredQuestionsEnabled(options.env)) {
|
|
39
|
+
return {
|
|
40
|
+
structuredQuestionsAvailable: "false",
|
|
41
|
+
questionToolAvailable,
|
|
42
|
+
usesWorkflowMcp,
|
|
43
|
+
reason: "workflow-mcp-disabled",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
structuredQuestionsAvailable: "true",
|
|
48
|
+
questionToolAvailable,
|
|
49
|
+
usesWorkflowMcp,
|
|
50
|
+
reason: "question-tool-available",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function supportsStructuredQuestions(activeTools, options = {}) {
|
|
54
|
+
return resolveQuestionTransport({
|
|
55
|
+
...options,
|
|
56
|
+
activeTools,
|
|
57
|
+
}).structuredQuestionsAvailable === "true";
|
|
58
|
+
}
|
|
59
|
+
export function resolveWorkflowQuestionToolSurface(options) {
|
|
60
|
+
const questionToolName = options.workflowServerName && !options.workflowExplicitlyBlocked
|
|
61
|
+
? toMcpToolName(options.workflowServerName, "ask_user_questions")
|
|
62
|
+
: undefined;
|
|
63
|
+
const activeTools = [
|
|
64
|
+
...options.exactWorkflowMcpTools,
|
|
65
|
+
...options.workflowMcpTools,
|
|
66
|
+
...(questionToolName ? [questionToolName] : []),
|
|
67
|
+
];
|
|
68
|
+
const transport = resolveQuestionTransport({
|
|
69
|
+
activeTools,
|
|
70
|
+
authMode: "externalCli",
|
|
71
|
+
baseUrl: "local://claude-code",
|
|
72
|
+
env: options.env,
|
|
73
|
+
});
|
|
74
|
+
const exactQuestionToolAllowed = !!questionToolName && options.exactWorkflowMcpTools.includes(questionToolName);
|
|
75
|
+
const workflowQuestionsEnabled = transport.structuredQuestionsAvailable === "true" &&
|
|
76
|
+
(options.workflowMcpTools.length > 0 || exactQuestionToolAllowed);
|
|
77
|
+
const disallowedTools = options.workflowServerName && transport.questionToolAvailable && !workflowQuestionsEnabled
|
|
78
|
+
? [toMcpToolName(options.workflowServerName, "ask_user_questions")]
|
|
79
|
+
: [];
|
|
80
|
+
return {
|
|
81
|
+
...transport,
|
|
82
|
+
questionToolName,
|
|
83
|
+
workflowQuestionsEnabled,
|
|
84
|
+
disallowedTools,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
@@ -191,9 +191,15 @@ export function parseRoadmapSlices(content) {
|
|
|
191
191
|
const riskMatch = rest.match(/`risk:(\w+)`/);
|
|
192
192
|
const risk = (riskMatch ? riskMatch[1] : "low");
|
|
193
193
|
const depsMatch = rest.match(/`depends:\[([^\]]*)\]`/);
|
|
194
|
-
|
|
195
|
-
|
|
194
|
+
// Recovery fallback: double-bracket form `[[id]]` from serialized bracket-wrapped IDs
|
|
195
|
+
const fallbackDepsMatch = depsMatch ? null : rest.match(/`depends:\[(\[(?:[^\]]*)\](?:,\[(?:[^\]]*)\])*)\]`/);
|
|
196
|
+
const rawDepContent = (depsMatch ?? fallbackDepsMatch)?.[1] ?? "";
|
|
197
|
+
const SLICE_ID_RE = /^[A-Za-z0-9][A-Za-z0-9-]*$/;
|
|
198
|
+
const RANGE_RE = /^[A-Za-z]+\d+(?:-|\.\.)[A-Za-z]+\d+$/;
|
|
199
|
+
const rawDepParts = rawDepContent.trim()
|
|
200
|
+
? rawDepContent.replace(/\[|\]/g, "").split(",").map(s => s.trim()).filter(s => SLICE_ID_RE.test(s) || RANGE_RE.test(s))
|
|
196
201
|
: [];
|
|
202
|
+
const depends = expandDependencies(rawDepParts);
|
|
197
203
|
// ADR-011: the renderer writes a `[sketch]` badge for sketch slices.
|
|
198
204
|
// Parse it back so the is_sketch flag survives a markdown → DB re-import
|
|
199
205
|
// (e.g. /gsd recover); otherwise the flag was silently lost.
|
|
@@ -6,7 +6,12 @@
|
|
|
6
6
|
const TEMPLATE_TOKEN_RE = /\{\{[^}]+\}\}/;
|
|
7
7
|
const H2_RE = /^##\s+(.+)$/gm;
|
|
8
8
|
const H3_RE = /^###\s+(.+)$/gm;
|
|
9
|
-
|
|
9
|
+
// A milestone line is single-line by construction. Every inter-token gap uses
|
|
10
|
+
// horizontal-whitespace classes (`[^\S\n]`) rather than `\s`, because `\s`
|
|
11
|
+
// matches newlines: a line missing a valid separator would otherwise let the
|
|
12
|
+
// `\s+(?:—|--|-)\s+` clause "bridge" onto the NEXT bullet's `- `, consuming it
|
|
13
|
+
// as the separator and silently swallowing the following well-formed milestone.
|
|
14
|
+
const MILESTONE_LINE_RE = /^-[^\S\n]+\[([ x])\][^\S\n]+(M\d{3}):[^\S\n]+(.+?)[^\S\n]+(?:—|--|-)[^\S\n]+(.+)$/gm;
|
|
10
15
|
const SLICE_HEADER_RE = /^###\s+(S\d{2})\s*(?:—|--|-)\s+(.+)$/m;
|
|
11
16
|
const REQUIREMENT_HEADER_RE = /^###\s+(R\d{3})\s*(?:—|--|-)\s+(.+)$/m;
|
|
12
17
|
function splitH2Sections(content) {
|
|
@@ -19,7 +19,8 @@ import { isAbsolute, join, dirname, resolve } from "node:path";
|
|
|
19
19
|
import { fileURLToPath } from "node:url";
|
|
20
20
|
import { gsdRoot } from "./paths.js";
|
|
21
21
|
import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager.js";
|
|
22
|
-
import { runWorktreePostCreateHook,
|
|
22
|
+
import { runWorktreePostCreateHook, syncGsdStateToWorktreeByScope } from "./auto-worktree.js";
|
|
23
|
+
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
23
24
|
import { writeSessionStatus, } from "./session-status-io.js";
|
|
24
25
|
import { hasFileConflict } from "./slice-parallel-conflict.js";
|
|
25
26
|
import { getErrorMessage } from "./error-utils.js";
|
|
@@ -108,7 +109,7 @@ function createSliceWorktree(basePath, milestoneId, sliceId) {
|
|
|
108
109
|
if (hookError) {
|
|
109
110
|
throw new Error(`slice worktree post-create hook failed (${wtName}): ${hookError}`);
|
|
110
111
|
}
|
|
111
|
-
|
|
112
|
+
syncGsdStateToWorktreeByScope(scopeMilestone(createWorkspace(basePath), milestoneId), scopeMilestone(createWorkspace(wtPath), milestoneId));
|
|
112
113
|
if (!existsSync(join(wtPath, ".gsd"))) {
|
|
113
114
|
throw new Error(`slice worktree preflight failed (${wtName}): missing .gsd in worktree`);
|
|
114
115
|
}
|
|
@@ -250,7 +250,27 @@ function detectDiskSliceIdDivergenceForMilestone(basePath, milestoneId) {
|
|
|
250
250
|
}
|
|
251
251
|
return drifts;
|
|
252
252
|
}
|
|
253
|
-
|
|
253
|
+
// #442 Phase 1.6: the three artifact/DB drift handlers (disk-slice-id,
|
|
254
|
+
// artifact-db-status, completed-milestone-reopened) each call
|
|
255
|
+
// detectArtifactDbDrift and then filter for their own kind — so the full
|
|
256
|
+
// milestone→slice→task walk + artifact SQL + disk scan would run THREE times
|
|
257
|
+
// per detection pass and discard 2/3 of the work. Memoize the result per
|
|
258
|
+
// DriftContext so the three handlers share one computation. The key is the
|
|
259
|
+
// ctx object, which detectAllDrift rebuilds for every pass (and which is
|
|
260
|
+
// unreferenced once the pass ends, so the WeakMap entry is GC'd) — DB/disk
|
|
261
|
+
// state is immutable within a single pass (repairs run only after detection),
|
|
262
|
+
// so this is behavior-preserving. A fresh ctx (e.g. the maintenance command's
|
|
263
|
+
// inline { basePath, state }) always recomputes.
|
|
264
|
+
const _artifactDbDriftMemo = new WeakMap();
|
|
265
|
+
export function detectArtifactDbDrift(state, ctx) {
|
|
266
|
+
const cached = _artifactDbDriftMemo.get(ctx);
|
|
267
|
+
if (cached)
|
|
268
|
+
return cached;
|
|
269
|
+
const computed = computeArtifactDbDrift(state, ctx);
|
|
270
|
+
_artifactDbDriftMemo.set(ctx, computed);
|
|
271
|
+
return computed;
|
|
272
|
+
}
|
|
273
|
+
function computeArtifactDbDrift(_state, ctx) {
|
|
254
274
|
if (!isDbAvailable())
|
|
255
275
|
return [];
|
|
256
276
|
const drifts = [];
|
|
@@ -18,8 +18,10 @@ import { logWarning } from './workflow-logger.js';
|
|
|
18
18
|
import { extractVerdict } from './verdict-parser.js';
|
|
19
19
|
import { detectPendingEscalation } from './escalation.js';
|
|
20
20
|
import { isTerminalMilestoneSummaryContent } from './milestone-summary-classifier.js';
|
|
21
|
-
import { isDbAvailable,
|
|
21
|
+
import { isDbAvailable, getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, getRequirementCounts, getLatestAssessmentByScope, getPendingGateCountForTurn, } from './gsd-db.js';
|
|
22
|
+
import { wasWorkflowDatabaseOpenAttempted } from './db-workspace.js';
|
|
22
23
|
import { formatCompletePhaseNextAction, countUnmappedActiveRequirements } from './requirements-backlog.js';
|
|
24
|
+
import { classifyMilestoneReadiness, readinessNeedsDiscussion, } from './milestone-readiness.js';
|
|
23
25
|
function formatNeedsAttentionBlocker(milestoneId) {
|
|
24
26
|
return [
|
|
25
27
|
`Milestone ${milestoneId} is blocked because milestone validation returned needs-attention.`,
|
|
@@ -301,7 +303,7 @@ export async function deriveState(basePath, opts) {
|
|
|
301
303
|
_telemetry.dbDeriveCount++;
|
|
302
304
|
}
|
|
303
305
|
else {
|
|
304
|
-
if (
|
|
306
|
+
if (wasWorkflowDatabaseOpenAttempted()) {
|
|
305
307
|
logWarning("state", "DB unavailable — refusing implicit markdown state derivation");
|
|
306
308
|
}
|
|
307
309
|
result = {
|
|
@@ -396,6 +398,12 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
|
|
|
396
398
|
const title = stripMilestonePrefix(m.title) || m.id;
|
|
397
399
|
const hasContext = !!resolveMilestoneFile(basePath, m.id, "CONTEXT");
|
|
398
400
|
const hasDraftContext = !hasContext && !!resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
|
|
401
|
+
const readiness = classifyMilestoneReadiness({
|
|
402
|
+
status: m.status,
|
|
403
|
+
hasContext,
|
|
404
|
+
hasDraftContext,
|
|
405
|
+
sliceCount: slices.length,
|
|
406
|
+
});
|
|
399
407
|
if (!activeMilestoneFound) {
|
|
400
408
|
const deps = m.depends_on;
|
|
401
409
|
const depsUnmet = deps.some(dep => !completeMilestoneIds.has(dep));
|
|
@@ -403,9 +411,9 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
|
|
|
403
411
|
registry.push({ id: m.id, title, status: 'pending', dependsOn: deps });
|
|
404
412
|
continue;
|
|
405
413
|
}
|
|
406
|
-
if (
|
|
414
|
+
if (readiness.kind === 'queued-shell') {
|
|
407
415
|
if (!firstDeferredQueuedShell) {
|
|
408
|
-
firstDeferredQueuedShell = { id: m.id, title, deps, hasDraftContext };
|
|
416
|
+
firstDeferredQueuedShell = { id: m.id, title, deps, hasDraftContext: readiness.hasDraftContext };
|
|
409
417
|
}
|
|
410
418
|
registry.push({ id: m.id, title, status: 'pending', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
411
419
|
continue;
|
|
@@ -417,7 +425,7 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
|
|
|
417
425
|
registry.push({ id: m.id, title, status: 'active', ...(deps.length > 0 ? { dependsOn: deps } : {}) });
|
|
418
426
|
continue;
|
|
419
427
|
}
|
|
420
|
-
if ((
|
|
428
|
+
if (readinessNeedsDiscussion(readiness))
|
|
421
429
|
activeMilestoneHasDraft = true;
|
|
422
430
|
activeMilestone = { id: m.id, title };
|
|
423
431
|
activeMilestoneSlices = slices;
|
|
@@ -46,6 +46,13 @@
|
|
|
46
46
|
For simple projects or scripts:
|
|
47
47
|
- Executable verification commands (bash assertions, curl checks, etc.) are sufficient
|
|
48
48
|
|
|
49
|
+
For browser-facing web apps (React, Next, Vue, Vite, static HTML, etc.):
|
|
50
|
+
- Prefer `npx playwright test <spec>` in Verification when `@playwright/test` exists
|
|
51
|
+
- If Playwright is not set up yet, the first UI slice should add `playwright.config.ts`,
|
|
52
|
+
a minimal smoke spec (for example `e2e/smoke.spec.ts`), and a safe verify command
|
|
53
|
+
- Slice closeout UAT must declare `browser-executable` or `runtime-executable` — not
|
|
54
|
+
`artifact-driven` — when checks navigate to localhost or exercise the live UI
|
|
55
|
+
|
|
49
56
|
If the project has no test framework and the work is non-trivial,
|
|
50
57
|
the first task should set one up. A test runner costs 2 minutes
|
|
51
58
|
and pays for itself immediately.
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
- **Complexity:** {{simple | complex}}
|
|
22
22
|
- **Why:** {{one-line rationale citing the signals that decided it}}
|
|
23
|
+
- **Web stack:** {{browser-facing framework or "not a web UI" — e.g. Next.js + Playwright, static HTML, N/A for CLI/API-only}}
|
|
23
24
|
|
|
24
25
|
## Current State
|
|
25
26
|
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
- Contract verification: {{tests / shell verifiers / fixtures / artifact checks}}
|
|
43
43
|
- Integration verification: {{real subsystem interaction that must be exercised, or none}}
|
|
44
44
|
- Operational verification: {{service lifecycle / restart / reconnect / supervision / deploy-install behavior, or none}}
|
|
45
|
-
- UAT / human verification: {{what needs real human judgment, or none}}
|
|
45
|
+
- UAT / human verification: {{what needs real human judgment, or none — for web apps prefer browser-executable / runtime-executable Playwright checks over deferring UI proof to humans}}
|
|
46
46
|
|
|
47
47
|
## Milestone Definition of Done
|
|
48
48
|
|
|
@@ -5,9 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
## UAT Type
|
|
7
7
|
|
|
8
|
-
- UAT mode: {{artifact-driven | live-runtime | human-experience | mixed}}
|
|
8
|
+
- UAT mode: {{artifact-driven | browser-executable | runtime-executable | live-runtime | human-experience | mixed}}
|
|
9
9
|
- Why this mode is sufficient: {{reason}}
|
|
10
10
|
|
|
11
|
+
<!-- Web apps: never use artifact-driven when steps open a browser, navigate to localhost,
|
|
12
|
+
or capture screenshots. Use browser-executable (browser_* tools) or runtime-executable
|
|
13
|
+
(npx playwright test). Name dev-server preconditions below. -->
|
|
14
|
+
|
|
11
15
|
## Preconditions
|
|
12
16
|
|
|
13
17
|
{{whatMustBeTrueBeforeTesting — server running, data seeded, etc.}}
|
|
@@ -4,6 +4,17 @@ import { resolveManifest, } from "./unit-context-manifest.js";
|
|
|
4
4
|
import { getRequiredWorkflowToolsForAutoUnit } from "./workflow-mcp.js";
|
|
5
5
|
import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
|
|
6
6
|
import { WHOLE_FILE_OBSERVATION_MAX_BYTES, WHOLE_FILE_OBSERVATION_MAX_LINES, } from "./source-observations.js";
|
|
7
|
+
export function compileUnitContextContract(unitType) {
|
|
8
|
+
const manifest = resolveManifest(unitType);
|
|
9
|
+
if (!manifest) {
|
|
10
|
+
return {
|
|
11
|
+
ok: false,
|
|
12
|
+
reason: "unknown-unit-type",
|
|
13
|
+
detail: `No Unit manifest is registered for ${unitType}`,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return { ok: true, contract: buildPromptContextContract(unitType, manifest) };
|
|
17
|
+
}
|
|
7
18
|
export function compileUnitToolContract(unitType) {
|
|
8
19
|
const manifest = resolveManifest(unitType);
|
|
9
20
|
const surfaceContract = getUnitToolSurfaceContract(unitType);
|
|
@@ -25,6 +36,7 @@ export function compileUnitToolContract(unitType) {
|
|
|
25
36
|
detail: `${unitType} has no closeout workflow tool`,
|
|
26
37
|
};
|
|
27
38
|
}
|
|
39
|
+
const promptContext = buildPromptContextContract(unitType, manifest);
|
|
28
40
|
return {
|
|
29
41
|
ok: true,
|
|
30
42
|
contract: {
|
|
@@ -33,10 +45,8 @@ export function compileUnitToolContract(unitType) {
|
|
|
33
45
|
toolsPolicy: manifest.tools,
|
|
34
46
|
requiredWorkflowTools,
|
|
35
47
|
forbiddenWorkflowTools,
|
|
36
|
-
promptObligations:
|
|
37
|
-
|
|
38
|
-
`tools-policy:${manifest.tools.mode}`,
|
|
39
|
-
],
|
|
48
|
+
promptObligations: promptContext.obligations,
|
|
49
|
+
promptContext,
|
|
40
50
|
validationRules: [
|
|
41
51
|
"unit-manifest-present",
|
|
42
52
|
"workflow-tool-surface-present",
|
|
@@ -44,15 +54,49 @@ export function compileUnitToolContract(unitType) {
|
|
|
44
54
|
...(unitType === "execute-task" ? ["source-observation-contract-present"] : []),
|
|
45
55
|
],
|
|
46
56
|
closeoutTools,
|
|
47
|
-
sourceObservations:
|
|
57
|
+
sourceObservations: promptContext.sourceObservations,
|
|
48
58
|
artifacts: {
|
|
49
|
-
inline:
|
|
50
|
-
excerpt:
|
|
51
|
-
onDemand:
|
|
59
|
+
inline: promptContext.artifacts.inline,
|
|
60
|
+
excerpt: promptContext.artifacts.excerpt,
|
|
61
|
+
onDemand: promptContext.artifacts.onDemand,
|
|
52
62
|
},
|
|
53
63
|
},
|
|
54
64
|
};
|
|
55
65
|
}
|
|
66
|
+
function buildPromptContextContract(unitType, manifest) {
|
|
67
|
+
const sourceObservations = sourceObservationContractForUnit(unitType);
|
|
68
|
+
return {
|
|
69
|
+
unitType,
|
|
70
|
+
contextMode: manifest.contextMode,
|
|
71
|
+
toolsPolicy: manifest.tools,
|
|
72
|
+
obligations: promptContextObligations(manifest, sourceObservations),
|
|
73
|
+
sourceObservations,
|
|
74
|
+
artifacts: {
|
|
75
|
+
inline: manifest.artifacts.inline,
|
|
76
|
+
excerpt: manifest.artifacts.excerpt,
|
|
77
|
+
onDemand: manifest.artifacts.onDemand,
|
|
78
|
+
computed: manifest.artifacts.computed ?? [],
|
|
79
|
+
prepend: manifest.prepend ?? [],
|
|
80
|
+
},
|
|
81
|
+
maxSystemPromptChars: manifest.maxSystemPromptChars,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function promptContextObligations(manifest, sourceObservations) {
|
|
85
|
+
const obligations = [
|
|
86
|
+
`context-mode:${manifest.contextMode}`,
|
|
87
|
+
`tools-policy:${manifest.tools.mode}`,
|
|
88
|
+
artifactObligation("context-inline", manifest.artifacts.inline),
|
|
89
|
+
artifactObligation("context-excerpt", manifest.artifacts.excerpt),
|
|
90
|
+
artifactObligation("context-on-demand", manifest.artifacts.onDemand),
|
|
91
|
+
];
|
|
92
|
+
if (sourceObservations.mode !== "none") {
|
|
93
|
+
obligations.push(`source-observations:${sourceObservations.mode}`);
|
|
94
|
+
}
|
|
95
|
+
return obligations;
|
|
96
|
+
}
|
|
97
|
+
function artifactObligation(label, artifacts) {
|
|
98
|
+
return `${label}:${artifacts.length > 0 ? artifacts.join(",") : "none"}`;
|
|
99
|
+
}
|
|
56
100
|
function sourceObservationContractForUnit(unitType) {
|
|
57
101
|
if (unitType !== "execute-task")
|
|
58
102
|
return { mode: "none" };
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Resolve phase-aware tool surfaces for GSD model presentations.
|
|
3
3
|
import { RUN_UAT_BROWSER_TOOL_NAMES, RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_TOOL_PRESENTATION_PLAN_ID, RUN_UAT_WORKFLOW_TOOL_NAMES, } from "./unit-tool-contracts.js";
|
|
4
|
+
import { toMcpToolName } from "./mcp-tool-name.js";
|
|
5
|
+
import { createToolSurfaceSnapshot } from "./tool-surface-snapshot.js";
|
|
4
6
|
import { uatTypeIncludesBrowser } from "./uat-policy.js";
|
|
7
|
+
import { canonicalWorkflowSurfaceToolName } from "./workflow-tool-surface.js";
|
|
5
8
|
export { RUN_UAT_BROWSER_TOOL_NAMES, RUN_UAT_READ_ONLY_TOOL_NAMES, RUN_UAT_TOOL_PRESENTATION_PLAN_ID, RUN_UAT_WORKFLOW_TOOL_NAMES, } from "./unit-tool-contracts.js";
|
|
6
9
|
export const RUN_UAT_FORBIDDEN_TOOL_NAMES = [
|
|
7
10
|
"edit",
|
|
@@ -21,43 +24,12 @@ export const RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES = [
|
|
|
21
24
|
"Glob",
|
|
22
25
|
"Grep",
|
|
23
26
|
];
|
|
24
|
-
const WORKFLOW_ALIAS_TO_CANONICAL = {
|
|
25
|
-
gsd_save_decision: "gsd_decision_save",
|
|
26
|
-
gsd_update_requirement: "gsd_requirement_update",
|
|
27
|
-
gsd_save_requirement: "gsd_requirement_save",
|
|
28
|
-
gsd_save_summary: "gsd_summary_save",
|
|
29
|
-
gsd_generate_milestone_id: "gsd_milestone_generate_id",
|
|
30
|
-
gsd_milestone_plan: "gsd_plan_milestone",
|
|
31
|
-
gsd_slice_plan: "gsd_plan_slice",
|
|
32
|
-
gsd_task_plan: "gsd_plan_task",
|
|
33
|
-
gsd_slice_replan: "gsd_replan_slice",
|
|
34
|
-
gsd_complete_slice: "gsd_slice_complete",
|
|
35
|
-
gsd_milestone_complete: "gsd_complete_milestone",
|
|
36
|
-
gsd_milestone_validate: "gsd_validate_milestone",
|
|
37
|
-
gsd_roadmap_reassess: "gsd_reassess_roadmap",
|
|
38
|
-
gsd_complete_task: "gsd_task_complete",
|
|
39
|
-
gsd_reopen_task: "gsd_task_reopen",
|
|
40
|
-
gsd_reopen_slice: "gsd_slice_reopen",
|
|
41
|
-
gsd_reopen_milestone: "gsd_milestone_reopen",
|
|
42
|
-
};
|
|
43
27
|
export function canonicalWorkflowToolName(toolName) {
|
|
44
|
-
|
|
45
|
-
const baseName = mcp?.tool ?? toolName;
|
|
46
|
-
return WORKFLOW_ALIAS_TO_CANONICAL[baseName] ?? baseName;
|
|
47
|
-
}
|
|
48
|
-
export function parseMcpToolName(toolName) {
|
|
49
|
-
if (!toolName.startsWith("mcp__"))
|
|
50
|
-
return null;
|
|
51
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
52
|
-
if (toolSeparator < 0)
|
|
53
|
-
return null;
|
|
54
|
-
return {
|
|
55
|
-
server: toolName.slice("mcp__".length, toolSeparator),
|
|
56
|
-
tool: toolName.slice(toolSeparator + 2),
|
|
57
|
-
};
|
|
28
|
+
return canonicalWorkflowSurfaceToolName(toolName);
|
|
58
29
|
}
|
|
30
|
+
export { parseMcpToolName } from "./mcp-tool-name.js";
|
|
59
31
|
export function toWorkflowMcpToolName(serverName, toolName) {
|
|
60
|
-
return
|
|
32
|
+
return toMcpToolName(serverName, canonicalWorkflowToolName(toolName));
|
|
61
33
|
}
|
|
62
34
|
function dedupe(values) {
|
|
63
35
|
return [...new Set(values)];
|
|
@@ -134,6 +106,14 @@ export function resolveToolPresentationPlan(options) {
|
|
|
134
106
|
? toWorkflowMcpToolName(workflowServerName, name)
|
|
135
107
|
: name)
|
|
136
108
|
: allowedToolNames;
|
|
109
|
+
const toolSurface = createToolSurfaceSnapshot({
|
|
110
|
+
source: "presentation-plan",
|
|
111
|
+
phase: options.phase,
|
|
112
|
+
modelFacingToolNames: options.availableToolNames ?? requested,
|
|
113
|
+
registeredToolNames: options.availableToolNames ?? requested,
|
|
114
|
+
scopedToolNames: allowedToolNames,
|
|
115
|
+
presentedToolNames,
|
|
116
|
+
});
|
|
137
117
|
if (options.phase === "run-uat") {
|
|
138
118
|
for (const forbidden of RUN_UAT_FORBIDDEN_TOOL_NAMES) {
|
|
139
119
|
addBlockedTool(blockedToolNames, forbidden, "forbidden during run-uat");
|
|
@@ -148,5 +128,6 @@ export function resolveToolPresentationPlan(options) {
|
|
|
148
128
|
blockedToolNames,
|
|
149
129
|
aliases,
|
|
150
130
|
diagnostics: [],
|
|
131
|
+
toolSurface,
|
|
151
132
|
};
|
|
152
133
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Typed snapshots for model-facing, registered, scoped, and presented tool surfaces.
|
|
3
|
+
function dedupeToolNames(toolNames) {
|
|
4
|
+
return [...new Set(toolNames ?? [])];
|
|
5
|
+
}
|
|
6
|
+
export function createToolSurfaceSnapshot(input) {
|
|
7
|
+
return {
|
|
8
|
+
source: input.source,
|
|
9
|
+
unitType: input.unitType,
|
|
10
|
+
phase: input.phase,
|
|
11
|
+
modelFacingToolNames: dedupeToolNames(input.modelFacingToolNames),
|
|
12
|
+
registeredToolNames: dedupeToolNames(input.registeredToolNames),
|
|
13
|
+
scopedToolNames: dedupeToolNames(input.scopedToolNames),
|
|
14
|
+
presentedToolNames: dedupeToolNames(input.presentedToolNames),
|
|
15
|
+
capturedAt: input.capturedAt ?? Date.now(),
|
|
16
|
+
};
|
|
17
|
+
}
|