gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.a947d025c
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/README.md +35 -59
- 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/GSD-WORKFLOW.md +2 -2
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/contracts.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +103 -9
- package/dist/resources/extensions/gsd/auto/orchestrator.js +48 -4
- package/dist/resources/extensions/gsd/auto/phases.js +311 -154
- package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
- package/dist/resources/extensions/gsd/auto/session.js +9 -1
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -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-dashboard.js +18 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +122 -88
- package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +197 -9
- package/dist/resources/extensions/gsd/auto-start.js +254 -17
- package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +229 -336
- package/dist/resources/extensions/gsd/auto.js +273 -87
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +122 -11
- 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 +30 -20
- 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 +341 -55
- 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/bootstrap/write-gate.js +147 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
- package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
- 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-extract-learnings.js +17 -12
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/context-budget.js +37 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +18 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +22 -0
- package/dist/resources/extensions/gsd/detection.js +106 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +73 -5
- package/dist/resources/extensions/gsd/gsd-db.js +146 -13
- package/dist/resources/extensions/gsd/guided-flow.js +149 -48
- package/dist/resources/extensions/gsd/health-widget.js +3 -0
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/memory-store.js +69 -12
- package/dist/resources/extensions/gsd/migrate/command.js +40 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
- 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/planning-path-scope.js +26 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
- 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/parallel-research-slices.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/dist/resources/extensions/gsd/quick.js +34 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +94 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -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/state-reconciliation.js +27 -0
- package/dist/resources/extensions/gsd/tool-contract.js +50 -0
- 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/tools/context-mode-tool-result.js +15 -0
- package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +958 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
- package/dist/resources/extensions/gsd/worktree-safety.js +119 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +317 -0
- 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 +14 -14
- 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 +14 -14
- 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 +6 -4
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -17
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
- package/packages/mcp-server/src/workflow-tools.ts +30 -16
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/tsconfig.tsbuildinfo +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 +9 -2
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +43 -11
- 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 +31 -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 +52 -11
- 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 +26 -10
- 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/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.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/types.ts +3 -0
- 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-abort-order.test.js +36 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
- 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 +21 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +94 -16
- 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 +78 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
- package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
- package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
- 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 +5 -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 +20 -7
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -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 +60 -4
- 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 +81 -4
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.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__/chat-frame-compaction-tone.test.js +6 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
- 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/adaptive-layout.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
- 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 +18 -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 +225 -16
- 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 +85 -2
- 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 +71 -0
- 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 +25 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +102 -16
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
- package/packages/pi-coding-agent/src/core/extensions/types.ts +63 -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 +92 -4
- package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
- 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__/chat-frame-compaction-tone.test.ts +7 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +27 -3
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +1 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +18 -8
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/tui.ts +20 -8
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +7 -0
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +36 -27
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/src/resources/GSD-WORKFLOW.md +2 -2
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -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/contracts.ts +19 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -11
- package/src/resources/extensions/gsd/auto/loop.ts +134 -16
- package/src/resources/extensions/gsd/auto/orchestrator.ts +52 -4
- package/src/resources/extensions/gsd/auto/phases.ts +427 -220
- package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
- package/src/resources/extensions/gsd/auto/session.ts +9 -1
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +15 -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-dashboard.ts +20 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +134 -90
- package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +207 -7
- package/src/resources/extensions/gsd/auto-start.ts +326 -25
- package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +259 -360
- package/src/resources/extensions/gsd/auto.ts +336 -89
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +147 -11
- 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 +32 -19
- 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 +396 -55
- 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/bootstrap/write-gate.ts +153 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
- package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
- 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-extract-learnings.ts +17 -12
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/context-budget.ts +44 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
- package/src/resources/extensions/gsd/detection.ts +128 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +87 -10
- package/src/resources/extensions/gsd/gsd-db.ts +168 -13
- package/src/resources/extensions/gsd/guided-flow.ts +175 -55
- package/src/resources/extensions/gsd/health-widget.ts +3 -0
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/memory-store.ts +77 -12
- package/src/resources/extensions/gsd/migrate/command.ts +47 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
- 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/planning-path-scope.ts +35 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/preferences-types.ts +1 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
- 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/parallel-research-slices.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
- package/src/resources/extensions/gsd/quick.ts +37 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +122 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -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/state-reconciliation.ts +57 -0
- 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 +544 -41
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +119 -2
- 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 +175 -11
- 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-recovery.test.ts +184 -2
- 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 +142 -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 +97 -2
- 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/commands-extract-learnings.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
- 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-budget.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +18 -10
- 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/db-schema-metadata.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +6 -11
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
- 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/dispatch-rule-coverage.test.ts +313 -0
- 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/exec-history.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
- 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 +151 -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/gsd-db.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
- 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 +66 -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 +248 -10
- 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-decay-factor.test.ts +90 -0
- 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 +37 -7
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +267 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +88 -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 +44 -9
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -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 +95 -75
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
- 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-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
- 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-external-gsd.test.ts +40 -0
- 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/right-sized-workflow-prompts.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- 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 +222 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
- 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 -59
- 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/stalled-tool-recovery.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
- 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/tui-header-lifecycle.test.ts +210 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
- 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-tool-executors.test.ts +3 -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 +38 -6
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +50 -31
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +434 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
- 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 +373 -76
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +327 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tool-contract.ts +82 -0
- 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/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
- package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1255 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
- package/src/resources/extensions/gsd/worktree-safety.ts +282 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +404 -0
- 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/resources/extensions/gsd/worktree-resolver.js +0 -733
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +0 -434
- package/src/resources/extensions/gsd/worktree-resolver.ts +0 -909
- /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → 8G7Lc96dfT0V6VXh6O6Ka}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Registers GSD extension runtime hooks and token-saving tool policies.
|
|
3
|
+
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
import { pathToFileURL } from "node:url";
|
|
2
7
|
|
|
3
8
|
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
4
9
|
import { isToolCallEventType } from "@gsd/pi-coding-agent";
|
|
@@ -7,7 +12,7 @@ import type { GSDEcosystemBeforeAgentStartHandler } from "../ecosystem/gsd-exten
|
|
|
7
12
|
import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
|
|
8
13
|
|
|
9
14
|
import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
|
|
10
|
-
import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
15
|
+
import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
|
|
11
16
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
12
17
|
import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
|
|
13
18
|
import { loadFile, saveFile, formatContinue } from "../files.js";
|
|
@@ -25,12 +30,255 @@ import { initNotificationWidget } from "../notification-widget.js";
|
|
|
25
30
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
26
31
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
27
32
|
import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
|
|
33
|
+
import { resolveSkillManifest } from "../skill-manifest.js";
|
|
28
34
|
|
|
29
|
-
// Skip the welcome screen on the very first session_start — cli.ts already
|
|
30
|
-
// printed it before the TUI launched. Only re-print on /clear (subsequent sessions).
|
|
31
|
-
let isFirstSession = true;
|
|
32
35
|
let approvalQuestionAbortInFlight = false;
|
|
33
36
|
|
|
37
|
+
interface DeferredApprovalGate {
|
|
38
|
+
gateId: string;
|
|
39
|
+
basePath: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
type WelcomeScreenModule = {
|
|
43
|
+
buildWelcomeScreenLines(opts: { version: string; remoteChannel?: string; width?: number }): string[];
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
async function loadWelcomeScreenModule(): Promise<WelcomeScreenModule | undefined> {
|
|
47
|
+
const candidates: string[] = [];
|
|
48
|
+
const gsdBinPath = process.env.GSD_BIN_PATH;
|
|
49
|
+
if (gsdBinPath) {
|
|
50
|
+
candidates.push(join(dirname(gsdBinPath), "welcome-screen.js"));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const packageRoot = process.env.GSD_PKG_ROOT;
|
|
54
|
+
if (packageRoot) {
|
|
55
|
+
candidates.push(join(packageRoot, "dist", "welcome-screen.js"));
|
|
56
|
+
candidates.push(join(packageRoot, "src", "welcome-screen.ts"));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
for (const candidate of candidates) {
|
|
60
|
+
try {
|
|
61
|
+
if (!existsSync(candidate)) continue;
|
|
62
|
+
const mod = await import(pathToFileURL(candidate).href) as Partial<WelcomeScreenModule>;
|
|
63
|
+
if (typeof mod.buildWelcomeScreenLines === "function") {
|
|
64
|
+
return mod as WelcomeScreenModule;
|
|
65
|
+
}
|
|
66
|
+
} catch {
|
|
67
|
+
// Try the next package layout.
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function installWelcomeHeader(ctx: ExtensionContext): Promise<void> {
|
|
74
|
+
if (!ctx.hasUI || typeof ctx.ui?.setHeader !== "function") return;
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
const welcome = await loadWelcomeScreenModule();
|
|
78
|
+
if (!welcome) return;
|
|
79
|
+
|
|
80
|
+
let remoteChannel: string | undefined;
|
|
81
|
+
try {
|
|
82
|
+
const { resolveRemoteConfig } = await import("../../remote-questions/config.js");
|
|
83
|
+
const rc = resolveRemoteConfig();
|
|
84
|
+
if (rc) remoteChannel = rc.channel;
|
|
85
|
+
} catch { /* non-fatal */ }
|
|
86
|
+
|
|
87
|
+
ctx.ui.setHeader(() => {
|
|
88
|
+
let cachedLines: string[] | undefined;
|
|
89
|
+
let cachedWidth: number | undefined;
|
|
90
|
+
return {
|
|
91
|
+
render(width: number): string[] {
|
|
92
|
+
if (cachedLines !== undefined && cachedWidth === width) return cachedLines;
|
|
93
|
+
cachedLines = welcome.buildWelcomeScreenLines({
|
|
94
|
+
version: process.env.GSD_VERSION || "0.0.0",
|
|
95
|
+
remoteChannel,
|
|
96
|
+
width,
|
|
97
|
+
});
|
|
98
|
+
cachedWidth = width;
|
|
99
|
+
return cachedLines;
|
|
100
|
+
},
|
|
101
|
+
invalidate(): void {
|
|
102
|
+
cachedLines = undefined;
|
|
103
|
+
cachedWidth = undefined;
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
} catch {
|
|
108
|
+
/* non-fatal */
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
let deferredApprovalGate: DeferredApprovalGate | null = null;
|
|
113
|
+
|
|
114
|
+
export const MINIMAL_GSD_TOOL_NAMES = [
|
|
115
|
+
"gsd_exec",
|
|
116
|
+
"gsd_exec_search",
|
|
117
|
+
"gsd_resume",
|
|
118
|
+
"gsd_milestone_status",
|
|
119
|
+
"gsd_checkpoint_db",
|
|
120
|
+
"memory_query",
|
|
121
|
+
"capture_thought",
|
|
122
|
+
] as const;
|
|
123
|
+
|
|
124
|
+
export const MINIMAL_AUTO_BASE_TOOL_NAMES = [
|
|
125
|
+
"ask_user_questions",
|
|
126
|
+
"bash",
|
|
127
|
+
"bg_shell",
|
|
128
|
+
"edit",
|
|
129
|
+
"glob",
|
|
130
|
+
"grep",
|
|
131
|
+
"ls",
|
|
132
|
+
"read",
|
|
133
|
+
"write",
|
|
134
|
+
] as const;
|
|
135
|
+
|
|
136
|
+
const AUTO_UNIT_SCOPED_TOOLS: Record<string, readonly string[]> = {
|
|
137
|
+
"research-milestone": ["gsd_summary_save", "gsd_decision_save"],
|
|
138
|
+
"plan-milestone": ["gsd_plan_milestone", "gsd_decision_save", "gsd_requirement_update"],
|
|
139
|
+
"discuss-milestone": ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
|
|
140
|
+
"validate-milestone": ["gsd_validate_milestone", "gsd_reassess_roadmap", "subagent"],
|
|
141
|
+
"complete-milestone": ["gsd_complete_milestone", "subagent"],
|
|
142
|
+
"research-slice": ["gsd_summary_save", "gsd_decision_save"],
|
|
143
|
+
"plan-slice": ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
144
|
+
"refine-slice": ["gsd_plan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
145
|
+
"replan-slice": ["gsd_replan_slice", "gsd_plan_task", "gsd_decision_save"],
|
|
146
|
+
"complete-slice": ["gsd_slice_complete", "gsd_decision_save", "gsd_requirement_update", "subagent"],
|
|
147
|
+
"reassess-roadmap": ["gsd_reassess_roadmap"],
|
|
148
|
+
"execute-task": ["gsd_task_complete", "gsd_decision_save"],
|
|
149
|
+
"execute-task-simple": ["gsd_task_complete", "gsd_decision_save"],
|
|
150
|
+
"reactive-execute": ["gsd_task_complete", "gsd_decision_save"],
|
|
151
|
+
"run-uat": ["gsd_summary_save"],
|
|
152
|
+
"gate-evaluate": ["gsd_save_gate_result"],
|
|
153
|
+
"rewrite-docs": ["gsd_summary_save", "gsd_decision_save"],
|
|
154
|
+
"workflow-preferences": ["gsd_summary_save"],
|
|
155
|
+
"discuss-project": ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
|
|
156
|
+
"discuss-requirements": ["gsd_requirement_save", "gsd_summary_save"],
|
|
157
|
+
"research-decision": ["gsd_summary_save"],
|
|
158
|
+
"research-project": ["gsd_summary_save", "gsd_decision_save"],
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const WORKFLOW_GSD_TOOL_NAMES = [
|
|
162
|
+
...MINIMAL_GSD_TOOL_NAMES,
|
|
163
|
+
...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
|
|
164
|
+
].filter(isGsdManagedTool);
|
|
165
|
+
|
|
166
|
+
function isGsdManagedTool(name: string): boolean {
|
|
167
|
+
return name.startsWith("gsd_") || name === "memory_query" || name === "capture_thought" || name === "gsd_graph";
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function buildMinimalGsdToolSet(activeToolNames: readonly string[]): string[] {
|
|
171
|
+
const active = new Set(activeToolNames);
|
|
172
|
+
const preserved = activeToolNames.filter((name) => !isGsdManagedTool(name));
|
|
173
|
+
const minimal = MINIMAL_GSD_TOOL_NAMES.filter((name) => active.has(name));
|
|
174
|
+
return [...new Set([...preserved, ...minimal])];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function buildMinimalAutoGsdToolSet(
|
|
178
|
+
activeToolNames: readonly string[],
|
|
179
|
+
unitType: string | undefined,
|
|
180
|
+
): string[] {
|
|
181
|
+
const active = new Set(activeToolNames);
|
|
182
|
+
const unitTools = unitType ? AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [] : [];
|
|
183
|
+
const autoBaseTools = new Set<string>(MINIMAL_AUTO_BASE_TOOL_NAMES);
|
|
184
|
+
const preserved = activeToolNames.filter((name) => autoBaseTools.has(name));
|
|
185
|
+
const scoped = [...MINIMAL_GSD_TOOL_NAMES, ...unitTools].filter((name) => active.has(name));
|
|
186
|
+
return [...new Set([...preserved, ...scoped])];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function buildMinimalGsdWorkflowToolSet(activeToolNames: readonly string[]): string[] {
|
|
190
|
+
const active = new Set(activeToolNames);
|
|
191
|
+
const autoBaseTools = new Set<string>(MINIMAL_AUTO_BASE_TOOL_NAMES);
|
|
192
|
+
const preserved = activeToolNames.filter((name) => autoBaseTools.has(name));
|
|
193
|
+
const scoped = WORKFLOW_GSD_TOOL_NAMES.filter((name) => active.has(name));
|
|
194
|
+
return [...new Set([...preserved, ...scoped])];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function buildRequestScopedGsdToolSet(
|
|
198
|
+
activeToolNames: readonly string[],
|
|
199
|
+
requestCustomMessages: readonly { customType?: string }[] | undefined,
|
|
200
|
+
): string[] | undefined {
|
|
201
|
+
for (let index = (requestCustomMessages?.length ?? 0) - 1; index >= 0; index--) {
|
|
202
|
+
const currentCustomType = requestCustomMessages?.[index]?.customType;
|
|
203
|
+
if (
|
|
204
|
+
currentCustomType === "gsd-run" ||
|
|
205
|
+
currentCustomType === "gsd-discuss" ||
|
|
206
|
+
currentCustomType === "gsd-doctor-heal" ||
|
|
207
|
+
currentCustomType === "gsd-triage"
|
|
208
|
+
) {
|
|
209
|
+
return buildMinimalGsdWorkflowToolSet(activeToolNames);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function isFullGsdToolSurfaceRequested(): boolean {
|
|
216
|
+
return process.env.PI_GSD_FULL_TOOLS === "1";
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function isGeneralGsdToolScopingRequested(): boolean {
|
|
220
|
+
return process.env.PI_GSD_MINIMAL_TOOLS === "1";
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export interface ScopedGsdWorkflowState {
|
|
224
|
+
tools: string[] | null;
|
|
225
|
+
visibleSkills: string[] | undefined;
|
|
226
|
+
restoreVisibleSkills: boolean;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
type GsdWorkflowScopeApi = Pick<ExtensionAPI, "getActiveTools" | "setActiveTools"> & Partial<Pick<ExtensionAPI, "getVisibleSkills" | "setVisibleSkills">>;
|
|
230
|
+
|
|
231
|
+
function applyMinimalGsdToolSurface(pi: ExtensionAPI): void {
|
|
232
|
+
if (isFullGsdToolSurfaceRequested()) return;
|
|
233
|
+
const dash = getAutoRuntimeSnapshot();
|
|
234
|
+
if (dash.active && dash.currentUnit) {
|
|
235
|
+
pi.setActiveTools(buildMinimalAutoGsdToolSet(pi.getActiveTools(), dash.currentUnit.type));
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (!isGeneralGsdToolScopingRequested()) return;
|
|
239
|
+
pi.setActiveTools(buildMinimalGsdToolSet(pi.getActiveTools()));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export function scopeGsdWorkflowToolsForDispatch(
|
|
243
|
+
pi: GsdWorkflowScopeApi,
|
|
244
|
+
unitType?: string,
|
|
245
|
+
): ScopedGsdWorkflowState | null {
|
|
246
|
+
if (isFullGsdToolSurfaceRequested()) return null;
|
|
247
|
+
const current = pi.getActiveTools();
|
|
248
|
+
const scoped = unitType
|
|
249
|
+
? buildMinimalAutoGsdToolSet(current, unitType)
|
|
250
|
+
: buildMinimalGsdWorkflowToolSet(current);
|
|
251
|
+
const toolsChanged = !(scoped.length === current.length && scoped.every((name, index) => name === current[index]));
|
|
252
|
+
const skillManifest = resolveSkillManifest(unitType);
|
|
253
|
+
const canScopeSkills = skillManifest !== null && pi.getVisibleSkills && pi.setVisibleSkills;
|
|
254
|
+
if (!toolsChanged && !canScopeSkills) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
if (toolsChanged) {
|
|
258
|
+
pi.setActiveTools(scoped);
|
|
259
|
+
}
|
|
260
|
+
const visibleSkills = canScopeSkills ? pi.getVisibleSkills!() : undefined;
|
|
261
|
+
if (canScopeSkills) {
|
|
262
|
+
pi.setVisibleSkills!(skillManifest);
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
tools: toolsChanged ? current : null,
|
|
266
|
+
visibleSkills,
|
|
267
|
+
restoreVisibleSkills: Boolean(canScopeSkills),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function restoreGsdWorkflowTools(
|
|
272
|
+
pi: Pick<ExtensionAPI, "setActiveTools"> & Partial<Pick<ExtensionAPI, "setVisibleSkills">>,
|
|
273
|
+
savedState: ScopedGsdWorkflowState | null,
|
|
274
|
+
): void {
|
|
275
|
+
if (!savedState) return;
|
|
276
|
+
if (savedState.tools) pi.setActiveTools(savedState.tools);
|
|
277
|
+
if (savedState.restoreVisibleSkills && pi.setVisibleSkills) {
|
|
278
|
+
pi.setVisibleSkills(savedState.visibleSkills);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
34
282
|
async function deriveGsdState(basePath: string) {
|
|
35
283
|
const { deriveState } = await import("../state.js");
|
|
36
284
|
return deriveState(basePath);
|
|
@@ -65,12 +313,76 @@ async function applyDisabledModelProviderPolicy(ctx: ExtensionContext): Promise<
|
|
|
65
313
|
}
|
|
66
314
|
}
|
|
67
315
|
|
|
68
|
-
|
|
69
|
-
|
|
316
|
+
/**
|
|
317
|
+
* Bridge `context_management.compaction_threshold_percent` from GSD preferences
|
|
318
|
+
* into the agent's runtime compaction settings (#5475). The preference is
|
|
319
|
+
* validated to (0.5, 0.95) at load time, but defense-in-depth normalization
|
|
320
|
+
* here protects against a stale or hand-edited prefs file. Calling with
|
|
321
|
+
* `undefined` clears any prior override so a removed preference does not leak.
|
|
322
|
+
*/
|
|
323
|
+
async function applyCompactionThresholdOverride(ctx: ExtensionContext): Promise<void> {
|
|
324
|
+
try {
|
|
325
|
+
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
326
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
327
|
+
const raw = prefs?.preferences.context_management?.compaction_threshold_percent;
|
|
328
|
+
const value =
|
|
329
|
+
typeof raw === "number" && Number.isFinite(raw) && raw > 0 && raw < 1 ? raw : undefined;
|
|
330
|
+
ctx.setCompactionThresholdOverride(value);
|
|
331
|
+
} catch {
|
|
332
|
+
// Non-fatal: leave any existing override in place.
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
function clearDeferredApprovalGate(basePath?: string): void {
|
|
337
|
+
if (!basePath || deferredApprovalGate?.basePath === basePath) {
|
|
338
|
+
deferredApprovalGate = null;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function deferApprovalGate(gateId: string, basePath: string): void {
|
|
343
|
+
deferredApprovalGate = { gateId, basePath };
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function contextBasePath(ctx?: { cwd?: string }): string {
|
|
347
|
+
return typeof ctx?.cwd === "string" ? ctx.cwd : process.cwd();
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function activateDeferredApprovalGate(basePath: string): void {
|
|
351
|
+
if (deferredApprovalGate?.basePath !== basePath) return;
|
|
352
|
+
setPendingGate(deferredApprovalGate.gateId, basePath);
|
|
353
|
+
deferredApprovalGate = null;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function isContextDraftSummarySave(toolName: string, input: unknown): boolean {
|
|
357
|
+
if (toolName !== "gsd_summary_save" && toolName !== "summary_save") return false;
|
|
358
|
+
if (!input || typeof input !== "object") return false;
|
|
359
|
+
return (input as { artifact_type?: unknown }).artifact_type === "CONTEXT-DRAFT";
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function shouldBlockDeferredApprovalTool(
|
|
363
|
+
toolName: string,
|
|
364
|
+
input: unknown,
|
|
365
|
+
basePath: string,
|
|
366
|
+
): { block: boolean; reason?: string } {
|
|
367
|
+
if (deferredApprovalGate?.basePath !== basePath) return { block: false };
|
|
368
|
+
if (toolName === "ask_user_questions") return { block: false };
|
|
369
|
+
if (isContextDraftSummarySave(toolName, input)) return { block: false };
|
|
370
|
+
return {
|
|
371
|
+
block: true,
|
|
372
|
+
reason: [
|
|
373
|
+
`HARD BLOCK: Approval question "${deferredApprovalGate.gateId}" has been shown to the user.`,
|
|
374
|
+
`Only CONTEXT-DRAFT persistence may finish in this same assistant turn.`,
|
|
375
|
+
`Wait for the user's answer before calling additional tools.`,
|
|
376
|
+
].join(" "),
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export function resolveNotificationStoreBasePath(basePath: string): string {
|
|
381
|
+
return resolveWorktreeProjectRoot(basePath);
|
|
70
382
|
}
|
|
71
383
|
|
|
72
384
|
function initSessionNotifications(ctx: ExtensionContext): void {
|
|
73
|
-
initNotificationStore(resolveNotificationStoreBasePath());
|
|
385
|
+
initNotificationStore(resolveNotificationStoreBasePath(contextBasePath(ctx)));
|
|
74
386
|
installNotifyInterceptor(ctx);
|
|
75
387
|
initNotificationWidget(ctx);
|
|
76
388
|
}
|
|
@@ -112,52 +424,34 @@ export function registerHooks(
|
|
|
112
424
|
ecosystemHandlers: GSDEcosystemBeforeAgentStartHandler[],
|
|
113
425
|
): void {
|
|
114
426
|
pi.on("session_start", async (_event, ctx) => {
|
|
427
|
+
const basePath = contextBasePath(ctx);
|
|
115
428
|
initSessionNotifications(ctx);
|
|
116
429
|
if (!isAutoActive()) {
|
|
117
430
|
const { initHealthWidget } = await import("../health-widget.js");
|
|
118
431
|
initHealthWidget(ctx);
|
|
119
432
|
}
|
|
120
|
-
resetWriteGateState(
|
|
433
|
+
resetWriteGateState(basePath);
|
|
121
434
|
resetToolCallLoopGuard();
|
|
122
435
|
approvalQuestionAbortInFlight = false;
|
|
436
|
+
clearDeferredApprovalGate();
|
|
123
437
|
await resetAskUserQuestionsTurnCache();
|
|
124
438
|
await syncServiceTierStatus(ctx);
|
|
125
439
|
await applyDisabledModelProviderPolicy(ctx);
|
|
440
|
+
await applyCompactionThresholdOverride(ctx);
|
|
126
441
|
// Skip MCP auto-prep when running inside an auto-worktree (see session_switch below).
|
|
127
442
|
const { isInAutoWorktree } = await import("../auto-worktree.js");
|
|
128
|
-
if (!isInAutoWorktree(
|
|
443
|
+
if (!isInAutoWorktree(basePath)) {
|
|
129
444
|
const { prepareWorkflowMcpForProject } = await import("../workflow-mcp-auto-prep.js");
|
|
130
|
-
prepareWorkflowMcpForProject(ctx,
|
|
445
|
+
prepareWorkflowMcpForProject(ctx, basePath);
|
|
131
446
|
}
|
|
132
447
|
|
|
133
448
|
// Apply show_token_cost preference (#1515)
|
|
134
449
|
try {
|
|
135
450
|
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
136
|
-
const prefs = loadEffectiveGSDPreferences();
|
|
451
|
+
const prefs = loadEffectiveGSDPreferences(basePath);
|
|
137
452
|
process.env.GSD_SHOW_TOKEN_COST = prefs?.preferences.show_token_cost ? "1" : "";
|
|
138
453
|
} catch { /* non-fatal */ }
|
|
139
|
-
|
|
140
|
-
isFirstSession = false;
|
|
141
|
-
} else {
|
|
142
|
-
try {
|
|
143
|
-
const gsdBinPath = process.env.GSD_BIN_PATH;
|
|
144
|
-
if (gsdBinPath) {
|
|
145
|
-
const { dirname } = await import("node:path");
|
|
146
|
-
const { printWelcomeScreen } = await import(
|
|
147
|
-
join(dirname(gsdBinPath), "welcome-screen.js")
|
|
148
|
-
) as { printWelcomeScreen: (opts: { version: string; modelName?: string; provider?: string; remoteChannel?: string }) => void };
|
|
149
|
-
|
|
150
|
-
let remoteChannel: string | undefined;
|
|
151
|
-
try {
|
|
152
|
-
const { resolveRemoteConfig } = await import("../../remote-questions/config.js");
|
|
153
|
-
const rc = resolveRemoteConfig();
|
|
154
|
-
if (rc) remoteChannel = rc.channel;
|
|
155
|
-
} catch { /* non-fatal */ }
|
|
156
|
-
|
|
157
|
-
printWelcomeScreen({ version: process.env.GSD_VERSION || "0.0.0", remoteChannel });
|
|
158
|
-
}
|
|
159
|
-
} catch { /* non-fatal */ }
|
|
160
|
-
}
|
|
454
|
+
await installWelcomeHeader(ctx);
|
|
161
455
|
await loadToolApiKeysForSession();
|
|
162
456
|
if (isAutoActive()) {
|
|
163
457
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
@@ -165,21 +459,24 @@ export function registerHooks(
|
|
|
165
459
|
});
|
|
166
460
|
|
|
167
461
|
pi.on("session_switch", async (_event, ctx) => {
|
|
462
|
+
const basePath = contextBasePath(ctx);
|
|
168
463
|
initSessionNotifications(ctx);
|
|
169
|
-
resetWriteGateState(
|
|
464
|
+
resetWriteGateState(basePath);
|
|
170
465
|
resetToolCallLoopGuard();
|
|
466
|
+
clearDeferredApprovalGate();
|
|
171
467
|
await resetAskUserQuestionsTurnCache();
|
|
172
|
-
clearDiscussionFlowState(
|
|
468
|
+
clearDiscussionFlowState(basePath);
|
|
173
469
|
await syncServiceTierStatus(ctx);
|
|
174
470
|
await applyDisabledModelProviderPolicy(ctx);
|
|
471
|
+
await applyCompactionThresholdOverride(ctx);
|
|
175
472
|
// Skip MCP auto-prep when running inside an auto-worktree. The worktree
|
|
176
473
|
// already has .mcp.json from createAutoWorktree, and re-running the writer
|
|
177
474
|
// post-chdir rewrites the file mid-run (non-idempotent due to cwd-relative
|
|
178
475
|
// CLI path resolution), dirtying the tree and breaking the milestone merge.
|
|
179
476
|
const { isInAutoWorktree } = await import("../auto-worktree.js");
|
|
180
|
-
if (!isInAutoWorktree(
|
|
477
|
+
if (!isInAutoWorktree(basePath)) {
|
|
181
478
|
const { prepareWorkflowMcpForProject } = await import("../workflow-mcp-auto-prep.js");
|
|
182
|
-
prepareWorkflowMcpForProject(ctx,
|
|
479
|
+
prepareWorkflowMcpForProject(ctx, basePath);
|
|
183
480
|
}
|
|
184
481
|
await loadToolApiKeysForSession();
|
|
185
482
|
if (!isAutoActive()) {
|
|
@@ -191,11 +488,13 @@ export function registerHooks(
|
|
|
191
488
|
});
|
|
192
489
|
|
|
193
490
|
pi.on("before_agent_start", async (event, ctx: ExtensionContext) => {
|
|
491
|
+
applyMinimalGsdToolSurface(pi);
|
|
492
|
+
|
|
194
493
|
// Wait for ecosystem loader to finish (no-op after first turn).
|
|
195
494
|
const { getEcosystemReadyPromise } = await import("../ecosystem/loader.js");
|
|
196
495
|
await getEcosystemReadyPromise();
|
|
197
496
|
|
|
198
|
-
const beforeAgentBasePath =
|
|
497
|
+
const beforeAgentBasePath = contextBasePath(ctx);
|
|
199
498
|
const pendingApprovalGate = getPendingGate(beforeAgentBasePath);
|
|
200
499
|
if (pendingApprovalGate && isExplicitApprovalResponse(event.prompt, pendingApprovalGate)) {
|
|
201
500
|
markApprovalGateVerified(pendingApprovalGate, beforeAgentBasePath);
|
|
@@ -203,6 +502,7 @@ export function registerHooks(
|
|
|
203
502
|
if (milestoneId) markDepthVerified(milestoneId, beforeAgentBasePath);
|
|
204
503
|
clearPendingGate(beforeAgentBasePath);
|
|
205
504
|
}
|
|
505
|
+
clearDeferredApprovalGate(beforeAgentBasePath);
|
|
206
506
|
|
|
207
507
|
// GSD's own context injection (existing behavior — unchanged).
|
|
208
508
|
const { buildBeforeAgentStartResult } = await import("./system-context.js");
|
|
@@ -211,7 +511,7 @@ export function registerHooks(
|
|
|
211
511
|
// Refresh the snapshot used by ecosystem getPhase()/getActiveUnit().
|
|
212
512
|
// deriveState has its own ~100ms cache so this is cheap on repeat calls.
|
|
213
513
|
try {
|
|
214
|
-
const state = await deriveGsdState(
|
|
514
|
+
const state = await deriveGsdState(beforeAgentBasePath);
|
|
215
515
|
updateSnapshot(state);
|
|
216
516
|
} catch {
|
|
217
517
|
updateSnapshot(null);
|
|
@@ -253,7 +553,11 @@ export function registerHooks(
|
|
|
253
553
|
resetToolCallLoopGuard();
|
|
254
554
|
await resetAskUserQuestionsTurnCache();
|
|
255
555
|
const { handleAgentEnd } = await import("./agent-end-recovery.js");
|
|
256
|
-
|
|
556
|
+
try {
|
|
557
|
+
await handleAgentEnd(pi, event, ctx);
|
|
558
|
+
} finally {
|
|
559
|
+
activateDeferredApprovalGate(contextBasePath(ctx));
|
|
560
|
+
}
|
|
257
561
|
});
|
|
258
562
|
|
|
259
563
|
// Squash-merge quick-task branch back to the original branch after the
|
|
@@ -268,8 +572,8 @@ export function registerHooks(
|
|
|
268
572
|
}
|
|
269
573
|
});
|
|
270
574
|
|
|
271
|
-
pi.on("session_before_compact", async () => {
|
|
272
|
-
const basePath =
|
|
575
|
+
pi.on("session_before_compact", async (_event, ctx) => {
|
|
576
|
+
const basePath = contextBasePath(ctx);
|
|
273
577
|
// Context Mode is default-on. Write the resumable snapshot before any
|
|
274
578
|
// active-auto cancel return so auto sessions still leave re-entry context.
|
|
275
579
|
await writeContextModeCompactionSnapshot(basePath);
|
|
@@ -336,7 +640,7 @@ export function registerHooks(
|
|
|
336
640
|
if (!unitType) {
|
|
337
641
|
try {
|
|
338
642
|
const { getPendingDeepProjectSetupUnitForContext } = await import("../guided-flow.js");
|
|
339
|
-
const pending = getPendingDeepProjectSetupUnitForContext(ctx,
|
|
643
|
+
const pending = getPendingDeepProjectSetupUnitForContext(ctx, contextBasePath(ctx));
|
|
340
644
|
unitType = pending?.unitType;
|
|
341
645
|
unitId = pending?.unitId;
|
|
342
646
|
} catch {
|
|
@@ -345,7 +649,7 @@ export function registerHooks(
|
|
|
345
649
|
}
|
|
346
650
|
|
|
347
651
|
if (!unitType) {
|
|
348
|
-
const milestoneId = await getDiscussionMilestoneIdFor(
|
|
652
|
+
const milestoneId = await getDiscussionMilestoneIdFor(contextBasePath(ctx));
|
|
349
653
|
if (milestoneId) {
|
|
350
654
|
unitType = "discuss-milestone";
|
|
351
655
|
unitId = milestoneId;
|
|
@@ -355,15 +659,16 @@ export function registerHooks(
|
|
|
355
659
|
if (!shouldPauseForUserApprovalQuestion(unitType, [event.message])) return;
|
|
356
660
|
|
|
357
661
|
const gateId = approvalGateIdForUnit(unitType, unitId);
|
|
358
|
-
if (gateId)
|
|
662
|
+
if (gateId) deferApprovalGate(gateId, contextBasePath(ctx));
|
|
359
663
|
|
|
360
664
|
approvalQuestionAbortInFlight = true;
|
|
361
665
|
ctx.ui.notify(
|
|
362
666
|
`${unitType}${unitId ? ` ${unitId}` : ""} is waiting for your approval - pausing before more tool calls run.`,
|
|
363
667
|
"info",
|
|
364
668
|
);
|
|
365
|
-
// The pending gate
|
|
366
|
-
//
|
|
669
|
+
// The durable pending gate is activated at agent_end so same-turn
|
|
670
|
+
// CONTEXT-DRAFT persistence can finish after the text boundary streams.
|
|
671
|
+
// The tool_call hook below still blocks non-draft tools in this turn.
|
|
367
672
|
// Aborting mid-stream eats the model's question text on external CLI
|
|
368
673
|
// providers (Claude Code SDK) because lastTextContent isn't populated
|
|
369
674
|
// from in-flight builder state — the user only ever sees "Claude Code
|
|
@@ -374,7 +679,7 @@ export function registerHooks(
|
|
|
374
679
|
const { isParallelActive, shutdownParallel } = await import("../parallel-orchestrator.js");
|
|
375
680
|
if (isParallelActive()) {
|
|
376
681
|
try {
|
|
377
|
-
await shutdownParallel(
|
|
682
|
+
await shutdownParallel(contextBasePath(ctx));
|
|
378
683
|
} catch {
|
|
379
684
|
// best-effort
|
|
380
685
|
}
|
|
@@ -386,8 +691,8 @@ export function registerHooks(
|
|
|
386
691
|
}
|
|
387
692
|
});
|
|
388
693
|
|
|
389
|
-
pi.on("tool_call", async (event) => {
|
|
390
|
-
const discussionBasePath =
|
|
694
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
695
|
+
const discussionBasePath = contextBasePath(ctx);
|
|
391
696
|
const toolName = canonicalToolName(event.toolName);
|
|
392
697
|
// ── Loop guard: block repeated identical tool calls ──
|
|
393
698
|
const loopCheck = checkToolCallLoop(toolName, event.input as Record<string, unknown>);
|
|
@@ -395,6 +700,13 @@ export function registerHooks(
|
|
|
395
700
|
return { block: true, reason: loopCheck.reason };
|
|
396
701
|
}
|
|
397
702
|
|
|
703
|
+
const deferredGateGuard = shouldBlockDeferredApprovalTool(
|
|
704
|
+
toolName,
|
|
705
|
+
event.input,
|
|
706
|
+
discussionBasePath,
|
|
707
|
+
);
|
|
708
|
+
if (deferredGateGuard.block) return deferredGateGuard;
|
|
709
|
+
|
|
398
710
|
// ── Discussion gate enforcement: track pending gate questions ─────────
|
|
399
711
|
// Only gate-shaped ask_user_questions calls should block execution.
|
|
400
712
|
// The gate stays pending until the user selects the approval option.
|
|
@@ -482,6 +794,22 @@ export function registerHooks(
|
|
|
482
794
|
}
|
|
483
795
|
}
|
|
484
796
|
|
|
797
|
+
// ── Worktree-isolation write gate (#5199) ────────────────────────────
|
|
798
|
+
// Block planning-write tools from landing code at the project root when
|
|
799
|
+
// git.isolation=worktree but auto-mode hasn't created the milestone
|
|
800
|
+
// worktree yet. Without this, writes silently orphan outside git history.
|
|
801
|
+
if (isToolCallEventType("write", event) || isToolCallEventType("edit", event)) {
|
|
802
|
+
const wtBasePath = resolveWorktreeProjectRoot(dash.basePath ?? discussionBasePath);
|
|
803
|
+
const wtGuard = shouldBlockWorktreeWrite(
|
|
804
|
+
event.toolName,
|
|
805
|
+
event.input.path,
|
|
806
|
+
wtBasePath,
|
|
807
|
+
isAutoActive(),
|
|
808
|
+
dash.currentUnit?.type,
|
|
809
|
+
);
|
|
810
|
+
if (wtGuard.block) return wtGuard;
|
|
811
|
+
}
|
|
812
|
+
|
|
485
813
|
// ── Single-writer engine: block direct writes to STATE.md ──────────
|
|
486
814
|
// Covers write, edit, and bash tools to prevent bypass vectors.
|
|
487
815
|
if (isToolCallEventType("write", event)) {
|
|
@@ -548,7 +876,7 @@ export function registerHooks(
|
|
|
548
876
|
}
|
|
549
877
|
});
|
|
550
878
|
|
|
551
|
-
pi.on("tool_result", async (event) => {
|
|
879
|
+
pi.on("tool_result", async (event, ctx) => {
|
|
552
880
|
if (isAutoActive() && typeof event.toolCallId === "string") {
|
|
553
881
|
markToolEnd(event.toolCallId);
|
|
554
882
|
}
|
|
@@ -567,7 +895,7 @@ export function registerHooks(
|
|
|
567
895
|
}
|
|
568
896
|
const toolName = canonicalToolName(event.toolName);
|
|
569
897
|
if (toolName !== "ask_user_questions") return;
|
|
570
|
-
const basePath =
|
|
898
|
+
const basePath = contextBasePath(ctx);
|
|
571
899
|
const milestoneId = await getDiscussionMilestoneIdFor(basePath);
|
|
572
900
|
const queueActive = isQueuePhaseActive(basePath);
|
|
573
901
|
|
|
@@ -773,8 +1101,21 @@ export function registerHooks(
|
|
|
773
1101
|
// Tool set adaptation hook (ADR-005 Phase 4)
|
|
774
1102
|
// Extensions can override tool set after model selection by returning { toolNames: [...] }
|
|
775
1103
|
// Return undefined to let the built-in provider compatibility filtering proceed.
|
|
776
|
-
pi.on("adjust_tool_set", async (
|
|
777
|
-
|
|
1104
|
+
pi.on("adjust_tool_set", async (event) => {
|
|
1105
|
+
if (isFullGsdToolSurfaceRequested()) return undefined;
|
|
1106
|
+
const removed = new Set(event.filteredTools);
|
|
1107
|
+
const providerCompatible = event.activeToolNames.filter((name) => !removed.has(name));
|
|
1108
|
+
const requestScoped = buildRequestScopedGsdToolSet(providerCompatible, event.requestCustomMessages);
|
|
1109
|
+
if (requestScoped) {
|
|
1110
|
+
return { toolNames: requestScoped };
|
|
1111
|
+
}
|
|
1112
|
+
const dash = getAutoRuntimeSnapshot();
|
|
1113
|
+
if (dash.active && dash.currentUnit) {
|
|
1114
|
+
return { toolNames: buildMinimalAutoGsdToolSet(providerCompatible, dash.currentUnit.type) };
|
|
1115
|
+
}
|
|
1116
|
+
if (isGeneralGsdToolScopingRequested()) {
|
|
1117
|
+
return { toolNames: buildMinimalGsdToolSet(providerCompatible) };
|
|
1118
|
+
}
|
|
778
1119
|
return undefined;
|
|
779
1120
|
});
|
|
780
1121
|
}
|
|
@@ -39,6 +39,8 @@ function toStrArray(v: unknown): string[] {
|
|
|
39
39
|
* CompleteMilestoneParams, tolerating type mismatches from LLM JSON quirks.
|
|
40
40
|
*/
|
|
41
41
|
export function sanitizeCompleteMilestoneParams(raw: Record<string, unknown>): CompleteMilestoneParams {
|
|
42
|
+
const actorName = toStr(raw.actorName);
|
|
43
|
+
const triggerReason = toStr(raw.triggerReason);
|
|
42
44
|
return {
|
|
43
45
|
milestoneId: toStr(raw.milestoneId),
|
|
44
46
|
title: toStr(raw.title),
|
|
@@ -53,5 +55,7 @@ export function sanitizeCompleteMilestoneParams(raw: Record<string, unknown>): C
|
|
|
53
55
|
followUps: toStr(raw.followUps),
|
|
54
56
|
deviations: toStr(raw.deviations),
|
|
55
57
|
verificationPassed: raw.verificationPassed === true || raw.verificationPassed === "true",
|
|
58
|
+
...(actorName ? { actorName } : {}),
|
|
59
|
+
...(triggerReason ? { triggerReason } : {}),
|
|
56
60
|
};
|
|
57
61
|
}
|