gsd-pi 2.80.0-dev.42bd34838 → 2.80.0-dev.488219eb6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/loop.js +71 -8
- package/dist/resources/extensions/gsd/auto/phases.js +179 -99
- package/dist/resources/extensions/gsd/auto/resolve.js +12 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -30
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +94 -76
- package/dist/resources/extensions/gsd/auto-prompts.js +90 -15
- package/dist/resources/extensions/gsd/auto-start.js +238 -12
- package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
- package/dist/resources/extensions/gsd/auto.js +95 -44
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +96 -26
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +6 -3
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +298 -54
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +53 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +37 -1
- package/dist/resources/extensions/gsd/guided-flow.js +61 -32
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +57 -5
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +8 -0
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +14 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +36 -7
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +3 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +3 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +34 -3
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +153 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +23 -5
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +19 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +23 -5
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +40 -7
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +3 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +3 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +5 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +37 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +177 -8
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +24 -5
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +21 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +25 -8
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -2
- package/src/resources/extensions/gsd/auto/loop.ts +84 -8
- package/src/resources/extensions/gsd/auto/phases.ts +258 -159
- package/src/resources/extensions/gsd/auto/resolve.ts +19 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -29
- package/src/resources/extensions/gsd/auto/session.ts +8 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +107 -78
- package/src/resources/extensions/gsd/auto-prompts.ts +95 -14
- package/src/resources/extensions/gsd/auto-start.ts +286 -15
- package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
- package/src/resources/extensions/gsd/auto.ts +132 -40
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +116 -24
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -3
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +347 -54
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +66 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +41 -2
- package/src/resources/extensions/gsd/guided-flow.ts +71 -39
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +361 -10
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +35 -31
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -125
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -97
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +33 -47
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +140 -3
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +83 -5
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_ssgManifest.js +0 -0
|
@@ -1,43 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Regression test for DB-authoritative syncWorktreeStateBack behavior.
|
|
3
|
-
*
|
|
4
|
-
* Worktree milestone projections are not authoritative. syncWorktreeStateBack
|
|
5
|
-
* may reconcile a legacy worktree DB and copy diagnostics, but must not copy
|
|
6
|
-
* milestone markdown directories back into the project root.
|
|
7
3
|
*/
|
|
8
4
|
|
|
9
|
-
import { describe, it } from
|
|
10
|
-
import assert from
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
5
|
+
import { describe, it } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
resolve(process.cwd(), 'src', 'resources', 'extensions', 'gsd', 'auto-worktree.ts'),
|
|
17
|
-
'utf-8',
|
|
18
|
-
)
|
|
11
|
+
import { syncWorktreeStateBack } from "../auto-worktree.ts";
|
|
19
12
|
|
|
20
|
-
describe(
|
|
21
|
-
it(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
13
|
+
describe("syncWorktreeStateBack does not copy worktree milestone projections", () => {
|
|
14
|
+
it("copies root diagnostics but leaves milestone markdown directories behind", () => {
|
|
15
|
+
const root = mkdtempSync(join(tmpdir(), "gsd-sync-back-"));
|
|
16
|
+
const main = join(root, "main");
|
|
17
|
+
const worktree = join(root, "worktree");
|
|
18
|
+
try {
|
|
19
|
+
mkdirSync(join(main, ".gsd", "milestones"), { recursive: true });
|
|
20
|
+
mkdirSync(join(worktree, ".gsd", "milestones", "M001"), { recursive: true });
|
|
21
|
+
writeFileSync(join(worktree, ".gsd", "metrics.json"), "{}\n", "utf-8");
|
|
22
|
+
writeFileSync(
|
|
23
|
+
join(worktree, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
|
|
24
|
+
"# M001: Worktree-only projection\n",
|
|
25
|
+
"utf-8",
|
|
26
|
+
);
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
// Find syncWorktreeStateBack
|
|
30
|
-
const fnStart = src.indexOf('function syncWorktreeStateBack(')
|
|
31
|
-
assert.ok(fnStart !== -1)
|
|
28
|
+
const result = syncWorktreeStateBack(main, worktree, "M001");
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
})
|
|
43
|
-
})
|
|
30
|
+
assert.deepEqual(result.synced, ["metrics.json"]);
|
|
31
|
+
assert.equal(existsSync(join(main, ".gsd", "metrics.json")), true);
|
|
32
|
+
assert.equal(
|
|
33
|
+
existsSync(join(main, ".gsd", "milestones", "M001", "M001-ROADMAP.md")),
|
|
34
|
+
false,
|
|
35
|
+
);
|
|
36
|
+
} finally {
|
|
37
|
+
rmSync(root, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: System context memory gating regression tests.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
|
|
7
|
+
import { buildContextMessage, isLowEntropyResumePrompt, loadMemoryBlock } from "../bootstrap/system-context.ts";
|
|
8
|
+
import { closeDatabase, openDatabase } from "../gsd-db.ts";
|
|
9
|
+
import { createMemory } from "../memory-store.ts";
|
|
10
|
+
|
|
11
|
+
test("buildContextMessage marks hidden guided context when memory is supplied", () => {
|
|
12
|
+
const message = buildContextMessage({
|
|
13
|
+
memoryBlock: "\n\n[MEMORY]\n\n- keep this",
|
|
14
|
+
injection: "[GSD Guided Execute Context]\nUse the task plan.",
|
|
15
|
+
forensicsInjection: null,
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
assert.ok(message, "expected hidden context message");
|
|
19
|
+
assert.equal(message.customType, "gsd-guided-context");
|
|
20
|
+
assert.equal(message.display, false);
|
|
21
|
+
assert.match(message.content, /\[GSD Context Metadata\]\n- Memory supplied: yes/);
|
|
22
|
+
assert.ok(
|
|
23
|
+
message.content.indexOf("Memory supplied: yes") < message.content.indexOf("[GSD Guided Execute Context]"),
|
|
24
|
+
"memory marker should appear before guided context",
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("buildContextMessage caps hidden context by default", () => {
|
|
29
|
+
const original = process.env.PI_GSD_CONTEXT_MAX_CHARS;
|
|
30
|
+
delete process.env.PI_GSD_CONTEXT_MAX_CHARS;
|
|
31
|
+
try {
|
|
32
|
+
const message = buildContextMessage({
|
|
33
|
+
memoryBlock: "",
|
|
34
|
+
injection: `[GSD Guided Execute Context]\n${"large context\n".repeat(500)}`,
|
|
35
|
+
forensicsInjection: null,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
assert.ok(message, "expected hidden context message");
|
|
39
|
+
assert.equal(message.customType, "gsd-guided-context");
|
|
40
|
+
assert.ok(message.content.length <= 4000);
|
|
41
|
+
assert.match(message.content, /\[GSD Context Truncated\]/);
|
|
42
|
+
} finally {
|
|
43
|
+
if (original === undefined) delete process.env.PI_GSD_CONTEXT_MAX_CHARS;
|
|
44
|
+
else process.env.PI_GSD_CONTEXT_MAX_CHARS = original;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("buildContextMessage supports explicit context cap override", () => {
|
|
49
|
+
const original = process.env.PI_GSD_CONTEXT_MAX_CHARS;
|
|
50
|
+
process.env.PI_GSD_CONTEXT_MAX_CHARS = "1200";
|
|
51
|
+
try {
|
|
52
|
+
const message = buildContextMessage({
|
|
53
|
+
memoryBlock: "",
|
|
54
|
+
injection: `[GSD Guided Execute Context]\n${"large context\n".repeat(200)}`,
|
|
55
|
+
forensicsInjection: null,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
assert.ok(message, "expected hidden context message");
|
|
59
|
+
assert.equal(message.customType, "gsd-guided-context");
|
|
60
|
+
assert.ok(message.content.length <= 1200);
|
|
61
|
+
assert.match(message.content, /\[GSD Context Truncated\]/);
|
|
62
|
+
} finally {
|
|
63
|
+
if (original === undefined) delete process.env.PI_GSD_CONTEXT_MAX_CHARS;
|
|
64
|
+
else process.env.PI_GSD_CONTEXT_MAX_CHARS = original;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("buildContextMessage does not add memory marker when only guided context is supplied", () => {
|
|
69
|
+
const message = buildContextMessage({
|
|
70
|
+
memoryBlock: "",
|
|
71
|
+
injection: "[GSD Guided Execute Context]\nUse the task plan.",
|
|
72
|
+
forensicsInjection: null,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
assert.ok(message, "expected guided context message");
|
|
76
|
+
assert.equal(message.customType, "gsd-guided-context");
|
|
77
|
+
assert.doesNotMatch(message.content, /Memory supplied: yes/);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test("loadMemoryBlock keeps critical memories while gating prompt-relevant query hits", async () => {
|
|
81
|
+
closeDatabase();
|
|
82
|
+
assert.equal(openDatabase(":memory:"), true);
|
|
83
|
+
try {
|
|
84
|
+
createMemory({
|
|
85
|
+
category: "gotcha",
|
|
86
|
+
content: "Always preserve critical resume safety context.",
|
|
87
|
+
confidence: 0.95,
|
|
88
|
+
});
|
|
89
|
+
createMemory({
|
|
90
|
+
category: "preference",
|
|
91
|
+
content: "React dashboard preference should only appear for a React prompt query.",
|
|
92
|
+
confidence: 0.95,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const withPromptRelevant = await loadMemoryBlock("React dashboard", { includePromptRelevant: true });
|
|
96
|
+
assert.match(withPromptRelevant, /critical resume safety context/);
|
|
97
|
+
assert.match(withPromptRelevant, /React dashboard preference/);
|
|
98
|
+
|
|
99
|
+
const withoutPromptRelevant = await loadMemoryBlock("React dashboard", { includePromptRelevant: false });
|
|
100
|
+
assert.match(withoutPromptRelevant, /critical resume safety context/);
|
|
101
|
+
assert.doesNotMatch(withoutPromptRelevant, /React dashboard preference/);
|
|
102
|
+
} finally {
|
|
103
|
+
closeDatabase();
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("isLowEntropyResumePrompt identifies bare resume prompts only", () => {
|
|
108
|
+
assert.equal(isLowEntropyResumePrompt("continue"), true);
|
|
109
|
+
assert.equal(isLowEntropyResumePrompt("Go ahead."), true);
|
|
110
|
+
assert.equal(isLowEntropyResumePrompt("run the tests"), false);
|
|
111
|
+
assert.equal(isLowEntropyResumePrompt("/gsd auto"), false);
|
|
112
|
+
});
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
// GSD
|
|
2
|
-
//
|
|
3
|
-
// per call; embedding it in the cached system prefix invalidates Anthropic
|
|
4
|
-
// prompt-cache hits on every request. The fix routes memory through the
|
|
5
|
-
// existing context-message channel (volatile user-message suffix) and combines
|
|
6
|
-
// it with any active guided-execute or forensics injection.
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Regression coverage for volatile system-context message routing.
|
|
7
3
|
|
|
8
4
|
import { describe, test } from "node:test";
|
|
9
5
|
import assert from "node:assert/strict";
|
|
@@ -11,6 +7,8 @@ import assert from "node:assert/strict";
|
|
|
11
7
|
import { buildContextMessage } from "../bootstrap/system-context.ts";
|
|
12
8
|
|
|
13
9
|
describe("buildContextMessage (#5019 — memory routing)", () => {
|
|
10
|
+
const markedMemory = "[GSD Context Metadata]\n- Memory supplied: yes\n\n[MEMORY]\nrule one";
|
|
11
|
+
|
|
14
12
|
test("returns null when nothing to inject", () => {
|
|
15
13
|
const result = buildContextMessage({
|
|
16
14
|
memoryBlock: "",
|
|
@@ -37,7 +35,7 @@ describe("buildContextMessage (#5019 — memory routing)", () => {
|
|
|
37
35
|
});
|
|
38
36
|
assert.ok(result, "expected a context message");
|
|
39
37
|
assert.equal(result.customType, "gsd-memory");
|
|
40
|
-
assert.equal(result.content, "[MEMORY]\nrule one\nrule two");
|
|
38
|
+
assert.equal(result.content, "[GSD Context Metadata]\n- Memory supplied: yes\n\n[MEMORY]\nrule one\nrule two");
|
|
41
39
|
assert.equal(result.display, false);
|
|
42
40
|
});
|
|
43
41
|
|
|
@@ -71,7 +69,7 @@ describe("buildContextMessage (#5019 — memory routing)", () => {
|
|
|
71
69
|
});
|
|
72
70
|
assert.ok(result);
|
|
73
71
|
assert.equal(result.customType, "gsd-guided-context");
|
|
74
|
-
assert.equal(result.content,
|
|
72
|
+
assert.equal(result.content, `${markedMemory}\n\n[GUIDED]\nexecute T01`);
|
|
75
73
|
});
|
|
76
74
|
|
|
77
75
|
test("memory + forensics: memory prepended, customType is gsd-forensics", () => {
|
|
@@ -82,7 +80,7 @@ describe("buildContextMessage (#5019 — memory routing)", () => {
|
|
|
82
80
|
});
|
|
83
81
|
assert.ok(result);
|
|
84
82
|
assert.equal(result.customType, "gsd-forensics");
|
|
85
|
-
assert.equal(result.content,
|
|
83
|
+
assert.equal(result.content, `${markedMemory}\n\n[FORENSICS]\ninvestigation context`);
|
|
86
84
|
});
|
|
87
85
|
|
|
88
86
|
test("guided takes precedence over forensics when both are somehow present", () => {
|
|
@@ -1,325 +1,100 @@
|
|
|
1
|
-
|
|
2
|
-
* Token Profile — unit tests for M004/S01.
|
|
3
|
-
*
|
|
4
|
-
* Tests profile resolution, preference merging, phase skip defaults,
|
|
5
|
-
* subagent model routing, default-to-balanced behavior, and dispatch
|
|
6
|
-
* table guard clauses (source-level structural verification).
|
|
7
|
-
*
|
|
8
|
-
* Uses source-level checks (readFileSync + string matching) to avoid
|
|
9
|
-
* @gsd/pi-coding-agent import resolution issues in dev environments.
|
|
10
|
-
*/
|
|
1
|
+
// GSD-2 — Token profile behavior tests.
|
|
11
2
|
|
|
12
3
|
import test from "node:test";
|
|
13
4
|
import assert from "node:assert/strict";
|
|
14
|
-
import { readFileSync } from "node:fs";
|
|
15
|
-
import { join, dirname } from "node:path";
|
|
16
|
-
import { fileURLToPath } from "node:url";
|
|
17
|
-
import { extractSourceRegion } from "./test-helpers.ts";
|
|
18
5
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const dispatchSrc = readFileSync(join(__dirname, "..", "auto-dispatch.ts"), "utf-8");
|
|
26
|
-
const preferencesSrc = [
|
|
27
|
-
readFileSync(join(__dirname, "..", "preferences.ts"), "utf-8"),
|
|
28
|
-
readFileSync(join(__dirname, "..", "preferences-types.ts"), "utf-8"),
|
|
29
|
-
readFileSync(join(__dirname, "..", "preferences-models.ts"), "utf-8"),
|
|
30
|
-
readFileSync(join(__dirname, "..", "preferences-validation.ts"), "utf-8"),
|
|
31
|
-
].join("\n");
|
|
32
|
-
const typesSrc = readFileSync(join(__dirname, "..", "types.ts"), "utf-8");
|
|
33
|
-
|
|
34
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
35
|
-
// Type Definitions
|
|
36
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
37
|
-
|
|
38
|
-
test("types: TokenProfile type exported with budget/balanced/quality/burn-max", () => {
|
|
39
|
-
assert.ok(typesSrc.includes("export type TokenProfile"), "TokenProfile should be exported");
|
|
40
|
-
assert.match(typesSrc, /["']budget["']/, "should include budget");
|
|
41
|
-
assert.match(typesSrc, /["']balanced["']/, "should include balanced");
|
|
42
|
-
assert.match(typesSrc, /["']quality["']/, "should include quality");
|
|
43
|
-
assert.match(typesSrc, /["']burn-max["']/, "should include burn-max");
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test("types: InlineLevel type exported with full/standard/minimal", () => {
|
|
47
|
-
assert.ok(typesSrc.includes("export type InlineLevel"), "InlineLevel should be exported");
|
|
48
|
-
assert.match(typesSrc, /["']full["']/, "should include full");
|
|
49
|
-
assert.match(typesSrc, /["']standard["']/, "should include standard");
|
|
50
|
-
assert.match(typesSrc, /["']minimal["']/, "should include minimal");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
test("types: PhaseSkipPreferences interface exported", () => {
|
|
54
|
-
assert.ok(typesSrc.includes("export interface PhaseSkipPreferences"), "PhaseSkipPreferences should be exported");
|
|
55
|
-
assert.ok(typesSrc.includes("skip_research"), "should include skip_research");
|
|
56
|
-
assert.ok(typesSrc.includes("skip_reassess"), "should include skip_reassess");
|
|
57
|
-
assert.ok(typesSrc.includes("skip_slice_research"), "should include skip_slice_research");
|
|
58
|
-
assert.ok(typesSrc.includes("reassess_after_slice"), "should include reassess_after_slice");
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
62
|
-
// GSDPreferences Interface
|
|
63
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
64
|
-
|
|
65
|
-
test("preferences: GSDPreferences includes token_profile field", () => {
|
|
66
|
-
assert.ok(
|
|
67
|
-
preferencesSrc.includes("token_profile?: TokenProfile"),
|
|
68
|
-
"GSDPreferences should have token_profile field",
|
|
69
|
-
);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("preferences: GSDPreferences includes phases field", () => {
|
|
73
|
-
assert.ok(
|
|
74
|
-
preferencesSrc.includes("phases?: PhaseSkipPreferences"),
|
|
75
|
-
"GSDPreferences should have phases field",
|
|
76
|
-
);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test("preferences: GSDModelConfig includes subagent field", () => {
|
|
80
|
-
// Check both v1 and v2 configs
|
|
81
|
-
const v1Match = preferencesSrc.match(/interface GSDModelConfig\s*\{[^}]*subagent/);
|
|
82
|
-
assert.ok(v1Match, "GSDModelConfig should have subagent field");
|
|
83
|
-
const v2Match = preferencesSrc.match(/interface GSDModelConfigV2\s*\{[^}]*subagent/);
|
|
84
|
-
assert.ok(v2Match, "GSDModelConfigV2 should have subagent field");
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test("preferences: KNOWN_PREFERENCE_KEYS includes token_profile and phases", () => {
|
|
88
|
-
assert.ok(preferencesSrc.includes('"token_profile"'), "KNOWN_PREFERENCE_KEYS should include token_profile");
|
|
89
|
-
assert.ok(preferencesSrc.includes('"phases"'), "KNOWN_PREFERENCE_KEYS should include phases");
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
93
|
-
// Profile Resolution
|
|
94
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
95
|
-
|
|
96
|
-
test("profile: resolveProfileDefaults exists and handles all 4 tiers", () => {
|
|
97
|
-
assert.ok(
|
|
98
|
-
preferencesSrc.includes("export function resolveProfileDefaults"),
|
|
99
|
-
"resolveProfileDefaults should be exported",
|
|
100
|
-
);
|
|
101
|
-
assert.ok(
|
|
102
|
-
preferencesSrc.includes('case "budget"') &&
|
|
103
|
-
preferencesSrc.includes('case "balanced"') &&
|
|
104
|
-
preferencesSrc.includes('case "quality"') &&
|
|
105
|
-
preferencesSrc.includes('case "burn-max"'),
|
|
106
|
-
"resolveProfileDefaults should handle all 4 tiers",
|
|
107
|
-
);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test("profile: PROFILE_TIER_MAP defines tier intentions for all profiles", async () => {
|
|
111
|
-
const { getProfileTierMap } = await import("../preferences-models.ts");
|
|
112
|
-
const profileMaps = {
|
|
113
|
-
budget: getProfileTierMap("budget"),
|
|
114
|
-
balanced: getProfileTierMap("balanced"),
|
|
115
|
-
quality: getProfileTierMap("quality"),
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
assert.deepEqual(
|
|
119
|
-
Object.keys(profileMaps).sort(),
|
|
120
|
-
["balanced", "budget", "quality"],
|
|
121
|
-
"PROFILE_TIER_MAP should include the profile default tiers",
|
|
122
|
-
);
|
|
6
|
+
import { validatePreferences } from "../preferences-validation.ts";
|
|
7
|
+
import {
|
|
8
|
+
getProfileTierMap,
|
|
9
|
+
resolveProfileDefaults,
|
|
10
|
+
} from "../preferences-models.ts";
|
|
123
11
|
|
|
12
|
+
test("profile tier maps define provider-agnostic complexity tiers", () => {
|
|
124
13
|
const expectedPhaseKeys = ["completion", "execution", "execution_simple", "planning", "research", "subagent"];
|
|
125
14
|
const validTiers = new Set(["light", "standard", "heavy"]);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
assert.ok(validTiers.has(tier), `${profile}.${phase} should be a tier name`);
|
|
134
|
-
assert.ok(!tier.includes("claude-"), `${profile}.${phase} should not be a model ID`);
|
|
15
|
+
|
|
16
|
+
for (const profile of ["budget", "balanced", "quality"] as const) {
|
|
17
|
+
const tierMap = getProfileTierMap(profile);
|
|
18
|
+
assert.deepEqual(Object.keys(tierMap).sort(), expectedPhaseKeys);
|
|
19
|
+
for (const tier of Object.values(tierMap)) {
|
|
20
|
+
assert.ok(validTiers.has(tier));
|
|
21
|
+
assert.doesNotMatch(tier, /claude-|gpt-|gemini-/);
|
|
135
22
|
}
|
|
136
23
|
}
|
|
137
24
|
});
|
|
138
25
|
|
|
139
|
-
test("profile
|
|
140
|
-
// Behavioral check: with only OpenAI models in the available list, no slot
|
|
141
|
-
// should resolve to a claude-* model. Source-grep cannot prove this — only
|
|
142
|
-
// exercising the function with a controlled available-model list can.
|
|
143
|
-
const { resolveProfileDefaults } = await import("../preferences-models.ts");
|
|
26
|
+
test("profile defaults resolve to available OpenAI models when only OpenAI is available", () => {
|
|
144
27
|
const defaults = resolveProfileDefaults("balanced", ["gpt-4o", "gpt-4o-mini"]);
|
|
145
|
-
assert.ok(defaults.models
|
|
146
|
-
for (const
|
|
147
|
-
assert.
|
|
148
|
-
|
|
149
|
-
`${phase} resolved to ${modelId} but only OpenAI is available`,
|
|
150
|
-
);
|
|
28
|
+
assert.ok(defaults.models);
|
|
29
|
+
for (const modelId of Object.values(defaults.models!)) {
|
|
30
|
+
assert.equal(typeof modelId, "string");
|
|
31
|
+
assert.doesNotMatch(String(modelId), /^claude-/);
|
|
151
32
|
}
|
|
152
33
|
});
|
|
153
34
|
|
|
154
|
-
test("
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
assert.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
test("
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
);
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
220
|
-
|
|
221
|
-
test("validate: validatePreferences handles token_profile", () => {
|
|
222
|
-
assert.ok(
|
|
223
|
-
preferencesSrc.includes("preferences.token_profile") &&
|
|
224
|
-
preferencesSrc.includes("budget, balanced, quality, burn-max"),
|
|
225
|
-
"validatePreferences should validate token_profile enum values",
|
|
226
|
-
);
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
test("validate: validatePreferences handles phases object", () => {
|
|
230
|
-
assert.ok(
|
|
231
|
-
preferencesSrc.includes("preferences.phases") &&
|
|
232
|
-
preferencesSrc.includes("skip_research") &&
|
|
233
|
-
preferencesSrc.includes("skip_reassess") &&
|
|
234
|
-
preferencesSrc.includes("skip_slice_research"),
|
|
235
|
-
"validatePreferences should validate phases fields",
|
|
236
|
-
);
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test("validate: phases warns on unknown keys", () => {
|
|
240
|
-
assert.ok(
|
|
241
|
-
preferencesSrc.includes("knownPhaseKeys") &&
|
|
242
|
-
preferencesSrc.includes("unknown phases key"),
|
|
243
|
-
"validatePreferences should warn on unknown phase keys",
|
|
244
|
-
);
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
248
|
-
// Merge
|
|
249
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
250
|
-
|
|
251
|
-
test("merge: mergePreferences handles token_profile with nullish coalescing", () => {
|
|
252
|
-
assert.ok(
|
|
253
|
-
preferencesSrc.includes("token_profile: override.token_profile ?? base.token_profile"),
|
|
254
|
-
"mergePreferences should use nullish coalescing for token_profile",
|
|
255
|
-
);
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
test("merge: mergePreferences handles phases with spread", () => {
|
|
259
|
-
assert.ok(
|
|
260
|
-
preferencesSrc.includes("...(base.phases") && preferencesSrc.includes("...(override.phases"),
|
|
261
|
-
"mergePreferences should spread phases objects",
|
|
262
|
-
);
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
266
|
-
// Subagent Model Routing
|
|
267
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
268
|
-
|
|
269
|
-
test("subagent: budget profile assigns light tier for subagent", () => {
|
|
270
|
-
// PROFILE_TIER_MAP.budget.subagent should be "light"
|
|
271
|
-
const tierMapIdx = preferencesSrc.indexOf("PROFILE_TIER_MAP");
|
|
272
|
-
const budgetIdx = preferencesSrc.indexOf("budget:", tierMapIdx);
|
|
273
|
-
const balancedIdx = preferencesSrc.indexOf("balanced:", tierMapIdx);
|
|
274
|
-
const budgetBlock = preferencesSrc.slice(budgetIdx, balancedIdx);
|
|
275
|
-
assert.ok(budgetBlock.includes("subagent:"), "budget profile should define subagent tier");
|
|
276
|
-
assert.ok(budgetBlock.includes('"light"'), "budget subagent should use light tier");
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
test("subagent: resolveModelWithFallbacksForUnit handles subagent unit types", () => {
|
|
280
|
-
assert.ok(
|
|
281
|
-
preferencesSrc.includes('"subagent"') && preferencesSrc.includes('startsWith("subagent/")'),
|
|
282
|
-
"resolveModelWithFallbacksForUnit should handle subagent and subagent/* unit types",
|
|
283
|
-
);
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
287
|
-
// Dispatch Table — Phase Skip Guards
|
|
288
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
289
|
-
|
|
290
|
-
test("dispatch: research-milestone rule has skip_research guard", () => {
|
|
291
|
-
// Find the research-milestone rule and check it has the guard
|
|
292
|
-
const ruleIdx = dispatchSrc.indexOf("research-milestone");
|
|
293
|
-
assert.ok(ruleIdx > -1, "should have research-milestone rule");
|
|
294
|
-
// The guard should appear near this rule
|
|
295
|
-
assert.ok(
|
|
296
|
-
dispatchSrc.includes("skip_research") && dispatchSrc.includes("research-milestone"),
|
|
297
|
-
"research-milestone dispatch rule should check phases.skip_research",
|
|
298
|
-
);
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
test("dispatch: research-slice rule has skip guards", () => {
|
|
302
|
-
const ruleIdx = dispatchSrc.indexOf("research-slice");
|
|
303
|
-
assert.ok(ruleIdx > -1, "should have research-slice rule");
|
|
304
|
-
const afterRule = dispatchSrc.slice(ruleIdx);
|
|
305
|
-
assert.ok(
|
|
306
|
-
afterRule.includes("skip_research") || afterRule.includes("skip_slice_research"),
|
|
307
|
-
"research-slice rule should check skip_research or skip_slice_research",
|
|
308
|
-
);
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
test("dispatch: reassess-roadmap rule has reassess_after_slice opt-in guard (ADR-003)", () => {
|
|
312
|
-
assert.ok(
|
|
313
|
-
dispatchSrc.includes("reassess_after_slice") && dispatchSrc.includes("reassess-roadmap"),
|
|
314
|
-
"reassess-roadmap dispatch rule should check phases.reassess_after_slice",
|
|
315
|
-
);
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
test("dispatch: phase skip guards return null (not stop)", () => {
|
|
319
|
-
// Verify skip guards use return null pattern
|
|
320
|
-
const researchGuard = dispatchSrc.match(/skip_research\).*?return null/s);
|
|
321
|
-
assert.ok(researchGuard, "skip_research guard should return null (fall-through)");
|
|
322
|
-
|
|
323
|
-
const reassessGuard = dispatchSrc.match(/reassess_after_slice.*?return null/s);
|
|
324
|
-
assert.ok(reassessGuard, "reassess_after_slice guard should return null (fall-through)");
|
|
35
|
+
test("budget, balanced, and quality profiles set expected phase skip defaults", () => {
|
|
36
|
+
assert.deepEqual(resolveProfileDefaults("budget").phases, {
|
|
37
|
+
skip_research: true,
|
|
38
|
+
skip_reassess: true,
|
|
39
|
+
skip_slice_research: true,
|
|
40
|
+
skip_milestone_validation: true,
|
|
41
|
+
});
|
|
42
|
+
assert.deepEqual(resolveProfileDefaults("balanced").phases, {
|
|
43
|
+
skip_research: true,
|
|
44
|
+
skip_reassess: true,
|
|
45
|
+
skip_slice_research: true,
|
|
46
|
+
});
|
|
47
|
+
assert.deepEqual(resolveProfileDefaults("quality").phases, {
|
|
48
|
+
skip_research: true,
|
|
49
|
+
skip_slice_research: true,
|
|
50
|
+
skip_reassess: true,
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("burn-max preserves user model choices and enables full context defaults", () => {
|
|
55
|
+
const defaults = resolveProfileDefaults("burn-max");
|
|
56
|
+
assert.equal(defaults.models, undefined);
|
|
57
|
+
assert.equal(defaults.dynamic_routing?.enabled, false);
|
|
58
|
+
assert.equal(defaults.context_selection, "full");
|
|
59
|
+
assert.deepEqual(defaults.phases, {
|
|
60
|
+
skip_research: false,
|
|
61
|
+
skip_slice_research: false,
|
|
62
|
+
skip_reassess: false,
|
|
63
|
+
skip_milestone_validation: false,
|
|
64
|
+
reassess_after_slice: true,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("validatePreferences accepts token_profile and strict phase booleans", () => {
|
|
69
|
+
const result = validatePreferences({
|
|
70
|
+
token_profile: "quality",
|
|
71
|
+
phases: {
|
|
72
|
+
skip_research: true,
|
|
73
|
+
skip_reassess: "false" as any,
|
|
74
|
+
skip_slice_research: true,
|
|
75
|
+
reassess_after_slice: false,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
assert.equal(result.errors.length, 0);
|
|
80
|
+
assert.equal(result.preferences.token_profile, "quality");
|
|
81
|
+
assert.deepEqual(result.preferences.phases, {
|
|
82
|
+
skip_research: true,
|
|
83
|
+
skip_reassess: false,
|
|
84
|
+
skip_slice_research: true,
|
|
85
|
+
reassess_after_slice: false,
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("validatePreferences rejects invalid token profiles and warns on unknown phase keys", () => {
|
|
90
|
+
const result = validatePreferences({
|
|
91
|
+
token_profile: "fast" as any,
|
|
92
|
+
phases: {
|
|
93
|
+
skip_research: true,
|
|
94
|
+
unknown_phase: true,
|
|
95
|
+
} as any,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
assert.ok(result.errors.some((error) => error.includes("token_profile")));
|
|
99
|
+
assert.ok(result.warnings.some((warning) => warning.includes("unknown phases key")));
|
|
325
100
|
});
|