@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
|
@@ -329,7 +329,7 @@ export function acquireSessionLock(basePath) {
|
|
|
329
329
|
// #3218: Provide actionable workaround when lock recovery fails
|
|
330
330
|
const lockDirPath = lockTarget + ".lock";
|
|
331
331
|
const reason = existingPid
|
|
332
|
-
? `Another auto-mode session (PID ${existingPid}) appears to be running.\
|
|
332
|
+
? `Another auto-mode session (PID ${existingPid}) appears to be running.\nRun \`/gsd stop\` for graceful shutdown, or choose "Force start" from \`/gsd auto\` to terminate it.`
|
|
333
333
|
: `Another auto-mode session lock is stuck on this project.\nRun: rm -rf "${lockDirPath}" && rm -f "${lp}"`;
|
|
334
334
|
return { acquired: false, reason, existingPid };
|
|
335
335
|
}
|
|
@@ -108,11 +108,8 @@ function formatSkillActivationBlock(skillNames) {
|
|
|
108
108
|
const safe = skillNames.filter(name => SAFE_SKILL_NAME.test(name));
|
|
109
109
|
if (safe.length === 0)
|
|
110
110
|
return "";
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
// parameter name, causing tool validation failures — see #2224.
|
|
114
|
-
const calls = safe.map(name => `Call Skill({ skill: '${name}' })`).join('. ');
|
|
115
|
-
return `<skill_activation>${calls}.</skill_activation>`;
|
|
111
|
+
const reads = safe.map(name => `Read the installed '${name}' skill file from <available_skills>`).join(". ");
|
|
112
|
+
return `<skill_activation>${reads}.</skill_activation>`;
|
|
116
113
|
}
|
|
117
114
|
/**
|
|
118
115
|
* Manifest-driven recommendations block — informational only, does NOT
|
|
@@ -132,7 +129,7 @@ function formatSkillRecommendationsBlock(unitType, skillNames) {
|
|
|
132
129
|
const safe = skillNames.filter(name => SAFE_SKILL_NAME.test(name));
|
|
133
130
|
if (safe.length === 0)
|
|
134
131
|
return "";
|
|
135
|
-
return `<skill_recommendations unit="${unitType}">For this unit type, also consider
|
|
132
|
+
return `<skill_recommendations unit="${unitType}">For this unit type, also consider reading these installed skill files from <available_skills>: ${safe.join(", ")}. These are recommendations, not requirements.</skill_recommendations>`;
|
|
136
133
|
}
|
|
137
134
|
export function buildSkillActivationBlock(params) {
|
|
138
135
|
const prefs = params.preferences ?? loadEffectiveGSDPreferences(params.base)?.preferences;
|
|
@@ -23,7 +23,7 @@ import { logWarning } from './workflow-logger.js';
|
|
|
23
23
|
import { extractVerdict } from './verdict-parser.js';
|
|
24
24
|
import { detectPendingEscalation } from './escalation.js';
|
|
25
25
|
import { isTerminalMilestoneSummaryContent } from './milestone-summary-classifier.js';
|
|
26
|
-
import { isDbAvailable, getAllMilestones, getMilestone,
|
|
26
|
+
import { isDbAvailable, getAllMilestones, getMilestone, getSlicesByMilestoneIds, getSliceTasks, getReplanHistory, getSlice, getRequirementCounts, getLatestAssessmentByScope, getPendingGateCountForTurn, } from './gsd-db.js';
|
|
27
27
|
import { wasWorkflowDatabaseOpenAttempted } from './db-workspace.js';
|
|
28
28
|
import { formatCompletePhaseNextAction, countUnmappedActiveRequirements } from './requirements-backlog.js';
|
|
29
29
|
import { classifyMilestoneReadiness, readinessNeedsDiscussion, } from './milestone-readiness.js';
|
|
@@ -366,12 +366,16 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
|
|
|
366
366
|
let activeMilestoneFound = false;
|
|
367
367
|
let activeMilestoneHasDraft = false;
|
|
368
368
|
let firstDeferredQueuedShell = null;
|
|
369
|
+
const activeMilestoneIds = milestones
|
|
370
|
+
.filter((m) => !parkedMilestoneIds.has(m.id))
|
|
371
|
+
.map((m) => m.id);
|
|
372
|
+
const slicesByMilestone = getSlicesByMilestoneIds(activeMilestoneIds);
|
|
369
373
|
for (const m of milestones) {
|
|
370
374
|
if (parkedMilestoneIds.has(m.id)) {
|
|
371
375
|
registry.push({ id: m.id, title: stripMilestonePrefix(m.title) || m.id, status: 'parked' });
|
|
372
376
|
continue;
|
|
373
377
|
}
|
|
374
|
-
const slices =
|
|
378
|
+
const slices = slicesByMilestone.get(m.id) ?? [];
|
|
375
379
|
// DB-authoritative completeness (#4179): only trust completeMilestoneIds,
|
|
376
380
|
// which is itself derived from DB status. SUMMARY-file presence alone must
|
|
377
381
|
// not imply completion.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: ADR-015 Tool Contract module for Unit prompt, policy, and tool parity.
|
|
3
3
|
import { resolveManifest, } from "./unit-context-manifest.js";
|
|
4
|
-
import {
|
|
5
|
-
import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
|
|
4
|
+
import { getWorkflowTransportSupportError, } from "./workflow-mcp.js";
|
|
5
|
+
import { getRequiredWorkflowToolsForUnit, getUnitToolSurfaceContract, } from "./unit-tool-contracts.js";
|
|
6
6
|
import { WHOLE_FILE_OBSERVATION_MAX_BYTES, WHOLE_FILE_OBSERVATION_MAX_LINES, } from "./source-observations.js";
|
|
7
7
|
export function compileUnitContextContract(unitType) {
|
|
8
8
|
const manifest = resolveManifest(unitType);
|
|
@@ -15,6 +15,17 @@ export function compileUnitContextContract(unitType) {
|
|
|
15
15
|
}
|
|
16
16
|
return { ok: true, contract: buildPromptContextContract(unitType, manifest) };
|
|
17
17
|
}
|
|
18
|
+
export function getUnitWorkflowDispatchReadinessError(input) {
|
|
19
|
+
return getWorkflowTransportSupportError(input.provider, getRequiredWorkflowToolsForUnit(input.unitType), {
|
|
20
|
+
projectRoot: input.projectRoot,
|
|
21
|
+
env: input.env,
|
|
22
|
+
surface: input.surface,
|
|
23
|
+
unitType: input.unitType,
|
|
24
|
+
authMode: input.authMode,
|
|
25
|
+
baseUrl: input.baseUrl,
|
|
26
|
+
activeTools: input.activeTools,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
18
29
|
export function compileUnitToolContract(unitType) {
|
|
19
30
|
const manifest = resolveManifest(unitType);
|
|
20
31
|
const surfaceContract = getUnitToolSurfaceContract(unitType);
|
|
@@ -25,7 +36,7 @@ export function compileUnitToolContract(unitType) {
|
|
|
25
36
|
detail: `No Unit manifest is registered for ${unitType}`,
|
|
26
37
|
};
|
|
27
38
|
}
|
|
28
|
-
const requiredWorkflowTools =
|
|
39
|
+
const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType);
|
|
29
40
|
const forbiddenWorkflowTools = Object.entries(surfaceContract?.forbiddenGsdTools ?? {})
|
|
30
41
|
.map(([name, reason]) => ({ name, reason }));
|
|
31
42
|
const closeoutTools = requiredWorkflowTools.filter((tool) => /^gsd_(?:task|slice|milestone|complete|validate|save|summary|uat)/.test(tool));
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Tool Contract module's runtime face — verify the live SDK tool surface covers a Unit's required workflow tools.
|
|
3
|
+
import { testMcpServerConnection } from "../mcp-client/manager.js";
|
|
3
4
|
import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
|
|
4
5
|
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
6
|
+
import { recordWorkflowMcpProbe, WORKFLOW_MCP_PROBE_TIMEOUT_MS, } from "./workflow-mcp-readiness-cache.js";
|
|
7
|
+
import { resolveWorkflowMcpProjectRoot } from "./workflow-mcp.js";
|
|
5
8
|
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
6
9
|
/**
|
|
7
10
|
* Stable phrase recognized as transient by auto-tool-tracking's
|
|
@@ -11,20 +14,73 @@ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
|
11
14
|
export const TOOL_SURFACE_NOT_READY = "workflow tool surface not ready";
|
|
12
15
|
/** MCP server statuses that will not self-heal within the session. */
|
|
13
16
|
const TERMINAL_MCP_SERVER_STATUSES = new Set(["failed", "needs-auth", "disabled"]);
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
export const DEFAULT_WORKFLOW_MCP_PREFLIGHT_TIMEOUT_MS = 30_000;
|
|
18
|
+
export const DEFAULT_WORKFLOW_MCP_PREFLIGHT_POLL_MS = 200;
|
|
19
|
+
const RUN_UAT_PREFLIGHT_TIMEOUT_MS = 90_000;
|
|
20
|
+
function resolveWorkflowMcpPreflightTimeoutMs(unitType) {
|
|
21
|
+
if (unitType === "run-uat")
|
|
22
|
+
return RUN_UAT_PREFLIGHT_TIMEOUT_MS;
|
|
23
|
+
return DEFAULT_WORKFLOW_MCP_PREFLIGHT_TIMEOUT_MS;
|
|
24
|
+
}
|
|
25
|
+
export function probeCoversRequiredWorkflowTools(tools, required) {
|
|
26
|
+
return required.every((tool) => tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
|
|
27
|
+
}
|
|
28
|
+
export async function awaitWorkflowMcpToolRegistration(input) {
|
|
29
|
+
const { unitType, workflowServerName, projectRoot } = input;
|
|
30
|
+
if (!unitType || !workflowServerName)
|
|
31
|
+
return null;
|
|
32
|
+
const required = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
|
|
33
|
+
if (required.length === 0)
|
|
34
|
+
return null;
|
|
35
|
+
const probe = input.probe ?? (async (serverName, root) => {
|
|
36
|
+
const result = await testMcpServerConnection(serverName, {
|
|
37
|
+
projectDir: resolveWorkflowMcpProjectRoot(root),
|
|
38
|
+
timeoutMs: WORKFLOW_MCP_PROBE_TIMEOUT_MS,
|
|
39
|
+
});
|
|
40
|
+
return { ok: result.ok, tools: result.tools };
|
|
41
|
+
});
|
|
42
|
+
const deadline = Date.now() + (input.timeoutMs ?? resolveWorkflowMcpPreflightTimeoutMs(unitType));
|
|
43
|
+
const pollMs = input.pollMs ?? DEFAULT_WORKFLOW_MCP_PREFLIGHT_POLL_MS;
|
|
44
|
+
while (Date.now() < deadline) {
|
|
45
|
+
throwIfAborted(input.signal);
|
|
46
|
+
const result = await probe(workflowServerName, projectRoot);
|
|
47
|
+
throwIfAborted(input.signal);
|
|
48
|
+
if (result.ok && probeCoversRequiredWorkflowTools(result.tools, required)) {
|
|
49
|
+
recordWorkflowMcpProbe(projectRoot, workflowServerName, result.tools);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
await sleep(pollMs, input.signal);
|
|
53
|
+
}
|
|
54
|
+
return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" did not register required tools before session start: ${required.join(", ")}`;
|
|
55
|
+
}
|
|
56
|
+
function makeAbortError() {
|
|
57
|
+
const error = new Error("AbortError: The operation was aborted");
|
|
58
|
+
error.name = "AbortError";
|
|
59
|
+
return error;
|
|
60
|
+
}
|
|
61
|
+
function throwIfAborted(signal) {
|
|
62
|
+
if (signal?.aborted)
|
|
63
|
+
throw makeAbortError();
|
|
64
|
+
}
|
|
65
|
+
function sleep(ms, signal) {
|
|
66
|
+
throwIfAborted(signal);
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const timeout = setTimeout(() => {
|
|
69
|
+
signal?.removeEventListener("abort", onAbort);
|
|
70
|
+
resolve();
|
|
71
|
+
}, ms);
|
|
72
|
+
const onAbort = () => {
|
|
73
|
+
clearTimeout(timeout);
|
|
74
|
+
reject(makeAbortError());
|
|
75
|
+
};
|
|
76
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/** Brief pause after a successful preflight before SDK query (race with MCP attach). */
|
|
80
|
+
export const POST_PREFLIGHT_SDK_SETTLE_MS = 750;
|
|
81
|
+
export const POST_PREFLIGHT_READINESS_RETRY_DELAYS_MS = [
|
|
82
|
+
1_000, 2_000, 3_000, 5_000, 8_000, 10_000, 15_000, 15_000, 15_000, 15_000,
|
|
83
|
+
];
|
|
28
84
|
export function getToolSurfaceReadinessError(input) {
|
|
29
85
|
const { unitType, workflowServerName, observation } = input;
|
|
30
86
|
if (!unitType || !workflowServerName)
|
|
@@ -33,24 +89,20 @@ export function getToolSurfaceReadinessError(input) {
|
|
|
33
89
|
if (required.length === 0)
|
|
34
90
|
return null;
|
|
35
91
|
const server = observation.mcpServers.find((entry) => entry.name === workflowServerName);
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// server reports "pending" there routinely, then registers within seconds,
|
|
41
|
-
// usually well before the Unit's first workflow tool call. Aborting on
|
|
42
|
-
// "pending" would fail the common healthy session, so it passes through;
|
|
43
|
-
// a genuine miss after pass-through still surfaces in-session as
|
|
44
|
-
// "No such tool available" and classifies tool-unavailable → bounded retry.
|
|
45
|
-
// Only statuses that cannot self-heal abort here.
|
|
46
|
-
if (server.status !== "connected" && !TERMINAL_MCP_SERVER_STATUSES.has(server.status)) {
|
|
47
|
-
return null;
|
|
92
|
+
if (server && TERMINAL_MCP_SERVER_STATUSES.has(server.status)) {
|
|
93
|
+
const missing = required.filter((tool) => !observation.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
|
|
94
|
+
const tools = missing.length > 0 ? missing : required;
|
|
95
|
+
return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" status is "${server.status}" (terminal) — cannot register: ${tools.join(", ")}`;
|
|
48
96
|
}
|
|
49
97
|
const missing = required.filter((tool) => !observation.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)));
|
|
50
|
-
if (missing.length === 0)
|
|
98
|
+
if (missing.length === 0) {
|
|
51
99
|
return null;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
:
|
|
55
|
-
|
|
100
|
+
}
|
|
101
|
+
if (!server) {
|
|
102
|
+
return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" is absent from the init surface (not yet connected): ${missing.join(", ")}`;
|
|
103
|
+
}
|
|
104
|
+
if (server.status !== "connected") {
|
|
105
|
+
return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" status is "${server.status}" (not yet connected): ${missing.join(", ")}`;
|
|
106
|
+
}
|
|
107
|
+
return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" is connected but has not registered: ${missing.join(", ")}`;
|
|
56
108
|
}
|
|
@@ -16,7 +16,8 @@ import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
|
16
16
|
import { isClosedStatus } from "../status-guards.js";
|
|
17
17
|
import { saveFile, clearParseCache } from "../files.js";
|
|
18
18
|
import { invalidateStateCache } from "../state.js";
|
|
19
|
-
import {
|
|
19
|
+
import { stripIdPrefix } from "../workflow-projections.js";
|
|
20
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
20
21
|
import { writeManifest } from "../workflow-manifest.js";
|
|
21
22
|
import { appendEvent } from "../workflow-events.js";
|
|
22
23
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -166,7 +167,7 @@ export async function handleCompleteMilestone(params, basePath) {
|
|
|
166
167
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
167
168
|
// the event log entry (critical for worktree reconciliation).
|
|
168
169
|
try {
|
|
169
|
-
await
|
|
170
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
170
171
|
}
|
|
171
172
|
catch (projErr) {
|
|
172
173
|
logWarning("tool", `complete-milestone projection warning: ${projErr.message}`);
|
|
@@ -21,7 +21,7 @@ import { classifyUatContent, escalatesArtifactUatToBrowser } from "../uat-policy
|
|
|
21
21
|
import { invalidateStateCache } from "../state.js";
|
|
22
22
|
import { renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "../markdown-renderer.js";
|
|
23
23
|
import { isStaleWrite } from "../auto/turn-epoch.js";
|
|
24
|
-
import {
|
|
24
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
25
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
26
26
|
import { appendEvent } from "../workflow-events.js";
|
|
27
27
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -448,7 +448,7 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
448
448
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
449
449
|
// the event log entry (critical for worktree reconciliation).
|
|
450
450
|
try {
|
|
451
|
-
await
|
|
451
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
452
452
|
}
|
|
453
453
|
catch (projErr) {
|
|
454
454
|
logWarning("tool", `complete-slice projection warning for ${params.milestoneId}/${params.sliceId}: ${projErr.message}`);
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* Projection write failures are reported as stale projections and do not roll
|
|
9
9
|
* back committed DB state.
|
|
10
10
|
*/
|
|
11
|
+
import { existsSync } from "node:fs";
|
|
11
12
|
import { join } from "node:path";
|
|
12
13
|
import { isClosedStatus } from "../status-guards.js";
|
|
13
14
|
import { transaction, insertMilestone, insertSlice, insertTask, insertVerificationEvidence, getMilestone, getSlice, getTask, updateTaskStatus, deleteVerificationEvidence, saveGateResult, getPendingGatesForTurn, } from "../gsd-db.js";
|
|
@@ -18,7 +19,8 @@ import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
|
18
19
|
import { saveFile, clearParseCache } from "../files.js";
|
|
19
20
|
import { invalidateStateCache } from "../state.js";
|
|
20
21
|
import { renderPlanCheckboxes } from "../markdown-renderer.js";
|
|
21
|
-
import {
|
|
22
|
+
import { renderSummaryContent } from "../workflow-projections.js";
|
|
23
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
22
24
|
import { writeManifest } from "../workflow-manifest.js";
|
|
23
25
|
import { appendEvent } from "../workflow-events.js";
|
|
24
26
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -28,6 +30,35 @@ import { buildEscalationArtifact, writeEscalationArtifact } from "../escalation.
|
|
|
28
30
|
function taskSummaryPath(basePath, milestoneId, sliceId, taskId) {
|
|
29
31
|
return join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks", `${taskId}-SUMMARY.md`);
|
|
30
32
|
}
|
|
33
|
+
async function repairMissingTaskSummaryProjection(artifactBasePath, taskRow) {
|
|
34
|
+
const summaryPath = taskSummaryPath(artifactBasePath, taskRow.milestone_id, taskRow.slice_id, taskRow.id);
|
|
35
|
+
const summaryMd = renderSummaryContent(taskRow, taskRow.slice_id, taskRow.milestone_id, []);
|
|
36
|
+
let stale = false;
|
|
37
|
+
try {
|
|
38
|
+
await saveFile(summaryPath, summaryMd);
|
|
39
|
+
await renderPlanCheckboxes(artifactBasePath, taskRow.milestone_id, taskRow.slice_id);
|
|
40
|
+
}
|
|
41
|
+
catch (renderErr) {
|
|
42
|
+
stale = true;
|
|
43
|
+
logWarning("projection", `complete_task missing-summary repair failed for ${taskRow.milestone_id}/${taskRow.slice_id}/${taskRow.id}`, { error: renderErr.message });
|
|
44
|
+
}
|
|
45
|
+
invalidateStateCache();
|
|
46
|
+
clearPathCache();
|
|
47
|
+
clearParseCache();
|
|
48
|
+
try {
|
|
49
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: taskRow.milestone_id });
|
|
50
|
+
}
|
|
51
|
+
catch (projErr) {
|
|
52
|
+
logWarning("tool", `complete-task repair projection warning: ${projErr.message}`);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
writeManifest(artifactBasePath);
|
|
56
|
+
}
|
|
57
|
+
catch (mfErr) {
|
|
58
|
+
logWarning("tool", `complete-task repair manifest warning: ${mfErr.message}`);
|
|
59
|
+
}
|
|
60
|
+
return { summaryPath, stale };
|
|
61
|
+
}
|
|
31
62
|
/**
|
|
32
63
|
* Map an execute-task-owned gate id to the CompleteTaskParams field whose
|
|
33
64
|
* presence drives `pass` vs. `omitted`. Keep in lockstep with the gates
|
|
@@ -135,6 +166,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
135
166
|
const completedAt = new Date().toISOString();
|
|
136
167
|
let guardError = null;
|
|
137
168
|
let summaryMd = "";
|
|
169
|
+
let repairTaskSummaryRow = null;
|
|
138
170
|
// ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
|
|
139
171
|
// Building the artifact runs the full shape validation (2-4 options, unique
|
|
140
172
|
// ids, recommendation references a real id). If the payload is malformed
|
|
@@ -196,6 +228,12 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
196
228
|
guardError = "__stale_duplicate__";
|
|
197
229
|
return;
|
|
198
230
|
}
|
|
231
|
+
const existingSummaryPath = taskSummaryPath(artifactBasePath, params.milestoneId, params.sliceId, params.taskId);
|
|
232
|
+
if (existingTask.full_summary_md.trim() && !existsSync(existingSummaryPath)) {
|
|
233
|
+
repairTaskSummaryRow = existingTask;
|
|
234
|
+
guardError = "__repair_missing_summary__";
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
199
237
|
guardError = `task ${params.taskId} is already complete — use gsd_task_reopen first if you need to redo it`;
|
|
200
238
|
return;
|
|
201
239
|
}
|
|
@@ -251,6 +289,17 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
251
289
|
stale: true,
|
|
252
290
|
};
|
|
253
291
|
}
|
|
292
|
+
if (guardError === "__repair_missing_summary__" && repairTaskSummaryRow) {
|
|
293
|
+
const repair = await repairMissingTaskSummaryProjection(artifactBasePath, repairTaskSummaryRow);
|
|
294
|
+
return {
|
|
295
|
+
taskId: params.taskId,
|
|
296
|
+
sliceId: params.sliceId,
|
|
297
|
+
milestoneId: params.milestoneId,
|
|
298
|
+
summaryPath: repair.summaryPath,
|
|
299
|
+
duplicate: true,
|
|
300
|
+
...(repair.stale ? { stale: true } : {}),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
254
303
|
if (guardError) {
|
|
255
304
|
return { error: guardError };
|
|
256
305
|
}
|
|
@@ -348,6 +397,20 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
348
397
|
}
|
|
349
398
|
}
|
|
350
399
|
else if (params.escalation && !escalationWriteEnabled) {
|
|
400
|
+
if (params.escalation.continueWithDefault === false) {
|
|
401
|
+
const msg = `complete-task received a hard-blocker escalation (continueWithDefault=false) but phases.mid_execution_escalation is disabled for ${params.milestoneId}/${params.sliceId}/${params.taskId}; reverting to pending instead of silently advancing.`;
|
|
402
|
+
logWarning("tool", msg);
|
|
403
|
+
try {
|
|
404
|
+
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
405
|
+
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
|
|
406
|
+
invalidateStateCache();
|
|
407
|
+
logWarning("tool", `complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} because hard-blocker escalation handling is disabled; SUMMARY.md left on disk for retry.`);
|
|
408
|
+
}
|
|
409
|
+
catch (rollbackErr) {
|
|
410
|
+
logWarning("tool", `complete-task rollback failed after disabled hard-blocker escalation for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${rollbackErr.message}`);
|
|
411
|
+
}
|
|
412
|
+
return { error: msg };
|
|
413
|
+
}
|
|
351
414
|
logWarning("tool", `complete-task received escalation payload but phases.mid_execution_escalation is not enabled; ignoring (${params.milestoneId}/${params.sliceId}/${params.taskId})`);
|
|
352
415
|
}
|
|
353
416
|
// Invalidate all caches
|
|
@@ -358,7 +421,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
358
421
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
359
422
|
// the event log entry (critical for worktree reconciliation).
|
|
360
423
|
try {
|
|
361
|
-
await
|
|
424
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
362
425
|
}
|
|
363
426
|
catch (projErr) {
|
|
364
427
|
logWarning("tool", `complete-task projection warning: ${projErr.message}`);
|
|
@@ -7,7 +7,7 @@ import { getGateIdsForTurn } from "../gate-registry.js";
|
|
|
7
7
|
import { transaction, getMilestone, getSlice, getSliceTasks, insertTask, upsertSlicePlanning, upsertTaskPlanning, insertGateRow, updateSliceStatus, setSliceSketchFlag, deleteTask, deleteArtifactByPath, } from "../gsd-db.js";
|
|
8
8
|
import { invalidateStateCache } from "../state.js";
|
|
9
9
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
10
|
-
import {
|
|
10
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
11
11
|
import { writeManifest } from "../workflow-manifest.js";
|
|
12
12
|
import { appendEvent } from "../workflow-events.js";
|
|
13
13
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -367,7 +367,7 @@ export async function handlePlanSlice(rawParams, basePath) {
|
|
|
367
367
|
clearParseCache();
|
|
368
368
|
// ── Post-mutation hook: projections, manifest, event log ─────────────
|
|
369
369
|
try {
|
|
370
|
-
await
|
|
370
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
371
371
|
writeManifest(basePath);
|
|
372
372
|
appendEvent(basePath, {
|
|
373
373
|
cmd: "plan-slice",
|
|
@@ -4,7 +4,7 @@ import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
|
4
4
|
import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning } from "../gsd-db.js";
|
|
5
5
|
import { invalidateStateCache } from "../state.js";
|
|
6
6
|
import { renderTaskPlanFromDb } from "../markdown-renderer.js";
|
|
7
|
-
import {
|
|
7
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
8
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
9
9
|
import { appendEvent } from "../workflow-events.js";
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -110,7 +110,7 @@ export async function handlePlanTask(rawParams, basePath) {
|
|
|
110
110
|
clearParseCache();
|
|
111
111
|
// ── Post-mutation hook: projections, manifest, event log ─────────────
|
|
112
112
|
try {
|
|
113
|
-
await
|
|
113
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
114
114
|
writeManifest(basePath);
|
|
115
115
|
appendEvent(basePath, {
|
|
116
116
|
cmd: "plan-task",
|
|
@@ -6,7 +6,7 @@ import { isNonEmptyString } from "../validation.js";
|
|
|
6
6
|
import { transaction, getMilestone, getMilestoneSlices, getSlice, insertSlice, updateSliceFields, insertAssessment, deleteAssessmentByScope, deleteSlice, } from "../gsd-db.js";
|
|
7
7
|
import { invalidateStateCache } from "../state.js";
|
|
8
8
|
import { renderRoadmapFromDb, renderAssessmentFromDb } from "../markdown-renderer.js";
|
|
9
|
-
import {
|
|
9
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
10
10
|
import { writeManifest } from "../workflow-manifest.js";
|
|
11
11
|
import { appendEvent } from "../workflow-events.js";
|
|
12
12
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -234,7 +234,7 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
234
234
|
clearParseCache();
|
|
235
235
|
// ── Post-mutation hook: projections, manifest, event log ─────
|
|
236
236
|
try {
|
|
237
|
-
await
|
|
237
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
238
238
|
writeManifest(basePath);
|
|
239
239
|
appendEvent(basePath, {
|
|
240
240
|
cmd: "reassess-roadmap",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { getMilestoneSlices, getSliceTasks, reopenMilestoneCascade, } from "../gsd-db.js";
|
|
11
11
|
import { invalidateStateCache } from "../state.js";
|
|
12
|
-
import {
|
|
12
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
13
13
|
import { writeManifest } from "../workflow-manifest.js";
|
|
14
14
|
import { appendEvent } from "../workflow-events.js";
|
|
15
15
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -74,7 +74,7 @@ export async function handleReopenMilestone(params, basePath) {
|
|
|
74
74
|
clearPathCache();
|
|
75
75
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
76
76
|
try {
|
|
77
|
-
await
|
|
77
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
78
78
|
writeManifest(basePath);
|
|
79
79
|
appendEvent(basePath, {
|
|
80
80
|
cmd: "reopen-milestone",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
12
12
|
import { getSliceTasks, reopenSliceCascade, } from "../gsd-db.js";
|
|
13
13
|
import { invalidateStateCache } from "../state.js";
|
|
14
|
-
import {
|
|
14
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
15
15
|
import { writeManifest } from "../workflow-manifest.js";
|
|
16
16
|
import { appendEvent } from "../workflow-events.js";
|
|
17
17
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -72,7 +72,7 @@ export async function handleReopenSlice(params, basePath) {
|
|
|
72
72
|
clearPathCache();
|
|
73
73
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
74
74
|
try {
|
|
75
|
-
await
|
|
75
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
76
76
|
writeManifest(basePath);
|
|
77
77
|
appendEvent(basePath, {
|
|
78
78
|
cmd: "reopen-slice",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import { getMilestone, getSlice, getTask, updateTaskStatus, transaction, } from "../gsd-db.js";
|
|
12
12
|
import { invalidateStateCache } from "../state.js";
|
|
13
13
|
import { isClosedStatus } from "../status-guards.js";
|
|
14
|
-
import {
|
|
14
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
15
15
|
import { writeManifest } from "../workflow-manifest.js";
|
|
16
16
|
import { appendEvent } from "../workflow-events.js";
|
|
17
17
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -83,7 +83,7 @@ export async function handleReopenTask(params, basePath) {
|
|
|
83
83
|
clearPathCache();
|
|
84
84
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
85
85
|
try {
|
|
86
|
-
await
|
|
86
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
87
87
|
writeManifest(basePath);
|
|
88
88
|
appendEvent(basePath, {
|
|
89
89
|
cmd: "reopen-task",
|
|
@@ -4,7 +4,7 @@ import { invalidateStateCache } from "../state.js";
|
|
|
4
4
|
import { isClosedStatus } from "../status-guards.js";
|
|
5
5
|
import { isNonEmptyString } from "../validation.js";
|
|
6
6
|
import { renderPlanFromDb, renderReplanFromDb } from "../markdown-renderer.js";
|
|
7
|
-
import {
|
|
7
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
8
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
9
9
|
import { appendEvent } from "../workflow-events.js";
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -162,7 +162,7 @@ export async function handleReplanSlice(rawParams, basePath) {
|
|
|
162
162
|
clearParseCache();
|
|
163
163
|
// ── Post-mutation hook: projections, manifest, event log ─────
|
|
164
164
|
try {
|
|
165
|
-
await
|
|
165
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
166
166
|
writeManifest(basePath);
|
|
167
167
|
appendEvent(basePath, {
|
|
168
168
|
cmd: "replan-slice",
|
|
@@ -125,7 +125,7 @@ export function composeContextModeInstructions(unitType, opts) {
|
|
|
125
125
|
}
|
|
126
126
|
const TOOL_SURFACE_GUIDANCE_BY_UNIT = {
|
|
127
127
|
"run-uat": "Do not call `gsd_exec`, `Bash`, `Write`, or `Edit` — they are unavailable in this unit. Run every automated check through `gsd_uat_exec` with the appropriate `intent`. For browser UAT modes, use `browser_*` tools when presented; if browser automation fails, record the failure honestly and use `gsd_uat_exec` for the best objective substitute.",
|
|
128
|
-
"complete-slice": "Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
|
|
128
|
+
"complete-slice": "Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Capture learnings through `gsd_capture_thought` (or MCP-scoped `mcp__…__gsd_capture_thought`), not bare `capture_thought`, when workflow MCP tools are presented. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
|
|
129
129
|
"gate-evaluate": "Dispatch only **tester** subagents via `subagent`. Persist each gate with `gsd_save_gate_result`. Do not use `ToolSearch` — it is not available.",
|
|
130
130
|
"reactive-execute": "Dispatch only **worker** subagents via `subagent`. Do not call `gsd_task_complete` from this parent batch — each worker owns its task completion. If a failed task left no summary, call `gsd_summary_save` with `blocker_discovered: true`.",
|
|
131
131
|
"execute-task": "Complete only this task via `gsd_task_complete`. Do not call `gsd_slice_complete`, `gsd_validate_milestone`, or `gsd_complete_milestone` — the orchestrator owns phase transitions.",
|
|
@@ -173,15 +173,19 @@ export const UNIT_REGISTRY = {
|
|
|
173
173
|
phaseChain: ["completion"],
|
|
174
174
|
toolContract: {
|
|
175
175
|
allowedGsdTools: [
|
|
176
|
+
"gsd_exec",
|
|
176
177
|
"gsd_slice_complete",
|
|
177
178
|
"gsd_task_reopen",
|
|
178
179
|
"gsd_replan_slice",
|
|
179
180
|
"gsd_decision_save",
|
|
181
|
+
"gsd_capture_thought",
|
|
180
182
|
"gsd_requirement_update",
|
|
181
183
|
"gsd_summary_save",
|
|
182
184
|
"subagent",
|
|
183
185
|
],
|
|
184
186
|
requiredWorkflowTools: [
|
|
187
|
+
"gsd_exec",
|
|
188
|
+
"gsd_capture_thought",
|
|
185
189
|
"gsd_slice_complete",
|
|
186
190
|
"gsd_task_reopen",
|
|
187
191
|
"gsd_replan_slice",
|
|
@@ -207,8 +211,21 @@ export const UNIT_REGISTRY = {
|
|
|
207
211
|
scopeClass: "execute-task",
|
|
208
212
|
phaseChain: ["execution"],
|
|
209
213
|
toolContract: {
|
|
210
|
-
allowedGsdTools: [
|
|
211
|
-
|
|
214
|
+
allowedGsdTools: [
|
|
215
|
+
"gsd_task_complete",
|
|
216
|
+
"gsd_exec",
|
|
217
|
+
"gsd_exec_search",
|
|
218
|
+
"gsd_resume",
|
|
219
|
+
"gsd_capture_thought",
|
|
220
|
+
"gsd_decision_save",
|
|
221
|
+
],
|
|
222
|
+
requiredWorkflowTools: [
|
|
223
|
+
"gsd_task_complete",
|
|
224
|
+
"gsd_exec",
|
|
225
|
+
"gsd_exec_search",
|
|
226
|
+
"gsd_resume",
|
|
227
|
+
"gsd_capture_thought",
|
|
228
|
+
],
|
|
212
229
|
},
|
|
213
230
|
},
|
|
214
231
|
"execute-task-simple": {
|
|
@@ -216,8 +233,21 @@ export const UNIT_REGISTRY = {
|
|
|
216
233
|
scopeClass: "execute-task",
|
|
217
234
|
phaseChain: ["execution_simple", "execution"],
|
|
218
235
|
toolContract: {
|
|
219
|
-
allowedGsdTools: [
|
|
220
|
-
|
|
236
|
+
allowedGsdTools: [
|
|
237
|
+
"gsd_task_complete",
|
|
238
|
+
"gsd_exec",
|
|
239
|
+
"gsd_exec_search",
|
|
240
|
+
"gsd_resume",
|
|
241
|
+
"gsd_capture_thought",
|
|
242
|
+
"gsd_decision_save",
|
|
243
|
+
],
|
|
244
|
+
requiredWorkflowTools: [
|
|
245
|
+
"gsd_task_complete",
|
|
246
|
+
"gsd_exec",
|
|
247
|
+
"gsd_exec_search",
|
|
248
|
+
"gsd_resume",
|
|
249
|
+
"gsd_capture_thought",
|
|
250
|
+
],
|
|
221
251
|
},
|
|
222
252
|
},
|
|
223
253
|
"reactive-execute": {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Host-owned verification verdict policy for auto-mode units.
|
|
3
|
+
export const NO_HOST_CHECKS_FAILURE_CONTEXT = "No runnable host-owned verification command was discovered. Add project verification_commands in .gsd/PREFERENCES.md or a runnable task-plan Verify command, then resume with /gsd next.";
|
|
3
4
|
export function decideVerificationVerdict(unitType, result) {
|
|
4
5
|
if (unitType === "execute-task" && result.discoverySource === "task-plan-prose" && result.checks.length === 0) {
|
|
5
6
|
return {
|
|
@@ -14,7 +15,7 @@ export function decideVerificationVerdict(unitType, result) {
|
|
|
14
15
|
passed: false,
|
|
15
16
|
reason: "no-host-checks",
|
|
16
17
|
retryable: false,
|
|
17
|
-
failureContext:
|
|
18
|
+
failureContext: NO_HOST_CHECKS_FAILURE_CONTEXT,
|
|
18
19
|
};
|
|
19
20
|
}
|
|
20
21
|
if (!result.passed) {
|