@opengsd/gsd-pi 1.2.0-dev.5457a158 → 1.2.0-dev.6ccd27b3
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/headless-events.js +7 -5
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- 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/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +450 -217
- 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/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- 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 +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- 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 +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
- package/dist/resources/extensions/gsd/auto-start.js +35 -15
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +41 -2
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +172 -59
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- 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/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- 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/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- 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/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- 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/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/preferences-models.js +2 -2
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- 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 +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- 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/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- 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 +11 -2
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- 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 +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
- 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/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
- package/dist/resources/extensions/gsd/unit-registry.js +41 -24
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- 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-lifecycle.js +3 -2
- 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/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- 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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/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 +12 -12
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- 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 +13 -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 +55 -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/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.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 +12 -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-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.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/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.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/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- 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 +452 -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/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- 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 +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +161 -81
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- 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/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +239 -153
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +256 -145
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +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/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.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/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- 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/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- 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/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +534 -228
- 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/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- 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 +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- 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 +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
- package/src/resources/extensions/gsd/auto-start.ts +36 -18
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +49 -2
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +211 -59
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- 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/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- 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/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- 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/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- 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/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/preferences-models.ts +2 -1
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- 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 +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- 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/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- 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 +12 -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 +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- 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 +51 -0
- 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/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -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 +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -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/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +7 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +35 -58
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- 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-closeout.test.ts +95 -4
- 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/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- 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 +143 -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/prompt-db.test.ts +124 -6
- 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/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 +80 -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/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +44 -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/web-app-uat.test.ts +44 -1
- 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/workflow-tool-executors.test.ts +273 -38
- 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/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- 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 +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
- 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/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
- package/src/resources/extensions/gsd/unit-registry.ts +41 -24
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- 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-lifecycle.ts +3 -8
- 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/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
type AnswerOutcome,
|
|
6
|
+
classifyQuestion,
|
|
7
|
+
evaluateAnswer,
|
|
8
|
+
evaluateAskUserQuestionsRound,
|
|
9
|
+
failPolicyForKind,
|
|
10
|
+
formatUnansweredConsentQuestionMessage,
|
|
11
|
+
isAwaitingUserInput,
|
|
12
|
+
lastAssistantText,
|
|
13
|
+
messageHasPendingAskUserQuestionsTool,
|
|
14
|
+
shouldPauseForQuestion,
|
|
15
|
+
} from "../consent-question.ts";
|
|
16
|
+
|
|
17
|
+
const GATE_OPTIONS = [
|
|
18
|
+
{ label: "Yes, you got it (Recommended)" },
|
|
19
|
+
{ label: "Needs adjustment" },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
const CONSENT_OPTIONS = [
|
|
23
|
+
{ label: "Option A (Recommended)" },
|
|
24
|
+
{ label: "Option B" },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
function assistantMessage(text: string): unknown {
|
|
28
|
+
return { role: "assistant", content: [{ type: "text", text }] };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ── Classification ──────────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
test("classifyQuestion: gate ids, consent defaults, prose kinds", () => {
|
|
34
|
+
assert.deepEqual(
|
|
35
|
+
classifyQuestion({ id: "depth_verification_M001_confirm" }),
|
|
36
|
+
{ kind: "gate", gateSubKind: "approval" },
|
|
37
|
+
);
|
|
38
|
+
assert.deepEqual(
|
|
39
|
+
classifyQuestion({ id: "depth_verification" }),
|
|
40
|
+
{ kind: "gate", gateSubKind: "depth-verification" },
|
|
41
|
+
);
|
|
42
|
+
assert.deepEqual(
|
|
43
|
+
classifyQuestion({ id: "destructive_confirm_rm" }),
|
|
44
|
+
{ kind: "gate", gateSubKind: "destructive-confirm" },
|
|
45
|
+
);
|
|
46
|
+
// Any other structured question is a real elicitation → consent, fail-closed.
|
|
47
|
+
assert.equal(classifyQuestion({ id: "m004_shape", options: CONSENT_OPTIONS }).kind, "consent");
|
|
48
|
+
assert.equal(classifyQuestion({ id: "free_text_q" }).kind, "consent");
|
|
49
|
+
// Prose classification.
|
|
50
|
+
assert.equal(classifyQuestion({ text: "Should I proceed with the write?" }).kind, "consent");
|
|
51
|
+
assert.equal(
|
|
52
|
+
classifyQuestion({ text: "Want me to research this or skip?", unitType: "research-decision" }).kind,
|
|
53
|
+
"decision",
|
|
54
|
+
);
|
|
55
|
+
assert.equal(classifyQuestion({ text: "Here is the summary of changes." }).kind, "informational");
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("failPolicyForKind: only informational is fail-open", () => {
|
|
59
|
+
assert.equal(failPolicyForKind("gate"), "closed");
|
|
60
|
+
assert.equal(failPolicyForKind("consent"), "closed");
|
|
61
|
+
assert.equal(failPolicyForKind("decision"), "closed");
|
|
62
|
+
assert.equal(failPolicyForKind("informational"), "open");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// ── Policy table: (kind × answer shape) → outcome ───────────────────────────
|
|
66
|
+
|
|
67
|
+
type Row = {
|
|
68
|
+
name: string;
|
|
69
|
+
question: { id: string; options?: Array<{ label?: string }> };
|
|
70
|
+
details: Parameters<typeof evaluateAnswer>[0]["details"];
|
|
71
|
+
expected: AnswerOutcome;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const gateQ = { id: "depth_verification_M001_confirm", options: GATE_OPTIONS };
|
|
75
|
+
const consentQ = { id: "boundary_choice", options: CONSENT_OPTIONS };
|
|
76
|
+
|
|
77
|
+
const POLICY_TABLE: Row[] = [
|
|
78
|
+
// gate
|
|
79
|
+
{ name: "gate × confirm selected → verified", question: gateQ, details: { response: { answers: { [gateQ.id]: { selected: "Yes, you got it (Recommended)" } } } }, expected: "verified" },
|
|
80
|
+
{ name: "gate × decline selected → declined", question: gateQ, details: { response: { answers: { [gateQ.id]: { selected: "Needs adjustment" } } } }, expected: "declined" },
|
|
81
|
+
{ name: "gate × empty selected → waiting", question: gateQ, details: { response: { answers: { [gateQ.id]: { selected: "" } } } }, expected: "waiting" },
|
|
82
|
+
{ name: "gate × empty selected array → waiting", question: gateQ, details: { response: { answers: { [gateQ.id]: { selected: [] } } } }, expected: "waiting" },
|
|
83
|
+
{ name: "gate × missing response → waiting", question: gateQ, details: {}, expected: "waiting" },
|
|
84
|
+
{ name: "gate × notes-only → waiting (notes never satisfy a gate)", question: gateQ, details: { response: { answers: { [gateQ.id]: { notes: "looks fine" } } } }, expected: "waiting" },
|
|
85
|
+
{ name: "gate × cancelled → cancelled", question: gateQ, details: { cancelled: true, response: null }, expected: "cancelled" },
|
|
86
|
+
// consent
|
|
87
|
+
{ name: "consent × valid selected → answered", question: consentQ, details: { response: { answers: { [consentQ.id]: { selected: "Option B" } } } }, expected: "answered" },
|
|
88
|
+
{ name: "consent × empty selected → waiting (#528)", question: consentQ, details: { response: { answers: { [consentQ.id]: { selected: "" } } } }, expected: "waiting" },
|
|
89
|
+
{ name: "consent × missing answer → waiting", question: consentQ, details: { response: { answers: {} } }, expected: "waiting" },
|
|
90
|
+
{ name: "consent × missing response → waiting", question: consentQ, details: {}, expected: "waiting" },
|
|
91
|
+
{ name: "consent × notes-only → answered (a real user utterance)", question: consentQ, details: { response: { answers: { [consentQ.id]: { notes: "neither — keep it simple" } } } }, expected: "answered" },
|
|
92
|
+
{ name: "consent × cancelled → cancelled", question: consentQ, details: { cancelled: true, response: null }, expected: "cancelled" },
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
for (const row of POLICY_TABLE) {
|
|
96
|
+
test(`policy table: ${row.name}`, () => {
|
|
97
|
+
assert.equal(evaluateAnswer({ question: row.question, details: row.details }), row.expected);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ── Round evaluation ────────────────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
test("evaluateAskUserQuestionsRound: most blocking outcome wins", () => {
|
|
104
|
+
const details = {
|
|
105
|
+
response: {
|
|
106
|
+
answers: {
|
|
107
|
+
[consentQ.id]: { selected: "Option A (Recommended)" },
|
|
108
|
+
second: { selected: "" },
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
assert.equal(
|
|
113
|
+
evaluateAskUserQuestionsRound([consentQ, { id: "second", options: CONSENT_OPTIONS }], details),
|
|
114
|
+
"waiting",
|
|
115
|
+
);
|
|
116
|
+
assert.equal(evaluateAskUserQuestionsRound([consentQ], { cancelled: true }), "cancelled");
|
|
117
|
+
assert.equal(
|
|
118
|
+
evaluateAskUserQuestionsRound([consentQ], {
|
|
119
|
+
response: { answers: { [consentQ.id]: { selected: "Option A (Recommended)" } } },
|
|
120
|
+
}),
|
|
121
|
+
"answered",
|
|
122
|
+
);
|
|
123
|
+
// Empty round with no response is a no-op for callers.
|
|
124
|
+
assert.equal(evaluateAskUserQuestionsRound([], {}), "answered");
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// ── Regression: #528 empty selected on a consent question never answers ─────
|
|
128
|
+
|
|
129
|
+
test("#528: empty selected on a NON-gate question is waiting, not answered", () => {
|
|
130
|
+
const outcome = evaluateAskUserQuestionsRound(
|
|
131
|
+
[{ id: "scope_check", options: CONSENT_OPTIONS }],
|
|
132
|
+
{ response: { answers: { scope_check: { selected: "" } } } },
|
|
133
|
+
);
|
|
134
|
+
assert.equal(outcome, "waiting");
|
|
135
|
+
const message = formatUnansweredConsentQuestionMessage([{ id: "scope_check" }]);
|
|
136
|
+
assert.match(message, /scope_check/);
|
|
137
|
+
assert.match(message, /not consent/i);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// ── Regression: #682 pause promotion outside the old unit-type allowlist ────
|
|
141
|
+
|
|
142
|
+
test("#682: consent question in a non-allowlisted unit type pauses", () => {
|
|
143
|
+
const messages = [assistantMessage("The slice is staged. Ready to proceed with the merge?")];
|
|
144
|
+
assert.equal(shouldPauseForQuestion("execute-task", messages), true);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("#682: consent question in interactive mode (no unit type) pauses", () => {
|
|
148
|
+
const messages = [assistantMessage("Does this capture your intent correctly?")];
|
|
149
|
+
assert.equal(shouldPauseForQuestion(undefined, messages), true);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test("#682: cancellation marker pauses regardless of unit type", () => {
|
|
153
|
+
const messages = [assistantMessage("ask_user_questions was cancelled before receiving a response")];
|
|
154
|
+
assert.equal(shouldPauseForQuestion(undefined, messages), true);
|
|
155
|
+
assert.equal(shouldPauseForQuestion("execute-task", messages), true);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("shouldPauseForQuestion: informational prose never pauses", () => {
|
|
159
|
+
const messages = [assistantMessage("All tests pass. Moving on to the next task.")];
|
|
160
|
+
assert.equal(shouldPauseForQuestion(undefined, messages), false);
|
|
161
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test("shouldPauseForQuestion: plain non-approval question does not pause", () => {
|
|
165
|
+
// Generic questions (no approval/consent language) stay informational —
|
|
166
|
+
// matches the historical contract in deep-project-auto-loop tests.
|
|
167
|
+
const messages = [assistantMessage("Which file did you mean?")];
|
|
168
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test("shouldPauseForQuestion: explicit waiting-for-approval phrase pauses without a question mark", () => {
|
|
172
|
+
// The streaming pre-filter (no "?" → bail) must not skip the explicit
|
|
173
|
+
// wait-phrase boundary, which carries no question mark.
|
|
174
|
+
const messages = [assistantMessage("I am waiting for your approval before writing the file.")];
|
|
175
|
+
assert.equal(shouldPauseForQuestion(undefined, messages), true);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// ── Message-text extraction (merged from user-input-boundary tests) ─────────
|
|
179
|
+
|
|
180
|
+
test("lastAssistantText extracts the latest assistant text block content", () => {
|
|
181
|
+
assert.equal(
|
|
182
|
+
lastAssistantText([
|
|
183
|
+
{ role: "assistant", content: "Older message" },
|
|
184
|
+
{
|
|
185
|
+
role: "assistant",
|
|
186
|
+
content: [
|
|
187
|
+
{ type: "text", text: "First line" },
|
|
188
|
+
{ type: "text", text: "Second line" },
|
|
189
|
+
],
|
|
190
|
+
},
|
|
191
|
+
]),
|
|
192
|
+
"First line\nSecond line",
|
|
193
|
+
);
|
|
194
|
+
assert.equal(lastAssistantText(null), "");
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test("lastAssistantText includes thinking blocks so rate-limit notices are not dropped", () => {
|
|
198
|
+
// Turn with only a thinking block (no text block) — must not return ""
|
|
199
|
+
const result = lastAssistantText([
|
|
200
|
+
{
|
|
201
|
+
role: "assistant",
|
|
202
|
+
content: [
|
|
203
|
+
{ type: "thinking", thinking: "You've hit your limit · resets in 2h" },
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
]);
|
|
207
|
+
assert.ok(result.includes("You've hit your limit"), `expected rate-limit text, got: ${JSON.stringify(result)}`);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// ── Awaiting-input boundaries (merged from user-input-boundary tests) ───────
|
|
211
|
+
|
|
212
|
+
test("isAwaitingUserInput does not trigger on thinking-block question marks", () => {
|
|
213
|
+
// A thinking block with a question mark must NOT pause auto-mode —
|
|
214
|
+
// it's internal reasoning, not a user-visible prompt.
|
|
215
|
+
const messages = [
|
|
216
|
+
{
|
|
217
|
+
role: "assistant",
|
|
218
|
+
content: [
|
|
219
|
+
{ type: "thinking", thinking: "Should I skip research? Let me check the config." },
|
|
220
|
+
],
|
|
221
|
+
},
|
|
222
|
+
];
|
|
223
|
+
assert.equal(isAwaitingUserInput(messages), false);
|
|
224
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
test("isAwaitingUserInput does not trigger on thinking-block approval phrases", () => {
|
|
228
|
+
// A thinking block with approval phrases must NOT pause auto-mode.
|
|
229
|
+
const messages = [
|
|
230
|
+
{
|
|
231
|
+
role: "assistant",
|
|
232
|
+
content: [
|
|
233
|
+
{ type: "thinking", thinking: "The user confirmed and approved the plan. Should I proceed?" },
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
];
|
|
237
|
+
assert.equal(isAwaitingUserInput(messages), false);
|
|
238
|
+
assert.equal(shouldPauseForQuestion("discuss-requirements", messages), false);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test("isAwaitingUserInput treats plain-text next steps menus as waiting for the user (#454)", () => {
|
|
242
|
+
const messages = [
|
|
243
|
+
{
|
|
244
|
+
role: "assistant",
|
|
245
|
+
content: [
|
|
246
|
+
"Next steps:",
|
|
247
|
+
"1. Walk through the runtime placement check above.",
|
|
248
|
+
"2. Build a release once you're satisfied.",
|
|
249
|
+
"3. Other.",
|
|
250
|
+
].join("\n"),
|
|
251
|
+
},
|
|
252
|
+
];
|
|
253
|
+
assert.equal(isAwaitingUserInput(messages), true);
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test("isAwaitingUserInput still triggers on text-block question marks when thinking is also present", () => {
|
|
257
|
+
// When thinking + text are both present and the text asks a question, it should still pause.
|
|
258
|
+
const messages = [
|
|
259
|
+
{
|
|
260
|
+
role: "assistant",
|
|
261
|
+
content: [
|
|
262
|
+
{ type: "thinking", thinking: "Internal reasoning without questions." },
|
|
263
|
+
{ type: "text", text: "Does this look correct?" },
|
|
264
|
+
],
|
|
265
|
+
},
|
|
266
|
+
];
|
|
267
|
+
assert.equal(isAwaitingUserInput(messages), true);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// ── In-flight ask_user_questions detection (merged from user-input-boundary) ─
|
|
271
|
+
|
|
272
|
+
test("messageHasPendingAskUserQuestionsTool detects in-flight structured question tools", () => {
|
|
273
|
+
// state: "running" with no externalResult → still in-flight
|
|
274
|
+
assert.equal(
|
|
275
|
+
messageHasPendingAskUserQuestionsTool({
|
|
276
|
+
role: "assistant",
|
|
277
|
+
content: [
|
|
278
|
+
{ type: "text", text: "Which direction?" },
|
|
279
|
+
{ type: "toolCall", name: "mcp__gsd-workflow__ask_user_questions", state: "running" },
|
|
280
|
+
],
|
|
281
|
+
}),
|
|
282
|
+
true,
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
// no state, no externalResult — streaming block that hasn't completed yet
|
|
286
|
+
assert.equal(
|
|
287
|
+
messageHasPendingAskUserQuestionsTool({
|
|
288
|
+
role: "assistant",
|
|
289
|
+
content: [
|
|
290
|
+
{ type: "toolCall", name: "ask_user_questions" },
|
|
291
|
+
],
|
|
292
|
+
}),
|
|
293
|
+
true,
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
// state: "completed" — legacy state-based completion
|
|
297
|
+
assert.equal(
|
|
298
|
+
messageHasPendingAskUserQuestionsTool({
|
|
299
|
+
role: "assistant",
|
|
300
|
+
content: [
|
|
301
|
+
{ type: "toolCall", name: "ask_user_questions", state: "completed" },
|
|
302
|
+
],
|
|
303
|
+
}),
|
|
304
|
+
false,
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
// externalResult present — Claude Code signals completion via externalResult, not state
|
|
308
|
+
assert.equal(
|
|
309
|
+
messageHasPendingAskUserQuestionsTool({
|
|
310
|
+
role: "assistant",
|
|
311
|
+
content: [
|
|
312
|
+
{ type: "toolCall", name: "ask_user_questions", externalResult: { content: [], isError: false } },
|
|
313
|
+
],
|
|
314
|
+
}),
|
|
315
|
+
false,
|
|
316
|
+
);
|
|
317
|
+
assert.equal(
|
|
318
|
+
messageHasPendingAskUserQuestionsTool({
|
|
319
|
+
role: "assistant",
|
|
320
|
+
content: [
|
|
321
|
+
{
|
|
322
|
+
type: "toolCall",
|
|
323
|
+
name: "ask_user_questions",
|
|
324
|
+
externalResult: { content: [{ type: "text", text: "answer" }], isError: false },
|
|
325
|
+
},
|
|
326
|
+
],
|
|
327
|
+
}),
|
|
328
|
+
false,
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
// serverToolUse shape (claude-code-cli MCP path) — no externalResult → in-flight
|
|
332
|
+
assert.equal(
|
|
333
|
+
messageHasPendingAskUserQuestionsTool({
|
|
334
|
+
role: "assistant",
|
|
335
|
+
content: [
|
|
336
|
+
{ type: "serverToolUse", name: "mcp__gsd-workflow__ask_user_questions" },
|
|
337
|
+
],
|
|
338
|
+
}),
|
|
339
|
+
true,
|
|
340
|
+
);
|
|
341
|
+
// serverToolUse shape — externalResult present → completed
|
|
342
|
+
assert.equal(
|
|
343
|
+
messageHasPendingAskUserQuestionsTool({
|
|
344
|
+
role: "assistant",
|
|
345
|
+
content: [
|
|
346
|
+
{ type: "serverToolUse", name: "ask_user_questions", externalResult: { content: [], isError: false } },
|
|
347
|
+
],
|
|
348
|
+
}),
|
|
349
|
+
false,
|
|
350
|
+
);
|
|
351
|
+
});
|
|
@@ -17,11 +17,13 @@ function makeSession(activeRunDir: string): {
|
|
|
17
17
|
activeRunDir: string;
|
|
18
18
|
basePath: string;
|
|
19
19
|
verificationRetryCount: Map<string, number>;
|
|
20
|
+
exhaustedVerificationUnits: Set<string>;
|
|
20
21
|
} {
|
|
21
22
|
return {
|
|
22
23
|
activeRunDir,
|
|
23
24
|
basePath: activeRunDir,
|
|
24
25
|
verificationRetryCount: new Map<string, number>(),
|
|
26
|
+
exhaustedVerificationUnits: new Set<string>(),
|
|
25
27
|
};
|
|
26
28
|
}
|
|
27
29
|
|
|
@@ -137,3 +139,68 @@ test("saveCustomVerifyRetryCounts deletes empty retry files and ignores missing
|
|
|
137
139
|
rmSync(dir, { recursive: true, force: true });
|
|
138
140
|
}
|
|
139
141
|
});
|
|
142
|
+
|
|
143
|
+
test("saveCustomVerifyRetryCounts persists exhaustedVerificationUnits and hydrateCustomVerifyRetryCounts restores them", () => {
|
|
144
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-verify-retries-"));
|
|
145
|
+
try {
|
|
146
|
+
const session = makeSession(dir);
|
|
147
|
+
session.exhaustedVerificationUnits.add("execute-task:M001/S001/T001");
|
|
148
|
+
session.exhaustedVerificationUnits.add("execute-task:M001/S001/T002");
|
|
149
|
+
|
|
150
|
+
saveCustomVerifyRetryCounts(session, {
|
|
151
|
+
logFailure: () => assert.fail("logFailure should not be called"),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const session2 = makeSession(dir);
|
|
155
|
+
hydrateCustomVerifyRetryCounts(session2, {
|
|
156
|
+
logFailure: () => assert.fail("logFailure should not be called"),
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
assert.deepEqual(
|
|
160
|
+
[...session2.exhaustedVerificationUnits].sort(),
|
|
161
|
+
["execute-task:M001/S001/T001", "execute-task:M001/S001/T002"],
|
|
162
|
+
);
|
|
163
|
+
assert.equal(session2.verificationRetryCount.size, 0);
|
|
164
|
+
} finally {
|
|
165
|
+
rmSync(dir, { recursive: true, force: true });
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test("saveCustomVerifyRetryCounts keeps file when only exhaustedVerificationUnits is non-empty", () => {
|
|
170
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-verify-retries-"));
|
|
171
|
+
try {
|
|
172
|
+
const session = makeSession(dir);
|
|
173
|
+
session.exhaustedVerificationUnits.add("execute-task:M001/S001/T001");
|
|
174
|
+
|
|
175
|
+
saveCustomVerifyRetryCounts(session, {
|
|
176
|
+
logFailure: () => assert.fail("logFailure should not be called"),
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
const saved = JSON.parse(readFileSync(customVerifyRetryStatePath(session), "utf-8"));
|
|
180
|
+
assert.deepEqual(saved.exhausted, ["execute-task:M001/S001/T001"]);
|
|
181
|
+
} finally {
|
|
182
|
+
rmSync(dir, { recursive: true, force: true });
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test("hydrateCustomVerifyRetryCounts skips hydration when exhaustedVerificationUnits is already populated", () => {
|
|
187
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-verify-retries-"));
|
|
188
|
+
try {
|
|
189
|
+
const session = makeSession(dir);
|
|
190
|
+
session.exhaustedVerificationUnits.add("pre-existing:key");
|
|
191
|
+
mkdirSync(join(dir, "runtime"));
|
|
192
|
+
writeFileSync(customVerifyRetryStatePath(session), JSON.stringify({
|
|
193
|
+
counts: { "execute-task/M001/S001/T001": 2 },
|
|
194
|
+
exhausted: ["execute-task:M001/S001/T002"],
|
|
195
|
+
}));
|
|
196
|
+
|
|
197
|
+
hydrateCustomVerifyRetryCounts(session, {
|
|
198
|
+
logFailure: () => assert.fail("logFailure should not be called"),
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
assert.deepEqual([...session.exhaustedVerificationUnits], ["pre-existing:key"]);
|
|
202
|
+
assert.equal(session.verificationRetryCount.size, 0);
|
|
203
|
+
} finally {
|
|
204
|
+
rmSync(dir, { recursive: true, force: true });
|
|
205
|
+
}
|
|
206
|
+
});
|
|
@@ -920,9 +920,9 @@ describe('db-writer', () => {
|
|
|
920
920
|
decision,
|
|
921
921
|
});
|
|
922
922
|
|
|
923
|
-
test('detects deferral in scope
|
|
923
|
+
test('detects deferral in scope when the scope names the slice', () => {
|
|
924
924
|
const result = extractDeferredSliceRef(
|
|
925
|
-
fields('deferral of
|
|
925
|
+
fields('deferral of slice M001/S03', 'Move low-priority work to backlog', ''),
|
|
926
926
|
);
|
|
927
927
|
assert.deepStrictEqual(result, { milestoneId: 'M001', sliceId: 'S03' });
|
|
928
928
|
});
|
|
@@ -950,14 +950,14 @@ describe('db-writer', () => {
|
|
|
950
950
|
|
|
951
951
|
test('recognises "deferring" variant', () => {
|
|
952
952
|
const result = extractDeferredSliceRef(
|
|
953
|
-
fields('
|
|
953
|
+
fields('slice prioritization', 'deferring M005/S02 until later', ''),
|
|
954
954
|
);
|
|
955
955
|
assert.deepStrictEqual(result, { milestoneId: 'M005', sliceId: 'S02' });
|
|
956
956
|
});
|
|
957
957
|
|
|
958
958
|
test('recognises "defers" variant', () => {
|
|
959
959
|
const result = extractDeferredSliceRef(
|
|
960
|
-
fields('team defers slice
|
|
960
|
+
fields('slice prioritization', 'team defers slice M100/S10', ''),
|
|
961
961
|
);
|
|
962
962
|
assert.deepStrictEqual(result, { milestoneId: 'M100', sliceId: 'S10' });
|
|
963
963
|
});
|
|
@@ -969,6 +969,17 @@ describe('db-writer', () => {
|
|
|
969
969
|
assert.deepStrictEqual(result, { milestoneId: 'M003', sliceId: 'S01' });
|
|
970
970
|
});
|
|
971
971
|
|
|
972
|
+
test('does not treat a planning scope reference as a deferred slice', () => {
|
|
973
|
+
const result = extractDeferredSliceRef(
|
|
974
|
+
fields(
|
|
975
|
+
'planning',
|
|
976
|
+
'Plan S01 as the happy-path money loop only; Defer full duplicate/replay idempotency + polling reconciliation backstop (R006).',
|
|
977
|
+
'M003/S01 scope boundary for the BTC money loop (which requirements land in the first slice vs deferred follow-on slices).',
|
|
978
|
+
),
|
|
979
|
+
);
|
|
980
|
+
assert.strictEqual(result, null);
|
|
981
|
+
});
|
|
982
|
+
|
|
972
983
|
test('returns null when no deferral keyword is present', () => {
|
|
973
984
|
const result = extractDeferredSliceRef(
|
|
974
985
|
fields('approved work', 'M001/S01 is ready', 'proceed with M001/S01'),
|
|
@@ -6,7 +6,8 @@ import { tmpdir } from "node:os";
|
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import { randomUUID } from "node:crypto";
|
|
8
8
|
|
|
9
|
-
import { runDispatch
|
|
9
|
+
import { runDispatch } from "../auto/dispatch.ts";
|
|
10
|
+
import { runPreDispatch } from "../auto/pre-dispatch.ts";
|
|
10
11
|
import { AutoSession } from "../auto/session.ts";
|
|
11
12
|
import { resolveUnitSupervisionTimeouts } from "../auto-timers.ts";
|
|
12
13
|
import { bootstrapAutoSession } from "../auto-start.ts";
|
|
@@ -15,7 +16,7 @@ import { resolveDispatch, setResearchProjectPromptBuilderForTest } from "../auto
|
|
|
15
16
|
import { resolveExpectedArtifactPath, verifyExpectedArtifact, writeBlockerPlaceholder } from "../auto-recovery.ts";
|
|
16
17
|
import { finalizeProjectResearchTimeout } from "../project-research-policy.ts";
|
|
17
18
|
import { resetRegistry } from "../rule-registry.ts";
|
|
18
|
-
import { approvalGateIdForUnit, isAwaitingUserInput, isExplicitApprovalResponse,
|
|
19
|
+
import { approvalGateIdForUnit, isAwaitingUserInput, isExplicitApprovalResponse, shouldPauseForQuestion } from "../consent-question.ts";
|
|
19
20
|
import {
|
|
20
21
|
clearPendingAutoStart,
|
|
21
22
|
checkDeepProjectSetupAfterTurn,
|
|
@@ -1402,7 +1403,7 @@ test("deep project setup: user-quoted remote question failure does not pause aut
|
|
|
1402
1403
|
];
|
|
1403
1404
|
|
|
1404
1405
|
assert.equal(isAwaitingUserInput(messages), false);
|
|
1405
|
-
assert.equal(
|
|
1406
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
1406
1407
|
});
|
|
1407
1408
|
|
|
1408
1409
|
test("deep project setup: plain-text approval wait is treated as waiting for user input", () => {
|
|
@@ -1426,7 +1427,7 @@ test("deep project setup: opening interview question does not trigger approval a
|
|
|
1426
1427
|
];
|
|
1427
1428
|
|
|
1428
1429
|
assert.equal(isAwaitingUserInput(messages), true);
|
|
1429
|
-
assert.equal(
|
|
1430
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
1430
1431
|
});
|
|
1431
1432
|
|
|
1432
1433
|
test("deep project setup: grounding interview question with requirements context does not trigger approval abort", () => {
|
|
@@ -1441,7 +1442,7 @@ test("deep project setup: grounding interview question with requirements context
|
|
|
1441
1442
|
];
|
|
1442
1443
|
|
|
1443
1444
|
assert.equal(isAwaitingUserInput(messages), true);
|
|
1444
|
-
assert.equal(
|
|
1445
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
1445
1446
|
});
|
|
1446
1447
|
|
|
1447
1448
|
test("deep project setup: persistence and anti-goals interview prompt does not trigger approval abort", () => {
|
|
@@ -1460,7 +1461,7 @@ test("deep project setup: persistence and anti-goals interview prompt does not t
|
|
|
1460
1461
|
];
|
|
1461
1462
|
|
|
1462
1463
|
assert.equal(isAwaitingUserInput(messages), true);
|
|
1463
|
-
assert.equal(
|
|
1464
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
1464
1465
|
});
|
|
1465
1466
|
|
|
1466
1467
|
test("deep project setup: discovery questions before writing PROJECT do not trigger approval abort", () => {
|
|
@@ -1479,7 +1480,7 @@ test("deep project setup: discovery questions before writing PROJECT do not trig
|
|
|
1479
1480
|
];
|
|
1480
1481
|
|
|
1481
1482
|
assert.equal(isAwaitingUserInput(messages), true);
|
|
1482
|
-
assert.equal(
|
|
1483
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
1483
1484
|
});
|
|
1484
1485
|
|
|
1485
1486
|
test("deep project setup: discovery question mentioning write intent does not trigger approval abort", () => {
|
|
@@ -1491,7 +1492,7 @@ test("deep project setup: discovery question mentioning write intent does not tr
|
|
|
1491
1492
|
];
|
|
1492
1493
|
|
|
1493
1494
|
assert.equal(isAwaitingUserInput(messages), true);
|
|
1494
|
-
assert.equal(
|
|
1495
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
1495
1496
|
});
|
|
1496
1497
|
|
|
1497
1498
|
test("deep project setup: scope discovery question mentioning add does not trigger approval abort", () => {
|
|
@@ -1503,7 +1504,7 @@ test("deep project setup: scope discovery question mentioning add does not trigg
|
|
|
1503
1504
|
];
|
|
1504
1505
|
|
|
1505
1506
|
assert.equal(isAwaitingUserInput(messages), true);
|
|
1506
|
-
assert.equal(
|
|
1507
|
+
assert.equal(shouldPauseForQuestion("discuss-project", messages), false);
|
|
1507
1508
|
});
|
|
1508
1509
|
|
|
1509
1510
|
test("deep project setup: requirements preview question from screenshot is treated as waiting", () => {
|
|
@@ -1523,12 +1524,12 @@ test("deep project setup: requirements preview question from screenshot is treat
|
|
|
1523
1524
|
];
|
|
1524
1525
|
|
|
1525
1526
|
assert.equal(isAwaitingUserInput(messages), true);
|
|
1526
|
-
assert.equal(
|
|
1527
|
+
assert.equal(shouldPauseForQuestion("discuss-requirements", messages), true);
|
|
1527
1528
|
});
|
|
1528
1529
|
|
|
1529
1530
|
test("deep project setup: research decision question triggers approval boundary pause", () => {
|
|
1530
1531
|
assert.equal(
|
|
1531
|
-
|
|
1532
|
+
shouldPauseForQuestion("research-decision", [
|
|
1532
1533
|
{
|
|
1533
1534
|
role: "assistant",
|
|
1534
1535
|
content: "Run domain research now? (y/n)",
|
|
@@ -569,6 +569,42 @@ describe('derive-state-helpers', () => {
|
|
|
569
569
|
}
|
|
570
570
|
});
|
|
571
571
|
|
|
572
|
+
// ─── Batch slice query: multi-milestone slices loaded in one query ─────
|
|
573
|
+
test('buildRegistryAndFindActive: batched slice query preserves ordering across milestones', async () => {
|
|
574
|
+
const base = createFixtureBase();
|
|
575
|
+
try {
|
|
576
|
+
// M001 is complete so the loop advances past it.
|
|
577
|
+
writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_CONTENT);
|
|
578
|
+
writeFile(base, 'milestones/M001/M001-SUMMARY.md', '# M001 Summary\n\nDone.');
|
|
579
|
+
// M002 is a queued shell milestone with no context and no slices — should be deferred.
|
|
580
|
+
mkdirSync(join(base, '.gsd', 'milestones', 'M002'), { recursive: true });
|
|
581
|
+
// M003 is the real active milestone with slices in non-trivial sequence order.
|
|
582
|
+
writeFile(base, 'milestones/M003/M003-CONTEXT.md', '# M003: Real\n\nReal milestone.');
|
|
583
|
+
|
|
584
|
+
openDatabase(':memory:');
|
|
585
|
+
insertMilestone({ id: 'M001', title: 'Complete', status: 'complete' });
|
|
586
|
+
insertMilestone({ id: 'M002', title: 'Shell', status: 'queued' });
|
|
587
|
+
insertMilestone({ id: 'M003', title: 'Real', status: 'active' });
|
|
588
|
+
// Slices intentionally inserted with out-of-order sequences to prove ordering.
|
|
589
|
+
insertSlice({ id: 'S01', milestoneId: 'M001', title: 'M1 Second', status: 'complete', risk: 'low', depends: [], sequence: 2 });
|
|
590
|
+
insertSlice({ id: 'S02', milestoneId: 'M001', title: 'M1 First', status: 'complete', risk: 'low', depends: [], sequence: 1 });
|
|
591
|
+
insertSlice({ id: 'S03', milestoneId: 'M003', title: 'M3 Second', status: 'active', risk: 'low', depends: [], sequence: 5 });
|
|
592
|
+
insertSlice({ id: 'S04', milestoneId: 'M003', title: 'M3 First', status: 'active', risk: 'low', depends: [], sequence: 3 });
|
|
593
|
+
|
|
594
|
+
invalidateStateCache();
|
|
595
|
+
const state = await deriveStateFromDb(base);
|
|
596
|
+
|
|
597
|
+
assert.equal(state.activeMilestone?.id, 'M003', 'batched: M003 is active after complete M001 and shell M002');
|
|
598
|
+
assert.equal(state.activeSlice?.id, 'S04', 'batched: first slice by sequence is active');
|
|
599
|
+
assert.equal(state.registry.find(e => e.id === 'M001')?.status, 'complete', 'batched: M001 complete');
|
|
600
|
+
assert.equal(state.registry.find(e => e.id === 'M002')?.status, 'pending', 'batched: shell M002 deferred to pending');
|
|
601
|
+
assert.equal(state.registry.find(e => e.id === 'M003')?.status, 'active', 'batched: M003 active');
|
|
602
|
+
} finally {
|
|
603
|
+
closeDatabase();
|
|
604
|
+
cleanup(base);
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
|
|
572
608
|
// ─── Deferred queued shell: shell milestone deferred, real one promoted ──
|
|
573
609
|
test('buildRegistryAndFindActive: queued shell deferred, later real milestone becomes active (#3470)', async () => {
|
|
574
610
|
const base = createFixtureBase();
|