@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33
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-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- 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/bg-shell/utilities.js +3 -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 +30 -4
- 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 +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
- package/dist/resources/extensions/gsd/auto/phases.js +49 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -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 +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +44 -91
- package/dist/resources/extensions/gsd/auto.js +41 -14
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
- 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 +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- 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/captures.js +4 -6
- 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/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 +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +26 -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 +2 -6
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -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 +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +23 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- 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/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- 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 +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- 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 +7 -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/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- 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/state.js +6 -20
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- 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 +56 -0
- 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 +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- 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-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- 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-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- 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-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -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/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 +13 -13
- 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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- 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/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +2 -2
- 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/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -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 +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.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-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/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/dist/cli.js +9 -1
- 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/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/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +116 -39
- 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/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 +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- 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/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/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/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- 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/bg-shell/utilities.ts +3 -0
- 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 +34 -4
- 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 +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
- package/src/resources/extensions/gsd/auto/phases.ts +65 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -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 +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +44 -94
- package/src/resources/extensions/gsd/auto.ts +52 -16
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
- 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 +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- 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/captures.ts +4 -6
- 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/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 +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +37 -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 +2 -7
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -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 +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +37 -28
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- 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/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- 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 +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- 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 +7 -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/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- 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/state.ts +9 -21
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- 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/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/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- 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 +10 -10
- 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 +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- 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/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 +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- 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/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- 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 +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- 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-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- 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.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- 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 +76 -0
- 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 +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- 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-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- 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-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- 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-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.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/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
|
@@ -18,7 +18,7 @@ import { deriveState } from "./state.js";
|
|
|
18
18
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
19
19
|
import { loadFile, parseSummary, resolveAllOverrides } from "./files.js";
|
|
20
20
|
import { loadPrompt } from "./prompt-loader.js";
|
|
21
|
-
import { isAwaitingUserInput } from "./
|
|
21
|
+
import { isAwaitingUserInput } from "./consent-question.js";
|
|
22
22
|
import {
|
|
23
23
|
resolveMilestonePath,
|
|
24
24
|
resolveSliceFile,
|
|
@@ -51,8 +51,7 @@ import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
|
51
51
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
52
52
|
import { isDbAvailable, getTask, getSlice, getMilestone, getMilestoneSlices, updateTaskStatus, _getAdapter, getVerificationEvidence } from "./gsd-db.js";
|
|
53
53
|
import { getWorkflowDatabasePath, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
54
|
-
import { renderPlanCheckboxes, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
55
|
-
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
54
|
+
import { renderPlanCheckboxes, renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "./markdown-renderer.js";
|
|
56
55
|
import { consumeSignal } from "./session-status-io.js";
|
|
57
56
|
import {
|
|
58
57
|
checkPostUnitHooks,
|
|
@@ -88,7 +87,7 @@ import { writeTurnGitTransaction } from "./uok/gitops.js";
|
|
|
88
87
|
import { isClosedStatus } from "./status-guards.js";
|
|
89
88
|
import { detectAbandonMilestone } from "./abandon-detect.js";
|
|
90
89
|
import { getPendingGate } from "./bootstrap/write-gate.js";
|
|
91
|
-
import { isDeterministicPolicyError } from "./auto-tool-tracking.js";
|
|
90
|
+
import { isDeterministicPolicyError, isToolUnavailableError } from "./auto-tool-tracking.js";
|
|
92
91
|
import { formatConnectedStepStack, formatPostUnitStatusCard } from "./auto-status-message.js";
|
|
93
92
|
import {
|
|
94
93
|
clearProjectResearchInflightMarker,
|
|
@@ -96,6 +95,7 @@ import {
|
|
|
96
95
|
} from "./project-research-policy.js";
|
|
97
96
|
import { validateArtifact } from "./schemas/validate.js";
|
|
98
97
|
import { verificationRetryKey } from "./auto/verification-retry-policy.js";
|
|
98
|
+
import { saveCustomVerifyRetryCounts } from "./auto/custom-verify-retry-store.js";
|
|
99
99
|
import { getLedger } from "./metrics.js";
|
|
100
100
|
import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
|
|
101
101
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
@@ -901,7 +901,7 @@ export const USER_DRIVEN_DEEP_UNITS = new Set([
|
|
|
901
901
|
"discuss-milestone",
|
|
902
902
|
"research-decision",
|
|
903
903
|
]);
|
|
904
|
-
export { isAwaitingUserInput } from "./
|
|
904
|
+
export { isAwaitingUserInput } from "./consent-question.js";
|
|
905
905
|
|
|
906
906
|
function artifactValidationKind(unitType: string): "project" | "requirements" | null {
|
|
907
907
|
if (unitType === "discuss-project") return "project";
|
|
@@ -990,11 +990,13 @@ async function repairCompleteSliceRoadmapProjection(
|
|
|
990
990
|
return false;
|
|
991
991
|
}
|
|
992
992
|
|
|
993
|
+
// Stale-render detection (ADR-017): the DB already says the slice is closed;
|
|
994
|
+
// this only checks whether the rendered ROADMAP projection reflects it, to
|
|
995
|
+
// decide whether a repair re-render is needed.
|
|
993
996
|
const roadmapPath = resolveMilestoneFile(artifactBase, mid, "ROADMAP");
|
|
994
997
|
if (roadmapPath && existsSync(roadmapPath)) {
|
|
995
998
|
try {
|
|
996
|
-
|
|
997
|
-
if (roadmap.slices.find((roadmapSlice) => roadmapSlice.id === sid)?.done) {
|
|
999
|
+
if (roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sid)) {
|
|
998
1000
|
return false;
|
|
999
1001
|
}
|
|
1000
1002
|
} catch (err) {
|
|
@@ -2022,7 +2024,32 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2022
2024
|
"error",
|
|
2023
2025
|
);
|
|
2024
2026
|
} else if (!triggerArtifactVerified) {
|
|
2025
|
-
if (s.lastToolInvocationError) {
|
|
2027
|
+
if (s.lastToolInvocationError && isToolUnavailableError(s.lastToolInvocationError)) {
|
|
2028
|
+
// Tool-unavailable is transient: the workflow MCP server registers
|
|
2029
|
+
// its surface asynchronously, so a Unit's first call can race the
|
|
2030
|
+
// registration. Retry with escalating delay, bounded at 3 attempts.
|
|
2031
|
+
// ponytail: MAX constant so the guard, log, and display all agree
|
|
2032
|
+
const MAX_TOOL_UNAVAIL_RETRIES = 3;
|
|
2033
|
+
if (s.toolUnavailableRetries >= MAX_TOOL_UNAVAIL_RETRIES) {
|
|
2034
|
+
debugLog("postUnit", { phase: "tool-unavailable-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, retries: s.toolUnavailableRetries });
|
|
2035
|
+
ctx.ui.notify(
|
|
2036
|
+
`Tool unavailable for ${s.currentUnit.type} after ${MAX_TOOL_UNAVAIL_RETRIES} retries: ${s.lastToolInvocationError}. MCP server may not be starting — pausing auto-mode.`,
|
|
2037
|
+
"error",
|
|
2038
|
+
);
|
|
2039
|
+
s.lastToolInvocationError = null;
|
|
2040
|
+
await pauseAuto(ctx, pi);
|
|
2041
|
+
return "dispatched";
|
|
2042
|
+
}
|
|
2043
|
+
s.toolUnavailableRetries++;
|
|
2044
|
+
const delayMs = s.toolUnavailableRetries * 1000;
|
|
2045
|
+
debugLog("postUnit", { phase: "tool-unavailable-retry", unitType: s.currentUnit.type, unitId: s.currentUnit.id, error: s.lastToolInvocationError, attempt: s.toolUnavailableRetries, delayMs });
|
|
2046
|
+
ctx.ui.notify(
|
|
2047
|
+
`Tool unavailable for ${s.currentUnit.type}: ${s.lastToolInvocationError}. Waiting ${delayMs}ms for MCP server — retry ${s.toolUnavailableRetries}/${MAX_TOOL_UNAVAIL_RETRIES}.`,
|
|
2048
|
+
"warning",
|
|
2049
|
+
);
|
|
2050
|
+
s.lastToolInvocationError = null;
|
|
2051
|
+
await new Promise(r => setTimeout(r, delayMs));
|
|
2052
|
+
} else if (s.lastToolInvocationError) {
|
|
2026
2053
|
const isUserSkip = /queued user message/i.test(s.lastToolInvocationError);
|
|
2027
2054
|
const errMsg = isUserSkip
|
|
2028
2055
|
? `Tool skipped for ${s.currentUnit.type}: ${s.lastToolInvocationError}. Queued user message interrupted the turn — pausing auto-mode.`
|
|
@@ -2148,6 +2175,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2148
2175
|
}
|
|
2149
2176
|
}
|
|
2150
2177
|
s.exhaustedVerificationUnits.add(retryKey);
|
|
2178
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2151
2179
|
debugLog("postUnit", { phase: "artifact-verify-exhausted", unitType: s.currentUnit.type, unitId: s.currentUnit.id, attempt });
|
|
2152
2180
|
ctx.ui.notify(
|
|
2153
2181
|
`${failureDetails} Pausing auto-mode after ${MAX_ARTIFACT_VERIFICATION_RETRIES} retries.`,
|
|
@@ -2157,6 +2185,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2157
2185
|
return "dispatched";
|
|
2158
2186
|
}
|
|
2159
2187
|
s.verificationRetryCount.set(retryKey, attempt);
|
|
2188
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2160
2189
|
s.pendingVerificationRetry = {
|
|
2161
2190
|
unitId: s.currentUnit.id,
|
|
2162
2191
|
failureContext: `${failureDetails} (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
|
|
@@ -2178,8 +2207,11 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
2178
2207
|
if (s.pendingVerificationRetry?.unitId === s.currentUnit.id) {
|
|
2179
2208
|
s.pendingVerificationRetry = null;
|
|
2180
2209
|
}
|
|
2210
|
+
s.toolUnavailableRetries = 0;
|
|
2181
2211
|
s.verificationRetryCount.delete(retryKey);
|
|
2182
2212
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
2213
|
+
s.exhaustedVerificationUnits.delete(retryKey);
|
|
2214
|
+
saveCustomVerifyRetryCounts(s, { logFailure: err => debugLog("postUnit", { phase: "save-verify-retries-failed", error: err instanceof Error ? err.message : String(err) }) });
|
|
2183
2215
|
|
|
2184
2216
|
if (s.currentUnit.type === "complete-milestone") {
|
|
2185
2217
|
const { milestone: mid } = parseUnitId(s.currentUnit.id);
|
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
composeContextModeInstructions,
|
|
41
41
|
composeContractedUnitContext,
|
|
42
42
|
composeInlinedContext,
|
|
43
|
+
composeToolSurfaceInstructions,
|
|
43
44
|
composeUnitContext,
|
|
44
45
|
type ArtifactResolver,
|
|
45
46
|
type ComposedUnitContextBlock,
|
|
@@ -57,7 +58,11 @@ import { debugLog } from "./debug-logger.js";
|
|
|
57
58
|
import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
|
|
58
59
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
59
60
|
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
60
|
-
import {
|
|
61
|
+
import {
|
|
62
|
+
classifyUatContentForRun,
|
|
63
|
+
shouldDispatchUatForContent,
|
|
64
|
+
type UatType,
|
|
65
|
+
} from "./uat-policy.js";
|
|
61
66
|
import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
|
|
62
67
|
|
|
63
68
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
@@ -292,10 +297,12 @@ function prependContextModeToBlock(
|
|
|
292
297
|
block: string,
|
|
293
298
|
renderMode: ContextModeRenderMode = "standalone",
|
|
294
299
|
): string {
|
|
300
|
+
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
|
|
295
301
|
const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
|
|
296
|
-
|
|
297
|
-
if (!
|
|
298
|
-
return
|
|
302
|
+
const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
|
|
303
|
+
if (!guidance) return block;
|
|
304
|
+
if (!block.trim()) return guidance;
|
|
305
|
+
return `${guidance}\n\n${block}`;
|
|
299
306
|
}
|
|
300
307
|
|
|
301
308
|
function requireUnitPromptContextContract(unitType: string): UnitPromptContextContract {
|
|
@@ -969,7 +976,7 @@ export async function inlineDecisionsFromDb(
|
|
|
969
976
|
|
|
970
977
|
/**
|
|
971
978
|
* Inline requirements with optional milestone and slice scoping from the DB.
|
|
972
|
-
* Falls back to filesystem via inlineGsdRootFile when DB unavailable
|
|
979
|
+
* Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
|
|
973
980
|
*/
|
|
974
981
|
export async function inlineRequirementsFromDb(
|
|
975
982
|
base: string, milestoneId?: string, sliceId?: string, level?: InlineLevel,
|
|
@@ -979,14 +986,28 @@ export async function inlineRequirementsFromDb(
|
|
|
979
986
|
const { isDbAvailable } = await import("./gsd-db.js");
|
|
980
987
|
if (isDbAvailable()) {
|
|
981
988
|
const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
|
|
982
|
-
|
|
989
|
+
let requirements = queryRequirements({ milestoneId, sliceId });
|
|
990
|
+
let broadenedScope = false;
|
|
991
|
+
if (requirements.length === 0 && sliceId) {
|
|
992
|
+
requirements = queryRequirements({ milestoneId });
|
|
993
|
+
broadenedScope = true;
|
|
994
|
+
}
|
|
995
|
+
if (requirements.length === 0 && milestoneId) {
|
|
996
|
+
requirements = queryRequirements({ status: "active" });
|
|
997
|
+
broadenedScope = true;
|
|
998
|
+
}
|
|
983
999
|
if (requirements.length > 0) {
|
|
984
|
-
// Use compact format for non-full levels
|
|
985
|
-
|
|
1000
|
+
// Use compact format for non-full levels, milestone-scoped calls, and
|
|
1001
|
+
// any cascade stage that broadened past the originally requested scope —
|
|
1002
|
+
// a slice-scoped "full" call that fell through to the project-wide
|
|
1003
|
+
// active fallback must not format those rows as full requirements.
|
|
1004
|
+
const useCompact = inlineLevel !== "full" || !sliceId || broadenedScope;
|
|
1005
|
+
const formatted = useCompact
|
|
986
1006
|
? formatRequirementsCompact(requirements)
|
|
987
1007
|
: formatRequirementsForPrompt(requirements);
|
|
988
1008
|
return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
|
|
989
1009
|
}
|
|
1010
|
+
return null;
|
|
990
1011
|
}
|
|
991
1012
|
} catch (err) {
|
|
992
1013
|
logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1442,6 +1463,40 @@ export async function checkNeedsReassessment(
|
|
|
1442
1463
|
* - No UAT file exists for the slice
|
|
1443
1464
|
* - UAT result file already exists (idempotent — already ran)
|
|
1444
1465
|
*/
|
|
1466
|
+
/**
|
|
1467
|
+
* Resolve the effective UAT mode for the dispatch gate the same way
|
|
1468
|
+
* `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
|
|
1469
|
+
* supplemental context, so a `browser-executable` UAT whose slice references a
|
|
1470
|
+
* self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
|
|
1471
|
+
* playwright test`) is promoted to `runtime-executable` for the gate too.
|
|
1472
|
+
*
|
|
1473
|
+
* Without this, `checkNeedsRunUat` returns `browser-executable` while the
|
|
1474
|
+
* prompt instructs runtime-only execution, causing the dispatch gate to
|
|
1475
|
+
* require browser tools / warm up the browser daemon (or stop dispatch when
|
|
1476
|
+
* browser MCP is unavailable) for UAT runs that never touch the browser. See
|
|
1477
|
+
* cursor[bot] review on PR #696 for the M007/S01 regression.
|
|
1478
|
+
*/
|
|
1479
|
+
async function resolveRunUatEffectiveType(
|
|
1480
|
+
base: string,
|
|
1481
|
+
mid: string,
|
|
1482
|
+
sliceId: string,
|
|
1483
|
+
uatContent: string,
|
|
1484
|
+
): Promise<UatType> {
|
|
1485
|
+
let summaryContent = "";
|
|
1486
|
+
try {
|
|
1487
|
+
const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
|
|
1488
|
+
if (summaryPath) {
|
|
1489
|
+
summaryContent = (await loadFile(summaryPath)) ?? "";
|
|
1490
|
+
}
|
|
1491
|
+
} catch (err) {
|
|
1492
|
+
logWarning(
|
|
1493
|
+
"prompt",
|
|
1494
|
+
`resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
1495
|
+
);
|
|
1496
|
+
}
|
|
1497
|
+
return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1445
1500
|
export async function checkNeedsRunUat(
|
|
1446
1501
|
base: string, mid: string, state: GSDState, prefs: GSDPreferences | undefined,
|
|
1447
1502
|
): Promise<{ sliceId: string; uatType: UatType } | null> {
|
|
@@ -1470,7 +1525,8 @@ export async function checkNeedsRunUat(
|
|
|
1470
1525
|
if (assessmentContent && hasVerdict(assessmentContent)) continue;
|
|
1471
1526
|
}
|
|
1472
1527
|
if (!shouldDispatchUatForContent(uatContent, prefs)) continue;
|
|
1473
|
-
|
|
1528
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
|
|
1529
|
+
return { sliceId: sid, uatType };
|
|
1474
1530
|
}
|
|
1475
1531
|
return null;
|
|
1476
1532
|
}
|
|
@@ -1503,7 +1559,8 @@ export async function checkNeedsRunUat(
|
|
|
1503
1559
|
if (assessmentContentFb && hasVerdict(assessmentContentFb)) continue;
|
|
1504
1560
|
}
|
|
1505
1561
|
if (!shouldDispatchUatForContent(uatContentFb, prefs)) continue;
|
|
1506
|
-
|
|
1562
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
|
|
1563
|
+
return { sliceId: uatSid, uatType };
|
|
1507
1564
|
}
|
|
1508
1565
|
return null;
|
|
1509
1566
|
}
|
|
@@ -2470,6 +2527,9 @@ export async function buildPlanSlicePrompt(
|
|
|
2470
2527
|
`Either (a) add an earlier task that creates X on disk before the task that needs it, ` +
|
|
2471
2528
|
`or (b) if this task IS the one that creates X, move X from inputs to expected_output. ` +
|
|
2472
2529
|
`Do NOT put X in a task's expected_output if that task only reads or verifies X — only tasks that actually write X to disk should list it in expected_output.\n` +
|
|
2530
|
+
`- **"[file] X: ... GSD planning artifacts are projections preloaded as context / written by workflow tools"**: ` +
|
|
2531
|
+
`Remove X from the task's inputs, files, and expectedOutput entirely. Planning artifacts (anything under .gsd/, .planning/, or .audits/, or names like M001-CONTEXT.md / S01-PLAN.md) are preloaded as context and written by workflow tools — ` +
|
|
2532
|
+
`do NOT add a task that creates X and do NOT move X to expectedOutput.\n` +
|
|
2473
2533
|
`- **"[file] X: Task T_early reads X but it's created by task T_late (sequence violation)"**: ` +
|
|
2474
2534
|
`Either (a) reorder tasks so T_late (the creator) runs before T_early (the reader), ` +
|
|
2475
2535
|
`or (b) if T_late doesn't actually create X (it only reads/tests it), remove X from T_late's expected_output entirely.\n` +
|
|
@@ -3554,15 +3614,30 @@ export async function buildRunUatPrompt(
|
|
|
3554
3614
|
null,
|
|
3555
3615
|
cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget",
|
|
3556
3616
|
);
|
|
3617
|
+
const uatPolicy = classifyUatContentForRun(uatContent, cappedInlinedContext);
|
|
3618
|
+
const uatType = uatPolicy.effectiveType;
|
|
3619
|
+
const runtimeHarnessOverride = uatPolicy.declaredType === "browser-executable" && uatType === "runtime-executable"
|
|
3620
|
+
? [
|
|
3621
|
+
"## Runtime harness override",
|
|
3622
|
+
"",
|
|
3623
|
+
"This UAT declares `browser-executable` but the slice references a self-contained verification command (`npm run test:uat`, `search-uat.mjs`, or similar).",
|
|
3624
|
+
"Run **only** that command via `gsd_uat_exec` with `uat-runtime-check` intent.",
|
|
3625
|
+
"Do **not** call `uat-service-start`, do **not** run `npm run start`, `npm run test:server`, or any separate server command.",
|
|
3626
|
+
"Do **not** use `browser_navigate` or other `browser_*` tools — the harness already exercises the browser.",
|
|
3627
|
+
"When the harness exits 0, save **PASS** with `uatType: \"runtime-executable\"` (the effective mode above, not the UAT file header) and **runtime** check modes only.",
|
|
3628
|
+
"",
|
|
3629
|
+
].join("\n")
|
|
3630
|
+
: "";
|
|
3557
3631
|
const inlinedContext = prependContextModeToBlock(
|
|
3558
3632
|
"run-uat",
|
|
3559
3633
|
base,
|
|
3560
|
-
|
|
3634
|
+
runtimeHarnessOverride
|
|
3635
|
+
? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
|
|
3636
|
+
: cappedInlinedContext,
|
|
3561
3637
|
);
|
|
3562
3638
|
emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
|
|
3563
3639
|
|
|
3564
3640
|
const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
|
|
3565
|
-
const uatType = resolveEffectiveUatType(uatContent);
|
|
3566
3641
|
const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
|
|
3567
3642
|
|
|
3568
3643
|
return loadPrompt("run-uat", {
|
|
@@ -3847,18 +3922,22 @@ export async function buildReactiveExecutePrompt(
|
|
|
3847
3922
|
const inlinedTemplates = inlineTemplate("task-summary", "Task Summary");
|
|
3848
3923
|
trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates);
|
|
3849
3924
|
|
|
3850
|
-
const prompt =
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3925
|
+
const prompt = prependContextModeToBlock(
|
|
3926
|
+
"reactive-execute",
|
|
3927
|
+
base,
|
|
3928
|
+
loadPrompt("reactive-execute", {
|
|
3929
|
+
workingDirectory: base,
|
|
3930
|
+
milestoneId: mid,
|
|
3931
|
+
milestoneTitle: midTitle,
|
|
3932
|
+
sliceId: sid,
|
|
3933
|
+
sliceTitle: sTitle,
|
|
3934
|
+
graphContext,
|
|
3935
|
+
readyTaskCount: String(readyTaskIds.length),
|
|
3936
|
+
readyTaskList: readyTaskListLines.join("\n"),
|
|
3937
|
+
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
3938
|
+
inlinedTemplates,
|
|
3939
|
+
}),
|
|
3940
|
+
);
|
|
3862
3941
|
emitPromptContextTelemetry("reactive-execute", contextTelemetry, prompt);
|
|
3863
3942
|
return prompt;
|
|
3864
3943
|
}
|
|
@@ -4037,17 +4116,21 @@ export async function buildGateEvaluatePrompt(
|
|
|
4037
4116
|
].join("\n"));
|
|
4038
4117
|
}
|
|
4039
4118
|
|
|
4040
|
-
return
|
|
4041
|
-
|
|
4042
|
-
|
|
4043
|
-
|
|
4044
|
-
|
|
4045
|
-
|
|
4046
|
-
|
|
4047
|
-
|
|
4048
|
-
|
|
4049
|
-
|
|
4050
|
-
|
|
4119
|
+
return prependContextModeToBlock(
|
|
4120
|
+
"gate-evaluate",
|
|
4121
|
+
base,
|
|
4122
|
+
loadPrompt("gate-evaluate", {
|
|
4123
|
+
workingDirectory: base,
|
|
4124
|
+
milestoneId: mid,
|
|
4125
|
+
milestoneTitle: midTitle,
|
|
4126
|
+
sliceId: sid,
|
|
4127
|
+
sliceTitle: sTitle,
|
|
4128
|
+
slicePlanContent: planContent,
|
|
4129
|
+
gateCount: String(pending.length),
|
|
4130
|
+
gateList: gateListLines.join("\n"),
|
|
4131
|
+
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
4132
|
+
}),
|
|
4133
|
+
);
|
|
4051
4134
|
}
|
|
4052
4135
|
|
|
4053
4136
|
export async function buildRewriteDocsPrompt(
|
|
@@ -28,6 +28,7 @@ import { ensureGsdSymlink, isInheritedRepo, validateProjectId } from "./repo-ide
|
|
|
28
28
|
import { migrateToExternalState, recoverFailedMigration } from "./migrate-external.js";
|
|
29
29
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
30
30
|
import { gsdRoot, resolveMilestoneFile } from "./paths.js";
|
|
31
|
+
import { milestoneEntryBlockedGuidance } from "./guidance.js";
|
|
31
32
|
import { invalidateAllCaches } from "./cache.js";
|
|
32
33
|
import { writeLock, clearLock, readCrashLock, isLockProcessAlive } from "./crash-recovery.js";
|
|
33
34
|
import {
|
|
@@ -57,7 +58,8 @@ import {
|
|
|
57
58
|
detectWorktreeName,
|
|
58
59
|
setActiveMilestoneId,
|
|
59
60
|
} from "./worktree.js";
|
|
60
|
-
import { getAutoWorktreePath, isInAutoWorktree
|
|
61
|
+
import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
|
|
62
|
+
import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
|
|
61
63
|
import { readResourceVersion, cleanStaleRuntimeUnits } from "./auto-worktree.js";
|
|
62
64
|
import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
|
|
63
65
|
import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
|
|
@@ -993,12 +995,14 @@ export async function bootstrapAutoSession(
|
|
|
993
995
|
// phase-specific planning model for a discuss turn (#2829).
|
|
994
996
|
//
|
|
995
997
|
// Precedence:
|
|
996
|
-
// 1) Explicit session override via /gsd model (this session)
|
|
997
|
-
// 2)
|
|
998
|
-
// 3)
|
|
998
|
+
// 1) Explicit session override via /gsd model or /gsd auto --model (this session)
|
|
999
|
+
// 2) GSD model preferences from PREFERENCES.md (validated against live auth)
|
|
1000
|
+
// 3) Current session model from settings/session restore (if provider ready)
|
|
999
1001
|
//
|
|
1000
|
-
//
|
|
1001
|
-
//
|
|
1002
|
+
// PREFERENCES.md wins over the ambient session default (#3517) so /gsd auto
|
|
1003
|
+
// does not stick on claude-code/claude-sonnet-4-6 when the user configured
|
|
1004
|
+
// models via /gsd workflow-preferences or PREFERENCES.md. Custom providers
|
|
1005
|
+
// still skip PREFERENCES.md entirely (#4122).
|
|
1002
1006
|
//
|
|
1003
1007
|
// Exception (#4122): when the session provider is a custom provider declared
|
|
1004
1008
|
// in ~/.gsd/agent/models.json (Ollama, vLLM, OpenAI-compatible proxy, etc.),
|
|
@@ -1010,7 +1014,7 @@ export async function bootstrapAutoSession(
|
|
|
1010
1014
|
const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
|
|
1011
1015
|
const preferredModel = sessionProviderIsCustom
|
|
1012
1016
|
? null
|
|
1013
|
-
: resolveDefaultSessionModel(ctx.model?.provider);
|
|
1017
|
+
: resolveDefaultSessionModel(ctx.model?.provider, base);
|
|
1014
1018
|
// Validate the preferred model against the live registry + provider auth so
|
|
1015
1019
|
// an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
|
|
1016
1020
|
// start-model snapshot. Without this, every subsequent unit would try to
|
|
@@ -1040,8 +1044,8 @@ export async function bootstrapAutoSession(
|
|
|
1040
1044
|
: null;
|
|
1041
1045
|
const startThinkingSnapshot = pi.getThinkingLevel();
|
|
1042
1046
|
const startModelSnapshot = manualSessionOverride
|
|
1043
|
-
?? currentSessionModel
|
|
1044
1047
|
?? validatedPreferredModel
|
|
1048
|
+
?? currentSessionModel
|
|
1045
1049
|
?? null;
|
|
1046
1050
|
|
|
1047
1051
|
try {
|
|
@@ -1267,11 +1271,29 @@ export async function bootstrapAutoSession(
|
|
|
1267
1271
|
}
|
|
1268
1272
|
}
|
|
1269
1273
|
|
|
1270
|
-
const
|
|
1271
|
-
|
|
1274
|
+
const requestedMilestoneLock = process.env.GSD_MILESTONE_LOCK?.trim() || null;
|
|
1275
|
+
const lockedActiveMilestone =
|
|
1276
|
+
requestedMilestoneLock && state.activeMilestone?.id === requestedMilestoneLock;
|
|
1277
|
+
let blockingStrandedRecoveryAction: OrphanAuditAction | null;
|
|
1278
|
+
if (lockedActiveMilestone) {
|
|
1279
|
+
// Parallel worker or explicit `/gsd auto Mxxx`: sibling milestones'
|
|
1280
|
+
// stranded work must not block this milestone's resumption, and the
|
|
1281
|
+
// downstream `strandedRecoveryAction` (used for currentMilestoneId,
|
|
1282
|
+
// setActiveMilestoneId, and adoptStrandedMilestone) must be scoped to
|
|
1283
|
+
// the locked milestone only. Falling back to the first sibling action
|
|
1284
|
+
// would mis-target adoption (#742).
|
|
1285
|
+
const lockMatch = strandedRecoveryActions.find(
|
|
1286
|
+
(action) => action.milestoneId === requestedMilestoneLock,
|
|
1287
|
+
) ?? null;
|
|
1288
|
+
blockingStrandedRecoveryAction = lockMatch;
|
|
1289
|
+
strandedRecoveryAction = lockMatch;
|
|
1290
|
+
} else if (state.activeMilestone) {
|
|
1291
|
+
blockingStrandedRecoveryAction = strandedRecoveryActions.find(
|
|
1272
1292
|
(action) => action.milestoneId !== state.activeMilestone?.id,
|
|
1273
|
-
) ?? strandedRecoveryAction
|
|
1274
|
-
|
|
1293
|
+
) ?? strandedRecoveryAction;
|
|
1294
|
+
} else {
|
|
1295
|
+
blockingStrandedRecoveryAction = strandedRecoveryAction;
|
|
1296
|
+
}
|
|
1275
1297
|
|
|
1276
1298
|
if (blockingStrandedRecoveryAction) {
|
|
1277
1299
|
if (!state.activeMilestone) {
|
|
@@ -1293,6 +1315,8 @@ export async function bootstrapAutoSession(
|
|
|
1293
1315
|
formatStrandedWorkRecoveryMessage(strandedRecoveryAction),
|
|
1294
1316
|
"info",
|
|
1295
1317
|
);
|
|
1318
|
+
} else if (lockedActiveMilestone) {
|
|
1319
|
+
strandedRecoveryAction = null;
|
|
1296
1320
|
}
|
|
1297
1321
|
|
|
1298
1322
|
if (
|
|
@@ -1612,8 +1636,10 @@ export async function bootstrapAutoSession(
|
|
|
1612
1636
|
const isUnderGsdWorktrees = (p: string): boolean => {
|
|
1613
1637
|
const normalized = p.replaceAll("\\", "/");
|
|
1614
1638
|
if (findWorktreeSegment(normalized) !== null) return true;
|
|
1615
|
-
// The container directory itself (no trailing worktree name).
|
|
1616
|
-
return normalized.endsWith("/.gsd/worktrees")
|
|
1639
|
+
// The container directory itself (no trailing worktree name), in any layout.
|
|
1640
|
+
return normalized.endsWith("/.gsd/worktrees")
|
|
1641
|
+
|| normalized.endsWith("/.gsd-worktrees")
|
|
1642
|
+
|| /\/\.gsd\/projects\/[^/]+\/worktrees$/.test(normalized);
|
|
1617
1643
|
};
|
|
1618
1644
|
|
|
1619
1645
|
if (
|
|
@@ -1640,14 +1666,9 @@ export async function bootstrapAutoSession(
|
|
|
1640
1666
|
`Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`,
|
|
1641
1667
|
"error",
|
|
1642
1668
|
);
|
|
1643
|
-
} else if (enterResult.reason === "creation-failed") {
|
|
1644
|
-
ctx.ui.notify(
|
|
1645
|
-
`Cannot enter milestone ${s.currentMilestoneId}: worktree/branch creation failed. Isolation is degraded.`,
|
|
1646
|
-
"error",
|
|
1647
|
-
);
|
|
1648
|
-
} else if (enterResult.reason === "isolation-degraded") {
|
|
1669
|
+
} else if (enterResult.reason === "creation-failed" || enterResult.reason === "isolation-degraded") {
|
|
1649
1670
|
ctx.ui.notify(
|
|
1650
|
-
|
|
1671
|
+
milestoneEntryBlockedGuidance(s.currentMilestoneId, enterResult.reason),
|
|
1651
1672
|
"error",
|
|
1652
1673
|
);
|
|
1653
1674
|
} else if (enterResult.reason === "invalid-milestone-id") {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { stripMcpToolPrefix } from "@gsd/pi-ai";
|
|
8
|
+
import { TOOL_SURFACE_NOT_READY } from "./tool-surface-readiness.js";
|
|
8
9
|
|
|
9
10
|
interface InFlightTool {
|
|
10
11
|
startedAt: number;
|
|
@@ -132,6 +133,15 @@ export function clearInFlightTools(): void {
|
|
|
132
133
|
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
|
|
133
134
|
const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
|
|
134
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Matches the runtime's "tool not registered" error. Unlike the deterministic
|
|
138
|
+
* invocation failures above, this one is usually transient: the workflow MCP
|
|
139
|
+
* server registers its tool surface asynchronously after session start, so a
|
|
140
|
+
* Unit's first tool call can race the registration. Callers should retry
|
|
141
|
+
* (bounded) instead of breaking the loop.
|
|
142
|
+
*/
|
|
143
|
+
const TOOL_UNAVAILABLE_ERROR_RE = new RegExp(`No such tool available|${TOOL_SURFACE_NOT_READY}`, "i");
|
|
144
|
+
|
|
135
145
|
/**
|
|
136
146
|
* Returns true if the error message indicates a deterministic invocation or
|
|
137
147
|
* policy failure (as opposed to a normal tool execution error).
|
|
@@ -141,6 +151,15 @@ export function isToolInvocationError(errorMsg: string): boolean {
|
|
|
141
151
|
return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
|
|
142
152
|
}
|
|
143
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Returns true if the error message indicates the called tool was not on the
|
|
156
|
+
* session's tool surface (MCP startup race — see TOOL_UNAVAILABLE_ERROR_RE).
|
|
157
|
+
*/
|
|
158
|
+
export function isToolUnavailableError(errorMsg: string): boolean {
|
|
159
|
+
if (!errorMsg) return false;
|
|
160
|
+
return TOOL_UNAVAILABLE_ERROR_RE.test(errorMsg);
|
|
161
|
+
}
|
|
162
|
+
|
|
144
163
|
/**
|
|
145
164
|
* Returns true if the error message indicates the tool was skipped because
|
|
146
165
|
* a queued user message interrupted the turn (#3595). Retrying will produce
|