gsd-pi 2.80.0-dev.42bd34838 → 2.80.0-dev.488219eb6
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/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/loop.js +71 -8
- package/dist/resources/extensions/gsd/auto/phases.js +179 -99
- package/dist/resources/extensions/gsd/auto/resolve.js +12 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -30
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +94 -76
- package/dist/resources/extensions/gsd/auto-prompts.js +90 -15
- package/dist/resources/extensions/gsd/auto-start.js +238 -12
- package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
- package/dist/resources/extensions/gsd/auto.js +95 -44
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +96 -26
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +6 -3
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +298 -54
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +53 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +37 -1
- package/dist/resources/extensions/gsd/guided-flow.js +61 -32
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +57 -5
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- 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 +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +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/page_client-reference-manifest.js +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/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- 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/middleware.js +3 -3
- 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/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.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 +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +8 -0
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +14 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +36 -7
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +3 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +3 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +34 -3
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -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 +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +153 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +23 -5
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +19 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +23 -5
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +40 -7
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +3 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +3 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +5 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +37 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +177 -8
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +24 -5
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +21 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +25 -8
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -2
- package/src/resources/extensions/gsd/auto/loop.ts +84 -8
- package/src/resources/extensions/gsd/auto/phases.ts +258 -159
- package/src/resources/extensions/gsd/auto/resolve.ts +19 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -29
- package/src/resources/extensions/gsd/auto/session.ts +8 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +107 -78
- package/src/resources/extensions/gsd/auto-prompts.ts +95 -14
- package/src/resources/extensions/gsd/auto-start.ts +286 -15
- package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
- package/src/resources/extensions/gsd/auto.ts +132 -40
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +116 -24
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -3
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +347 -54
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +66 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +41 -2
- package/src/resources/extensions/gsd/guided-flow.ts +71 -39
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +361 -10
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +35 -31
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -125
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -97
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +33 -47
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +140 -3
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +83 -5
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_ssgManifest.js +0 -0
|
@@ -7,20 +7,17 @@
|
|
|
7
7
|
|
|
8
8
|
import test from "node:test";
|
|
9
9
|
import assert from "node:assert/strict";
|
|
10
|
-
import { readFileSync } from "node:fs";
|
|
11
|
-
import { join, dirname } from "node:path";
|
|
12
|
-
import { fileURLToPath } from "node:url";
|
|
13
10
|
import { classifyError, isTransient, isTransientNetworkError } from "../error-classifier.ts";
|
|
14
11
|
import { pauseAutoForProviderError } from "../provider-error-pause.ts";
|
|
15
12
|
import { resumeAutoAfterProviderDelay } from "../bootstrap/provider-error-resume.ts";
|
|
16
|
-
import { MAX_TRANSIENT_AUTO_RESUMES } from "../bootstrap/agent-end-recovery.ts";
|
|
13
|
+
import { MAX_TRANSIENT_AUTO_RESUMES, resetTransientRetryState } from "../bootstrap/agent-end-recovery.ts";
|
|
14
|
+
import { _buildCancelledUnitStopReason } from "../auto/phases.ts";
|
|
17
15
|
import { getNextFallbackModel } from "../preferences.ts";
|
|
18
16
|
// Zero-import module — imported by path rather than through the package
|
|
19
17
|
// barrel to avoid pulling the full AgentSession / @gsd/pi-ai dep graph into
|
|
20
18
|
// this unit test (see #4837).
|
|
21
19
|
import { RETRYABLE_ERROR_RE } from "../../../../../packages/pi-coding-agent/src/core/retryable-error-regex.ts";
|
|
22
|
-
|
|
23
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
import { streamOpenAICodexResponses } from "../../../../../packages/pi-ai/src/providers/openai-codex-responses.ts";
|
|
24
21
|
|
|
25
22
|
// ── classifyError ────────────────────────────────────────────────────────────
|
|
26
23
|
|
|
@@ -518,172 +515,73 @@ test("resumeAutoAfterProviderDelay resets provider retry state without clearing
|
|
|
518
515
|
]);
|
|
519
516
|
});
|
|
520
517
|
|
|
521
|
-
// ──
|
|
522
|
-
|
|
523
|
-
test("agent-end-recovery.ts tracks consecutive transient errors for escalating backoff", () => {
|
|
524
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
525
|
-
|
|
526
|
-
assert.ok(
|
|
527
|
-
src.includes("consecutiveTransientCount"),
|
|
528
|
-
"agent-end-recovery.ts must track consecutiveTransientCount for escalating backoff (#1166)",
|
|
529
|
-
);
|
|
530
|
-
assert.ok(
|
|
531
|
-
src.includes("MAX_TRANSIENT_AUTO_RESUMES"),
|
|
532
|
-
"agent-end-recovery.ts must define MAX_TRANSIENT_AUTO_RESUMES to cap infinite retries (#1166)",
|
|
533
|
-
);
|
|
534
|
-
});
|
|
535
|
-
|
|
536
|
-
test("agent-end-recovery.ts resets retry state before resolveAgentEnd on success", () => {
|
|
537
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
538
|
-
|
|
539
|
-
// After successful agent_end, resetRetryState must be called before resolveAgentEnd.
|
|
540
|
-
assert.ok(
|
|
541
|
-
/resetRetryState[\s\S]{0,250}resolveAgentEnd/.test(src),
|
|
542
|
-
"resetRetryState must be called before resolveAgentEnd on the success path (#1166)",
|
|
543
|
-
);
|
|
544
|
-
});
|
|
545
|
-
|
|
546
|
-
test("agent-end-recovery.ts applies escalating delay for repeated transient errors", () => {
|
|
547
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
518
|
+
// ── Provider recovery behavior (#1166 / #2813 / #4373) ─────────────────────
|
|
548
519
|
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
"agent-end-recovery.ts must escalate retryAfterMs exponentially for consecutive transient errors (#1166)",
|
|
553
|
-
);
|
|
520
|
+
test("resetTransientRetryState is callable by resume recovery", () => {
|
|
521
|
+
resetTransientRetryState();
|
|
522
|
+
assert.equal(classifyError("stream_exhausted_without_result").kind, "connection");
|
|
554
523
|
});
|
|
555
524
|
|
|
556
|
-
test("
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
});
|
|
568
|
-
|
|
569
|
-
test("agent-end-recovery.ts does not defer rate-limit errors to core retry handler before fallback (#4373)", () => {
|
|
570
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
571
|
-
assert.ok(
|
|
572
|
-
src.includes('if (isTransient(cls) && cls.kind !== "rate-limit")'),
|
|
573
|
-
"rate-limit errors must bypass transient core-retry deferral so fallback can execute (#4373)",
|
|
574
|
-
);
|
|
575
|
-
});
|
|
576
|
-
|
|
577
|
-
test("agent-end-recovery.ts updates dashboard dispatched model after fallback switch", () => {
|
|
578
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
579
|
-
assert.ok(
|
|
580
|
-
src.includes("setCurrentDispatchedModelId"),
|
|
581
|
-
"agent-end-recovery.ts should update currentDispatchedModelId when recovery switches model",
|
|
582
|
-
);
|
|
583
|
-
});
|
|
584
|
-
|
|
585
|
-
// ── Codex error extraction (#1166) ──────────────────────────────────────────
|
|
586
|
-
|
|
587
|
-
test("openai-codex-responses.ts extracts nested error fields", () => {
|
|
588
|
-
const codexSource = readFileSync(
|
|
589
|
-
join(__dirname, "../../../../../packages/pi-ai/src/providers/openai-codex-responses.ts"),
|
|
590
|
-
"utf-8",
|
|
591
|
-
);
|
|
592
|
-
|
|
593
|
-
// Must access event.error.message (nested), not just event.message (top-level)
|
|
594
|
-
assert.ok(
|
|
595
|
-
codexSource.includes("errorObj?.message"),
|
|
596
|
-
"mapCodexEvents must extract message from nested event.error object (#1166)",
|
|
597
|
-
);
|
|
598
|
-
assert.ok(
|
|
599
|
-
codexSource.includes("errorObj?.type"),
|
|
600
|
-
"mapCodexEvents must extract type from nested event.error object (#1166)",
|
|
601
|
-
);
|
|
602
|
-
});
|
|
603
|
-
|
|
604
|
-
// ── Fix 1: resetTransientRetryState resets module-level singleton ────────────
|
|
605
|
-
|
|
606
|
-
test("resetTransientRetryState is exported from agent-end-recovery.ts", () => {
|
|
607
|
-
const src = readFileSync(join(__dirname, "..", "bootstrap", "agent-end-recovery.ts"), "utf-8");
|
|
608
|
-
assert.ok(
|
|
609
|
-
src.includes("export function resetTransientRetryState"),
|
|
610
|
-
"agent-end-recovery.ts must export resetTransientRetryState for provider-error-resume.ts",
|
|
525
|
+
test("cancelled unit stop reason differentiates session startup failures", () => {
|
|
526
|
+
assert.deepEqual(
|
|
527
|
+
_buildCancelledUnitStopReason("plan-slice", "S01", {
|
|
528
|
+
category: "session-failed",
|
|
529
|
+
message: "Session creation timed out",
|
|
530
|
+
}),
|
|
531
|
+
{
|
|
532
|
+
notifyMessage: "Session creation failed for plan-slice S01: Session creation timed out. Stopping auto-mode.",
|
|
533
|
+
stopReason: "Session creation failed: Session creation timed out",
|
|
534
|
+
loopReason: "session-failed",
|
|
535
|
+
},
|
|
611
536
|
);
|
|
612
|
-
});
|
|
613
|
-
|
|
614
|
-
// ── Fix 2: Session creation timeout treated as transient in phases.ts ───────
|
|
615
|
-
|
|
616
|
-
test("phases.ts handles timeout session-creation failures with pause instead of stopAuto", () => {
|
|
617
|
-
const src = readFileSync(join(__dirname, "..", "auto", "phases.ts"), "utf-8");
|
|
618
537
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
assert.ok(
|
|
630
|
-
/errorCategory === "timeout"[\s\S]{0,1800}pauseAuto/.test(src),
|
|
631
|
-
"phases.ts must call pauseAuto for session-timeout failures (not stopAuto or continue)",
|
|
632
|
-
);
|
|
633
|
-
assert.ok(
|
|
634
|
-
/errorCategory === "session-failed"[\s\S]{0,700}pauseAuto/.test(src),
|
|
635
|
-
"phases.ts must call pauseAuto for transient session-start failures (not stopAuto or continue)",
|
|
636
|
-
);
|
|
637
|
-
// Must NOT use action: "continue" for transient cancellations (causes infinite loops)
|
|
638
|
-
assert.ok(
|
|
639
|
-
!/isTransient[\s\S]{0,500}action:\s*"continue"/.test(src),
|
|
640
|
-
"phases.ts must NOT return action:continue for cancelled units — use break+pause instead",
|
|
538
|
+
assert.deepEqual(
|
|
539
|
+
_buildCancelledUnitStopReason("execute-task", "T01", {
|
|
540
|
+
category: "aborted",
|
|
541
|
+
message: "Request aborted by user",
|
|
542
|
+
}),
|
|
543
|
+
{
|
|
544
|
+
notifyMessage: "Unit execute-task T01 aborted after dispatch: Request aborted by user. Stopping auto-mode.",
|
|
545
|
+
stopReason: "Unit aborted: Request aborted by user",
|
|
546
|
+
loopReason: "unit-aborted",
|
|
547
|
+
},
|
|
641
548
|
);
|
|
642
549
|
});
|
|
643
550
|
|
|
644
|
-
|
|
551
|
+
test("openai-codex response stream surfaces nested error type and message", async () => {
|
|
552
|
+
const originalFetch = globalThis.fetch;
|
|
553
|
+
const tokenPayload = Buffer.from(JSON.stringify({
|
|
554
|
+
"https://api.openai.com/auth": { chatgpt_account_id: "acct-test" },
|
|
555
|
+
})).toString("base64");
|
|
556
|
+
const apiKey = `header.${tokenPayload}.signature`;
|
|
557
|
+
globalThis.fetch = (async () => new Response(
|
|
558
|
+
'data: {"type":"error","error":{"type":"server_error","code":"server_error","message":"upstream failed"}}\n\n',
|
|
559
|
+
{ status: 200, headers: { "content-type": "text/event-stream" } },
|
|
560
|
+
)) as typeof fetch;
|
|
645
561
|
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
src.includes("resumeAutoAfterProviderDelay"),
|
|
657
|
-
"phases.ts must schedule resume via resumeAutoAfterProviderDelay",
|
|
658
|
-
);
|
|
659
|
-
// Must track consecutive session timeouts
|
|
660
|
-
assert.ok(
|
|
661
|
-
src.includes("consecutiveSessionTimeouts"),
|
|
662
|
-
"phases.ts must track consecutive session timeouts for escalating backoff",
|
|
663
|
-
);
|
|
664
|
-
// Must cap session timeout auto-resumes
|
|
665
|
-
assert.ok(
|
|
666
|
-
/MAX_SESSION_TIMEOUT_AUTO_RESUMES\s*=\s*\d+/.test(src),
|
|
667
|
-
"phases.ts must cap session timeout auto-resumes",
|
|
668
|
-
);
|
|
669
|
-
});
|
|
562
|
+
try {
|
|
563
|
+
const stream = streamOpenAICodexResponses(
|
|
564
|
+
{
|
|
565
|
+
provider: "openai-codex-responses",
|
|
566
|
+
id: "gpt-5.1-codex",
|
|
567
|
+
baseUrl: "https://codex.example.test",
|
|
568
|
+
} as any,
|
|
569
|
+
{ messages: [], systemPrompt: "", tools: [] } as any,
|
|
570
|
+
{ apiKey } as any,
|
|
571
|
+
);
|
|
670
572
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
"phases.ts must check for 'Session creation timed out' message to differentiate from unit hard timeout",
|
|
676
|
-
);
|
|
677
|
-
});
|
|
573
|
+
const events = [];
|
|
574
|
+
for await (const event of stream) {
|
|
575
|
+
events.push(event);
|
|
576
|
+
}
|
|
678
577
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
);
|
|
578
|
+
const errorEvent = events.find((event) => event.type === "error");
|
|
579
|
+
assert.ok(errorEvent, "stream should emit an error event");
|
|
580
|
+
assert.equal(errorEvent.error.errorMessage, "Codex server_error: upstream failed");
|
|
581
|
+
assert.equal(classifyError(errorEvent.error.errorMessage).kind, "server");
|
|
582
|
+
} finally {
|
|
583
|
+
globalThis.fetch = originalFetch;
|
|
584
|
+
}
|
|
687
585
|
});
|
|
688
586
|
|
|
689
587
|
// ── Fix 3: MAX_TRANSIENT_AUTO_RESUMES raised to 8 ───────────────────────────
|
|
@@ -6,42 +6,46 @@
|
|
|
6
6
|
* The fix imports ensureDbOpen from dynamic-tools and calls it before
|
|
7
7
|
* querying the DB.
|
|
8
8
|
*
|
|
9
|
-
* This
|
|
10
|
-
*
|
|
9
|
+
* This behavior test registers the query tool and executes it against a
|
|
10
|
+
* temp workspace where the DB must be opened on demand.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { describe, test } from 'node:test';
|
|
14
14
|
import assert from 'node:assert/strict';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const __dirname = dirname(__filename);
|
|
21
|
-
|
|
22
|
-
const source = readFileSync(join(__dirname, '..', 'bootstrap', 'query-tools.ts'), 'utf-8');
|
|
15
|
+
import { mkdirSync, mkdtempSync, rmSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { tmpdir } from 'node:os';
|
|
18
|
+
import { closeDatabase, insertMilestone, openDatabase } from '../gsd-db.ts';
|
|
19
|
+
import { registerQueryTools } from '../bootstrap/query-tools.ts';
|
|
23
20
|
|
|
24
21
|
describe('query-tools ensureDbOpen usage (#3672)', () => {
|
|
25
|
-
test('
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
test('gsd_milestone_status opens the workspace DB before querying', async () => {
|
|
23
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-query-tools-'));
|
|
24
|
+
const dbPath = join(base, '.gsd', 'gsd.db');
|
|
25
|
+
const tools: Record<string, any> = {};
|
|
26
|
+
const originalCwd = process.cwd();
|
|
27
|
+
try {
|
|
28
|
+
mkdirSync(join(base, '.gsd'), { recursive: true });
|
|
29
|
+
openDatabase(dbPath);
|
|
30
|
+
insertMilestone({ id: 'M001', title: 'Query me', status: 'active' });
|
|
31
|
+
closeDatabase();
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
assert.doesNotMatch(executeBlock, /isDbAvailable,/,
|
|
40
|
-
'execute path should not destructure isDbAvailable (replaced by ensureDbOpen)');
|
|
41
|
-
});
|
|
33
|
+
registerQueryTools({ registerTool(tool: any) { tools[tool.name] = tool; } } as any);
|
|
34
|
+
process.chdir(base);
|
|
35
|
+
const result = await tools.gsd_milestone_status.execute(
|
|
36
|
+
'call-1',
|
|
37
|
+
{ milestoneId: 'M001' },
|
|
38
|
+
undefined,
|
|
39
|
+
undefined,
|
|
40
|
+
undefined,
|
|
41
|
+
);
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
assert.notEqual(result.details?.error, 'db_unavailable');
|
|
44
|
+
assert.equal(result.details?.milestoneId ?? result.details?.milestone?.id, 'M001');
|
|
45
|
+
} finally {
|
|
46
|
+
process.chdir(originalCwd);
|
|
47
|
+
closeDatabase();
|
|
48
|
+
rmSync(base, { recursive: true, force: true });
|
|
49
|
+
}
|
|
46
50
|
});
|
|
47
51
|
});
|
|
@@ -11,203 +11,29 @@
|
|
|
11
11
|
|
|
12
12
|
import { describe, it } from "node:test";
|
|
13
13
|
import assert from "node:assert/strict";
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
// ─── Structural test: verify the guard exists in source ──────────────────────
|
|
14
|
+
import { _setAutoActiveForTest } from "../auto.ts";
|
|
15
|
+
import { handleWorkflowCommand } from "../commands/handlers/workflow.ts";
|
|
18
16
|
|
|
19
17
|
describe("/gsd queue auto-mode guard (#4704)", () => {
|
|
20
|
-
it("
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// Verify auto-mode guard comes BEFORE showQueue call. Accepts either the
|
|
41
|
-
// inline isAutoActive() check (Tier 1) or the shared requireNotAutoActive()
|
|
42
|
-
// helper (Tier 2 / #4712).
|
|
43
|
-
const guardIndex = Math.max(
|
|
44
|
-
queueBlock.indexOf("isAutoActive()"),
|
|
45
|
-
queueBlock.indexOf("requireNotAutoActive("),
|
|
46
|
-
);
|
|
47
|
-
const showQueueIndex = queueBlock.indexOf("showQueue(");
|
|
48
|
-
|
|
49
|
-
assert.ok(guardIndex !== -1, "auto-mode guard exists in queue command block");
|
|
50
|
-
assert.ok(showQueueIndex !== -1, "showQueue() call exists in queue command block");
|
|
51
|
-
assert.ok(
|
|
52
|
-
guardIndex < showQueueIndex,
|
|
53
|
-
"auto-mode guard appears before showQueue() call",
|
|
54
|
-
);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it("guard shows error message mentioning /gsd stop", () => {
|
|
58
|
-
const src = readFileSync(
|
|
59
|
-
join(
|
|
60
|
-
import.meta.dirname,
|
|
61
|
-
"..",
|
|
62
|
-
"commands",
|
|
63
|
-
"handlers",
|
|
64
|
-
"workflow.ts",
|
|
65
|
-
),
|
|
66
|
-
"utf-8",
|
|
67
|
-
);
|
|
68
|
-
|
|
69
|
-
assert.ok(
|
|
70
|
-
src.includes("cannot run while auto-mode is active"),
|
|
71
|
-
"error message explains that the command cannot run during auto-mode",
|
|
72
|
-
);
|
|
73
|
-
assert.ok(
|
|
74
|
-
src.includes("/gsd stop"),
|
|
75
|
-
"error message mentions /gsd stop as the resolution",
|
|
76
|
-
);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it("guard returns true (handled) to prevent falling through", () => {
|
|
80
|
-
const src = readFileSync(
|
|
81
|
-
join(
|
|
82
|
-
import.meta.dirname,
|
|
83
|
-
"..",
|
|
84
|
-
"commands",
|
|
85
|
-
"handlers",
|
|
86
|
-
"workflow.ts",
|
|
87
|
-
),
|
|
88
|
-
"utf-8",
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
const queueBlockMatch = src.match(
|
|
92
|
-
/if\s*\(\s*trimmed\s*===\s*"queue"\s*\)\s*\{([\s\S]*?)\n \}/,
|
|
93
|
-
);
|
|
94
|
-
assert.ok(queueBlockMatch);
|
|
95
|
-
const queueBlock = queueBlockMatch[1];
|
|
96
|
-
|
|
97
|
-
// The guard block should have its own return true before showQueue
|
|
98
|
-
const guardBlock = queueBlock.slice(0, queueBlock.indexOf("showQueue("));
|
|
99
|
-
assert.ok(
|
|
100
|
-
guardBlock.includes("return true"),
|
|
101
|
-
"guard block returns true before showQueue is reached",
|
|
102
|
-
);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// ─── .gsd/audit/ runtime classification regression ──────────────────────────
|
|
107
|
-
|
|
108
|
-
describe(".gsd/audit/ runtime classification (#4704)", () => {
|
|
109
|
-
it("GSD_RUNTIME_PATTERNS in gitignore.ts includes .gsd/audit/", () => {
|
|
110
|
-
const src = readFileSync(
|
|
111
|
-
join(import.meta.dirname, "..", "gitignore.ts"),
|
|
112
|
-
"utf-8",
|
|
113
|
-
);
|
|
114
|
-
assert.ok(
|
|
115
|
-
src.includes('".gsd/audit/"'),
|
|
116
|
-
".gsd/audit/ listed in GSD_RUNTIME_PATTERNS",
|
|
117
|
-
);
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it("RUNTIME_EXCLUSION_PATHS in git-service.ts includes .gsd/audit/", () => {
|
|
121
|
-
const src = readFileSync(
|
|
122
|
-
join(import.meta.dirname, "..", "git-service.ts"),
|
|
123
|
-
"utf-8",
|
|
124
|
-
);
|
|
125
|
-
assert.ok(
|
|
126
|
-
src.includes('".gsd/audit/"'),
|
|
127
|
-
".gsd/audit/ listed in RUNTIME_EXCLUSION_PATHS",
|
|
128
|
-
);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it("SKIP_PATHS in worktree-manager.ts includes .gsd/audit/", () => {
|
|
132
|
-
const src = readFileSync(
|
|
133
|
-
join(import.meta.dirname, "..", "worktree-manager.ts"),
|
|
134
|
-
"utf-8",
|
|
135
|
-
);
|
|
136
|
-
assert.ok(
|
|
137
|
-
src.includes('".gsd/audit/"'),
|
|
138
|
-
".gsd/audit/ listed in SKIP_PATHS",
|
|
139
|
-
);
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
// ─── Windows gsd.db close+reopen around pre-merge stash ─────────────────────
|
|
144
|
-
|
|
145
|
-
describe("Windows pre-merge DB release (#4704)", () => {
|
|
146
|
-
it("mergeMilestoneToMain closes gsd.db on win32 before git stash", () => {
|
|
147
|
-
const src = readFileSync(
|
|
148
|
-
join(import.meta.dirname, "..", "auto-worktree.ts"),
|
|
149
|
-
"utf-8",
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
// Locate the stash push line and ensure a win32-gated closeDatabase()
|
|
153
|
-
// call precedes it in the same function scope.
|
|
154
|
-
const stashIndex = src.indexOf('"stash", "push", "--include-untracked"');
|
|
155
|
-
assert.ok(stashIndex !== -1, "pre-merge stash push exists");
|
|
156
|
-
|
|
157
|
-
const beforeStash = src.slice(0, stashIndex);
|
|
158
|
-
const win32Index = beforeStash.lastIndexOf('process.platform === "win32"');
|
|
159
|
-
const closeIndex = beforeStash.lastIndexOf("closeDatabase()");
|
|
160
|
-
|
|
161
|
-
assert.ok(win32Index !== -1, "win32 platform guard appears before stash");
|
|
162
|
-
assert.ok(closeIndex !== -1, "closeDatabase() invoked before stash");
|
|
163
|
-
assert.ok(
|
|
164
|
-
win32Index < closeIndex && closeIndex < stashIndex,
|
|
165
|
-
"platform guard wraps the closeDatabase() call before the stash",
|
|
166
|
-
);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it("openDatabase is called after the stash to reopen the connection", () => {
|
|
170
|
-
const src = readFileSync(
|
|
171
|
-
join(import.meta.dirname, "..", "auto-worktree.ts"),
|
|
172
|
-
"utf-8",
|
|
173
|
-
);
|
|
174
|
-
const stashIndex = src.indexOf('"stash", "push", "--include-untracked"');
|
|
175
|
-
const afterStash = src.slice(stashIndex);
|
|
176
|
-
assert.ok(
|
|
177
|
-
afterStash.includes("openDatabase("),
|
|
178
|
-
"openDatabase() called after the pre-merge stash",
|
|
179
|
-
);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it("pre-merge stash targets entries by marker instead of refs/stash or stash@{0}", () => {
|
|
183
|
-
const src = readFileSync(
|
|
184
|
-
join(import.meta.dirname, "..", "auto-worktree.ts"),
|
|
185
|
-
"utf-8",
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
assert.ok(src.includes("stashMarker"), "stash marker is tracked");
|
|
189
|
-
assert.ok(
|
|
190
|
-
src.includes('"stash", "list", "--format=%gd%x00%s"'),
|
|
191
|
-
"stash lookup reads ref and message together",
|
|
192
|
-
);
|
|
193
|
-
assert.ok(!src.includes('"rev-parse", "refs/stash"'), "refs/stash is not used for identity");
|
|
194
|
-
assert.ok(!src.includes('["stash", "pop"]'), "stash pop is never unqualified");
|
|
195
|
-
assert.ok(!src.includes('["stash", "drop"]'), "stash drop is never unqualified");
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it("stash drop after pop failure requires auto-resolved .gsd conflicts", () => {
|
|
199
|
-
const src = readFileSync(
|
|
200
|
-
join(import.meta.dirname, "..", "auto-worktree.ts"),
|
|
201
|
-
"utf-8",
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
assert.ok(
|
|
205
|
-
src.includes("gsdUU.length > 0 && nonGsdUU.length === 0"),
|
|
206
|
-
"stash drop must only run after detected .gsd conflicts were auto-resolved",
|
|
207
|
-
);
|
|
208
|
-
assert.ok(
|
|
209
|
-
src.includes("git stash pop failed without resolvable conflict files; leaving stash for manual recovery"),
|
|
210
|
-
"non-conflict stash pop failures must leave the stash for manual recovery",
|
|
211
|
-
);
|
|
18
|
+
it("returns handled and notifies when auto-mode is active", async () => {
|
|
19
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
20
|
+
_setAutoActiveForTest(true);
|
|
21
|
+
try {
|
|
22
|
+
const handled = await handleWorkflowCommand("queue", {
|
|
23
|
+
ui: {
|
|
24
|
+
notify(message: string, level?: string) {
|
|
25
|
+
notifications.push({ message, level });
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
} as any, {} as any);
|
|
29
|
+
|
|
30
|
+
assert.equal(handled, true);
|
|
31
|
+
assert.deepEqual(notifications, [{
|
|
32
|
+
message: "/gsd queue cannot run while auto-mode is active.\nStop auto-mode first with /gsd stop, then run /gsd queue.",
|
|
33
|
+
level: "error",
|
|
34
|
+
}]);
|
|
35
|
+
} finally {
|
|
36
|
+
_setAutoActiveForTest(false);
|
|
37
|
+
}
|
|
212
38
|
});
|
|
213
39
|
});
|