@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
|
@@ -130,3 +130,68 @@ test("buildResearchMilestonePrompt keeps broad project docs on-demand", async (t
|
|
|
130
130
|
assert.match(prompt, /`\.gsd\/REQUIREMENTS\.md`/);
|
|
131
131
|
assert.match(prompt, /`\.gsd\/DECISIONS\.md`/);
|
|
132
132
|
});
|
|
133
|
+
|
|
134
|
+
// ─── ADR-029: preload-authoritative research grounding ────────────────
|
|
135
|
+
|
|
136
|
+
test("ADR-029: research-milestone inlines project classification + codebase snapshot", async (t) => {
|
|
137
|
+
const base = makeBase();
|
|
138
|
+
t.after(() => cleanup(base));
|
|
139
|
+
invalidateAllCaches();
|
|
140
|
+
|
|
141
|
+
seed(base, "M001");
|
|
142
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"), "# M001 Context\n");
|
|
143
|
+
// Give the codebase scan something real to sample.
|
|
144
|
+
writeFileSync(join(base, "index.html"), "<!doctype html><html><body><h1>hi</h1></body></html>\n");
|
|
145
|
+
writeFileSync(join(base, "script.js"), "const x = 1;\nasync function go() { await x; }\n");
|
|
146
|
+
|
|
147
|
+
const prompt = await buildResearchMilestonePrompt("M001", "Research Test", base);
|
|
148
|
+
|
|
149
|
+
// Project-size signal (same block plan-milestone gets).
|
|
150
|
+
assert.match(prompt, /### Project Classification/);
|
|
151
|
+
assert.match(prompt, /Workflow sizing:/);
|
|
152
|
+
// Bounded codebase snapshot grounds research in current code reality.
|
|
153
|
+
assert.match(prompt, /### Codebase Snapshot \(current code reality\)/);
|
|
154
|
+
assert.match(prompt, /do NOT re-survey the tree/);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test("ADR-029: codebase snapshot is suppressed when discuss_preparation is false", async (t) => {
|
|
158
|
+
const base = makeBase();
|
|
159
|
+
t.after(() => cleanup(base));
|
|
160
|
+
invalidateAllCaches();
|
|
161
|
+
|
|
162
|
+
seed(base, "M001");
|
|
163
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"), "# M001 Context\n");
|
|
164
|
+
writeFileSync(join(base, ".gsd", "PREFERENCES.md"), "---\ndiscuss_preparation: false\n---\n");
|
|
165
|
+
invalidateAllCaches();
|
|
166
|
+
|
|
167
|
+
const prompt = await buildResearchMilestonePrompt("M001", "Research Test", base);
|
|
168
|
+
|
|
169
|
+
// Snapshot opt-out honored; classification (unconditional) still present.
|
|
170
|
+
assert.doesNotMatch(prompt, /### Codebase Snapshot/);
|
|
171
|
+
assert.match(prompt, /### Project Classification/);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test("ADR-029: prior partial RESEARCH is inlined as a resume block; absent otherwise", async (t) => {
|
|
175
|
+
const base = makeBase();
|
|
176
|
+
t.after(() => cleanup(base));
|
|
177
|
+
invalidateAllCaches();
|
|
178
|
+
|
|
179
|
+
seed(base, "M001");
|
|
180
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"), "# M001 Context\n");
|
|
181
|
+
|
|
182
|
+
// No prior research yet → no resume block. (Match the rendered block heading,
|
|
183
|
+
// not the bare phrase — step 8 of the template references the phrase by name.)
|
|
184
|
+
const before = await buildResearchMilestonePrompt("M001", "Research Test", base);
|
|
185
|
+
assert.doesNotMatch(before, /### Resume — Prior Partial Research \(continue, do not redo\)/);
|
|
186
|
+
|
|
187
|
+
// A partial RESEARCH draft from a prior (interrupted) attempt.
|
|
188
|
+
writeFileSync(
|
|
189
|
+
join(base, ".gsd", "milestones", "M001", "M001-RESEARCH.md"),
|
|
190
|
+
"# Research\n\n## Findings\n\nPartial finding: the app is a static site.\n",
|
|
191
|
+
);
|
|
192
|
+
invalidateAllCaches();
|
|
193
|
+
|
|
194
|
+
const after = await buildResearchMilestonePrompt("M001", "Research Test", base);
|
|
195
|
+
assert.match(after, /Resume — Prior Partial Research \(continue, do not redo\)/);
|
|
196
|
+
assert.match(after, /Partial finding: the app is a static site/);
|
|
197
|
+
});
|
|
@@ -396,4 +396,44 @@ test('T. #1736: Checkbox format unchanged', () => {
|
|
|
396
396
|
assert.deepStrictEqual(slices[1].done, false, '#1736 checkbox compat: S02 not done');
|
|
397
397
|
});
|
|
398
398
|
|
|
399
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
400
|
+
// U. Regression #566: double-bracket depends serialization recovery
|
|
401
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
402
|
+
test('U. #566: double-bracket depends:[[S01]] recovers to ["S01"]', () => {
|
|
403
|
+
// Simulates a roadmap written by markdown-renderer when the DB had
|
|
404
|
+
// depends=["[S01]"] — produces `depends:[[S01]]` on disk.
|
|
405
|
+
const content = [
|
|
406
|
+
'# M020: Corrupted Depends',
|
|
407
|
+
'',
|
|
408
|
+
'## Slices',
|
|
409
|
+
'',
|
|
410
|
+
'- [ ] **S01: Foundation** `risk:low` `depends:[]`',
|
|
411
|
+
'- [ ] **S02: Build** `risk:medium` `depends:[[S01]]`',
|
|
412
|
+
'- [ ] **S03: Ship** `risk:high` `depends:[[S01, S02]]`',
|
|
413
|
+
'',
|
|
414
|
+
].join('\n');
|
|
415
|
+
|
|
416
|
+
const slices = parseRoadmapSlices(content);
|
|
417
|
+
assert.deepStrictEqual(slices.length, 3, '#566 double-bracket: 3 slices');
|
|
418
|
+
assert.deepStrictEqual(slices[1].depends, ['S01'], '#566: S02 depends recovered to ["S01"]');
|
|
419
|
+
assert.deepStrictEqual(slices[2].depends, ['S01', 'S02'], '#566: S03 depends recovered to ["S01","S02"]');
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
test('U. #566: bracket-wrapped single element depends:[[S01]] recovers to ["S01"]', () => {
|
|
423
|
+
// Simulates the exact DB corruption seen in the forensic evidence: depends=["[S01]"]
|
|
424
|
+
const content = [
|
|
425
|
+
'# M020: Single Bracket Corruption',
|
|
426
|
+
'',
|
|
427
|
+
'## Slices',
|
|
428
|
+
'',
|
|
429
|
+
'- [ ] **S01: First** `risk:low` `depends:[]`',
|
|
430
|
+
'- [ ] **S02: Second** `risk:medium` `depends:[[S01]]`',
|
|
431
|
+
'',
|
|
432
|
+
].join('\n');
|
|
433
|
+
|
|
434
|
+
const slices = parseRoadmapSlices(content);
|
|
435
|
+
assert.deepStrictEqual(slices[1].depends.length, 1, '#566 single: S02 has exactly 1 dep');
|
|
436
|
+
assert.deepStrictEqual(slices[1].depends[0], 'S01', '#566 single: dep is "S01" not "[S01]"');
|
|
437
|
+
});
|
|
438
|
+
|
|
399
439
|
});
|
|
@@ -6,7 +6,7 @@ import assert from "node:assert/strict";
|
|
|
6
6
|
|
|
7
7
|
import { classifyFailure } from "../recovery-classification.js";
|
|
8
8
|
import { reconcileBeforeDispatch } from "../state-reconciliation.js";
|
|
9
|
-
import { compileUnitToolContract } from "../tool-contract.js";
|
|
9
|
+
import { compileUnitContextContract, compileUnitToolContract } from "../tool-contract.js";
|
|
10
10
|
import { shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
|
|
11
11
|
import type { GSDState } from "../types.js";
|
|
12
12
|
|
|
@@ -68,6 +68,16 @@ test("Tool Contract compiles known Unit prompt and tool policy", () => {
|
|
|
68
68
|
assert.equal(result.ok && result.contract.toolsPolicy.mode, "all");
|
|
69
69
|
assert.ok(result.ok && result.contract.validationRules.includes("closeout-tool-present"));
|
|
70
70
|
assert.ok(result.ok && result.contract.validationRules.includes("source-observation-contract-present"));
|
|
71
|
+
assert.deepEqual(result.ok && result.contract.promptContext.artifacts.inline, [
|
|
72
|
+
"task-plan",
|
|
73
|
+
"slice-plan",
|
|
74
|
+
"prior-task-summaries",
|
|
75
|
+
"templates",
|
|
76
|
+
]);
|
|
77
|
+
assert.deepEqual(result.ok && result.contract.promptContext.artifacts.onDemand, ["slice-research"]);
|
|
78
|
+
assert.ok(result.ok && result.contract.promptObligations.includes("context-inline:task-plan,slice-plan,prior-task-summaries,templates"));
|
|
79
|
+
assert.ok(result.ok && result.contract.promptObligations.includes("context-on-demand:slice-research"));
|
|
80
|
+
assert.ok(result.ok && result.contract.promptObligations.includes("source-observations:whole-file-active-unit"));
|
|
71
81
|
assert.deepEqual(result.ok && result.contract.sourceObservations, {
|
|
72
82
|
mode: "whole-file-active-unit",
|
|
73
83
|
seedFields: ["task.files", "task.inputs"],
|
|
@@ -77,6 +87,20 @@ test("Tool Contract compiles known Unit prompt and tool policy", () => {
|
|
|
77
87
|
});
|
|
78
88
|
});
|
|
79
89
|
|
|
90
|
+
test("Unit Context Contract exposes prompt context without workflow tool surface", () => {
|
|
91
|
+
const result = compileUnitContextContract("execute-task");
|
|
92
|
+
|
|
93
|
+
assert.equal(result.ok, true);
|
|
94
|
+
assert.equal(result.ok && result.contract.unitType, "execute-task");
|
|
95
|
+
assert.equal(result.ok && result.contract.contextMode, "execution");
|
|
96
|
+
assert.equal(result.ok && result.contract.toolsPolicy.mode, "all");
|
|
97
|
+
assert.deepEqual(result.ok && result.contract.artifacts.excerpt, []);
|
|
98
|
+
assert.deepEqual(result.ok && result.contract.artifacts.computed, []);
|
|
99
|
+
assert.deepEqual(result.ok && result.contract.artifacts.prepend, []);
|
|
100
|
+
assert.equal(result.ok && result.contract.maxSystemPromptChars, 1_500_000);
|
|
101
|
+
assert.equal(result.ok && result.contract.sourceObservations.mode, "whole-file-active-unit");
|
|
102
|
+
});
|
|
103
|
+
|
|
80
104
|
test("Tool Contract records high-risk cross-phase tool boundaries without single-owning every tool", () => {
|
|
81
105
|
const completeSlice = compileUnitToolContract("complete-slice");
|
|
82
106
|
const runUat = compileUnitToolContract("run-uat");
|
|
@@ -24,6 +24,7 @@ import { fileURLToPath } from "node:url";
|
|
|
24
24
|
|
|
25
25
|
import { autoSession } from "../auto-runtime-state.ts";
|
|
26
26
|
import { registerHooks } from "../bootstrap/register-hooks.ts";
|
|
27
|
+
import { _resetPreferenceDiagnosticNotificationsForTests } from "../preferences-diagnostics.ts";
|
|
27
28
|
|
|
28
29
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
29
30
|
const HOOKS_SOURCE = readFileSync(
|
|
@@ -485,3 +486,82 @@ test("session_start and session_switch apply disabled model provider policy from
|
|
|
485
486
|
"session_switch should re-read preferences for the switched project/session context",
|
|
486
487
|
);
|
|
487
488
|
});
|
|
489
|
+
|
|
490
|
+
test("session_start surfaces malformed preference diagnostics through visible notifications", async (t) => {
|
|
491
|
+
const dir = join(
|
|
492
|
+
tmpdir(),
|
|
493
|
+
`gsd-session-pref-diagnostics-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
494
|
+
);
|
|
495
|
+
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
496
|
+
const tempGsdHome = join(dir, "home");
|
|
497
|
+
mkdirSync(tempGsdHome, { recursive: true });
|
|
498
|
+
|
|
499
|
+
const originalCwd = process.cwd();
|
|
500
|
+
const originalGsdHome = process.env.GSD_HOME;
|
|
501
|
+
process.env.GSD_HOME = tempGsdHome;
|
|
502
|
+
process.chdir(dir);
|
|
503
|
+
_resetPreferenceDiagnosticNotificationsForTests();
|
|
504
|
+
t.after(() => {
|
|
505
|
+
process.chdir(originalCwd);
|
|
506
|
+
if (originalGsdHome === undefined) delete process.env.GSD_HOME;
|
|
507
|
+
else process.env.GSD_HOME = originalGsdHome;
|
|
508
|
+
_resetPreferenceDiagnosticNotificationsForTests();
|
|
509
|
+
try { rmSync(dir, { recursive: true, force: true }); } catch { /* best-effort */ }
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
writeFileSync(
|
|
513
|
+
join(dir, ".gsd", "PREFERENCES.md"),
|
|
514
|
+
[
|
|
515
|
+
"---",
|
|
516
|
+
"version: 1",
|
|
517
|
+
"models:",
|
|
518
|
+
" validation:",
|
|
519
|
+
" openrouter/deepseek/deepseek-v4-pro",
|
|
520
|
+
" thinking: high",
|
|
521
|
+
"---",
|
|
522
|
+
"",
|
|
523
|
+
].join("\n"),
|
|
524
|
+
"utf-8",
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
528
|
+
const handlers = new Map<string, (event: unknown, ctx: any) => Promise<void> | void>();
|
|
529
|
+
const pi = {
|
|
530
|
+
on(event: string, handler: (event: unknown, ctx: any) => Promise<void> | void) {
|
|
531
|
+
handlers.set(event, handler);
|
|
532
|
+
},
|
|
533
|
+
} as any;
|
|
534
|
+
const ctx = {
|
|
535
|
+
hasUI: true,
|
|
536
|
+
ui: {
|
|
537
|
+
notify: (message: string, level?: string) => notifications.push({ message, level }),
|
|
538
|
+
setStatus: () => {},
|
|
539
|
+
setFooter: () => {},
|
|
540
|
+
setWorkingMessage: () => {},
|
|
541
|
+
onTerminalInput: () => () => {},
|
|
542
|
+
setWidget: () => {},
|
|
543
|
+
},
|
|
544
|
+
sessionManager: { getSessionId: () => null },
|
|
545
|
+
model: null,
|
|
546
|
+
setCompactionThresholdOverride: () => {},
|
|
547
|
+
modelRegistry: {
|
|
548
|
+
setDisabledModelProviders: () => {},
|
|
549
|
+
getProviderAuthMode: () => undefined,
|
|
550
|
+
isProviderRequestReady: () => false,
|
|
551
|
+
},
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
registerHooks(pi, []);
|
|
555
|
+
|
|
556
|
+
const sessionStart = handlers.get("session_start");
|
|
557
|
+
assert.ok(sessionStart, "session_start handler must be registered");
|
|
558
|
+
await sessionStart!({}, ctx);
|
|
559
|
+
|
|
560
|
+
const diagnostic = notifications.find((notification) =>
|
|
561
|
+
notification.message.includes("GSD project preferences error"),
|
|
562
|
+
);
|
|
563
|
+
assert.equal(diagnostic?.level, "error");
|
|
564
|
+
assert.match(diagnostic?.message ?? "", /could not be parsed/);
|
|
565
|
+
assert.match(diagnostic?.message ?? "", /line 5, column 5/);
|
|
566
|
+
assert.match(diagnostic?.message ?? "", /Preferences from this file were ignored/);
|
|
567
|
+
});
|
|
@@ -74,6 +74,29 @@ const PREPARE_WRITE_RE = /\.prepare\s*\(\s*[`'"][^`'"]*\b(INSERT|UPDATE|DELETE|R
|
|
|
74
74
|
|
|
75
75
|
// Match .exec("... INSERT|UPDATE|DELETE|REPLACE ...") or raw BEGIN/COMMIT/ROLLBACK.
|
|
76
76
|
const EXEC_WRITE_RE = /\.exec\s*\(\s*[`'"][^`'"]*\b(INSERT|UPDATE|DELETE|REPLACE|BEGIN|COMMIT|ROLLBACK)\b/i;
|
|
77
|
+
const DB_WORKSPACE_MECHANICS = new Set([
|
|
78
|
+
"backupDatabaseSnapshot",
|
|
79
|
+
"checkpointDatabase",
|
|
80
|
+
"closeAllDatabases",
|
|
81
|
+
"closeDatabase",
|
|
82
|
+
"closeDatabaseByWorkspace",
|
|
83
|
+
"getDbPath",
|
|
84
|
+
"getDbProvider",
|
|
85
|
+
"getDbStatus",
|
|
86
|
+
"openDatabase",
|
|
87
|
+
"openDatabaseByScope",
|
|
88
|
+
"openDatabaseByWorkspace",
|
|
89
|
+
"refreshOpenDatabaseFromDisk",
|
|
90
|
+
"vacuumDatabase",
|
|
91
|
+
"wasDbOpenAttempted",
|
|
92
|
+
]);
|
|
93
|
+
|
|
94
|
+
function importNames(specifierBlock: string): string[] {
|
|
95
|
+
return specifierBlock
|
|
96
|
+
.split(",")
|
|
97
|
+
.map((name) => name.trim().replace(/^type\s+/, "").split(/\s+as\s+/)[0]?.trim() ?? "")
|
|
98
|
+
.filter(Boolean);
|
|
99
|
+
}
|
|
77
100
|
|
|
78
101
|
test("no module outside gsd-db.ts issues raw write SQL against the engine DB", () => {
|
|
79
102
|
const files = walkTsFiles(gsdDir);
|
|
@@ -166,6 +189,84 @@ test("gsd-db.ts exports the expected single-writer wrappers", async () => {
|
|
|
166
189
|
}
|
|
167
190
|
});
|
|
168
191
|
|
|
192
|
+
test("DB Workspace Interface owns database open-state and maintenance calls", async () => {
|
|
193
|
+
const workspaceDb = await import("../db-workspace.js");
|
|
194
|
+
|
|
195
|
+
const expected = [
|
|
196
|
+
"backupWorkflowDatabaseSnapshot",
|
|
197
|
+
"checkpointWorkflowDatabase",
|
|
198
|
+
"closeAllWorkflowDatabases",
|
|
199
|
+
"closeWorkflowDatabase",
|
|
200
|
+
"closeWorkflowDatabaseByWorkspace",
|
|
201
|
+
"getWorkflowDatabasePath",
|
|
202
|
+
"getWorkflowDatabaseProvider",
|
|
203
|
+
"getWorkflowDatabaseStatus",
|
|
204
|
+
"isWorkflowDatabaseOpen",
|
|
205
|
+
"openExistingWorkflowDatabase",
|
|
206
|
+
"openWorkflowDatabase",
|
|
207
|
+
"openWorkflowDatabaseByScope",
|
|
208
|
+
"openWorkflowDatabaseByWorkspace",
|
|
209
|
+
"openWorkflowDatabasePath",
|
|
210
|
+
"refreshWorkflowDatabaseFromDisk",
|
|
211
|
+
"resolveProjectRootDbPath",
|
|
212
|
+
"resolveWorkflowDatabaseLocation",
|
|
213
|
+
"vacuumWorkflowDatabase",
|
|
214
|
+
"wasWorkflowDatabaseOpenAttempted",
|
|
215
|
+
];
|
|
216
|
+
|
|
217
|
+
for (const name of expected) {
|
|
218
|
+
assert.ok(
|
|
219
|
+
typeof (workspaceDb as Record<string, unknown>)[name] === "function",
|
|
220
|
+
`db-workspace.ts must export ${name} as a function`,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test("production modules do not import DB open-state mechanics from gsd-db.ts", () => {
|
|
226
|
+
const files = walkTsFiles(gsdDir);
|
|
227
|
+
const violations: Violation[] = [];
|
|
228
|
+
const staticImportRe = /import\s*\{([\s\S]*?)\}\s*from\s*["'][^"']*gsd-db\.(?:js|ts)["']/g;
|
|
229
|
+
const dynamicImportRe = /(?:const|let)\s*\{([\s\S]*?)\}\s*=\s*await\s+import\(["'][^"']*gsd-db\.(?:js|ts)["']\)/g;
|
|
230
|
+
|
|
231
|
+
for (const abs of files) {
|
|
232
|
+
const rel = relative(gsdDir, abs);
|
|
233
|
+
if (rel === "gsd-db.ts" || rel === "db-workspace.ts") continue;
|
|
234
|
+
|
|
235
|
+
let content: string;
|
|
236
|
+
try {
|
|
237
|
+
content = readFileSync(abs, "utf-8");
|
|
238
|
+
} catch {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
for (const re of [staticImportRe, dynamicImportRe]) {
|
|
243
|
+
re.lastIndex = 0;
|
|
244
|
+
let match: RegExpExecArray | null;
|
|
245
|
+
while ((match = re.exec(content)) !== null) {
|
|
246
|
+
const leaked = importNames(match[1] ?? "").filter((name) => DB_WORKSPACE_MECHANICS.has(name));
|
|
247
|
+
if (leaked.length === 0) continue;
|
|
248
|
+
violations.push({
|
|
249
|
+
file: rel,
|
|
250
|
+
line: content.slice(0, match.index).split("\n").length,
|
|
251
|
+
snippet: leaked.join(", "),
|
|
252
|
+
kind: "db-workspace-leak",
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (violations.length > 0) {
|
|
259
|
+
const lines = violations.map(
|
|
260
|
+
(v) => ` ${v.file}:${v.line} [${v.kind}] — ${v.snippet}`,
|
|
261
|
+
);
|
|
262
|
+
assert.fail(
|
|
263
|
+
`Found ${violations.length} DB open-state import(s) from gsd-db.ts:\n` +
|
|
264
|
+
lines.join("\n") +
|
|
265
|
+
"\n\nImport these through db-workspace.ts so gsd-db.ts stays the single-writer implementation, not the caller-facing DB Workspace Interface.",
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
|
|
169
270
|
test("the invariant test touches every .ts module under gsd/ (sanity check)", () => {
|
|
170
271
|
const files = walkTsFiles(gsdDir);
|
|
171
272
|
// Rough sanity: ensure we're not accidentally walking an empty tree
|
|
@@ -177,4 +278,3 @@ test("the invariant test touches every .ts module under gsd/ (sanity check)", ()
|
|
|
177
278
|
assert.ok(rels.includes("memory-store.ts"), "walker must include memory-store.ts");
|
|
178
279
|
assert.ok(rels.includes("workflow-manifest.ts"), "walker must include workflow-manifest.ts");
|
|
179
280
|
});
|
|
180
|
-
|
|
@@ -74,6 +74,33 @@ describe("stale queued milestone selection (#3470)", () => {
|
|
|
74
74
|
assert.equal(m070Entry!.status, "active", "M070 should be active in registry");
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
+
test("queued milestone with roadmap projection but no DB slices stays deferred", async () => {
|
|
78
|
+
base = createFixtureBase();
|
|
79
|
+
openDatabase(":memory:");
|
|
80
|
+
|
|
81
|
+
// M068: queued shell with a stale ROADMAP projection, but no CONTEXT and no DB slices.
|
|
82
|
+
insertMilestone({ id: "M068", title: "Queued Roadmap Projection", status: "queued" });
|
|
83
|
+
writeFile(base, "milestones/M068/M068-ROADMAP.md", "# M068\n\n## Slices\n\n- [ ] **S99: Stale Slice**");
|
|
84
|
+
|
|
85
|
+
// M070: real active milestone — context, roadmap, slices, tasks
|
|
86
|
+
insertMilestone({ id: "M070", title: "Real Active", status: "active" });
|
|
87
|
+
insertSlice({ id: "S01", milestoneId: "M070", title: "Slice One", status: "active", risk: "low", depends: [] });
|
|
88
|
+
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M070", title: "Task One", status: "pending" });
|
|
89
|
+
|
|
90
|
+
writeFile(base, "milestones/M070/M070-CONTEXT.md", "# M070: Real Active\n\nThis is the real milestone.");
|
|
91
|
+
writeFile(base, "milestones/M070/M070-ROADMAP.md", "# M070: Real Active\n\n## Slices\n\n- [ ] **S01: Slice One**");
|
|
92
|
+
writeFile(base, "milestones/M070/slices/S01/S01-PLAN.md", "# S01: Slice One\n\n## Tasks\n\n- [ ] **T01: Task One**");
|
|
93
|
+
|
|
94
|
+
invalidateStateCache();
|
|
95
|
+
const state = await deriveStateFromDb(base);
|
|
96
|
+
|
|
97
|
+
assert.equal(state.activeMilestone?.id, "M070", "ROADMAP-only queued milestone must not block active M070");
|
|
98
|
+
|
|
99
|
+
const m068Entry = state.registry.find((e: any) => e.id === "M068");
|
|
100
|
+
assert.ok(m068Entry, "M068 should still appear in registry");
|
|
101
|
+
assert.equal(m068Entry!.status, "pending", "M068 should stay pending without CONTEXT or DB slices");
|
|
102
|
+
});
|
|
103
|
+
|
|
77
104
|
test("queued milestone WITH context file can still be selected as active", async () => {
|
|
78
105
|
base = createFixtureBase();
|
|
79
106
|
openDatabase(":memory:");
|
|
@@ -3,7 +3,10 @@ import assert from "node:assert/strict";
|
|
|
3
3
|
import { readFileSync } from "node:fs";
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
_resolveEffectiveUnitIsolationModeForTest,
|
|
8
|
+
_withDetachedAutoKeepaliveForTest,
|
|
9
|
+
} from "../auto.ts";
|
|
7
10
|
import {
|
|
8
11
|
_scheduleAutoStartAfterIdleForTest,
|
|
9
12
|
resolveGuidedExecuteLaunchMode,
|
|
@@ -337,19 +340,31 @@ test("resume path only hard-exits on blocked stop, not blocked pause (#6154)", (
|
|
|
337
340
|
});
|
|
338
341
|
|
|
339
342
|
test("prepareForUnit skips worktree safety when isolation is not worktree (#6154)", () => {
|
|
340
|
-
const
|
|
341
|
-
const prepareForUnitIdx =
|
|
342
|
-
const prepareForUnitBody =
|
|
343
|
+
const orchSrc = readGsdFile("auto/orchestrator.ts");
|
|
344
|
+
const prepareForUnitIdx = orchSrc.indexOf("private async prepareWorktreeForUnit(");
|
|
345
|
+
const prepareForUnitBody = orchSrc.slice(prepareForUnitIdx, orchSrc.indexOf("private classifyAndRecover(", prepareForUnitIdx));
|
|
343
346
|
|
|
344
347
|
assert.ok(prepareForUnitIdx > -1, "prepareForUnit should exist");
|
|
345
348
|
assert.ok(
|
|
346
|
-
prepareForUnitBody.includes(
|
|
349
|
+
prepareForUnitBody.includes("const isolationMode = this.getEffectiveUnitIsolationMode(this.runtimeBasePath);"),
|
|
350
|
+
"prepareForUnit should resolve the effective isolation mode once",
|
|
351
|
+
);
|
|
352
|
+
assert.ok(
|
|
353
|
+
prepareForUnitBody.includes('if (isolationMode !== "worktree")'),
|
|
347
354
|
"prepareForUnit should bypass worktree safety validation outside worktree isolation mode",
|
|
348
355
|
);
|
|
349
356
|
});
|
|
350
357
|
|
|
358
|
+
test("effective unit isolation follows degraded branch fallback", () => {
|
|
359
|
+
assert.equal(_resolveEffectiveUnitIsolationModeForTest("worktree", true), "branch");
|
|
360
|
+
assert.equal(_resolveEffectiveUnitIsolationModeForTest("worktree", false), "worktree");
|
|
361
|
+
assert.equal(_resolveEffectiveUnitIsolationModeForTest("branch", true), "branch");
|
|
362
|
+
assert.equal(_resolveEffectiveUnitIsolationModeForTest("none", true), "none");
|
|
363
|
+
});
|
|
364
|
+
|
|
351
365
|
test("discuss-to-auto handoff defaults to step mode unless explicitly disabled", () => {
|
|
352
366
|
const guidedFlowSrc = readGsdFile("guided-flow.ts");
|
|
367
|
+
const discussionHandoffSrc = readGsdFile("discussion-handoff.ts");
|
|
353
368
|
const workflowSrc = readGsdFile("commands/handlers/workflow.ts");
|
|
354
369
|
|
|
355
370
|
assert.ok(
|
|
@@ -357,7 +372,7 @@ test("discuss-to-auto handoff defaults to step mode unless explicitly disabled",
|
|
|
357
372
|
"guided-flow must not hardcode step: false on pending auto-start entries",
|
|
358
373
|
);
|
|
359
374
|
assert.match(
|
|
360
|
-
|
|
375
|
+
discussionHandoffSrc,
|
|
361
376
|
/scheduleAutoStartAfterIdle\(ctx, pi, basePath, false, \{ step: step \?\? true \}\)/,
|
|
362
377
|
"checkAutoStartAfterDiscuss should default missing step flags to step mode",
|
|
363
378
|
);
|
|
@@ -24,7 +24,9 @@ test("buildMinimalGsdToolSet preserves non-GSD tools and replaces broad GSD surf
|
|
|
24
24
|
"gsd_milestone_status",
|
|
25
25
|
"gsd_checkpoint_db",
|
|
26
26
|
"memory_query",
|
|
27
|
+
"gsd_memory_query",
|
|
27
28
|
"capture_thought",
|
|
29
|
+
"gsd_capture_thought",
|
|
28
30
|
"gsd_graph",
|
|
29
31
|
]);
|
|
30
32
|
|
|
@@ -575,6 +577,42 @@ test("scopeGsdWorkflowToolsForDispatch applies and restores per-unit skill visib
|
|
|
575
577
|
assert.equal(calls.filter((call) => call.kind === "skills").length, 2);
|
|
576
578
|
});
|
|
577
579
|
|
|
580
|
+
// ── Regression #534: auto-mode subprocess cannot call gsd_memory_query / gsd_capture_thought ──
|
|
581
|
+
// MCP-workflow subprocesses register the gsd_-prefixed variants, not the pi-native names.
|
|
582
|
+
// MINIMAL_GSD_TOOL_NAMES must include both so resolveScopedToolNames exposes them.
|
|
583
|
+
|
|
584
|
+
test("MINIMAL_GSD_TOOL_NAMES includes gsd_memory_query and gsd_capture_thought (regression #534)", () => {
|
|
585
|
+
assert.ok(
|
|
586
|
+
(MINIMAL_GSD_TOOL_NAMES as readonly string[]).includes("gsd_memory_query"),
|
|
587
|
+
"MINIMAL_GSD_TOOL_NAMES must include gsd_memory_query for MCP-workflow surface parity",
|
|
588
|
+
);
|
|
589
|
+
assert.ok(
|
|
590
|
+
(MINIMAL_GSD_TOOL_NAMES as readonly string[]).includes("gsd_capture_thought"),
|
|
591
|
+
"MINIMAL_GSD_TOOL_NAMES must include gsd_capture_thought for MCP-workflow surface parity",
|
|
592
|
+
);
|
|
593
|
+
});
|
|
594
|
+
|
|
595
|
+
test("buildMinimalAutoGsdToolSet resolves MCP-scoped gsd_memory_query and gsd_capture_thought when subprocess only registers gsd_-prefixed variants (regression #534)", () => {
|
|
596
|
+
// Simulate a subprocess that only exposes gsd_-prefixed MCP tool names,
|
|
597
|
+
// not the pi-native memory_query / capture_thought variants.
|
|
598
|
+
const result = buildMinimalAutoGsdToolSet([
|
|
599
|
+
"bash",
|
|
600
|
+
"read",
|
|
601
|
+
"mcp__gsd-workflow__gsd_exec",
|
|
602
|
+
"mcp__gsd-workflow__gsd_memory_query",
|
|
603
|
+
"mcp__gsd-workflow__gsd_capture_thought",
|
|
604
|
+
], "execute-task");
|
|
605
|
+
|
|
606
|
+
assert.ok(
|
|
607
|
+
result.includes("mcp__gsd-workflow__gsd_memory_query"),
|
|
608
|
+
"mcp__gsd-workflow__gsd_memory_query must be included when only the gsd_-prefixed variant is available",
|
|
609
|
+
);
|
|
610
|
+
assert.ok(
|
|
611
|
+
result.includes("mcp__gsd-workflow__gsd_capture_thought"),
|
|
612
|
+
"mcp__gsd-workflow__gsd_capture_thought must be included when only the gsd_-prefixed variant is available",
|
|
613
|
+
);
|
|
614
|
+
});
|
|
615
|
+
|
|
578
616
|
test("applyUnitSkillVisibility sets manifest or clears for wildcard", () => {
|
|
579
617
|
const calls: Array<string[] | undefined> = [];
|
|
580
618
|
applyUnitSkillVisibility({
|
|
@@ -141,6 +141,41 @@ for (const customType of ["gsd-discuss", "gsd-run"] as const) {
|
|
|
141
141
|
});
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
+
for (const unitType of ["execute-task", "execute-task-simple", "reactive-execute"] as const) {
|
|
145
|
+
test(`${unitType}: resolves gsd_task_complete via alias gsd_complete_task when only alias is registered`, () => {
|
|
146
|
+
// Simulates the MCP transport registering gsd_complete_task (alias) instead of gsd_task_complete.
|
|
147
|
+
// adjust_tool_set strips aliases from providerCompatible, so gsd_complete_task is only present
|
|
148
|
+
// in registeredToolNames. resolveScopedToolNames must still surface it so the agent can complete tasks.
|
|
149
|
+
const base: string[] = [...FULL_REGISTERED_TOOLS];
|
|
150
|
+
const aliasOnlyRegistered = base
|
|
151
|
+
.filter((name) => name !== "gsd_task_complete")
|
|
152
|
+
.concat("gsd_complete_task");
|
|
153
|
+
const aliasStrippedActive = aliasOnlyRegistered.filter((name) => name !== "gsd_complete_task");
|
|
154
|
+
|
|
155
|
+
const result = buildMinimalAutoGsdToolSet(aliasStrippedActive, unitType, aliasOnlyRegistered);
|
|
156
|
+
|
|
157
|
+
assert.ok(
|
|
158
|
+
result.includes("gsd_task_complete") || result.includes("gsd_complete_task"),
|
|
159
|
+
`${unitType} missing gsd_task_complete / gsd_complete_task — agent cannot complete tasks`,
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test(`${unitType}: alias does not duplicate canonical when both are in the active set`, () => {
|
|
164
|
+
// When both canonical and alias are registered/active, only the canonical should be surfaced.
|
|
165
|
+
const bothPresent: string[] = [...FULL_REGISTERED_TOOLS, "gsd_complete_task"];
|
|
166
|
+
|
|
167
|
+
const result = buildMinimalAutoGsdToolSet(bothPresent, unitType, bothPresent);
|
|
168
|
+
|
|
169
|
+
const hasCanonical = result.includes("gsd_task_complete");
|
|
170
|
+
const hasAlias = result.includes("gsd_complete_task");
|
|
171
|
+
assert.ok(hasCanonical || hasAlias, `${unitType} missing completion tool`);
|
|
172
|
+
assert.ok(
|
|
173
|
+
!(hasCanonical && hasAlias),
|
|
174
|
+
`${unitType} surfaces both gsd_task_complete and gsd_complete_task — alias should not duplicate canonical`,
|
|
175
|
+
);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
144
179
|
test("discuss-milestone two-stage scoping matches adjust_tool_set request scope", () => {
|
|
145
180
|
const activeTools = simulateDiscussAllowlistFilter(FULL_REGISTERED_TOOLS);
|
|
146
181
|
const dispatchScoped = buildMinimalAutoGsdToolSet(
|