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
|
@@ -72,6 +72,10 @@ import { verifyExpectedArtifact } from "./auto-recovery.js";
|
|
|
72
72
|
import { createWorkspace, scopeMilestone, type MilestoneScope } from "./workspace.js";
|
|
73
73
|
import { getPendingGate, extractDepthVerificationMilestoneId } from "./bootstrap/write-gate.js";
|
|
74
74
|
|
|
75
|
+
export function shouldSkipGitBootstrapAfterInit(result: { gitEnabled?: boolean }): boolean {
|
|
76
|
+
return result.gitEnabled === false;
|
|
77
|
+
}
|
|
78
|
+
|
|
75
79
|
// ─── Re-exports (preserve public API for existing importers) ────────────────
|
|
76
80
|
export {
|
|
77
81
|
MILESTONE_ID_RE, generateMilestoneSuffix, nextMilestoneId,
|
|
@@ -86,6 +90,8 @@ export {
|
|
|
86
90
|
import { logWarning } from "./workflow-logger.js";
|
|
87
91
|
import { deleteRuntimeKv } from "./db/runtime-kv.js";
|
|
88
92
|
import { PAUSED_SESSION_KV_KEY } from "./interrupted-session.js";
|
|
93
|
+
import { buildWorkflowDispatchContent } from "./workflow-protocol.js";
|
|
94
|
+
import { isFullGsdToolSurfaceRequested, restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch } from "./bootstrap/register-hooks.js";
|
|
89
95
|
|
|
90
96
|
type AutoStartOptions = Parameters<typeof startAutoDetached>[4];
|
|
91
97
|
type AutoStartLauncher = typeof startAutoDetached;
|
|
@@ -203,6 +209,16 @@ function runPlanV2Gate(
|
|
|
203
209
|
return "pass";
|
|
204
210
|
}
|
|
205
211
|
|
|
212
|
+
export const _needsPlanV2GateForTest = needsPlanV2Gate;
|
|
213
|
+
export const _runPlanV2GateForTest = runPlanV2Gate;
|
|
214
|
+
|
|
215
|
+
export function _roadmapHasParseableSlicesForTest(
|
|
216
|
+
roadmapContent: string | null | undefined,
|
|
217
|
+
): boolean {
|
|
218
|
+
if (!roadmapContent) return false;
|
|
219
|
+
return parseRoadmapSlices(roadmapContent).length > 0;
|
|
220
|
+
}
|
|
221
|
+
|
|
206
222
|
// ─── Commit Instruction Helpers ──────────────────────────────────────────────
|
|
207
223
|
|
|
208
224
|
/** Build commit instruction for planning prompts. .gsd/ is managed externally and always gitignored. */
|
|
@@ -264,7 +280,7 @@ const USER_DRIVEN_DEEP_SETUP_UNITS = new Set([
|
|
|
264
280
|
"discuss-requirements",
|
|
265
281
|
"research-decision",
|
|
266
282
|
]);
|
|
267
|
-
const FOREGROUND_DEEP_SETUP_RULE_NAMES = new Set([
|
|
283
|
+
export const FOREGROUND_DEEP_SETUP_RULE_NAMES = new Set([
|
|
268
284
|
"deep: pre-planning (no workflow prefs) → workflow-preferences",
|
|
269
285
|
"deep: pre-planning (no PROJECT) → discuss-project",
|
|
270
286
|
"deep: pre-planning (no REQUIREMENTS) → discuss-requirements",
|
|
@@ -1062,49 +1078,66 @@ async function dispatchWorkflow(
|
|
|
1062
1078
|
}
|
|
1063
1079
|
}
|
|
1064
1080
|
|
|
1065
|
-
// Scope tools for
|
|
1081
|
+
// Scope tools for guided workflow turns (#2949, token-consumption savings).
|
|
1066
1082
|
// Providers with grammar-based constrained decoding (xAI/Grok) return
|
|
1067
1083
|
// "Grammar is too complex" when the combined tool schema is too large.
|
|
1068
|
-
//
|
|
1069
|
-
//
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
const currentTools = pi.getActiveTools();
|
|
1073
|
-
savedTools = currentTools;
|
|
1074
|
-
// Keep all non-GSD tools (builtins, other extensions) and only the
|
|
1075
|
-
// GSD tools on the discuss allowlist.
|
|
1076
|
-
const scopedTools = currentTools.filter(
|
|
1077
|
-
(t) => !t.startsWith("gsd_") || DISCUSS_TOOLS_ALLOWLIST.includes(t),
|
|
1078
|
-
);
|
|
1079
|
-
pi.setActiveTools(scopedTools);
|
|
1080
|
-
debugLog("discuss-tool-scoping", {
|
|
1081
|
-
unitType,
|
|
1082
|
-
before: currentTools.length,
|
|
1083
|
-
after: scopedTools.length,
|
|
1084
|
-
removed: currentTools.length - scopedTools.length,
|
|
1085
|
-
});
|
|
1086
|
-
}
|
|
1084
|
+
// Guided workflow turns only need the active unit's tool surface; strip
|
|
1085
|
+
// unrelated GSD tools and broad non-GSD tools for this queued turn, then
|
|
1086
|
+
// restore so the narrowed surface does not leak into future dispatches.
|
|
1087
|
+
let savedTools: ReturnType<typeof scopeGsdWorkflowToolsForDispatch> = null;
|
|
1087
1088
|
|
|
1088
|
-
|
|
1089
|
-
|
|
1089
|
+
try {
|
|
1090
|
+
const currentTools = pi.getActiveTools();
|
|
1091
|
+
savedTools = {
|
|
1092
|
+
tools: currentTools,
|
|
1093
|
+
visibleSkills: typeof pi.getVisibleSkills === "function" ? pi.getVisibleSkills() : undefined,
|
|
1094
|
+
restoreVisibleSkills: typeof pi.setVisibleSkills === "function",
|
|
1095
|
+
};
|
|
1096
|
+
if (unitType?.startsWith("discuss-") && !isFullGsdToolSurfaceRequested()) {
|
|
1097
|
+
// Keep all non-GSD tools (builtins, other extensions) and only the
|
|
1098
|
+
// GSD tools on the discuss allowlist.
|
|
1099
|
+
const scopedTools = currentTools.filter(
|
|
1100
|
+
(t) => !t.startsWith("gsd_") || DISCUSS_TOOLS_ALLOWLIST.includes(t),
|
|
1101
|
+
);
|
|
1102
|
+
pi.setActiveTools(scopedTools);
|
|
1103
|
+
const scopedState = scopeGsdWorkflowToolsForDispatch(pi, unitType);
|
|
1104
|
+
savedTools = {
|
|
1105
|
+
tools: currentTools,
|
|
1106
|
+
visibleSkills: scopedState?.visibleSkills ?? savedTools.visibleSkills,
|
|
1107
|
+
restoreVisibleSkills: scopedState?.restoreVisibleSkills ?? savedTools.restoreVisibleSkills,
|
|
1108
|
+
};
|
|
1109
|
+
debugLog("discuss-tool-scoping", {
|
|
1110
|
+
unitType,
|
|
1111
|
+
before: currentTools.length,
|
|
1112
|
+
after: pi.getActiveTools().length,
|
|
1113
|
+
removed: currentTools.length - pi.getActiveTools().length,
|
|
1114
|
+
});
|
|
1115
|
+
} else {
|
|
1116
|
+
savedTools = scopeGsdWorkflowToolsForDispatch(pi, unitType) ?? savedTools;
|
|
1117
|
+
}
|
|
1090
1118
|
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
customType,
|
|
1094
|
-
content: `Read the following GSD workflow protocol and execute exactly.\n\n${workflow}\n\n## Your Task\n\n${note}`,
|
|
1095
|
-
display: false,
|
|
1096
|
-
},
|
|
1097
|
-
{ triggerTurn: true },
|
|
1098
|
-
);
|
|
1119
|
+
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(gsdHome(), "agent", "GSD-WORKFLOW.md");
|
|
1120
|
+
const workflow = readFileSync(workflowPath, "utf-8");
|
|
1099
1121
|
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1122
|
+
pi.sendMessage(
|
|
1123
|
+
{
|
|
1124
|
+
customType,
|
|
1125
|
+
content: buildWorkflowDispatchContent({ workflow, workflowPath, task: note }),
|
|
1126
|
+
display: false,
|
|
1127
|
+
},
|
|
1128
|
+
{ triggerTurn: true },
|
|
1129
|
+
);
|
|
1130
|
+
} finally {
|
|
1131
|
+
// Restore full tool set after the message is queued. The LLM turn has
|
|
1132
|
+
// already captured the scoped set — restoring prevents the narrowed
|
|
1133
|
+
// tools from leaking into subsequent dispatches (#3628). The finally
|
|
1134
|
+
// block ensures restoration even if sendMessage throws.
|
|
1135
|
+
restoreGsdWorkflowTools(pi, savedTools);
|
|
1105
1136
|
}
|
|
1106
1137
|
}
|
|
1107
1138
|
|
|
1139
|
+
export const _dispatchWorkflowForTest = dispatchWorkflow;
|
|
1140
|
+
|
|
1108
1141
|
function getStructuredQuestionsAvailability(
|
|
1109
1142
|
pi: ExtensionAPI,
|
|
1110
1143
|
ctx: ExtensionContext | undefined,
|
|
@@ -2005,7 +2038,7 @@ export async function showSmartEntry(
|
|
|
2005
2038
|
// No .gsd/ or zombie .gsd/ — run the project init wizard
|
|
2006
2039
|
const result = await showProjectInit(ctx, pi, basePath, detection);
|
|
2007
2040
|
if (!result.completed) return; // User cancelled
|
|
2008
|
-
skipGitBootstrap = result
|
|
2041
|
+
skipGitBootstrap = shouldSkipGitBootstrapAfterInit(result);
|
|
2009
2042
|
|
|
2010
2043
|
// Init wizard bootstrapped .gsd/ — fall through to the normal flow below
|
|
2011
2044
|
// which will detect "no milestones" and start the discuss prompt
|
|
@@ -2364,8 +2397,7 @@ export async function showSmartEntry(
|
|
|
2364
2397
|
if (hasRoadmap) {
|
|
2365
2398
|
const roadmapContent = await loadFile(roadmapFile!);
|
|
2366
2399
|
if (roadmapContent) {
|
|
2367
|
-
|
|
2368
|
-
roadmapHasSlices = parsed.length > 0;
|
|
2400
|
+
roadmapHasSlices = _roadmapHasParseableSlicesForTest(roadmapContent);
|
|
2369
2401
|
}
|
|
2370
2402
|
}
|
|
2371
2403
|
|
|
@@ -30,6 +30,10 @@ interface InitWizardResult {
|
|
|
30
30
|
gitEnabled?: boolean;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
export function shouldWriteGitFiles(gitEnabled: boolean): boolean {
|
|
34
|
+
return gitEnabled;
|
|
35
|
+
}
|
|
36
|
+
|
|
33
37
|
interface ProjectPreferences {
|
|
34
38
|
mode: "solo" | "team";
|
|
35
39
|
gitIsolation: "worktree" | "branch" | "none";
|
|
@@ -299,7 +303,7 @@ export async function showProjectInit(
|
|
|
299
303
|
|
|
300
304
|
// Ensure .gitignore only when git is active. A user who selected "Skip"
|
|
301
305
|
// should not have git initialized or git-related files mutated later.
|
|
302
|
-
if (gitEnabled) {
|
|
306
|
+
if (shouldWriteGitFiles(gitEnabled)) {
|
|
303
307
|
ensureGitignore(basePath);
|
|
304
308
|
untrackRuntimeFiles(basePath);
|
|
305
309
|
}
|
|
@@ -1183,6 +1183,33 @@ export function nativeRmForce(basePath: string, paths: string[]): void {
|
|
|
1183
1183
|
}
|
|
1184
1184
|
}
|
|
1185
1185
|
|
|
1186
|
+
function runGitWorktreeAdd(
|
|
1187
|
+
basePath: string,
|
|
1188
|
+
wtPath: string,
|
|
1189
|
+
branch: string,
|
|
1190
|
+
createBranch?: boolean,
|
|
1191
|
+
startPoint?: string,
|
|
1192
|
+
): void {
|
|
1193
|
+
if (createBranch) {
|
|
1194
|
+
const branchRef = gitExec(basePath, ["show-ref", "--verify", `refs/heads/${branch}`], true);
|
|
1195
|
+
if (branchRef) {
|
|
1196
|
+
gitExec(basePath, ["worktree", "add", wtPath, branch]);
|
|
1197
|
+
return;
|
|
1198
|
+
}
|
|
1199
|
+
gitExec(basePath, ["worktree", "add", "-b", branch, wtPath, startPoint ?? "HEAD"]);
|
|
1200
|
+
} else {
|
|
1201
|
+
gitExec(basePath, ["worktree", "add", wtPath, branch]);
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
export function assertWorktreeMaterialized(wtPath: string): void {
|
|
1206
|
+
if (existsSync(join(wtPath, ".git"))) return;
|
|
1207
|
+
throw new GSDError(
|
|
1208
|
+
GSD_GIT_ERROR,
|
|
1209
|
+
`git worktree add did not materialize a valid worktree at ${wtPath}: missing .git file`,
|
|
1210
|
+
);
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1186
1213
|
/**
|
|
1187
1214
|
* Add a new git worktree.
|
|
1188
1215
|
* Native: libgit2 worktree API.
|
|
@@ -1198,14 +1225,20 @@ export function nativeWorktreeAdd(
|
|
|
1198
1225
|
const native = loadNative();
|
|
1199
1226
|
if (native) {
|
|
1200
1227
|
native.gitWorktreeAdd(basePath, wtPath, branch, createBranch, startPoint);
|
|
1201
|
-
|
|
1228
|
+
try {
|
|
1229
|
+
assertWorktreeMaterialized(wtPath);
|
|
1230
|
+
return;
|
|
1231
|
+
} catch {
|
|
1232
|
+
rmSync(wtPath, { recursive: true, force: true });
|
|
1233
|
+
gitExec(basePath, ["worktree", "prune"], true);
|
|
1234
|
+
runGitWorktreeAdd(basePath, wtPath, branch, createBranch, startPoint);
|
|
1235
|
+
assertWorktreeMaterialized(wtPath);
|
|
1236
|
+
return;
|
|
1237
|
+
}
|
|
1202
1238
|
}
|
|
1203
1239
|
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
} else {
|
|
1207
|
-
gitExec(basePath, ["worktree", "add", wtPath, branch]);
|
|
1208
|
-
}
|
|
1240
|
+
runGitWorktreeAdd(basePath, wtPath, branch, createBranch, startPoint);
|
|
1241
|
+
assertWorktreeMaterialized(wtPath);
|
|
1209
1242
|
}
|
|
1210
1243
|
|
|
1211
1244
|
/**
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// GSD-2 + src/resources/extensions/gsd/orphan-stash-audit.ts
|
|
2
|
+
// Startup sweep for orphaned gsd-preflight-stash entries left behind by
|
|
3
|
+
// interrupted milestone merges (#5538-followup).
|
|
4
|
+
|
|
5
|
+
import { execFileSync } from "node:child_process";
|
|
6
|
+
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
7
|
+
|
|
8
|
+
export interface OrphanPreflightStashAuditResult {
|
|
9
|
+
applied: Array<{ milestoneId: string; stashRef: string }>;
|
|
10
|
+
warnings: string[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Recognize the "already restored" failure mode of `git stash apply`.
|
|
15
|
+
*
|
|
16
|
+
* When a preflight stash captured untracked files via `--include-untracked`
|
|
17
|
+
* and those files are now present in the working tree (e.g. a prior audit
|
|
18
|
+
* run already applied this stash), `git stash apply` aborts with
|
|
19
|
+
* `<path> already exists, no checkout` and exits non-zero. That is the
|
|
20
|
+
* idempotent steady state for this audit, not a recovery failure — treat
|
|
21
|
+
* it as a no-op so repeated GSD startups stop spamming the user with
|
|
22
|
+
* warnings about stashes that have already been restored (#5538-followup
|
|
23
|
+
* peer-review feedback).
|
|
24
|
+
*/
|
|
25
|
+
function _isAlreadyRestoredApplyError(err: unknown): boolean {
|
|
26
|
+
if (!err || typeof err !== "object") return false;
|
|
27
|
+
const stderr = (err as { stderr?: unknown }).stderr;
|
|
28
|
+
const stderrText = typeof stderr === "string" ? stderr : stderr instanceof Uint8Array ? Buffer.from(stderr).toString("utf-8") : "";
|
|
29
|
+
if (stderrText && /already exists, no checkout/i.test(stderrText)) return true;
|
|
30
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
31
|
+
return /already exists, no checkout/i.test(message);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { _isAlreadyRestoredApplyError };
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Audit `git stash list` for orphaned `gsd-preflight-stash:M00x:*` entries.
|
|
38
|
+
*
|
|
39
|
+
* The matching merge code in `phases.ts` previously skipped the postflight
|
|
40
|
+
* pop whenever `mergeAndExit` threw, leaking the user's pre-merge working
|
|
41
|
+
* tree into the stash list. For every preflight-stash entry whose milestone
|
|
42
|
+
* is now complete (per the supplied callback), `git stash apply` is invoked —
|
|
43
|
+
* NOT `pop`. The stash entry stays in the list so the user retains a backup
|
|
44
|
+
* if the apply produces unexpected merge results. Idempotent across repeated
|
|
45
|
+
* startup runs.
|
|
46
|
+
*
|
|
47
|
+
* Failures are best-effort: a list error (no repo, git unavailable) returns
|
|
48
|
+
* an empty result. An apply error becomes a warning the user sees alongside
|
|
49
|
+
* the existing orphan-branch audit messages — startup continues.
|
|
50
|
+
*/
|
|
51
|
+
export function auditOrphanedPreflightStashes(
|
|
52
|
+
basePath: string,
|
|
53
|
+
isMilestoneComplete: (milestoneId: string) => boolean,
|
|
54
|
+
): OrphanPreflightStashAuditResult {
|
|
55
|
+
const result: OrphanPreflightStashAuditResult = { applied: [], warnings: [] };
|
|
56
|
+
|
|
57
|
+
let listOutput: string;
|
|
58
|
+
try {
|
|
59
|
+
listOutput = execFileSync(
|
|
60
|
+
"git",
|
|
61
|
+
["stash", "list", "--format=%gd%x00%s"],
|
|
62
|
+
{
|
|
63
|
+
cwd: basePath,
|
|
64
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
65
|
+
encoding: "utf-8",
|
|
66
|
+
env: GIT_NO_PROMPT_ENV,
|
|
67
|
+
},
|
|
68
|
+
);
|
|
69
|
+
} catch {
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const MARKER_RE = /\bgsd-preflight-stash:([A-Za-z0-9_-]+):/;
|
|
74
|
+
for (const line of listOutput.split("\n")) {
|
|
75
|
+
const sep = line.indexOf("\x00");
|
|
76
|
+
if (sep < 0) continue;
|
|
77
|
+
const ref = line.slice(0, sep);
|
|
78
|
+
const subject = line.slice(sep + 1);
|
|
79
|
+
if (!ref || !subject) continue;
|
|
80
|
+
|
|
81
|
+
const match = MARKER_RE.exec(subject);
|
|
82
|
+
if (!match) continue;
|
|
83
|
+
const milestoneId = match[1];
|
|
84
|
+
|
|
85
|
+
let complete = false;
|
|
86
|
+
try {
|
|
87
|
+
complete = isMilestoneComplete(milestoneId);
|
|
88
|
+
} catch (err) {
|
|
89
|
+
result.warnings.push(
|
|
90
|
+
`Could not determine completion status for ${milestoneId} during preflight-stash audit: ${err instanceof Error ? err.message : String(err)}.`,
|
|
91
|
+
);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (!complete) continue;
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
execFileSync("git", ["stash", "apply", "--quiet", ref], {
|
|
98
|
+
cwd: basePath,
|
|
99
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
100
|
+
encoding: "utf-8",
|
|
101
|
+
env: GIT_NO_PROMPT_ENV,
|
|
102
|
+
});
|
|
103
|
+
result.applied.push({ milestoneId, stashRef: ref });
|
|
104
|
+
} catch (err) {
|
|
105
|
+
// Idempotent steady state: stash was already applied in a prior audit
|
|
106
|
+
// run; the files exist and `git stash apply` refuses to overwrite.
|
|
107
|
+
// Skip silently so repeat runs are no-ops.
|
|
108
|
+
if (_isAlreadyRestoredApplyError(err)) continue;
|
|
109
|
+
result.warnings.push(
|
|
110
|
+
`Could not apply orphaned preflight stash ${ref} (milestone ${milestoneId}): ${err instanceof Error ? err.message : String(err)}. ` +
|
|
111
|
+
`Run \`git stash apply ${ref}\` manually to restore your pre-merge changes.`,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
@@ -21,7 +21,7 @@ import { join, dirname } from "node:path";
|
|
|
21
21
|
import { fileURLToPath } from "node:url";
|
|
22
22
|
import { gsdRoot } from "./paths.js";
|
|
23
23
|
import { createWorktree, worktreePath } from "./worktree-manager.js";
|
|
24
|
-
import { autoWorktreeBranch, runWorktreePostCreateHook, syncGsdStateToWorktree } from "./auto-worktree.js";
|
|
24
|
+
import { autoWorktreeBranch, fastForwardReusedMilestoneBranchIfSafe, runWorktreePostCreateHook, syncGsdStateToWorktree } from "./auto-worktree.js";
|
|
25
25
|
import { nativeBranchExists } from "./native-git-bridge.js";
|
|
26
26
|
import { readIntegrationBranch } from "./git-service.js";
|
|
27
27
|
import { resolveParallelConfig } from "./preferences.js";
|
|
@@ -471,7 +471,7 @@ export async function startParallel(
|
|
|
471
471
|
// Create the worktree (without chdir — coordinator stays in project root)
|
|
472
472
|
let wtPath: string;
|
|
473
473
|
try {
|
|
474
|
-
wtPath =
|
|
474
|
+
wtPath = _createMilestoneWorktree(basePath, mid);
|
|
475
475
|
} catch (e) {
|
|
476
476
|
logWarning("parallel", `createMilestoneWorktree fallback for ${mid}: ${(e as Error).message}`);
|
|
477
477
|
wtPath = worktreePath(basePath, mid);
|
|
@@ -532,13 +532,23 @@ export async function startParallel(
|
|
|
532
532
|
/**
|
|
533
533
|
* Create a git worktree for a milestone without changing the coordinator's cwd.
|
|
534
534
|
* Uses milestone/<MID> branch naming (same as auto-worktree.ts).
|
|
535
|
+
*
|
|
536
|
+
* Exported with the `_` prefix purely for tests — production callers stay on
|
|
537
|
+
* the closure-private name `createMilestoneWorktree` below.
|
|
535
538
|
*/
|
|
536
|
-
function
|
|
539
|
+
export function _createMilestoneWorktree(basePath: string, milestoneId: string): string {
|
|
537
540
|
const branch = autoWorktreeBranch(milestoneId);
|
|
538
541
|
const branchExists = nativeBranchExists(basePath, branch);
|
|
539
542
|
|
|
540
543
|
let info: { name: string; path: string; branch: string; exists: boolean };
|
|
541
544
|
if (branchExists) {
|
|
545
|
+
// #5549 post-merge audit (R3): match the fast-forward behavior added to
|
|
546
|
+
// `createAutoWorktree` in commit 8996cb68e. When a worker reuses an
|
|
547
|
+
// existing milestone branch, fast-forward it onto the integration branch
|
|
548
|
+
// when safe so per-worker worktrees don't fork from a stale base after a
|
|
549
|
+
// sibling milestone has merged. Same `nativeIsAncestor` + worktree-list
|
|
550
|
+
// safety guards apply.
|
|
551
|
+
fastForwardReusedMilestoneBranchIfSafe(basePath, milestoneId, branch);
|
|
542
552
|
info = createWorktree(basePath, milestoneId, { branch, reuseExistingBranch: true });
|
|
543
553
|
} else {
|
|
544
554
|
const integrationBranch = readIntegrationBranch(basePath, milestoneId) ?? undefined;
|
|
@@ -380,6 +380,8 @@ function shouldValidateInputAsPath(raw: string): boolean {
|
|
|
380
380
|
const trimmed = raw.trim();
|
|
381
381
|
if (!trimmed) return false;
|
|
382
382
|
|
|
383
|
+
if (isRuntimeOnlyInput(trimmed)) return false;
|
|
384
|
+
|
|
383
385
|
const candidate = extractPathFromAnnotation(trimmed);
|
|
384
386
|
if (!candidate) return false;
|
|
385
387
|
|
|
@@ -405,6 +407,10 @@ function shouldValidateInputAsPath(raw: string): boolean {
|
|
|
405
407
|
);
|
|
406
408
|
}
|
|
407
409
|
|
|
410
|
+
function isRuntimeOnlyInput(raw: string): boolean {
|
|
411
|
+
return /\(\s*runtime\s*\)/i.test(raw);
|
|
412
|
+
}
|
|
413
|
+
|
|
408
414
|
function containsGlobPattern(candidate: string): boolean {
|
|
409
415
|
return ["*", "?", "[", "]", "{", "}"].some((char) => candidate.includes(char));
|
|
410
416
|
}
|
|
@@ -448,6 +454,16 @@ export function checkFilePathConsistency(
|
|
|
448
454
|
): PreExecutionCheckJSON[] {
|
|
449
455
|
const results: PreExecutionCheckJSON[] = [];
|
|
450
456
|
|
|
457
|
+
// Build a set of all files created by any task at any position (normalized).
|
|
458
|
+
// Used to suppress consistency errors for files that will be caught with a
|
|
459
|
+
// more precise message by checkTaskOrdering (sequence violation).
|
|
460
|
+
const allTaskOutputs = new Set<string>();
|
|
461
|
+
for (const t of tasks) {
|
|
462
|
+
for (const f of t.expected_output) {
|
|
463
|
+
allTaskOutputs.add(normalizeFilePath(f));
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
451
467
|
for (let i = 0; i < tasks.length; i++) {
|
|
452
468
|
const task = tasks[i];
|
|
453
469
|
const priorOutputs = getExpectedOutputsUpTo(tasks, i);
|
|
@@ -481,6 +497,12 @@ export function checkFilePathConsistency(
|
|
|
481
497
|
}
|
|
482
498
|
|
|
483
499
|
if (!existsOnDisk && !inPriorOutputs && !inOwnOutputs && !directorySatisfied) {
|
|
500
|
+
// If a later task claims to create this file, the ordering check will
|
|
501
|
+
// fire a more precise "sequence violation" error for the same file.
|
|
502
|
+
// Suppress the consistency error here to avoid duplicate noise.
|
|
503
|
+
if (allTaskOutputs.has(normalizedFile) && !ownOutputs.has(normalizedFile)) {
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
484
506
|
results.push({
|
|
485
507
|
category: "file",
|
|
486
508
|
target: file,
|
|
@@ -535,6 +557,7 @@ export function checkTaskOrdering(
|
|
|
535
557
|
const filesToCheck = [...task.inputs];
|
|
536
558
|
|
|
537
559
|
for (const file of filesToCheck) {
|
|
560
|
+
if (isRuntimeOnlyInput(file)) continue;
|
|
538
561
|
if (!shouldValidateInputAsPath(file)) continue;
|
|
539
562
|
|
|
540
563
|
const normalizedFile = normalizeFilePath(file);
|
|
@@ -6,6 +6,8 @@ You are executing GSD auto-mode.
|
|
|
6
6
|
|
|
7
7
|
Your working directory is `{{workingDirectory}}`. All file reads, writes, and shell commands MUST operate relative to this directory. Do NOT `cd` to any other directory.
|
|
8
8
|
|
|
9
|
+
If any inlined plan, summary, verification command, or prior artifact names an absolute path outside `{{workingDirectory}}`, treat that path as stale context. Convert it to the equivalent relative path under `{{workingDirectory}}` before reading, writing, or executing. If no equivalent path exists under `{{workingDirectory}}`, record a verification failure and stop; do not edit or run commands in another checkout.
|
|
10
|
+
|
|
9
11
|
## Mission
|
|
10
12
|
|
|
11
13
|
All slices are complete. Verify the integrated work, persist milestone completion, refresh project state, and write the final record future milestones will rely on.
|
|
@@ -14,7 +16,7 @@ Preloaded context includes roadmap, requirements, decisions, project context, an
|
|
|
14
16
|
|
|
15
17
|
Start with what the excerpts give you. Read full files when the section heads signal richer context you need.
|
|
16
18
|
|
|
17
|
-
**On-demand Read ordering:** Complete all slice SUMMARY Reads you need for cross-slice synthesis, the Decision Re-evaluation table, and LEARNINGS **before** calling `gsd_complete_milestone` (step
|
|
19
|
+
**On-demand Read ordering:** Complete all slice SUMMARY Reads you need for cross-slice synthesis, the Decision Re-evaluation table, and LEARNINGS **before** calling `gsd_complete_milestone` (step 13). Once that tool runs, the milestone is marked complete in the DB, so it must be the final persistent milestone-closeout write.
|
|
18
20
|
|
|
19
21
|
### Closeout Review Mode
|
|
20
22
|
|
|
@@ -43,7 +45,7 @@ Subagents report only; they do not write user source. Fold any findings into Dec
|
|
|
43
45
|
|
|
44
46
|
### Verification Gate — STOP if verification failed
|
|
45
47
|
|
|
46
|
-
**If ANY verification failure was recorded in steps
|
|
48
|
+
**If ANY verification failure was recorded in steps 4, 5, or 6, you MUST follow the failure path below. Do NOT proceed with steps 10–14.**
|
|
47
49
|
|
|
48
50
|
**Failure path** (verification failed):
|
|
49
51
|
- Do NOT call `gsd_complete_milestone`.
|
|
@@ -67,13 +69,15 @@ Subagents report only; they do not write user source. Fold any findings into Dec
|
|
|
67
69
|
- `title` (string) — Milestone title
|
|
68
70
|
- `oneLiner` (string) — One-sentence summary of what the milestone achieved
|
|
69
71
|
- `narrative` (string) — Detailed narrative of what happened during the milestone
|
|
72
|
+
- `verificationPassed` (boolean) — Must be `true`; confirms code-change verification, success criteria, and definition-of-done checks all passed
|
|
73
|
+
|
|
74
|
+
**Recommended parameters** (the schema accepts these as optional, but always fill them in — omitted values render as placeholders such as "Not provided.", "None.", or "(none)"):
|
|
70
75
|
- `successCriteriaResults` (string) — Markdown detailing how each success criterion was met or not met
|
|
71
76
|
- `definitionOfDoneResults` (string) — Markdown detailing how each definition-of-done item was met
|
|
72
77
|
- `requirementOutcomes` (string) — Markdown detailing requirement status transitions with evidence
|
|
73
78
|
- `keyDecisions` (array of strings) — Key architectural/pattern decisions made during the milestone
|
|
74
79
|
- `keyFiles` (array of strings) — Key files created or modified during the milestone
|
|
75
80
|
- `lessonsLearned` (array of strings) — Lessons learned during the milestone
|
|
76
|
-
- `verificationPassed` (boolean) — Must be `true`; confirms code-change verification, success criteria, and definition-of-done checks all passed
|
|
77
81
|
|
|
78
82
|
**Optional parameters:**
|
|
79
83
|
- `followUps` (string) — Follow-up items for future milestones
|
|
@@ -82,6 +86,6 @@ Subagents report only; they do not write user source. Fold any findings into Dec
|
|
|
82
86
|
14. Do not commit manually — the system auto-commits your changes after this unit completes.
|
|
83
87
|
- Say: "Milestone {{milestoneId}} complete."
|
|
84
88
|
|
|
85
|
-
**Important:** Do NOT skip code-change, success-criteria, or definition-of-done verification (steps
|
|
89
|
+
**Important:** Do NOT skip code-change, success-criteria, or definition-of-done verification (steps 4-6). The summary must reflect verified outcomes. Verification failures block completion; there is no override. If a verification tool fails, errors, or returns unexpected output, treat it as failure.
|
|
86
90
|
|
|
87
91
|
**File system safety:** When scanning milestone directories for evidence, use `ls` or `find` first. Never pass a directory path (e.g. `tasks/`, `slices/`) to `read`; it only accepts file paths.
|
|
@@ -29,7 +29,7 @@ Use `subagent` only for fresh-context review when useful: reviewer for cross-cut
|
|
|
29
29
|
7. If requirement status changed, call `gsd_requirement_update`; do not write `.gsd/REQUIREMENTS.md` directly.
|
|
30
30
|
8. Prepare `gsd_slice_complete` content with camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`.
|
|
31
31
|
9. Draft concrete UAT with preconditions, numbered steps, expected outcomes, edge cases, UAT Type, and Not Proven By This UAT.
|
|
32
|
-
10. Review task
|
|
32
|
+
10. Review the inlined task-summary excerpts for DECISIONS.md and KNOWLEDGE.md-worthy decisions, patterns, and gotchas. Read full `*-SUMMARY.md` files only when an excerpt is absent, truncated, or lacks the specific evidence needed for the slice narrative. Capture significant items with `capture_thought`; do not append knowledge files directly.
|
|
33
33
|
11. Call `gsd_slice_complete`. The DB-backed tool is the canonical write path. Do **not** manually write `{{sliceSummaryPath}}`. Do **not** manually write `{{sliceUatPath}}`. Do not edit roadmap checkboxes; the tool renders files and updates projections.
|
|
34
34
|
12. Do not run git commands.
|
|
35
35
|
13. Update `.gsd/PROJECT.md` with a full `write` only if the current project state needs refresh.
|
|
@@ -33,7 +33,7 @@ You execute. The inlined task plan is authoritative. Verify referenced files and
|
|
|
33
33
|
## Execution Rules
|
|
34
34
|
|
|
35
35
|
1. Tersely narrate transitions, decisions, and verification outcomes between tool-call clusters.
|
|
36
|
-
2. Call `memory_query` with 2-4 keywords from the task title and touched files
|
|
36
|
+
2. Use the injected memory/context blocks first. Call `memory_query` with 2-4 keywords from the task title and touched files only when no injected memory block exists or the inlined memory/context is insufficient for this task.
|
|
37
37
|
3. {{skillActivation}} Follow activated skills before code edits.
|
|
38
38
|
4. Execute the task plan. Before any `Write` that creates an artifact or output file, check whether that path already exists. If it does, read it first and decide whether the work is already done, should be extended, or truly needs replacement.
|
|
39
39
|
5. Build real behavior through the intended surface; stubs/mocks belong in tests only.
|
|
@@ -59,11 +59,13 @@ Keep about **{{verificationBudget}}** for verification and summary. If context i
|
|
|
59
59
|
- If the plan is fundamentally invalid, set `blocker_discovered: true` in the summary and explain.
|
|
60
60
|
- For downstream-impacting ambiguity that cannot be resolved from code, plans, or decisions, include an `escalation` object with question, options, recommendation, rationale, and `continueWithDefault`.
|
|
61
61
|
- Capture meaningful architecture/pattern/observability decisions with `capture_thought`; capture non-obvious gotchas or conventions only when they save future investigation.
|
|
62
|
-
-
|
|
62
|
+
- Use the inlined Task Summary template below. Read `{{taskSummaryTemplatePath}}` only if the inlined template is absent or visibly truncated.
|
|
63
63
|
- Call `gsd_task_complete` with camelCase fields `milestoneId`, `sliceId`, `taskId`, `oneLiner`, `narrative`, `verification`, and `verificationEvidence`.
|
|
64
64
|
- The DB-backed tool is the canonical write path. Do **not** manually write `{{taskSummaryPath}}` or edit PLAN.md checkboxes; the tool renders the summary and updates state.
|
|
65
65
|
- Do not run git commands; the system commits from your summary.
|
|
66
66
|
|
|
67
|
+
{{inlinedTemplates}}
|
|
68
|
+
|
|
67
69
|
**Autonomous execution:** no human is available. Do not call `ask_user_questions` or `secure_env_collect`; make reasonable assumptions and document them.
|
|
68
70
|
|
|
69
71
|
**You MUST call `gsd_task_complete` before finishing.**
|
|
@@ -39,7 +39,7 @@ If slice research is inlined, trust it. Explore enough code to confirm paths, bo
|
|
|
39
39
|
5. Define slice verification before tasks. Non-trivial slices need real tests or executable assertions; boundary contracts need contract-exercising checks. Tests must not read .gitignore/gitignored paths such as `.gsd/`, `.planning/`, or `.audits/`.
|
|
40
40
|
6. Include Threat Surface (Q3), Requirement Impact (Q4), proof level, observability, integration closure, Failure Modes (Q5), Load Profile (Q6), and Negative Tests (Q7) only where applicable.
|
|
41
41
|
7. Right-size tasks. Simple slices can be one task; split only when context, ownership, or verification boundaries justify it.
|
|
42
|
-
8. Each task needs a concrete title, Why / Files / Do / Verify / Done when, plus task-plan description, steps, must-haves, verification, inputs, and expected output. Inputs and Expected Output must include concrete backtick-wrapped paths
|
|
42
|
+
8. Each task needs a concrete title, Why / Files / Do / Verify / Done when, plus task-plan description, steps, must-haves, verification, inputs, and expected output. Inputs and Expected Output must include concrete backtick-wrapped paths. Use paths relative to `{{workingDirectory}}`; do not put absolute paths to the original checkout or any directory outside `{{workingDirectory}}` in `files`, `inputs`, `expectedOutput`, or verification commands. **`expected_output` must only list files the task actually creates or overwrites on disk.** Do NOT include files the task merely reads, verifies, or tests — those belong only in `inputs`. If a task is a pure verification or test task that produces no new files, its `expected_output` may be empty or limited to test-result artifacts (e.g. a log or assertion output). A file that does not yet exist on disk and is needed as an `input` must be produced by an earlier task's `expected_output` — if no prior task creates it, add a task before this one that does.
|
|
43
43
|
9. Persist with `gsd_plan_slice` using goal, successCriteria, optional proofLevel/integrationClosure/observabilityImpact, and tasks. `gsd_plan_slice` handles task persistence transactionally and renders `{{outputPath}}` plus task plans; do not call `gsd_plan_task`. The DB-backed tool is the canonical write path. Do **not** rely on direct `PLAN.md` writes as the source of truth.
|
|
44
44
|
10. Self-audit before finishing: goal/demo closure, requirement coverage, locked decisions, concrete paths, dependency order, wiring, scope size, proof truthfulness, feature completeness, and quality gates. Quality gates: non-trivial slices/tasks include specific Q3-Q7 coverage where applicable.
|
|
45
45
|
11. If planning creates structural decisions, append them to `.gsd/DECISIONS.md`.
|
|
@@ -8,7 +8,7 @@ Your working directory is `{{workingDirectory}}`. All file reads, writes, and sh
|
|
|
8
8
|
|
|
9
9
|
A completed task reported `blocker_discovered: true`, meaning the current slice plan cannot be executed as-is. Your job is to rewrite the remaining tasks in the slice plan to address the blocker while preserving all completed work.
|
|
10
10
|
|
|
11
|
-
All relevant context has been preloaded below — the roadmap, current slice plan,
|
|
11
|
+
All relevant context has been preloaded below — the roadmap, current slice plan, blocker task summary excerpt, and decisions are inlined. Start working immediately without re-reading these files.
|
|
12
12
|
|
|
13
13
|
{{inlinedContext}}
|
|
14
14
|
|
|
@@ -30,7 +30,7 @@ Consider these captures when rewriting the remaining tasks — they represent th
|
|
|
30
30
|
|
|
31
31
|
## Instructions
|
|
32
32
|
|
|
33
|
-
1. Read the blocker task summary
|
|
33
|
+
1. Use the inlined blocker summary excerpt first. Read the full blocker task summary only if the excerpt is absent, marked truncated, or lacks the specific blocker evidence needed to replan.
|
|
34
34
|
2. Analyze the remaining `[ ]` tasks in the slice plan. Determine which are still valid, which need modification, and which should be replaced.
|
|
35
35
|
3. **Persist replan state through `gsd_replan_slice`.** Call it with: `milestoneId`, `sliceId`, `blockerTaskId`, `blockerDescription`, `whatChanged`, `updatedTasks` (array of task objects with taskId, title, description, estimate, files, verify, inputs, expectedOutput), `removedTaskIds` (array of task ID strings). The tool structurally enforces preservation of completed tasks, writes replan history to the DB, re-renders `{{planPath}}`, and renders `{{replanPath}}`. Preserve or update the Threat Surface and Requirement Impact sections if the replan changes the slice's security posture or requirement coverage.
|
|
36
36
|
4. If any incomplete task had a `T0x-PLAN.md`, remove or rewrite it to match the new task description.
|