@opengsd/gsd-pi 1.2.0-dev.e8563f58 → 1.2.0-dev.fbdca60b
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-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/loader.js +6 -4
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +85 -15
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +3 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +18 -6
- package/dist/resources/extensions/gsd/auto-start.js +23 -3
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-verification.js +14 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +45 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/gsd-db.js +15 -20
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +3 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +6 -2
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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.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 +7 -7
- package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-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/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +3 -3
- 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/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
- 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 +50 -6
- 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.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +17 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +459 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +62 -43
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +95 -15
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +10 -16
- package/src/resources/extensions/gsd/auto-dispatch.ts +11 -10
- package/src/resources/extensions/gsd/auto-post-unit.ts +21 -6
- package/src/resources/extensions/gsd/auto-start.ts +24 -4
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-verification.ts +18 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +56 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/gsd-db.ts +15 -19
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +3 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +76 -12
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{LDHRKiRBIVZmiuMjrL1Vy → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{LDHRKiRBIVZmiuMjrL1Vy → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
|
@@ -339,7 +339,7 @@ test("resume path only hard-exits on blocked stop, not blocked pause (#6154)", (
|
|
|
339
339
|
);
|
|
340
340
|
});
|
|
341
341
|
|
|
342
|
-
test("prepareForUnit
|
|
342
|
+
test("prepareForUnit enforces worktree safety for all isolation modes (#6154)", () => {
|
|
343
343
|
const orchSrc = readGsdFile("auto/orchestrator.ts");
|
|
344
344
|
const prepareForUnitIdx = orchSrc.indexOf("private async prepareWorktreeForUnit(");
|
|
345
345
|
const prepareForUnitBody = orchSrc.slice(prepareForUnitIdx, orchSrc.indexOf("private classifyAndRecover(", prepareForUnitIdx));
|
|
@@ -350,8 +350,12 @@ test("prepareForUnit skips worktree safety when isolation is not worktree (#6154
|
|
|
350
350
|
"prepareForUnit should resolve the effective isolation mode once",
|
|
351
351
|
);
|
|
352
352
|
assert.ok(
|
|
353
|
-
prepareForUnitBody.includes('
|
|
354
|
-
"prepareForUnit should
|
|
353
|
+
prepareForUnitBody.includes('const writeScope ='),
|
|
354
|
+
"prepareForUnit should classify the unit's write scope before validating",
|
|
355
|
+
);
|
|
356
|
+
assert.ok(
|
|
357
|
+
!prepareForUnitBody.includes('if (isolationMode !== "worktree")'),
|
|
358
|
+
"prepareForUnit must not bypass worktree safety outside worktree isolation mode",
|
|
355
359
|
);
|
|
356
360
|
});
|
|
357
361
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import test from "node:test";
|
|
4
4
|
import assert from "node:assert/strict";
|
|
5
5
|
|
|
6
|
-
import { _resolveCurrentUnitStartedAtForTest } from "../auto/
|
|
6
|
+
import { _resolveCurrentUnitStartedAtForTest } from "../auto/phase-helpers.ts";
|
|
7
7
|
|
|
8
8
|
test("unit started-at resolver tolerates stopAuto clearing currentUnit", () => {
|
|
9
9
|
assert.equal(_resolveCurrentUnitStartedAtForTest(null), undefined);
|
|
@@ -159,4 +159,21 @@ describe("teardown chdir failure clears registry", () => {
|
|
|
159
159
|
assert.strictEqual(getAutoWorktreeOriginalBase(), null, "registry null after successful teardown");
|
|
160
160
|
assert.strictEqual(getActiveAutoWorktreeContext(), null, "context null after successful teardown");
|
|
161
161
|
});
|
|
162
|
+
|
|
163
|
+
test("teardown survives when current working directory was deleted", () => {
|
|
164
|
+
repoDir = createTempRepo();
|
|
165
|
+
seedMilestone(repoDir, "M003");
|
|
166
|
+
|
|
167
|
+
const worktreePath = createAutoWorktree(repoDir, "M003");
|
|
168
|
+
process.chdir(worktreePath);
|
|
169
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
170
|
+
|
|
171
|
+
assert.doesNotThrow(
|
|
172
|
+
() => teardownAutoWorktree(repoDir, "M003"),
|
|
173
|
+
"teardownAutoWorktree should not call process.cwd() unguarded from a deleted cwd",
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
assert.strictEqual(getAutoWorktreeOriginalBase(), null, "registry null after deleted-cwd teardown");
|
|
177
|
+
assert.strictEqual(getActiveAutoWorktreeContext(), null, "context null after deleted-cwd teardown");
|
|
178
|
+
});
|
|
162
179
|
});
|
|
@@ -365,13 +365,14 @@ test("buildMinimalAutoGsdToolSet includes closeout tool for complete-slice", ()
|
|
|
365
365
|
"gsd_complete_slice",
|
|
366
366
|
"memory_query",
|
|
367
367
|
"capture_thought",
|
|
368
|
+
"gsd_capture_thought",
|
|
368
369
|
], "complete-slice");
|
|
369
370
|
|
|
370
371
|
assert.ok(result.includes("gsd_slice_complete"));
|
|
371
372
|
assert.ok(result.includes("gsd_task_reopen"));
|
|
372
373
|
assert.ok(result.includes("gsd_replan_slice"));
|
|
373
374
|
assert.ok(result.includes("subagent"));
|
|
374
|
-
assert.ok(result.includes("
|
|
375
|
+
assert.ok(result.includes("gsd_capture_thought"));
|
|
375
376
|
assert.ok(!result.includes("gsd_task_complete"));
|
|
376
377
|
assert.ok(!result.includes("gsd_complete_slice"));
|
|
377
378
|
});
|
|
@@ -387,6 +388,7 @@ test("buildMinimalAutoGsdToolSet preserves workflow MCP-namespaced closeout tool
|
|
|
387
388
|
"mcp__gsd-workflow__gsd_exec",
|
|
388
389
|
"mcp__gsd-workflow__memory_query",
|
|
389
390
|
"mcp__gsd-workflow__capture_thought",
|
|
391
|
+
"mcp__gsd-workflow__gsd_capture_thought",
|
|
390
392
|
], "complete-slice");
|
|
391
393
|
|
|
392
394
|
assert.ok(result.includes("mcp__gsd-workflow__gsd_task_reopen"));
|
|
@@ -395,7 +397,7 @@ test("buildMinimalAutoGsdToolSet preserves workflow MCP-namespaced closeout tool
|
|
|
395
397
|
assert.ok(!result.includes("mcp__gsd-workflow__gsd_complete_slice"));
|
|
396
398
|
assert.ok(result.includes("mcp__gsd-workflow__gsd_exec"));
|
|
397
399
|
assert.ok(result.includes("mcp__gsd-workflow__memory_query"));
|
|
398
|
-
assert.ok(result.includes("mcp__gsd-
|
|
400
|
+
assert.ok(result.includes("mcp__gsd-workflow__gsd_capture_thought"));
|
|
399
401
|
});
|
|
400
402
|
|
|
401
403
|
test("buildMinimalAutoGsdToolSet covers execute-task-simple", () => {
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
import { describe, test } from "node:test";
|
|
5
5
|
import assert from "node:assert/strict";
|
|
6
6
|
|
|
7
|
-
import { getToolSurfaceReadinessError } from "../tool-surface-readiness.ts";
|
|
7
|
+
import { getToolSurfaceReadinessError, awaitWorkflowMcpToolRegistration } from "../tool-surface-readiness.ts";
|
|
8
|
+
import { clearWorkflowMcpProbeCache, recordWorkflowMcpProbe } from "../workflow-mcp-readiness-cache.ts";
|
|
8
9
|
import { isToolUnavailableError } from "../auto-tool-tracking.ts";
|
|
9
10
|
import { classifyError, isTransient } from "../error-classifier.ts";
|
|
10
11
|
import { toMcpToolName } from "../mcp-tool-name.ts";
|
|
@@ -58,18 +59,82 @@ describe("getToolSurfaceReadinessError", () => {
|
|
|
58
59
|
assert.match(error, /gsd_uat_exec/);
|
|
59
60
|
});
|
|
60
61
|
|
|
61
|
-
test("
|
|
62
|
-
// The SDK reports still-connecting servers as "pending" at init — the
|
|
63
|
-
// common healthy session. A genuine miss after pass-through is caught
|
|
64
|
-
// in-session ("No such tool available" → tool-unavailable → retry).
|
|
62
|
+
test("still blocks pending init when required tools are absent from the live surface", () => {
|
|
65
63
|
const error = getToolSurfaceReadinessError({
|
|
66
|
-
unitType: "
|
|
64
|
+
unitType: "run-uat",
|
|
67
65
|
workflowServerName: SERVER,
|
|
68
66
|
observation: { tools: ["read", "bash"], mcpServers: [{ name: SERVER, status: "pending" }] },
|
|
69
67
|
});
|
|
68
|
+
assert.ok(error);
|
|
69
|
+
assert.match(error!, /status is "pending"/);
|
|
70
|
+
assert.match(error!, /gsd_uat_exec/);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("accepts pending server status when the live init surface already contains every required tool", () => {
|
|
74
|
+
const error = getToolSurfaceReadinessError({
|
|
75
|
+
unitType: "run-uat",
|
|
76
|
+
workflowServerName: SERVER,
|
|
77
|
+
observation: {
|
|
78
|
+
tools: [
|
|
79
|
+
prefixed("gsd_uat_exec"),
|
|
80
|
+
prefixed("gsd_uat_result_save"),
|
|
81
|
+
prefixed("gsd_resume"),
|
|
82
|
+
prefixed("gsd_milestone_status"),
|
|
83
|
+
prefixed("gsd_journal_query"),
|
|
84
|
+
],
|
|
85
|
+
mcpServers: [{ name: SERVER, status: "pending" }],
|
|
86
|
+
},
|
|
87
|
+
});
|
|
70
88
|
assert.equal(error, null);
|
|
71
89
|
});
|
|
72
90
|
|
|
91
|
+
test("does not accept a pending live init surface just because a probe cache covers required tools", () => {
|
|
92
|
+
clearWorkflowMcpProbeCache();
|
|
93
|
+
const projectRoot = "/tmp/project-discuss-probe";
|
|
94
|
+
recordWorkflowMcpProbe(projectRoot, SERVER, [
|
|
95
|
+
"ask_user_questions",
|
|
96
|
+
"gsd_summary_save",
|
|
97
|
+
"gsd_requirement_save",
|
|
98
|
+
"gsd_requirement_update",
|
|
99
|
+
"gsd_plan_milestone",
|
|
100
|
+
"gsd_milestone_generate_id",
|
|
101
|
+
]);
|
|
102
|
+
|
|
103
|
+
const error = getToolSurfaceReadinessError({
|
|
104
|
+
unitType: "discuss-milestone",
|
|
105
|
+
workflowServerName: SERVER,
|
|
106
|
+
projectRoot,
|
|
107
|
+
observation: {
|
|
108
|
+
tools: [],
|
|
109
|
+
mcpServers: [{ name: SERVER, status: "pending" }],
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
assert.ok(error, "expected live init tools to be authoritative over direct probe cache");
|
|
114
|
+
assert.match(error, /status is "pending"/);
|
|
115
|
+
assert.match(error, /ask_user_questions/);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("pending server status reports only required tools missing from the live init surface", () => {
|
|
119
|
+
const error = getToolSurfaceReadinessError({
|
|
120
|
+
unitType: "run-uat",
|
|
121
|
+
workflowServerName: SERVER,
|
|
122
|
+
observation: {
|
|
123
|
+
tools: [
|
|
124
|
+
prefixed("gsd_uat_result_save"),
|
|
125
|
+
prefixed("gsd_resume"),
|
|
126
|
+
prefixed("gsd_milestone_status"),
|
|
127
|
+
prefixed("gsd_journal_query"),
|
|
128
|
+
],
|
|
129
|
+
mcpServers: [{ name: SERVER, status: "pending" }],
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
assert.ok(error, "expected a readiness error while gsd_uat_exec is still absent");
|
|
133
|
+
assert.match(error, /status is "pending"/);
|
|
134
|
+
assert.match(error, /gsd_uat_exec/);
|
|
135
|
+
assert.doesNotMatch(error, /gsd_uat_result_save/);
|
|
136
|
+
});
|
|
137
|
+
|
|
73
138
|
test("returns null when all required tools are registered under the MCP prefix", () => {
|
|
74
139
|
const error = getToolSurfaceReadinessError({
|
|
75
140
|
unitType: "run-uat",
|
|
@@ -82,7 +147,7 @@ describe("getToolSurfaceReadinessError", () => {
|
|
|
82
147
|
assert.equal(error, null);
|
|
83
148
|
});
|
|
84
149
|
|
|
85
|
-
test("reports the failed server
|
|
150
|
+
test("reports the failed server as terminal", () => {
|
|
86
151
|
const error = getToolSurfaceReadinessError({
|
|
87
152
|
unitType: "run-uat",
|
|
88
153
|
workflowServerName: SERVER,
|
|
@@ -90,7 +155,20 @@ describe("getToolSurfaceReadinessError", () => {
|
|
|
90
155
|
});
|
|
91
156
|
assert.ok(error, "expected a readiness error");
|
|
92
157
|
assert.match(error, /workflow tool surface not ready for run-uat/);
|
|
93
|
-
assert.match(error, /
|
|
158
|
+
assert.match(error, /terminal/);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("reports terminal status even when required tools are already on the init surface", () => {
|
|
162
|
+
const error = getToolSurfaceReadinessError({
|
|
163
|
+
unitType: "run-uat",
|
|
164
|
+
workflowServerName: SERVER,
|
|
165
|
+
observation: {
|
|
166
|
+
tools: RUN_UAT_TOOLS.map(prefixed),
|
|
167
|
+
mcpServers: [{ name: SERVER, status: "failed" }],
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
assert.ok(error, "expected a readiness error despite tools on the surface");
|
|
171
|
+
assert.match(error, /terminal/);
|
|
94
172
|
assert.match(error, /gsd_uat_exec/);
|
|
95
173
|
});
|
|
96
174
|
|
|
@@ -101,7 +179,7 @@ describe("getToolSurfaceReadinessError", () => {
|
|
|
101
179
|
observation: { tools: ["read", "bash"], mcpServers: [{ name: SERVER, status: "needs-auth" }] },
|
|
102
180
|
});
|
|
103
181
|
assert.ok(error, "expected a readiness error for needs-auth");
|
|
104
|
-
assert.match(error, /
|
|
182
|
+
assert.match(error, /terminal/);
|
|
105
183
|
});
|
|
106
184
|
|
|
107
185
|
test("aborts on disabled (terminal — cannot self-heal)", () => {
|
|
@@ -111,7 +189,7 @@ describe("getToolSurfaceReadinessError", () => {
|
|
|
111
189
|
observation: { tools: ["read", "bash"], mcpServers: [{ name: SERVER, status: "disabled" }] },
|
|
112
190
|
});
|
|
113
191
|
assert.ok(error, "expected a readiness error for disabled");
|
|
114
|
-
assert.match(error, /
|
|
192
|
+
assert.match(error, /terminal/);
|
|
115
193
|
});
|
|
116
194
|
|
|
117
195
|
test("reports partially-registered surfaces even when the server says connected", () => {
|
|
@@ -128,6 +206,102 @@ describe("getToolSurfaceReadinessError", () => {
|
|
|
128
206
|
assert.match(error, /gsd_uat_result_save/);
|
|
129
207
|
assert.doesNotMatch(error, /gsd_uat_exec,/);
|
|
130
208
|
});
|
|
209
|
+
|
|
210
|
+
test("reports the screenshot case: result save registered but UAT exec missing", () => {
|
|
211
|
+
const error = getToolSurfaceReadinessError({
|
|
212
|
+
unitType: "run-uat",
|
|
213
|
+
workflowServerName: SERVER,
|
|
214
|
+
observation: {
|
|
215
|
+
tools: [
|
|
216
|
+
prefixed("gsd_uat_result_save"),
|
|
217
|
+
prefixed("gsd_resume"),
|
|
218
|
+
prefixed("gsd_milestone_status"),
|
|
219
|
+
prefixed("gsd_journal_query"),
|
|
220
|
+
],
|
|
221
|
+
mcpServers: [{ name: SERVER, status: "connected" }],
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
assert.ok(error, "expected a readiness error when gsd_uat_exec is absent");
|
|
225
|
+
assert.match(error, /connected but has not registered/);
|
|
226
|
+
assert.match(error, /gsd_uat_exec/);
|
|
227
|
+
assert.doesNotMatch(error, /gsd_uat_result_save/);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
describe("awaitWorkflowMcpToolRegistration", () => {
|
|
232
|
+
test("does not skip live probe when cache already covers required tools", async () => {
|
|
233
|
+
clearWorkflowMcpProbeCache();
|
|
234
|
+
const { recordWorkflowMcpProbe } = await import("../workflow-mcp-readiness-cache.ts");
|
|
235
|
+
recordWorkflowMcpProbe("/tmp/project-cache-hit", SERVER, RUN_UAT_TOOLS);
|
|
236
|
+
|
|
237
|
+
let probeCalls = 0;
|
|
238
|
+
const error = await awaitWorkflowMcpToolRegistration({
|
|
239
|
+
unitType: "run-uat",
|
|
240
|
+
workflowServerName: SERVER,
|
|
241
|
+
projectRoot: "/tmp/project-cache-hit",
|
|
242
|
+
timeoutMs: 1,
|
|
243
|
+
pollMs: 1,
|
|
244
|
+
probe: async () => {
|
|
245
|
+
probeCalls += 1;
|
|
246
|
+
return { ok: true, tools: RUN_UAT_TOOLS };
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
assert.equal(error, null);
|
|
250
|
+
assert.ok(probeCalls > 0, "preflight must probe the live MCP server even when cache is warm");
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test("resolves when probe reports required tools", async () => {
|
|
254
|
+
clearWorkflowMcpProbeCache();
|
|
255
|
+
const error = await awaitWorkflowMcpToolRegistration({
|
|
256
|
+
unitType: "run-uat",
|
|
257
|
+
workflowServerName: SERVER,
|
|
258
|
+
projectRoot: "/tmp/project",
|
|
259
|
+
timeoutMs: 1_000,
|
|
260
|
+
pollMs: 1,
|
|
261
|
+
probe: async () => ({
|
|
262
|
+
ok: true,
|
|
263
|
+
tools: RUN_UAT_TOOLS,
|
|
264
|
+
}),
|
|
265
|
+
});
|
|
266
|
+
assert.equal(error, null);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test("times out when required tools never register", async () => {
|
|
270
|
+
clearWorkflowMcpProbeCache();
|
|
271
|
+
const error = await awaitWorkflowMcpToolRegistration({
|
|
272
|
+
unitType: "run-uat",
|
|
273
|
+
workflowServerName: SERVER,
|
|
274
|
+
projectRoot: "/tmp/project",
|
|
275
|
+
timeoutMs: 5,
|
|
276
|
+
pollMs: 1,
|
|
277
|
+
probe: async () => ({ ok: true, tools: ["gsd_uat_result_save"] }),
|
|
278
|
+
});
|
|
279
|
+
assert.ok(error);
|
|
280
|
+
assert.match(error!, /did not register required tools before session start/);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
test("aborts while waiting for workflow MCP tools", async () => {
|
|
284
|
+
clearWorkflowMcpProbeCache();
|
|
285
|
+
const controller = new AbortController();
|
|
286
|
+
let probeCount = 0;
|
|
287
|
+
const wait = awaitWorkflowMcpToolRegistration({
|
|
288
|
+
unitType: "run-uat",
|
|
289
|
+
workflowServerName: SERVER,
|
|
290
|
+
projectRoot: "/tmp/project-abort",
|
|
291
|
+
timeoutMs: 10_000,
|
|
292
|
+
pollMs: 10_000,
|
|
293
|
+
signal: controller.signal,
|
|
294
|
+
probe: async () => {
|
|
295
|
+
probeCount += 1;
|
|
296
|
+
return { ok: true, tools: ["gsd_uat_result_save"] };
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
controller.abort();
|
|
301
|
+
|
|
302
|
+
await assert.rejects(wait, /AbortError/);
|
|
303
|
+
assert.equal(probeCount, 1);
|
|
304
|
+
});
|
|
131
305
|
});
|
|
132
306
|
|
|
133
307
|
describe("readiness error classification contract", () => {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for MCP tool-availability race.
|
|
3
|
+
*
|
|
4
|
+
* When the MCP workflow server is still connecting, tool calls fail with
|
|
5
|
+
* "No such tool available". The bounded retry counter on AutoSession
|
|
6
|
+
* (toolUnavailableRetries) prevents infinite re-dispatch loops by capping
|
|
7
|
+
* retries at 3 with escalating delay, then pausing auto-mode.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, test } from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import { AutoSession } from "../auto/session.ts";
|
|
12
|
+
|
|
13
|
+
describe("toolUnavailableRetries on AutoSession", () => {
|
|
14
|
+
test("defaults to 0", () => {
|
|
15
|
+
const s = new AutoSession();
|
|
16
|
+
assert.equal(s.toolUnavailableRetries, 0);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("is cleared on reset()", () => {
|
|
20
|
+
const s = new AutoSession();
|
|
21
|
+
s.toolUnavailableRetries = 2;
|
|
22
|
+
s.reset();
|
|
23
|
+
assert.equal(s.toolUnavailableRetries, 0);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("accumulates across assignments (simulates retry increments)", () => {
|
|
27
|
+
const s = new AutoSession();
|
|
28
|
+
s.toolUnavailableRetries = 1;
|
|
29
|
+
s.toolUnavailableRetries = 2;
|
|
30
|
+
s.toolUnavailableRetries = 3;
|
|
31
|
+
assert.equal(s.toolUnavailableRetries, 3);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// gsd-pi — Regression tests for the centralized transport gate and
|
|
2
|
+
// milestone double-complete guard (auto-dispatch.ts + phases.ts).
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { mkdirSync, mkdtempSync, rmSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { tmpdir } from "node:os";
|
|
9
|
+
|
|
10
|
+
import { resolveDispatch } from "../auto-dispatch.ts";
|
|
11
|
+
import { openDatabase, closeDatabase, insertMilestone, getMilestone } from "../gsd-db.ts";
|
|
12
|
+
import { isClosedStatus } from "../status-guards.ts";
|
|
13
|
+
import { getWorkflowTransportSupportError } from "../workflow-mcp.ts";
|
|
14
|
+
|
|
15
|
+
// ── transport gate: getWorkflowTransportSupportError blocks missing tools ────
|
|
16
|
+
|
|
17
|
+
test("getWorkflowTransportSupportError blocks when required non-surface tools are missing", () => {
|
|
18
|
+
const err = getWorkflowTransportSupportError(
|
|
19
|
+
"claude-code",
|
|
20
|
+
["custom_non_surface_tool"],
|
|
21
|
+
{
|
|
22
|
+
projectRoot: process.cwd(),
|
|
23
|
+
surface: "auto-mode",
|
|
24
|
+
unitType: "execute-task",
|
|
25
|
+
authMode: "externalCli",
|
|
26
|
+
baseUrl: "local://claude-code",
|
|
27
|
+
activeTools: ["some_other_tool"],
|
|
28
|
+
},
|
|
29
|
+
);
|
|
30
|
+
assert.ok(err, "should return an error when required non-surface tools are missing from activeTools");
|
|
31
|
+
assert.match(err, /cannot run/i);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("getWorkflowTransportSupportError passes for non-MCP transport", () => {
|
|
35
|
+
const err = getWorkflowTransportSupportError(
|
|
36
|
+
"claude-code",
|
|
37
|
+
["custom_non_surface_tool"],
|
|
38
|
+
{
|
|
39
|
+
projectRoot: process.cwd(),
|
|
40
|
+
surface: "auto-mode",
|
|
41
|
+
unitType: "execute-task",
|
|
42
|
+
authMode: "apiKey",
|
|
43
|
+
baseUrl: "https://api.anthropic.com",
|
|
44
|
+
activeTools: [],
|
|
45
|
+
},
|
|
46
|
+
);
|
|
47
|
+
assert.equal(err, null, "non-MCP transport should not be blocked");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("resolveDispatch allows dispatch when MCP tools are available", async (t) => {
|
|
51
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-transport-pass-"));
|
|
52
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
53
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
54
|
+
t.after(() => {
|
|
55
|
+
closeDatabase();
|
|
56
|
+
rmSync(base, { recursive: true, force: true });
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
60
|
+
|
|
61
|
+
const action = await resolveDispatch({
|
|
62
|
+
basePath: base,
|
|
63
|
+
mid: "M001",
|
|
64
|
+
midTitle: "Test",
|
|
65
|
+
state: {
|
|
66
|
+
phase: "executing",
|
|
67
|
+
activeMilestone: { id: "M001", title: "Test", status: "active" },
|
|
68
|
+
activeSlice: { id: "S01", title: "Slice" },
|
|
69
|
+
activeTask: { id: "M001/S01/T01", title: "Task", status: "pending" },
|
|
70
|
+
registry: [],
|
|
71
|
+
blockers: [],
|
|
72
|
+
} as any,
|
|
73
|
+
prefs: undefined,
|
|
74
|
+
// No transport gate deps → no MCP check → dispatch should go through
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
assert.equal(action.action, "dispatch");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// ── double-complete guard: isClosedStatus prevents duplicate closeout ────────
|
|
81
|
+
|
|
82
|
+
test("isClosedStatus detects complete milestone status", () => {
|
|
83
|
+
assert.equal(isClosedStatus("complete"), true);
|
|
84
|
+
assert.equal(isClosedStatus("done"), true);
|
|
85
|
+
assert.equal(isClosedStatus("skipped"), true);
|
|
86
|
+
assert.equal(isClosedStatus("closed"), true);
|
|
87
|
+
assert.equal(isClosedStatus("active"), false);
|
|
88
|
+
assert.equal(isClosedStatus("pending"), false);
|
|
89
|
+
assert.equal(isClosedStatus(""), false);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("getMilestone + isClosedStatus guards against double-complete dispatch", (t) => {
|
|
93
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-double-complete-"));
|
|
94
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
95
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
96
|
+
t.after(() => {
|
|
97
|
+
closeDatabase();
|
|
98
|
+
rmSync(base, { recursive: true, force: true });
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
insertMilestone({ id: "M001", title: "Test", status: "complete" });
|
|
102
|
+
|
|
103
|
+
// resolveDispatch itself checks for closed milestones at the top
|
|
104
|
+
// (before any dispatch rule fires), which is the same guard used
|
|
105
|
+
// by the phases.ts double-complete check.
|
|
106
|
+
const milestone = getMilestone("M001");
|
|
107
|
+
assert.ok(milestone, "milestone should exist in DB");
|
|
108
|
+
assert.equal(isClosedStatus(milestone.status), true, "closed milestone must be detected");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("resolveDispatch stops on closed milestone before dispatching", async (t) => {
|
|
112
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-closed-milestone-"));
|
|
113
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
114
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
115
|
+
t.after(() => {
|
|
116
|
+
closeDatabase();
|
|
117
|
+
rmSync(base, { recursive: true, force: true });
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
insertMilestone({ id: "M001", title: "Test", status: "complete" });
|
|
121
|
+
|
|
122
|
+
const action = await resolveDispatch({
|
|
123
|
+
basePath: base,
|
|
124
|
+
mid: "M001",
|
|
125
|
+
midTitle: "Test",
|
|
126
|
+
state: {
|
|
127
|
+
phase: "complete",
|
|
128
|
+
activeMilestone: { id: "M001", title: "Test", status: "complete" },
|
|
129
|
+
activeSlice: null,
|
|
130
|
+
activeTask: null,
|
|
131
|
+
registry: [],
|
|
132
|
+
blockers: [],
|
|
133
|
+
} as any,
|
|
134
|
+
prefs: undefined,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
assert.equal(action.action, "stop");
|
|
138
|
+
assert.match(action.reason ?? "", /closed/i);
|
|
139
|
+
});
|
|
@@ -4,6 +4,7 @@ import { mkdtempSync, readFileSync, rmSync, existsSync } from "node:fs";
|
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { emitJournalEvent } from "../journal.ts";
|
|
7
|
+
import { appendEvent } from "../workflow-events.ts";
|
|
7
8
|
import { saveActivityLog } from "../activity-log.ts";
|
|
8
9
|
import { initMetrics, resetMetrics, snapshotUnitMetrics } from "../metrics.ts";
|
|
9
10
|
import { setLogBasePath, logWarning } from "../workflow-logger.ts";
|
|
@@ -38,6 +39,12 @@ test("unified audit plane bridges journal/activity/metrics/workflow logger into
|
|
|
38
39
|
eventType: "iteration-start",
|
|
39
40
|
data: { turnId: "turn-123", unitId: "M001/S01/T01" },
|
|
40
41
|
});
|
|
42
|
+
appendEvent(basePath, {
|
|
43
|
+
cmd: "complete-task",
|
|
44
|
+
params: { milestoneId: "M001", sliceId: "S01", taskId: "T01" },
|
|
45
|
+
ts: new Date().toISOString(),
|
|
46
|
+
actor: "agent",
|
|
47
|
+
});
|
|
41
48
|
|
|
42
49
|
const activityCtx = makeMockContext([
|
|
43
50
|
{ type: "message", message: { role: "assistant", content: [{ type: "text", text: "hello" }] } },
|
|
@@ -73,6 +80,7 @@ test("unified audit plane bridges journal/activity/metrics/workflow logger into
|
|
|
73
80
|
const events = readAuditEvents(basePath);
|
|
74
81
|
const types = new Set(events.map((event) => String(event.type ?? "")));
|
|
75
82
|
assert.ok(types.has("journal-iteration-start"));
|
|
83
|
+
assert.ok(types.has("workflow-event-complete_task"));
|
|
76
84
|
assert.ok(types.has("activity-log-saved"));
|
|
77
85
|
assert.ok(types.has("unit-metrics-snapshot"));
|
|
78
86
|
assert.ok(types.has("workflow-log-warn"));
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
_needsPlanV2GateForTest,
|
|
23
23
|
_runPlanV2GateForTest,
|
|
24
24
|
} from "../guided-flow.ts";
|
|
25
|
-
import { shouldRunPlanV2Gate } from "../auto/
|
|
25
|
+
import { shouldRunPlanV2Gate } from "../auto/phase-helpers.ts";
|
|
26
26
|
import { resolveUokFlags } from "../uok/flags.ts";
|
|
27
27
|
|
|
28
28
|
const MILESTONE_ID = "M001";
|
|
@@ -24,6 +24,8 @@ test("execute-task fails closed when no host-owned checks are discovered", () =>
|
|
|
24
24
|
assert.equal(verdict.reason, "no-host-checks");
|
|
25
25
|
assert.equal(verdict.retryable, false);
|
|
26
26
|
assert.match(verdict.failureContext, /No runnable host-owned verification command/);
|
|
27
|
+
assert.match(verdict.failureContext, /\.gsd\/PREFERENCES\.md/);
|
|
28
|
+
assert.match(verdict.failureContext, /\/gsd next/);
|
|
27
29
|
});
|
|
28
30
|
|
|
29
31
|
test("execute-task passes when non-runnable task-plan prose is the verification source", () => {
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
compactMilestoneEvents,
|
|
14
14
|
type WorkflowEvent,
|
|
15
15
|
} from '../workflow-events.ts';
|
|
16
|
+
import { workflowEventLogPath } from '../workflow-event-ledger.ts';
|
|
16
17
|
|
|
17
18
|
function tempDir(): string {
|
|
18
19
|
return fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-events-'));
|
|
@@ -38,6 +39,24 @@ test('workflow-events: appendEvent creates .gsd dir and event-log.jsonl', () =>
|
|
|
38
39
|
}
|
|
39
40
|
});
|
|
40
41
|
|
|
42
|
+
test('workflow-events: appendEvent from canonical worktree writes project ledger', () => {
|
|
43
|
+
const base = tempDir();
|
|
44
|
+
try {
|
|
45
|
+
const worktree = path.join(base, '.gsd-worktrees', 'M001');
|
|
46
|
+
fs.mkdirSync(worktree, { recursive: true });
|
|
47
|
+
|
|
48
|
+
appendEvent(worktree, makeEvent('complete-task', { milestoneId: 'M001', taskId: 'T01' }));
|
|
49
|
+
|
|
50
|
+
const projectLog = path.join(base, '.gsd', 'event-log.jsonl');
|
|
51
|
+
const worktreeLog = path.join(worktree, '.gsd', 'event-log.jsonl');
|
|
52
|
+
assert.ok(fs.existsSync(projectLog), 'project event ledger should exist');
|
|
53
|
+
assert.equal(fs.existsSync(worktreeLog), false, 'worktree-local event log should not be the append target');
|
|
54
|
+
assert.equal(workflowEventLogPath(worktree), projectLog);
|
|
55
|
+
} finally {
|
|
56
|
+
cleanupDir(base);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
41
60
|
test('workflow-events: appendEvent writes valid JSON line', () => {
|
|
42
61
|
const base = tempDir();
|
|
43
62
|
try {
|