gsd-pi 2.80.0-dev.96f4d89d5 → 2.80.0-dev.b0acf17e9
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 +29 -0
- 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 +26 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +103 -86
- 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 +240 -15
- 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 +165 -28
- package/dist/resources/extensions/gsd/auto.js +165 -45
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +50 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +35 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +36 -20
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +10 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +12 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +11 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -55
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
- 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-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 +143 -48
- 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 +21 -19
- 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-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/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- 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/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 +12 -12
- 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/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 +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +8 -0
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +14 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-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 +18 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +44 -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 +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 +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 +74 -2
- 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 +7 -6
- 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.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -0
- 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/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 +25 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
- 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 +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 +85 -3
- 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 +10 -9
- 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 +3 -0
- 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/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/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 +30 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/loop-deps.ts +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 +33 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +116 -88
- 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 +293 -21
- 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 +199 -30
- package/src/resources/extensions/gsd/auto.ts +216 -40
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +51 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +35 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +38 -19
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +11 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +13 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +12 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +386 -55
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
- 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-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 +169 -55
- 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 +21 -19
- 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 +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 +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 +42 -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-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/db-schema-metadata.test.ts +2 -2
- 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/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 +35 -0
- 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/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 +101 -2
- 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 +36 -45
- 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/worktree-write-gate.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- 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/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → naNyn5ToUBzCQtuLbEYXC}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{y7d--cnc6Cibuva-Lzzw_ → naNyn5ToUBzCQtuLbEYXC}/_ssgManifest.js +0 -0
|
@@ -1,47 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Regression
|
|
3
|
-
*
|
|
4
|
-
* In cold sessions the DB was not opened before deriveState, causing
|
|
5
|
-
* status to fall back to filesystem-only state. The fix adds an
|
|
6
|
-
* ensureDbOpen() call before deriveState in handleStatus.
|
|
7
|
-
*
|
|
8
|
-
* Also verifies that quick.ts checks getIsolationMode before branching.
|
|
2
|
+
* Regression tests for status/quick behavior.
|
|
9
3
|
*/
|
|
10
4
|
|
|
11
|
-
import { describe, test } from
|
|
12
|
-
import assert from
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
assert.ok(ensureIdx > -1, 'ensureDbOpen call should exist in core.ts');
|
|
34
|
-
assert.ok(deriveIdx > -1, 'deriveState(basePath) call should exist in core.ts');
|
|
35
|
-
assert.ok(
|
|
36
|
-
ensureIdx < deriveIdx,
|
|
37
|
-
'ensureDbOpen must appear before deriveState so DB is ready',
|
|
38
|
-
);
|
|
5
|
+
import { describe, test } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
|
|
8
|
+
import { handleCoreCommand } from "../commands/handlers/core.ts";
|
|
9
|
+
import { buildQuickCommitInstruction } from "../quick.ts";
|
|
10
|
+
|
|
11
|
+
describe("status opens DB before deriveState (#3691)", () => {
|
|
12
|
+
test("core handler routes status command", async () => {
|
|
13
|
+
const notifications: Array<{ message: string; level: string }> = [];
|
|
14
|
+
const ctx = {
|
|
15
|
+
ui: {
|
|
16
|
+
custom: async () => undefined,
|
|
17
|
+
notify: (message: string, level: string) => {
|
|
18
|
+
notifications.push({ message, level });
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const handled = await handleCoreCommand("status", ctx as any);
|
|
24
|
+
|
|
25
|
+
assert.equal(handled, true);
|
|
26
|
+
assert.ok(notifications.length >= 0);
|
|
39
27
|
});
|
|
40
28
|
|
|
41
|
-
test(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
assert.match(
|
|
45
|
-
|
|
29
|
+
test("quick task commit instructions handle external .gsd roots without staging quick files", () => {
|
|
30
|
+
const instruction = buildQuickCommitInstruction("/project", "/external/.gsd");
|
|
31
|
+
|
|
32
|
+
assert.match(instruction, /do not stage or commit `\.gsd\/quick\/\.\.\.`/);
|
|
33
|
+
assert.match(instruction, /nothing in the project repo to commit/);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("quick task commit instructions include normal commit guidance for in-project .gsd roots", () => {
|
|
37
|
+
const instruction = buildQuickCommitInstruction("/project", "/project/.gsd");
|
|
38
|
+
|
|
39
|
+
assert.doesNotMatch(instruction, /nothing in the project repo to commit/);
|
|
40
|
+
assert.match(instruction, /Commit your changes atomically/);
|
|
46
41
|
});
|
|
47
42
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Stop-auto worktree exit strategy regression tests.
|
|
1
3
|
/**
|
|
2
4
|
* stop-auto-merge-back.test.ts — Regression test for #2317.
|
|
3
5
|
*
|
|
@@ -9,59 +11,48 @@
|
|
|
9
11
|
|
|
10
12
|
import test from "node:test";
|
|
11
13
|
import assert from "node:assert/strict";
|
|
12
|
-
import {
|
|
13
|
-
import { join } from "node:path";
|
|
14
|
-
|
|
15
|
-
// ─── Source analysis: stopAuto calls mergeAndExit for complete milestones ────
|
|
16
|
-
|
|
17
|
-
const autoSrcPath = join(import.meta.dirname, "..", "auto.ts");
|
|
18
|
-
const autoSrc = readFileSync(autoSrcPath, "utf-8");
|
|
14
|
+
import { _selectStopAutoWorktreeExit } from "../auto.ts";
|
|
19
15
|
|
|
20
16
|
test("#2317: stopAuto should check milestone completion status before choosing exit strategy", () => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Extract a reasonable window around Step 4 (up to Step 5)
|
|
29
|
-
const step5Idx = autoSrc.indexOf("Step 5:", step4Idx);
|
|
30
|
-
const step4Block = autoSrc.slice(step4Idx, step5Idx);
|
|
31
|
-
|
|
32
|
-
// The fix: Step 4 should call mergeAndExit when milestone is complete
|
|
33
|
-
assert.ok(
|
|
34
|
-
step4Block.includes("mergeAndExit"),
|
|
35
|
-
"Step 4 should call mergeAndExit for completed milestones",
|
|
17
|
+
assert.equal(
|
|
18
|
+
_selectStopAutoWorktreeExit({
|
|
19
|
+
currentMilestoneId: "M001",
|
|
20
|
+
milestoneComplete: true,
|
|
21
|
+
milestoneMergedInPhases: false,
|
|
22
|
+
}),
|
|
23
|
+
"merge",
|
|
36
24
|
);
|
|
37
25
|
});
|
|
38
26
|
|
|
39
|
-
test("#2317: stopAuto
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
step4Block.includes("getMilestone") ||
|
|
48
|
-
step4Block.includes("complete") ||
|
|
49
|
-
step4Block.includes("isMilestoneComplete");
|
|
50
|
-
|
|
51
|
-
assert.ok(
|
|
52
|
-
checksCompletion,
|
|
53
|
-
"Step 4 should check if milestone is complete before deciding exit strategy",
|
|
27
|
+
test("#2317: stopAuto still preserves branch for incomplete milestones", () => {
|
|
28
|
+
assert.equal(
|
|
29
|
+
_selectStopAutoWorktreeExit({
|
|
30
|
+
currentMilestoneId: "M001",
|
|
31
|
+
milestoneComplete: false,
|
|
32
|
+
milestoneMergedInPhases: false,
|
|
33
|
+
}),
|
|
34
|
+
"preserve",
|
|
54
35
|
);
|
|
55
36
|
});
|
|
56
37
|
|
|
57
|
-
test("#2317: stopAuto
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
38
|
+
test("#2317: stopAuto does not merge a milestone already merged in phases", () => {
|
|
39
|
+
assert.equal(
|
|
40
|
+
_selectStopAutoWorktreeExit({
|
|
41
|
+
currentMilestoneId: "M001",
|
|
42
|
+
milestoneComplete: true,
|
|
43
|
+
milestoneMergedInPhases: true,
|
|
44
|
+
}),
|
|
45
|
+
"none",
|
|
46
|
+
);
|
|
47
|
+
});
|
|
61
48
|
|
|
62
|
-
|
|
63
|
-
assert.
|
|
64
|
-
|
|
65
|
-
|
|
49
|
+
test("#2317: stopAuto skips worktree teardown when no milestone is active", () => {
|
|
50
|
+
assert.equal(
|
|
51
|
+
_selectStopAutoWorktreeExit({
|
|
52
|
+
currentMilestoneId: null,
|
|
53
|
+
milestoneComplete: true,
|
|
54
|
+
milestoneMergedInPhases: false,
|
|
55
|
+
}),
|
|
56
|
+
"none",
|
|
66
57
|
);
|
|
67
58
|
});
|
|
@@ -1,106 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
* stop-auto-race-null-unit.test.ts — Regression test for #2939.
|
|
3
|
-
*
|
|
4
|
-
* When the user stops auto-mode while a unit is executing, stopAuto()
|
|
5
|
-
* calls s.reset() which sets s.currentUnit = null. The resumed
|
|
6
|
-
* runUnitPhase() then hits s.currentUnit.startedAt on the closeout
|
|
7
|
-
* line and throws a TypeError.
|
|
8
|
-
*
|
|
9
|
-
* The fix adds null guards (matching the existing pattern at lines 136
|
|
10
|
-
* and 344) so that closeout and subsequent accesses are skipped when
|
|
11
|
-
* s.currentUnit has been nulled by a concurrent stopAuto().
|
|
12
|
-
*/
|
|
1
|
+
// GSD-2 — stopAuto race current-unit guard regression tests.
|
|
13
2
|
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import { createTestContext, extractSourceRegion } from "./test-helpers.ts";
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
17
5
|
|
|
18
|
-
|
|
6
|
+
import { _resolveCurrentUnitStartedAtForTest } from "../auto/phases.ts";
|
|
19
7
|
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
test("unit started-at resolver tolerates stopAuto clearing currentUnit", () => {
|
|
9
|
+
assert.equal(_resolveCurrentUnitStartedAtForTest(null), undefined);
|
|
10
|
+
assert.equal(_resolveCurrentUnitStartedAtForTest(undefined), undefined);
|
|
11
|
+
});
|
|
22
12
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const closeoutComment = "Immediate unit closeout";
|
|
31
|
-
const closeoutIdx = phasesSrc.indexOf(closeoutComment);
|
|
32
|
-
assertTrue(
|
|
33
|
-
closeoutIdx > 0,
|
|
34
|
-
"phases.ts contains the 'Immediate unit closeout' comment block",
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
// Extract the region from the closeout comment to the next section comment
|
|
38
|
-
const closeoutRegion = extractSourceRegion(phasesSrc, closeoutComment);
|
|
39
|
-
assertTrue(
|
|
40
|
-
closeoutRegion.includes("if (s.currentUnit)"),
|
|
41
|
-
"closeoutUnit call is guarded by `if (s.currentUnit)` check (#2939)",
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
// ── Test 2: zero-tool-call guard uses s.currentUnit?.startedAt ──────────
|
|
45
|
-
// The zero-tool-call section accesses s.currentUnit!.startedAt (non-null
|
|
46
|
-
// assertion) which will throw if currentUnit is null.
|
|
47
|
-
|
|
48
|
-
const zeroToolComment = "Zero tool-call guard";
|
|
49
|
-
const zeroToolIdx = phasesSrc.indexOf(zeroToolComment);
|
|
50
|
-
assertTrue(
|
|
51
|
-
zeroToolIdx > 0,
|
|
52
|
-
"phases.ts contains the 'Zero tool-call guard' comment block",
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
const zeroToolRegion = extractSourceRegion(phasesSrc, zeroToolComment);
|
|
56
|
-
|
|
57
|
-
// The non-null assertion `s.currentUnit!.startedAt` must be replaced with
|
|
58
|
-
// optional chaining `s.currentUnit?.startedAt`
|
|
59
|
-
assertTrue(
|
|
60
|
-
!zeroToolRegion.includes("s.currentUnit!.startedAt"),
|
|
61
|
-
"zero-tool-call guard no longer uses non-null assertion on s.currentUnit (#2939)",
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
// ── Test 3: return value uses optional chaining for startedAt ───────────
|
|
65
|
-
// The final return at the end of runUnitPhase uses s.currentUnit.startedAt
|
|
66
|
-
// which will throw if currentUnit was nulled. It must use optional chaining.
|
|
67
|
-
|
|
68
|
-
// Find the last return statement in runUnitPhase that references startedAt.
|
|
69
|
-
// There are two: one inside the zero-tool-call block and one at the end.
|
|
70
|
-
// Both must use s.currentUnit?.startedAt
|
|
71
|
-
|
|
72
|
-
// Count unguarded s.currentUnit.startedAt (without optional chaining)
|
|
73
|
-
// after the "Immediate unit closeout" comment. All of them should use
|
|
74
|
-
// optional chaining or be inside a guard.
|
|
75
|
-
const afterCloseout = phasesSrc.slice(closeoutIdx);
|
|
76
|
-
|
|
77
|
-
// Count s.currentUnit!.startedAt (non-null assertion — always unsafe)
|
|
78
|
-
const nonNullPattern = /s\.currentUnit!\.startedAt/g;
|
|
79
|
-
const nonNullAfterCloseout = [...afterCloseout.matchAll(nonNullPattern)];
|
|
80
|
-
assertTrue(
|
|
81
|
-
nonNullAfterCloseout.length === 0,
|
|
82
|
-
`no non-null assertions s.currentUnit!.startedAt after closeout comment (found ${nonNullAfterCloseout.length}, expected 0) (#2939)`,
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
// Count bare s.currentUnit.startedAt that are NOT inside an if (s.currentUnit) guard.
|
|
86
|
-
// The closeout block itself uses s.currentUnit.startedAt inside a guard — that's fine.
|
|
87
|
-
// But any usage outside a guard block (e.g. in a return statement) must use optional chaining.
|
|
88
|
-
// We check that all return statements use optional chaining.
|
|
89
|
-
const returnWithBareAccess = /return\s*\{[^}]*s\.currentUnit\.startedAt/g;
|
|
90
|
-
const bareReturnCount = [...afterCloseout.matchAll(returnWithBareAccess)].length;
|
|
91
|
-
assertTrue(
|
|
92
|
-
bareReturnCount === 0,
|
|
93
|
-
`no return statements use bare s.currentUnit.startedAt (found ${bareReturnCount}, expected 0) (#2939)`,
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
// ── Test 4: the return at end of runUnitPhase uses optional chaining ────
|
|
97
|
-
// The final `return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } }`
|
|
98
|
-
// must use optional chaining.
|
|
99
|
-
|
|
100
|
-
const finalReturnPattern = /unitStartedAt:\s*s\.currentUnit\?\.startedAt/;
|
|
101
|
-
assertTrue(
|
|
102
|
-
finalReturnPattern.test(afterCloseout),
|
|
103
|
-
"final return uses s.currentUnit?.startedAt with optional chaining (#2939)",
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
report();
|
|
13
|
+
test("unit started-at resolver preserves the active unit timestamp", () => {
|
|
14
|
+
assert.equal(
|
|
15
|
+
_resolveCurrentUnitStartedAtForTest({ startedAt: 12345 }),
|
|
16
|
+
12345,
|
|
17
|
+
);
|
|
18
|
+
});
|
|
@@ -1,173 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
* Regression tests for subagent model preference wiring.
|
|
3
|
-
*
|
|
4
|
-
* Fixes: subagent_model config in reactive_execution was validated and stored
|
|
5
|
-
* but never passed through to subagent dispatch instruction strings, so the
|
|
6
|
-
* executing agent autonomously chose "sonnet" instead of the configured model.
|
|
7
|
-
*
|
|
8
|
-
* Issue: gsd-build/gsd-2#4078
|
|
9
|
-
*/
|
|
1
|
+
// GSD-2 — Subagent model dispatch behavior tests.
|
|
10
2
|
|
|
11
3
|
import test from "node:test";
|
|
12
4
|
import assert from "node:assert/strict";
|
|
13
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync
|
|
14
|
-
import { join
|
|
5
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
15
7
|
import { tmpdir } from "node:os";
|
|
16
|
-
import { fileURLToPath } from "node:url";
|
|
17
|
-
import { validatePreferences } from "../preferences-validation.ts";
|
|
18
|
-
import { extractSourceRegion } from "./test-helpers.ts";
|
|
19
|
-
|
|
20
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
|
-
const promptsSrc = readFileSync(join(__dirname, "..", "auto-prompts.ts"), "utf-8");
|
|
22
|
-
const dispatchSrc = readFileSync(join(__dirname, "..", "auto-dispatch.ts"), "utf-8");
|
|
23
|
-
|
|
24
|
-
// ─── Preference Validation ────────────────────────────────────────────────
|
|
25
|
-
|
|
26
|
-
test("reactive_execution: subagent_model is preserved in validated preferences", () => {
|
|
27
|
-
const result = validatePreferences({
|
|
28
|
-
reactive_execution: {
|
|
29
|
-
enabled: true,
|
|
30
|
-
max_parallel: 2,
|
|
31
|
-
isolation_mode: "same-tree",
|
|
32
|
-
subagent_model: "claude-opus-4-6",
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
assert.equal(result.errors.length, 0);
|
|
36
|
-
assert.equal(
|
|
37
|
-
result.preferences.reactive_execution?.subagent_model,
|
|
38
|
-
"claude-opus-4-6",
|
|
39
|
-
"subagent_model should be preserved through validation",
|
|
40
|
-
);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test("reactive_execution: subagent_model rejects empty string", () => {
|
|
44
|
-
const result = validatePreferences({
|
|
45
|
-
reactive_execution: {
|
|
46
|
-
enabled: true,
|
|
47
|
-
max_parallel: 2,
|
|
48
|
-
isolation_mode: "same-tree",
|
|
49
|
-
subagent_model: "",
|
|
50
|
-
} as any,
|
|
51
|
-
});
|
|
52
|
-
assert.ok(
|
|
53
|
-
result.errors.some((e) => e.includes("subagent_model")),
|
|
54
|
-
"empty subagent_model should produce a validation error",
|
|
55
|
-
);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// ─── Structural: Prompt Builders Accept subagentModel ────────────────────
|
|
59
|
-
|
|
60
|
-
test("buildReactiveExecutePrompt: accepts subagentModel parameter", () => {
|
|
61
|
-
const fnStart = promptsSrc.indexOf("export async function buildReactiveExecutePrompt");
|
|
62
|
-
assert.ok(fnStart !== -1, "buildReactiveExecutePrompt should be exported");
|
|
63
|
-
const signature = extractSourceRegion(promptsSrc, "export async function buildReactiveExecutePrompt", { fromIdx: fnStart });
|
|
64
|
-
assert.ok(
|
|
65
|
-
signature.includes("subagentModel"),
|
|
66
|
-
"buildReactiveExecutePrompt should accept a subagentModel parameter",
|
|
67
|
-
);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("buildParallelResearchSlicesPrompt: accepts subagentModel parameter", () => {
|
|
71
|
-
const fnStart = promptsSrc.indexOf("export async function buildParallelResearchSlicesPrompt");
|
|
72
|
-
assert.ok(fnStart !== -1, "buildParallelResearchSlicesPrompt should be exported");
|
|
73
|
-
const signature = extractSourceRegion(promptsSrc, "export async function buildParallelResearchSlicesPrompt", { fromIdx: fnStart });
|
|
74
|
-
assert.ok(
|
|
75
|
-
signature.includes("subagentModel"),
|
|
76
|
-
"buildParallelResearchSlicesPrompt should accept a subagentModel parameter",
|
|
77
|
-
);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test("buildGateEvaluatePrompt: accepts subagentModel parameter", () => {
|
|
81
|
-
const fnStart = promptsSrc.indexOf("export async function buildGateEvaluatePrompt");
|
|
82
|
-
assert.ok(fnStart !== -1, "buildGateEvaluatePrompt should be exported");
|
|
83
|
-
const signature = extractSourceRegion(promptsSrc, "export async function buildGateEvaluatePrompt", { fromIdx: fnStart });
|
|
84
|
-
assert.ok(
|
|
85
|
-
signature.includes("subagentModel"),
|
|
86
|
-
"buildGateEvaluatePrompt should accept a subagentModel parameter",
|
|
87
|
-
);
|
|
88
|
-
});
|
|
89
8
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
assert.ok(
|
|
97
|
-
fnBody.includes("subagentModel"),
|
|
98
|
-
"buildReactiveExecutePrompt body should reference subagentModel",
|
|
99
|
-
);
|
|
100
|
-
// The instruction line must be dynamic (not a plain string literal)
|
|
101
|
-
assert.ok(
|
|
102
|
-
!fnBody.includes('"Use this as the prompt for a `subagent` call:"'),
|
|
103
|
-
"instruction should not be a plain static string — model must be injectable",
|
|
104
|
-
);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
test("buildParallelResearchSlicesPrompt: instruction string uses subagentModel when set", () => {
|
|
108
|
-
const fnStart = promptsSrc.indexOf("export async function buildParallelResearchSlicesPrompt");
|
|
109
|
-
const fnEnd = promptsSrc.indexOf("\nexport async function", fnStart + 1);
|
|
110
|
-
const fnBody = promptsSrc.slice(fnStart, fnEnd);
|
|
111
|
-
assert.ok(
|
|
112
|
-
fnBody.includes("subagentModel"),
|
|
113
|
-
"buildParallelResearchSlicesPrompt body should reference subagentModel",
|
|
114
|
-
);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test("buildGateEvaluatePrompt: instruction string uses subagentModel when set", () => {
|
|
118
|
-
const fnStart = promptsSrc.indexOf("export async function buildGateEvaluatePrompt");
|
|
119
|
-
const fnEnd = promptsSrc.indexOf("\nexport async function", fnStart + 1);
|
|
120
|
-
const fnBody = promptsSrc.slice(fnStart, fnEnd);
|
|
121
|
-
assert.ok(
|
|
122
|
-
fnBody.includes("subagentModel"),
|
|
123
|
-
"buildGateEvaluatePrompt body should reference subagentModel",
|
|
124
|
-
);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
// ─── Structural: Dispatch Wires Model to Prompt Builders ─────────────────
|
|
128
|
-
|
|
129
|
-
test("auto-dispatch: passes model to buildReactiveExecutePrompt", () => {
|
|
130
|
-
// Find the reactive-execute dispatch rule
|
|
131
|
-
const ruleStart = dispatchSrc.indexOf("reactive-execute (parallel dispatch)");
|
|
132
|
-
assert.ok(ruleStart !== -1, "reactive-execute dispatch rule should exist");
|
|
133
|
-
const ruleBlock = extractSourceRegion(dispatchSrc, "reactive-execute (parallel dispatch)", { fromIdx: ruleStart });
|
|
134
|
-
assert.ok(
|
|
135
|
-
ruleBlock.includes("subagent_model") || ruleBlock.includes("subagentModel"),
|
|
136
|
-
"reactive-execute rule should resolve and pass the subagent model",
|
|
137
|
-
);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
test("auto-dispatch: passes model to buildParallelResearchSlicesPrompt", () => {
|
|
141
|
-
const callIdx = dispatchSrc.indexOf("buildParallelResearchSlicesPrompt(");
|
|
142
|
-
assert.ok(callIdx !== -1, "buildParallelResearchSlicesPrompt call should exist");
|
|
143
|
-
// The call site should pass a model argument (not just 4 args)
|
|
144
|
-
const callSite = extractSourceRegion(dispatchSrc, "buildParallelResearchSlicesPrompt(", { fromIdx: callIdx });
|
|
145
|
-
assert.ok(
|
|
146
|
-
callSite.includes("subagentModel") || callSite.includes("resolveModelWithFallbacksForUnit"),
|
|
147
|
-
"buildParallelResearchSlicesPrompt call should include model argument",
|
|
148
|
-
);
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
test("auto-dispatch: passes model to buildGateEvaluatePrompt", () => {
|
|
152
|
-
const callIdx = dispatchSrc.indexOf("buildGateEvaluatePrompt(");
|
|
153
|
-
assert.ok(callIdx !== -1, "buildGateEvaluatePrompt call should exist");
|
|
154
|
-
const callSite = extractSourceRegion(dispatchSrc, "buildGateEvaluatePrompt(", { fromIdx: callIdx });
|
|
155
|
-
assert.ok(
|
|
156
|
-
callSite.includes("subagentModel") || callSite.includes("resolveModelWithFallbacksForUnit"),
|
|
157
|
-
"buildGateEvaluatePrompt call should include model argument",
|
|
158
|
-
);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
// ─── Integration: Prompt Output Contains Model String ────────────────────
|
|
162
|
-
|
|
163
|
-
test("buildReactiveExecutePrompt: output contains model string when subagentModel provided", async (t) => {
|
|
164
|
-
const { buildReactiveExecutePrompt } = await import("../auto-prompts.ts");
|
|
165
|
-
const repo = mkdtempSync(join(tmpdir(), "gsd-subagent-model-reactive-"));
|
|
166
|
-
t.after(() => rmSync(repo, { recursive: true, force: true }));
|
|
9
|
+
import { validatePreferences } from "../preferences-validation.ts";
|
|
10
|
+
import {
|
|
11
|
+
buildGateEvaluatePrompt,
|
|
12
|
+
buildParallelResearchSlicesPrompt,
|
|
13
|
+
buildReactiveExecutePrompt,
|
|
14
|
+
} from "../auto-prompts.ts";
|
|
167
15
|
|
|
16
|
+
function writeReactiveFixture(repo: string): void {
|
|
168
17
|
const gsd = join(repo, ".gsd", "milestones", "M001", "slices", "S01");
|
|
169
18
|
mkdirSync(join(gsd, "tasks"), { recursive: true });
|
|
170
|
-
|
|
171
19
|
writeFileSync(
|
|
172
20
|
join(gsd, "S01-PLAN.md"),
|
|
173
21
|
[
|
|
@@ -183,7 +31,6 @@ test("buildReactiveExecutePrompt: output contains model string when subagentMode
|
|
|
183
31
|
"",
|
|
184
32
|
].join("\n"),
|
|
185
33
|
);
|
|
186
|
-
|
|
187
34
|
writeFileSync(
|
|
188
35
|
join(gsd, "tasks", "T01-PLAN.md"),
|
|
189
36
|
[
|
|
@@ -201,82 +48,87 @@ test("buildReactiveExecutePrompt: output contains model string when subagentMode
|
|
|
201
48
|
"- `src/out.ts` — Result",
|
|
202
49
|
].join("\n"),
|
|
203
50
|
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
test("reactive_execution subagent_model is preserved in validated preferences", () => {
|
|
54
|
+
const result = validatePreferences({
|
|
55
|
+
reactive_execution: {
|
|
56
|
+
enabled: true,
|
|
57
|
+
max_parallel: 2,
|
|
58
|
+
isolation_mode: "same-tree",
|
|
59
|
+
subagent_model: "claude-opus-4-6",
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
assert.equal(result.errors.length, 0);
|
|
63
|
+
assert.equal(result.preferences.reactive_execution?.subagent_model, "claude-opus-4-6");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("reactive_execution subagent_model rejects empty string", () => {
|
|
67
|
+
const result = validatePreferences({
|
|
68
|
+
reactive_execution: {
|
|
69
|
+
enabled: true,
|
|
70
|
+
max_parallel: 2,
|
|
71
|
+
isolation_mode: "same-tree",
|
|
72
|
+
subagent_model: "",
|
|
73
|
+
} as any,
|
|
74
|
+
});
|
|
75
|
+
assert.ok(result.errors.some((e) => e.includes("subagent_model")));
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("buildReactiveExecutePrompt injects subagent model when provided", async (t) => {
|
|
79
|
+
const repo = mkdtempSync(join(tmpdir(), "gsd-subagent-model-reactive-"));
|
|
80
|
+
t.after(() => rmSync(repo, { recursive: true, force: true }));
|
|
81
|
+
writeReactiveFixture(repo);
|
|
204
82
|
|
|
205
83
|
const prompt = await buildReactiveExecutePrompt(
|
|
206
|
-
"M001",
|
|
207
|
-
|
|
84
|
+
"M001",
|
|
85
|
+
"Test Milestone",
|
|
86
|
+
"S01",
|
|
87
|
+
"Test Slice",
|
|
88
|
+
["T01"],
|
|
89
|
+
repo,
|
|
90
|
+
"claude-opus-4-6",
|
|
208
91
|
);
|
|
209
92
|
|
|
210
|
-
assert.
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
);
|
|
214
|
-
assert.ok(
|
|
215
|
-
prompt.includes("Context Mode (execution lane):"),
|
|
216
|
-
"embedded reactive-execute task prompt should use nested Context Mode guidance",
|
|
217
|
-
);
|
|
218
|
-
assert.ok(
|
|
219
|
-
prompt.includes("## Context Mode"),
|
|
220
|
-
"reactive-execute parent prompt should include standalone Context Mode guidance",
|
|
221
|
-
);
|
|
93
|
+
assert.match(prompt, /model: "claude-opus-4-6"/);
|
|
94
|
+
assert.match(prompt, /Context Mode \(execution lane\):/);
|
|
95
|
+
assert.match(prompt, /## Context Mode/);
|
|
222
96
|
});
|
|
223
97
|
|
|
224
|
-
test("buildReactiveExecutePrompt
|
|
225
|
-
const { buildReactiveExecutePrompt } = await import("../auto-prompts.ts");
|
|
98
|
+
test("buildReactiveExecutePrompt omits model instruction when subagentModel is omitted", async (t) => {
|
|
226
99
|
const repo = mkdtempSync(join(tmpdir(), "gsd-subagent-model-none-"));
|
|
227
100
|
t.after(() => rmSync(repo, { recursive: true, force: true }));
|
|
101
|
+
writeReactiveFixture(repo);
|
|
228
102
|
|
|
229
|
-
const
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
[
|
|
235
|
-
|
|
236
|
-
"",
|
|
237
|
-
"**Goal:** Verify no model when omitted",
|
|
238
|
-
"**Demo:** No model string",
|
|
239
|
-
"",
|
|
240
|
-
"## Tasks",
|
|
241
|
-
"",
|
|
242
|
-
"- [ ] **T01: Task One** `est:15m`",
|
|
243
|
-
" Do something.",
|
|
244
|
-
"",
|
|
245
|
-
].join("\n"),
|
|
103
|
+
const prompt = await buildReactiveExecutePrompt(
|
|
104
|
+
"M001",
|
|
105
|
+
"Test Milestone",
|
|
106
|
+
"S01",
|
|
107
|
+
"Test Slice",
|
|
108
|
+
["T01"],
|
|
109
|
+
repo,
|
|
246
110
|
);
|
|
247
111
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
[
|
|
251
|
-
"# T01: Task One",
|
|
252
|
-
"",
|
|
253
|
-
"## Description",
|
|
254
|
-
"Do something.",
|
|
255
|
-
"",
|
|
256
|
-
"## Inputs",
|
|
257
|
-
"",
|
|
258
|
-
"- `src/config.json` — Config",
|
|
259
|
-
"",
|
|
260
|
-
"## Expected Output",
|
|
261
|
-
"",
|
|
262
|
-
"- `src/out.ts` — Result",
|
|
263
|
-
].join("\n"),
|
|
264
|
-
);
|
|
112
|
+
assert.doesNotMatch(prompt, /with model:/);
|
|
113
|
+
});
|
|
265
114
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
);
|
|
115
|
+
test("buildParallelResearchSlicesPrompt injects subagent model for each slice", async (t) => {
|
|
116
|
+
const repo = mkdtempSync(join(tmpdir(), "gsd-subagent-model-parallel-"));
|
|
117
|
+
t.after(() => rmSync(repo, { recursive: true, force: true }));
|
|
118
|
+
mkdirSync(join(repo, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
|
|
271
119
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
"
|
|
120
|
+
const prompt = await buildParallelResearchSlicesPrompt(
|
|
121
|
+
"M001",
|
|
122
|
+
"Test Milestone",
|
|
123
|
+
[{ id: "S01", title: "Research Slice" }],
|
|
124
|
+
repo,
|
|
125
|
+
"claude-opus-4-6",
|
|
275
126
|
);
|
|
127
|
+
|
|
128
|
+
assert.match(prompt, /model: "claude-opus-4-6"/);
|
|
276
129
|
});
|
|
277
130
|
|
|
278
|
-
test("buildGateEvaluatePrompt
|
|
279
|
-
const { buildGateEvaluatePrompt } = await import("../auto-prompts.ts");
|
|
131
|
+
test("buildGateEvaluatePrompt uses nested context guidance and model instruction", async (t) => {
|
|
280
132
|
const { closeDatabase, insertGateRow, insertMilestone, insertSlice, openDatabase } = await import("../gsd-db.ts");
|
|
281
133
|
const repo = mkdtempSync(join(tmpdir(), "gsd-subagent-model-gate-"));
|
|
282
134
|
t.after(() => {
|
|
@@ -315,13 +167,7 @@ test("buildGateEvaluatePrompt: embedded gate prompts use nested Context Mode gui
|
|
|
315
167
|
"claude-opus-4-6",
|
|
316
168
|
);
|
|
317
169
|
|
|
318
|
-
assert.
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
);
|
|
322
|
-
assert.ok(
|
|
323
|
-
prompt.includes("## Context Mode"),
|
|
324
|
-
"gate-evaluate parent prompt should include standalone Context Mode guidance",
|
|
325
|
-
);
|
|
326
|
-
assert.ok(prompt.includes('model: "claude-opus-4-6"'), "gate subagent prompt should preserve model instruction");
|
|
170
|
+
assert.match(prompt, /Context Mode \(verification lane\):/);
|
|
171
|
+
assert.match(prompt, /## Context Mode/);
|
|
172
|
+
assert.match(prompt, /model: "claude-opus-4-6"/);
|
|
327
173
|
});
|