gsd-pi 2.80.0-dev.4ea7d80e7 → 2.80.0-dev.7582bf37a
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 +4 -2
- 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/loop.js +103 -9
- package/dist/resources/extensions/gsd/auto/phases.js +240 -139
- 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 +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 +104 -86
- package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
- package/dist/resources/extensions/gsd/auto-start.js +238 -12
- 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 +209 -81
- package/dist/resources/extensions/gsd/auto.js +159 -44
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
- 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 +319 -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/bootstrap/write-gate.js +19 -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-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 +4 -2
- package/dist/resources/extensions/gsd/db-migration-steps.js +6 -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 +46 -13
- package/dist/resources/extensions/gsd/guided-flow.js +141 -46
- 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/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/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-manager.js +16 -14
- package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
- 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 +3 -3
- 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 +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/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 +32 -0
- 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 +17 -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 +52 -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 +6 -2
- 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 +3 -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 +6 -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 +5 -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 +41 -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 +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__/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 +6 -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 +155 -7
- 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 +31 -6
- 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 +22 -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.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 +36 -0
- 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 +59 -7
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
- 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 +5 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -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__/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 +180 -7
- 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 +39 -8
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +24 -0
- 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/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/loop-deps.ts +3 -2
- package/src/resources/extensions/gsd/auto/loop.ts +134 -16
- package/src/resources/extensions/gsd/auto/phases.ts +328 -200
- 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 +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 +117 -88
- package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
- package/src/resources/extensions/gsd/auto-start.ts +286 -15
- 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 +241 -72
- package/src/resources/extensions/gsd/auto.ts +208 -39
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
- 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 +369 -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/bootstrap/write-gate.ts +19 -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-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 +4 -2
- package/src/resources/extensions/gsd/db-migration-steps.ts +8 -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 +50 -13
- package/src/resources/extensions/gsd/guided-flow.ts +167 -53
- 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/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/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 +433 -11
- 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 +160 -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 +14 -1
- 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 +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/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 +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/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 +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 +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 +239 -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-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 +1 -0
- 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 +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/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/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 +166 -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 +55 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- 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/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 +1 -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 +203 -4
- 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/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-manager.ts +15 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
- 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/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_ssgManifest.js +0 -0
|
@@ -15,6 +15,13 @@ export interface CompactionSettings {
|
|
|
15
15
|
enabled?: boolean; // default: true
|
|
16
16
|
reserveTokens?: number; // default: 16384
|
|
17
17
|
keepRecentTokens?: number; // default: 20000
|
|
18
|
+
/**
|
|
19
|
+
* Optional percent-of-context-window trigger (0 < value < 1). When set,
|
|
20
|
+
* compaction fires at `contextWindow * thresholdPercent` and overrides
|
|
21
|
+
* `reserveTokens`. Typically set as a runtime override by host integrations
|
|
22
|
+
* (see `setCompactionThresholdOverride`) and not persisted by users directly.
|
|
23
|
+
*/
|
|
24
|
+
thresholdPercent?: number;
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
export interface BranchSummarySettings {
|
|
@@ -812,11 +819,42 @@ export class SettingsManager {
|
|
|
812
819
|
return this.settings.compaction?.keepRecentTokens ?? COMPACTION_KEEP_RECENT_TOKENS;
|
|
813
820
|
}
|
|
814
821
|
|
|
815
|
-
|
|
822
|
+
getCompactionThresholdPercent(): number | undefined {
|
|
823
|
+
return this.settings.compaction?.thresholdPercent;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* Set or clear an in-memory compaction threshold-percent override.
|
|
828
|
+
*
|
|
829
|
+
* Applied to `this.settings` only; never persisted to disk. Pass `undefined`
|
|
830
|
+
* to clear a previously set override (necessary for idempotent re-sync from
|
|
831
|
+
* host integrations whose preference may have been removed).
|
|
832
|
+
*
|
|
833
|
+
* Direct mutation is used instead of `applyOverrides()` because deep-merge
|
|
834
|
+
* semantics skip `undefined` values, which would prevent clearing.
|
|
835
|
+
*/
|
|
836
|
+
setCompactionThresholdOverride(percent: number | undefined): void {
|
|
837
|
+
if (!this.settings.compaction) {
|
|
838
|
+
this.settings.compaction = {};
|
|
839
|
+
}
|
|
840
|
+
if (percent === undefined) {
|
|
841
|
+
delete this.settings.compaction.thresholdPercent;
|
|
842
|
+
} else {
|
|
843
|
+
this.settings.compaction.thresholdPercent = percent;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
getCompactionSettings(): {
|
|
848
|
+
enabled: boolean;
|
|
849
|
+
reserveTokens: number;
|
|
850
|
+
keepRecentTokens: number;
|
|
851
|
+
thresholdPercent?: number;
|
|
852
|
+
} {
|
|
816
853
|
return {
|
|
817
854
|
enabled: this.getCompactionEnabled(),
|
|
818
855
|
reserveTokens: this.getCompactionReserveTokens(),
|
|
819
856
|
keepRecentTokens: this.getCompactionKeepRecentTokens(),
|
|
857
|
+
thresholdPercent: this.getCompactionThresholdPercent(),
|
|
820
858
|
};
|
|
821
859
|
}
|
|
822
860
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Tests skill invocation and prompt-only skill visibility behavior.
|
|
3
|
+
|
|
1
4
|
import assert from "node:assert/strict";
|
|
2
5
|
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
6
|
import { tmpdir } from "node:os";
|
|
@@ -86,4 +89,29 @@ describe("Skill tool", () => {
|
|
|
86
89
|
assert.match(message, /^Skill "nonexistent" not found\. Available skills: /);
|
|
87
90
|
assert.match(message, /swift-testing/);
|
|
88
91
|
});
|
|
92
|
+
|
|
93
|
+
it("filters skill catalog without unloading skills or disabling Skill tool", async () => {
|
|
94
|
+
writeSkill(testDir, "alpha", "Use alpha.");
|
|
95
|
+
writeSkill(testDir, "beta", "Use beta.");
|
|
96
|
+
const session = await createSession();
|
|
97
|
+
|
|
98
|
+
assert.match(session.systemPrompt, /<name>alpha<\/name>/);
|
|
99
|
+
assert.match(session.systemPrompt, /<name>beta<\/name>/);
|
|
100
|
+
|
|
101
|
+
session.setVisibleSkillsByName(["alpha"]);
|
|
102
|
+
assert.deepEqual(session.getVisibleSkillNames(), ["alpha"]);
|
|
103
|
+
assert.match(session.systemPrompt, /<name>alpha<\/name>/);
|
|
104
|
+
assert.doesNotMatch(session.systemPrompt, /<name>beta<\/name>/);
|
|
105
|
+
|
|
106
|
+
const tool = session.state.tools.find((entry) => entry.name === "Skill");
|
|
107
|
+
assert.ok(tool, "Skill tool should remain active");
|
|
108
|
+
const result = await tool.execute("call-3", { skill: "beta" });
|
|
109
|
+
const text = result.content[0]?.type === "text" ? result.content[0].text : "";
|
|
110
|
+
assert.match(text, /<skill name="beta"/);
|
|
111
|
+
|
|
112
|
+
session.setVisibleSkillsByName(undefined);
|
|
113
|
+
assert.equal(session.getVisibleSkillNames(), undefined);
|
|
114
|
+
assert.match(session.systemPrompt, /<name>alpha<\/name>/);
|
|
115
|
+
assert.match(session.systemPrompt, /<name>beta<\/name>/);
|
|
116
|
+
});
|
|
89
117
|
});
|
|
@@ -59,13 +59,12 @@ export interface BuildSystemPromptOptions {
|
|
|
59
59
|
* Append a `Current date and time: <toLocaleString>` line to the system
|
|
60
60
|
* prompt. Default: `false`.
|
|
61
61
|
*
|
|
62
|
-
*
|
|
63
|
-
* Embedding a per-call timestamp in the system prompt invalidates
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* and inject it via a non-cached channel (user message) when possible.
|
|
62
|
+
* Provider prompt caches generally depend on stable prompt prefixes.
|
|
63
|
+
* Embedding a per-call timestamp in the system prompt invalidates that
|
|
64
|
+
* stability on every request, often forcing full prompt reprocessing.
|
|
65
|
+
* Most agentic flows do not need wall-clock awareness in the system
|
|
66
|
+
* prompt — opt in only when the consumer genuinely needs it, and inject
|
|
67
|
+
* it via a non-cached channel (user message) when possible.
|
|
69
68
|
*/
|
|
70
69
|
includeDateTime?: boolean;
|
|
71
70
|
}
|
|
@@ -86,9 +85,8 @@ export function buildSystemPrompt(options: BuildSystemPromptOptions = {}): strin
|
|
|
86
85
|
} = options;
|
|
87
86
|
const resolvedCwd = toPosixPath(cwd ?? process.cwd());
|
|
88
87
|
|
|
89
|
-
// Per-call timestamps invalidate
|
|
90
|
-
//
|
|
91
|
-
// when explicitly opted in via `includeDateTime`.
|
|
88
|
+
// Per-call timestamps invalidate provider prompt cache stability. Compute
|
|
89
|
+
// lazily and only when explicitly opted in via `includeDateTime`.
|
|
92
90
|
const dateTimeLine = includeDateTime
|
|
93
91
|
? `\nCurrent date and time: ${new Date().toLocaleString("en-US", {
|
|
94
92
|
weekday: "long",
|
|
@@ -19,76 +19,32 @@
|
|
|
19
19
|
import test from "node:test";
|
|
20
20
|
import assert from "node:assert/strict";
|
|
21
21
|
import { spawn } from "node:child_process";
|
|
22
|
+
import { createBashTool } from "./bash.js";
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"packages/pi-coding-agent/src/core/tools/bash.ts",
|
|
35
|
-
"packages/pi-coding-agent/src/core/bash-executor.ts",
|
|
36
|
-
"packages/pi-coding-agent/src/utils/shell.ts",
|
|
37
|
-
];
|
|
38
|
-
const candidates = [
|
|
39
|
-
resolve(__dirname, "../../../../../"),
|
|
40
|
-
resolve(__dirname, "../../../../../../"),
|
|
41
|
-
];
|
|
42
|
-
for (const candidate of candidates) {
|
|
43
|
-
if (requiredFiles.every((file) => existsSync(join(candidate, file)))) {
|
|
44
|
-
return candidate;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
throw new Error(`Unable to resolve repository root from ${__dirname}`);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const REPO_ROOT = findRepoRoot();
|
|
51
|
-
|
|
52
|
-
const SPAWN_FILES = [
|
|
53
|
-
join(REPO_ROOT, "packages/pi-coding-agent/src/core/tools/bash.ts"),
|
|
54
|
-
join(REPO_ROOT, "packages/pi-coding-agent/src/core/bash-executor.ts"),
|
|
55
|
-
join(REPO_ROOT, "packages/pi-coding-agent/src/utils/shell.ts"),
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
test("spawn calls use platform-guarded detached flag (no unconditional detached: true)", () => {
|
|
59
|
-
for (const file of SPAWN_FILES) {
|
|
60
|
-
const content = readFileSync(file, "utf-8");
|
|
61
|
-
const lines = content.split("\n");
|
|
62
|
-
|
|
63
|
-
for (let i = 0; i < lines.length; i++) {
|
|
64
|
-
const line = lines[i]!;
|
|
65
|
-
// Skip comments
|
|
66
|
-
if (line.trim().startsWith("//") || line.trim().startsWith("*")) continue;
|
|
67
|
-
// Check for unconditional `detached: true`
|
|
68
|
-
if (/detached:\s*true\b/.test(line)) {
|
|
69
|
-
assert.fail(
|
|
70
|
-
`${file}:${i + 1} has unconditional 'detached: true' — ` +
|
|
71
|
-
`must use 'detached: process.platform !== "win32"' ` +
|
|
72
|
-
`to prevent EINVAL on Windows (ConPTY / VSCode terminal)`,
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
});
|
|
24
|
+
test("bash tool delegates command execution through operations without forcing process detachment", async () => {
|
|
25
|
+
const calls: Array<{ command: string; cwd: string; env?: NodeJS.ProcessEnv }> = [];
|
|
26
|
+
const tool = createBashTool(process.cwd(), {
|
|
27
|
+
operations: {
|
|
28
|
+
async exec(command, cwd, options) {
|
|
29
|
+
calls.push({ command, cwd, env: options.env });
|
|
30
|
+
options.onData(Buffer.from("ok\n"));
|
|
31
|
+
return { exitCode: 0 };
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
78
35
|
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
const content = readFileSync(shellFile, "utf-8");
|
|
36
|
+
const result = await tool.execute("tool-call", { command: "echo ok" });
|
|
37
|
+
const firstContent = result.content[0];
|
|
82
38
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
assert.ok(
|
|
87
|
-
!/detached:\s*true/.test(taskkillRegion[0]),
|
|
88
|
-
"taskkill spawn should not use detached: true — " +
|
|
89
|
-
"it can cause EINVAL on Windows and is unnecessary for a utility process",
|
|
90
|
-
);
|
|
39
|
+
assert.ok(firstContent);
|
|
40
|
+
if (firstContent.type !== "text") {
|
|
41
|
+
assert.fail(`Expected text content, got ${firstContent.type}`);
|
|
91
42
|
}
|
|
43
|
+
assert.equal(firstContent.text, "ok\n");
|
|
44
|
+
assert.deepEqual(calls.map((call) => ({ command: call.command, cwd: call.cwd })), [
|
|
45
|
+
{ command: "echo ok", cwd: process.cwd() },
|
|
46
|
+
]);
|
|
47
|
+
assert.ok(calls[0]?.env, "default bash context should provide an execution environment");
|
|
92
48
|
});
|
|
93
49
|
|
|
94
50
|
// Smoke test: spawn with platform-guarded detached flag actually works
|
|
@@ -116,6 +116,7 @@ const bashSchema = Type.Object({
|
|
|
116
116
|
export type BashToolInput = Static<typeof bashSchema>;
|
|
117
117
|
|
|
118
118
|
export interface BashToolDetails {
|
|
119
|
+
cwd?: string;
|
|
119
120
|
truncation?: TruncationResult;
|
|
120
121
|
fullOutputPath?: string;
|
|
121
122
|
artifactId?: string;
|
|
@@ -384,6 +385,7 @@ export function createBashTool(cwd: string, options?: BashToolOptions): AgentToo
|
|
|
384
385
|
onUpdate({
|
|
385
386
|
content: [{ type: "text", text: truncation.content || "" }],
|
|
386
387
|
details: {
|
|
388
|
+
cwd: spawnContext.cwd,
|
|
387
389
|
truncation: truncation.truncated ? truncation : undefined,
|
|
388
390
|
fullOutputPath: spillFilePath,
|
|
389
391
|
},
|
|
@@ -412,10 +414,11 @@ export function createBashTool(cwd: string, options?: BashToolOptions): AgentToo
|
|
|
412
414
|
let outputText = truncation.content || "(no output)";
|
|
413
415
|
|
|
414
416
|
// Build details with truncation info
|
|
415
|
-
let details: BashToolDetails | undefined;
|
|
417
|
+
let details: BashToolDetails | undefined = { cwd: spawnContext.cwd };
|
|
416
418
|
|
|
417
419
|
if (truncation.truncated) {
|
|
418
420
|
details = {
|
|
421
|
+
...details,
|
|
419
422
|
truncation,
|
|
420
423
|
fullOutputPath: spillFilePath,
|
|
421
424
|
...(spillArtifactId ? { artifactId: spillArtifactId } : {}),
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
} from "./edit-diff.js";
|
|
14
14
|
import { notifyFileChanged } from "../lsp/client.js";
|
|
15
15
|
import { resolveToCwd } from "./path-utils.js";
|
|
16
|
+
import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
|
|
16
17
|
|
|
17
18
|
const editSchema = Type.Object({
|
|
18
19
|
path: Type.String({ description: "Path to the file to edit (relative or absolute)" }),
|
|
@@ -27,6 +28,7 @@ export interface EditToolDetails {
|
|
|
27
28
|
diff: string;
|
|
28
29
|
/** Line number of the first change in the new file (for editor navigation) */
|
|
29
30
|
firstChangedLine?: number;
|
|
31
|
+
target?: ToolTargetMetadata;
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
/**
|
|
@@ -208,7 +210,17 @@ export function createEditTool(cwd: string, options?: EditToolOptions): AgentToo
|
|
|
208
210
|
text: `Successfully replaced text in ${path}.`,
|
|
209
211
|
},
|
|
210
212
|
],
|
|
211
|
-
details: {
|
|
213
|
+
details: {
|
|
214
|
+
diff: diffResult.diff,
|
|
215
|
+
firstChangedLine: diffResult.firstChangedLine,
|
|
216
|
+
target: createToolTarget({
|
|
217
|
+
kind: "file",
|
|
218
|
+
action: "edit",
|
|
219
|
+
inputPath: path,
|
|
220
|
+
resolvedPath: absolutePath,
|
|
221
|
+
line: diffResult.firstChangedLine,
|
|
222
|
+
}),
|
|
223
|
+
},
|
|
212
224
|
});
|
|
213
225
|
} catch (error: any) {
|
|
214
226
|
// Clean up abort handler
|
|
@@ -5,6 +5,7 @@ import { existsSync } from "fs";
|
|
|
5
5
|
import path from "path";
|
|
6
6
|
import { FIND_DEFAULT_LIMIT } from "../constants.js";
|
|
7
7
|
import { resolveToCwd } from "./path-utils.js";
|
|
8
|
+
import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
|
|
8
9
|
import { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from "./truncate.js";
|
|
9
10
|
|
|
10
11
|
const findSchema = Type.Object({
|
|
@@ -20,6 +21,7 @@ export type FindToolInput = Static<typeof findSchema>;
|
|
|
20
21
|
const DEFAULT_LIMIT = FIND_DEFAULT_LIMIT;
|
|
21
22
|
|
|
22
23
|
export interface FindToolDetails {
|
|
24
|
+
target?: ToolTargetMetadata;
|
|
23
25
|
truncation?: TruncationResult;
|
|
24
26
|
resultLimitReached?: number;
|
|
25
27
|
}
|
|
@@ -73,6 +75,13 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
|
|
|
73
75
|
(async () => {
|
|
74
76
|
try {
|
|
75
77
|
const searchPath = resolveToCwd(searchDir || ".", cwd);
|
|
78
|
+
const target = createToolTarget({
|
|
79
|
+
kind: "search",
|
|
80
|
+
action: "find",
|
|
81
|
+
inputPath: searchDir || ".",
|
|
82
|
+
resolvedPath: searchPath,
|
|
83
|
+
pattern,
|
|
84
|
+
});
|
|
76
85
|
const effectiveLimit = limit ?? DEFAULT_LIMIT;
|
|
77
86
|
const ops = customOps ?? defaultFindOperations;
|
|
78
87
|
|
|
@@ -93,7 +102,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
|
|
|
93
102
|
if (results.length === 0) {
|
|
94
103
|
resolve({
|
|
95
104
|
content: [{ type: "text", text: "No files found matching pattern" }],
|
|
96
|
-
details:
|
|
105
|
+
details: { target },
|
|
97
106
|
});
|
|
98
107
|
return;
|
|
99
108
|
}
|
|
@@ -111,7 +120,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
|
|
|
111
120
|
const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
|
|
112
121
|
|
|
113
122
|
let resultOutput = truncation.content;
|
|
114
|
-
const details: FindToolDetails = {};
|
|
123
|
+
const details: FindToolDetails = { target };
|
|
115
124
|
const notices: string[] = [];
|
|
116
125
|
|
|
117
126
|
if (resultLimitReached) {
|
|
@@ -130,7 +139,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
|
|
|
130
139
|
|
|
131
140
|
resolve({
|
|
132
141
|
content: [{ type: "text", text: resultOutput }],
|
|
133
|
-
details
|
|
142
|
+
details,
|
|
134
143
|
});
|
|
135
144
|
return;
|
|
136
145
|
}
|
|
@@ -150,7 +159,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
|
|
|
150
159
|
if (globResult.matches.length === 0) {
|
|
151
160
|
resolve({
|
|
152
161
|
content: [{ type: "text", text: "No files found matching pattern" }],
|
|
153
|
-
details:
|
|
162
|
+
details: { target },
|
|
154
163
|
});
|
|
155
164
|
return;
|
|
156
165
|
}
|
|
@@ -163,7 +172,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
|
|
|
163
172
|
const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
|
|
164
173
|
|
|
165
174
|
let resultOutput = truncation.content;
|
|
166
|
-
const details: FindToolDetails = {};
|
|
175
|
+
const details: FindToolDetails = { target };
|
|
167
176
|
const notices: string[] = [];
|
|
168
177
|
|
|
169
178
|
if (resultLimitReached) {
|
|
@@ -184,7 +193,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
|
|
|
184
193
|
|
|
185
194
|
resolve({
|
|
186
195
|
content: [{ type: "text", text: resultOutput }],
|
|
187
|
-
details
|
|
196
|
+
details,
|
|
188
197
|
});
|
|
189
198
|
} catch (e: any) {
|
|
190
199
|
signal?.removeEventListener("abort", onAbort);
|
|
@@ -6,6 +6,7 @@ import { readFileSync, statSync } from "fs";
|
|
|
6
6
|
import path from "path";
|
|
7
7
|
import { ensureTool } from "../../utils/tools-manager.js";
|
|
8
8
|
import { resolveToCwd } from "./path-utils.js";
|
|
9
|
+
import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
|
|
9
10
|
import {
|
|
10
11
|
DEFAULT_MAX_BYTES,
|
|
11
12
|
formatSize,
|
|
@@ -34,6 +35,7 @@ export type GrepToolInput = Static<typeof grepSchema>;
|
|
|
34
35
|
const DEFAULT_LIMIT = 100;
|
|
35
36
|
|
|
36
37
|
export interface GrepToolDetails {
|
|
38
|
+
target?: ToolTargetMetadata;
|
|
37
39
|
truncation?: TruncationResult;
|
|
38
40
|
matchLimitReached?: number;
|
|
39
41
|
linesTruncated?: boolean;
|
|
@@ -112,6 +114,14 @@ export function createGrepTool(cwd: string, options?: GrepToolOptions): AgentToo
|
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
const searchPath = resolveToCwd(searchDir || ".", cwd);
|
|
117
|
+
const target = createToolTarget({
|
|
118
|
+
kind: "search",
|
|
119
|
+
action: "grep",
|
|
120
|
+
inputPath: searchDir || ".",
|
|
121
|
+
resolvedPath: searchPath,
|
|
122
|
+
pattern,
|
|
123
|
+
glob,
|
|
124
|
+
});
|
|
115
125
|
const ops = customOps ?? defaultGrepOperations;
|
|
116
126
|
|
|
117
127
|
let isDirectory: boolean;
|
|
@@ -282,7 +292,7 @@ export function createGrepTool(cwd: string, options?: GrepToolOptions): AgentToo
|
|
|
282
292
|
|
|
283
293
|
if (matchCount === 0) {
|
|
284
294
|
settle(() =>
|
|
285
|
-
resolve({ content: [{ type: "text", text: "No matches found" }], details:
|
|
295
|
+
resolve({ content: [{ type: "text", text: "No matches found" }], details: { target } }),
|
|
286
296
|
);
|
|
287
297
|
return;
|
|
288
298
|
}
|
|
@@ -298,7 +308,7 @@ export function createGrepTool(cwd: string, options?: GrepToolOptions): AgentToo
|
|
|
298
308
|
const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
|
|
299
309
|
|
|
300
310
|
let output = truncation.content;
|
|
301
|
-
const details: GrepToolDetails = {};
|
|
311
|
+
const details: GrepToolDetails = { target };
|
|
302
312
|
|
|
303
313
|
// Build notices
|
|
304
314
|
const notices: string[] = [];
|
|
@@ -329,7 +339,7 @@ export function createGrepTool(cwd: string, options?: GrepToolOptions): AgentToo
|
|
|
329
339
|
settle(() =>
|
|
330
340
|
resolve({
|
|
331
341
|
content: [{ type: "text", text: output }],
|
|
332
|
-
details
|
|
342
|
+
details,
|
|
333
343
|
}),
|
|
334
344
|
);
|
|
335
345
|
});
|
|
@@ -17,6 +17,7 @@ import { formatDimensionNote, resizeImage } from "../../utils/image-resize.js";
|
|
|
17
17
|
import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
|
|
18
18
|
import { formatHashLines } from "./hashline.js";
|
|
19
19
|
import { resolveReadPath } from "./path-utils.js";
|
|
20
|
+
import { createReadFileTarget, type ToolTargetMetadata } from "./tool-target.js";
|
|
20
21
|
import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from "./truncate.js";
|
|
21
22
|
|
|
22
23
|
const readSchema = Type.Object({
|
|
@@ -28,6 +29,7 @@ const readSchema = Type.Object({
|
|
|
28
29
|
export type HashlineReadToolInput = Static<typeof readSchema>;
|
|
29
30
|
|
|
30
31
|
export interface HashlineReadToolDetails {
|
|
32
|
+
target?: ToolTargetMetadata;
|
|
31
33
|
truncation?: TruncationResult;
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -66,6 +68,7 @@ export function createHashlineReadTool(cwd: string, options?: HashlineReadToolOp
|
|
|
66
68
|
signal?: AbortSignal,
|
|
67
69
|
) => {
|
|
68
70
|
const absolutePath = resolveReadPath(path, cwd);
|
|
71
|
+
const target = createReadFileTarget(path, absolutePath, offset, limit);
|
|
69
72
|
|
|
70
73
|
return new Promise<{ content: (TextContent | ImageContent)[]; details: HashlineReadToolDetails | undefined }>(
|
|
71
74
|
(resolve, reject) => {
|
|
@@ -186,7 +189,7 @@ export function createHashlineReadTool(cwd: string, options?: HashlineReadToolOp
|
|
|
186
189
|
if (aborted) return;
|
|
187
190
|
|
|
188
191
|
if (signal) signal.removeEventListener("abort", onAbort);
|
|
189
|
-
resolve({ content, details });
|
|
192
|
+
resolve({ content, details: { ...details, target } });
|
|
190
193
|
} catch (error: any) {
|
|
191
194
|
if (signal) signal.removeEventListener("abort", onAbort);
|
|
192
195
|
if (!aborted) {
|
|
@@ -70,10 +70,18 @@ export {
|
|
|
70
70
|
export {
|
|
71
71
|
createWriteTool,
|
|
72
72
|
type WriteOperations,
|
|
73
|
+
type WriteToolDetails,
|
|
73
74
|
type WriteToolInput,
|
|
74
75
|
type WriteToolOptions,
|
|
75
76
|
writeTool,
|
|
76
77
|
} from "./write.js";
|
|
78
|
+
export {
|
|
79
|
+
createToolTarget,
|
|
80
|
+
type ToolTargetAction,
|
|
81
|
+
type ToolTargetKind,
|
|
82
|
+
type ToolTargetMetadata,
|
|
83
|
+
type ToolTargetRange,
|
|
84
|
+
} from "./tool-target.js";
|
|
77
85
|
export {
|
|
78
86
|
createHashlineEditTool,
|
|
79
87
|
type HashlineEditInput,
|
|
@@ -3,6 +3,7 @@ import { type Static, Type } from "@sinclair/typebox";
|
|
|
3
3
|
import { existsSync, readdirSync, statSync } from "fs";
|
|
4
4
|
import nodePath from "path";
|
|
5
5
|
import { resolveToCwd } from "./path-utils.js";
|
|
6
|
+
import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
|
|
6
7
|
import { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from "./truncate.js";
|
|
7
8
|
|
|
8
9
|
const lsSchema = Type.Object({
|
|
@@ -15,6 +16,7 @@ export type LsToolInput = Static<typeof lsSchema>;
|
|
|
15
16
|
const DEFAULT_LIMIT = 500;
|
|
16
17
|
|
|
17
18
|
export interface LsToolDetails {
|
|
19
|
+
target?: ToolTargetMetadata;
|
|
18
20
|
truncation?: TruncationResult;
|
|
19
21
|
entryLimitReached?: number;
|
|
20
22
|
}
|
|
@@ -68,6 +70,12 @@ export function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<ty
|
|
|
68
70
|
(async () => {
|
|
69
71
|
try {
|
|
70
72
|
const dirPath = resolveToCwd(path || ".", cwd);
|
|
73
|
+
const target = createToolTarget({
|
|
74
|
+
kind: "directory",
|
|
75
|
+
action: "list",
|
|
76
|
+
inputPath: path || ".",
|
|
77
|
+
resolvedPath: dirPath,
|
|
78
|
+
});
|
|
71
79
|
const effectiveLimit = limit ?? DEFAULT_LIMIT;
|
|
72
80
|
|
|
73
81
|
// Check if path exists
|
|
@@ -124,7 +132,7 @@ export function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<ty
|
|
|
124
132
|
signal?.removeEventListener("abort", onAbort);
|
|
125
133
|
|
|
126
134
|
if (results.length === 0) {
|
|
127
|
-
resolve({ content: [{ type: "text", text: "(empty directory)" }], details:
|
|
135
|
+
resolve({ content: [{ type: "text", text: "(empty directory)" }], details: { target } });
|
|
128
136
|
return;
|
|
129
137
|
}
|
|
130
138
|
|
|
@@ -133,7 +141,7 @@ export function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<ty
|
|
|
133
141
|
const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
|
|
134
142
|
|
|
135
143
|
let output = truncation.content;
|
|
136
|
-
const details: LsToolDetails = {};
|
|
144
|
+
const details: LsToolDetails = { target };
|
|
137
145
|
|
|
138
146
|
// Build notices
|
|
139
147
|
const notices: string[] = [];
|
|
@@ -154,7 +162,7 @@ export function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<ty
|
|
|
154
162
|
|
|
155
163
|
resolve({
|
|
156
164
|
content: [{ type: "text", text: output }],
|
|
157
|
-
details
|
|
165
|
+
details,
|
|
158
166
|
});
|
|
159
167
|
} catch (e: any) {
|
|
160
168
|
signal?.removeEventListener("abort", onAbort);
|
|
@@ -6,6 +6,7 @@ import { access as fsAccess, readFile as fsReadFile } from "fs/promises";
|
|
|
6
6
|
import { formatDimensionNote, resizeImage } from "../../utils/image-resize.js";
|
|
7
7
|
import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
|
|
8
8
|
import { resolveReadPath } from "./path-utils.js";
|
|
9
|
+
import { createReadFileTarget, type ToolTargetMetadata } from "./tool-target.js";
|
|
9
10
|
import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from "./truncate.js";
|
|
10
11
|
|
|
11
12
|
const readSchema = Type.Object({
|
|
@@ -17,6 +18,7 @@ const readSchema = Type.Object({
|
|
|
17
18
|
export type ReadToolInput = Static<typeof readSchema>;
|
|
18
19
|
|
|
19
20
|
export interface ReadToolDetails {
|
|
21
|
+
target?: ToolTargetMetadata;
|
|
20
22
|
truncation?: TruncationResult;
|
|
21
23
|
}
|
|
22
24
|
|
|
@@ -61,6 +63,7 @@ export function createReadTool(cwd: string, options?: ReadToolOptions): AgentToo
|
|
|
61
63
|
signal?: AbortSignal,
|
|
62
64
|
) => {
|
|
63
65
|
const absolutePath = resolveReadPath(path, cwd);
|
|
66
|
+
const target = createReadFileTarget(path, absolutePath, offset, limit);
|
|
64
67
|
|
|
65
68
|
return new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(
|
|
66
69
|
(resolve, reject) => {
|
|
@@ -210,7 +213,7 @@ export function createReadTool(cwd: string, options?: ReadToolOptions): AgentToo
|
|
|
210
213
|
signal.removeEventListener("abort", onAbort);
|
|
211
214
|
}
|
|
212
215
|
|
|
213
|
-
resolve({ content, details });
|
|
216
|
+
resolve({ content, details: { ...details, target } });
|
|
214
217
|
} catch (error: any) {
|
|
215
218
|
// Clean up abort handler
|
|
216
219
|
if (signal) {
|
|
@@ -15,78 +15,17 @@
|
|
|
15
15
|
|
|
16
16
|
import test from "node:test";
|
|
17
17
|
import assert from "node:assert/strict";
|
|
18
|
-
import {
|
|
19
|
-
import { join, dirname, relative } from "node:path";
|
|
20
|
-
import { fileURLToPath } from "node:url";
|
|
18
|
+
import { execCommand } from "../exec.js";
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
* or `cmd`) and therefore need the Windows shell guard.
|
|
28
|
-
*
|
|
29
|
-
* If a file spawns only hardcoded system binaries (like `node` in rpc-client.ts),
|
|
30
|
-
* it does not need the guard and should NOT appear here.
|
|
31
|
-
*/
|
|
32
|
-
const SPAWN_FILES_NEEDING_SHELL_GUARD = [
|
|
33
|
-
// Extension's GSD client — spawns the `gsd` binary which is a .cmd on Windows
|
|
34
|
-
join(coreDir, "..", "..", "..", "vscode-extension", "src", "gsd-client.ts"),
|
|
35
|
-
// exec.ts — used by extensions to run arbitrary commands
|
|
36
|
-
join(coreDir, "exec.ts"),
|
|
37
|
-
// LSP index — spawns project-type commands (tsc, cargo, etc.)
|
|
38
|
-
join(coreDir, "lsp", "index.ts"),
|
|
39
|
-
// LSP client — spawns LSP server binaries (npx, etc.)
|
|
40
|
-
join(coreDir, "lsp", "client.ts"),
|
|
41
|
-
// LSP mux — spawns lspmux binary
|
|
42
|
-
join(coreDir, "lsp", "lspmux.ts"),
|
|
43
|
-
// Package manager — spawns npm/yarn/pnpm
|
|
44
|
-
join(coreDir, "package-manager.ts"),
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
test("all spawn sites that invoke user-facing binaries include shell: process.platform === 'win32'", () => {
|
|
48
|
-
const failures: string[] = [];
|
|
49
|
-
|
|
50
|
-
for (const file of SPAWN_FILES_NEEDING_SHELL_GUARD) {
|
|
51
|
-
let content: string;
|
|
52
|
-
try {
|
|
53
|
-
content = readFileSync(file, "utf-8");
|
|
54
|
-
} catch {
|
|
55
|
-
// File may not exist in this checkout — skip
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const lines = content.split("\n");
|
|
60
|
-
|
|
61
|
-
// Find all spawn(..., { ... }) call sites and check each one
|
|
62
|
-
// for the presence of `shell: process.platform === "win32"` within
|
|
63
|
-
// 5 lines after the spawn call.
|
|
64
|
-
for (let i = 0; i < lines.length; i++) {
|
|
65
|
-
const line = lines[i]!;
|
|
66
|
-
// Skip comments
|
|
67
|
-
if (line.trim().startsWith("//") || line.trim().startsWith("*")) continue;
|
|
68
|
-
|
|
69
|
-
// Detect a spawn() call
|
|
70
|
-
if (/\bspawn\(/.test(line)) {
|
|
71
|
-
// Look ahead up to 8 lines for the shell guard
|
|
72
|
-
const lookahead = lines.slice(i, i + 8).join("\n");
|
|
73
|
-
const hasShellGuard =
|
|
74
|
-
/shell:\s*process\.platform\s*===\s*["']win32["']/.test(lookahead);
|
|
75
|
-
|
|
76
|
-
if (!hasShellGuard) {
|
|
77
|
-
const relPath = relative(join(coreDir, "..", ".."), file);
|
|
78
|
-
failures.push(`${relPath}:${i + 1}`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
assert.deepEqual(
|
|
85
|
-
failures,
|
|
86
|
-
[],
|
|
87
|
-
`The following spawn sites are missing 'shell: process.platform === "win32"':\n` +
|
|
88
|
-
failures.map(f => ` - ${f}`).join("\n") +
|
|
89
|
-
`\nOn Windows, .cmd wrapper scripts (npm, npx, tsc, gsd) require shell ` +
|
|
90
|
-
`resolution. Without this guard, spawn fails with ENOENT or EINVAL.`,
|
|
20
|
+
test("execCommand runs a user-facing binary and captures stdout", async () => {
|
|
21
|
+
const result = await execCommand(
|
|
22
|
+
process.execPath,
|
|
23
|
+
["-e", "process.stdout.write('ok')"],
|
|
24
|
+
process.cwd(),
|
|
91
25
|
);
|
|
26
|
+
|
|
27
|
+
assert.equal(result.stdout, "ok");
|
|
28
|
+
assert.equal(result.stderr, "");
|
|
29
|
+
assert.equal(result.code, 0);
|
|
30
|
+
assert.equal(result.killed, false);
|
|
92
31
|
});
|