gsd-pi 2.78.1-dev.84a383f51 → 2.78.1
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 +7 -7
- package/dist/cli.js +55 -95
- package/dist/headless-query.d.ts +0 -22
- package/dist/headless-query.js +4 -24
- package/dist/headless.d.ts +0 -10
- package/dist/headless.js +1 -16
- package/dist/loader.js +10 -7
- package/dist/onboarding.d.ts +0 -10
- package/dist/onboarding.js +2 -2
- package/dist/provider-migrations.d.ts +2 -2
- package/dist/provider-migrations.js +2 -5
- package/dist/resource-loader.d.ts +2 -5
- package/dist/resource-loader.js +5 -28
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
- package/dist/resources/extensions/gsd/auto/loop.js +0 -23
- package/dist/resources/extensions/gsd/auto/phases.js +2 -2
- package/dist/resources/extensions/gsd/auto/run-unit.js +1 -3
- package/dist/resources/extensions/gsd/auto/session.js +0 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +4 -43
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +0 -30
- package/dist/resources/extensions/gsd/auto.js +5 -14
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -14
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +5 -7
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +4 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -94
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +6 -11
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +8 -34
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +2 -38
- package/dist/resources/extensions/gsd/commands/catalog.js +5 -69
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -22
- package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -3
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -10
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -4
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +1 -39
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/forensics.js +2 -2
- package/dist/resources/extensions/gsd/git-service.js +5 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -11
- package/dist/resources/extensions/gsd/guided-flow.js +23 -23
- package/dist/resources/extensions/gsd/memory-store.js +31 -66
- package/dist/resources/extensions/gsd/model-router.js +9 -114
- package/dist/resources/extensions/gsd/native-git-bridge.js +1 -7
- package/dist/resources/extensions/gsd/preferences-models.js +15 -91
- package/dist/resources/extensions/gsd/preferences-types.js +0 -2
- package/dist/resources/extensions/gsd/preferences-validation.js +0 -32
- package/dist/resources/extensions/gsd/preferences.js +3 -5
- package/dist/resources/extensions/gsd/prompt-loader.js +12 -23
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -9
- package/dist/resources/extensions/gsd/state.js +0 -42
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +5 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -18
- package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
- package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -3
- package/dist/resources/extensions/gsd/worktree-command.js +46 -26
- package/dist/resources/extensions/mcp-client/index.js +3 -6
- package/dist/resources/extensions/slash-commands/create-extension.js +22 -36
- package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -9
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
- package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
- package/dist/rtk-shared.d.ts +0 -3
- package/dist/rtk-shared.js +0 -17
- package/dist/rtk.d.ts +5 -2
- package/dist/rtk.js +20 -3
- 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 +13 -13
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +4 -44
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -4
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- 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/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
- package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +20 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/package.json +1 -2
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +46 -74
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +0 -26
- package/packages/mcp-server/src/workflow-tools.ts +58 -93
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -48
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +0 -13
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +3 -24
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -26
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +20 -52
- package/packages/pi-ai/src/types.ts +0 -13
- package/packages/pi-ai/src/utils/repair-tool-json.ts +3 -24
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -32
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -6
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +0 -4
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -19
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +0 -18
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +0 -13
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -20
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -14
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +0 -7
- package/packages/pi-coding-agent/src/core/messages.ts +0 -4
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -32
- package/packages/pi-coding-agent/src/core/model-registry.ts +0 -21
- package/packages/pi-coding-agent/src/core/system-prompt.ts +15 -33
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -17
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +3 -17
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +3 -20
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +2 -24
- package/src/resources/extensions/gsd/auto/phases.ts +3 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +1 -3
- package/src/resources/extensions/gsd/auto/session.ts +0 -3
- package/src/resources/extensions/gsd/auto/types.ts +0 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +8 -46
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +4 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +0 -38
- package/src/resources/extensions/gsd/auto.ts +4 -14
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -15
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +7 -8
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +9 -10
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +31 -102
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +6 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -39
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +11 -39
- package/src/resources/extensions/gsd/commands/catalog.ts +5 -75
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -22
- package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -3
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -15
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -4
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +1 -39
- package/src/resources/extensions/gsd/doctor-types.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/forensics.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +5 -13
- package/src/resources/extensions/gsd/gsd-db.ts +2 -12
- package/src/resources/extensions/gsd/guided-flow.ts +25 -25
- package/src/resources/extensions/gsd/memory-store.ts +28 -81
- package/src/resources/extensions/gsd/model-router.ts +9 -172
- package/src/resources/extensions/gsd/native-git-bridge.ts +1 -7
- package/src/resources/extensions/gsd/preferences-models.ts +15 -101
- package/src/resources/extensions/gsd/preferences-types.ts +0 -6
- package/src/resources/extensions/gsd/preferences-validation.ts +0 -35
- package/src/resources/extensions/gsd/preferences.ts +2 -16
- package/src/resources/extensions/gsd/prompt-loader.ts +12 -26
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -9
- package/src/resources/extensions/gsd/state.ts +0 -42
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1 -178
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -58
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -21
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +211 -138
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +59 -142
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +4 -7
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +32 -89
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +23 -41
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +87 -22
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +118 -7
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +60 -18
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +76 -14
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +83 -22
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +63 -1
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +1 -26
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -30
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +4 -14
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +12 -22
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +1 -64
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -22
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -128
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/model-router.test.ts +8 -169
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +43 -32
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +10 -4
- package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +0 -16
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -7
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +19 -168
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +1 -7
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -23
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +4 -51
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +16 -7
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -15
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +0 -15
- package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -17
- package/src/resources/extensions/gsd/unit-context-manifest.ts +8 -8
- package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
- package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -3
- package/src/resources/extensions/gsd/workflow-logger.ts +0 -1
- package/src/resources/extensions/gsd/worktree-command.ts +44 -31
- package/src/resources/extensions/mcp-client/index.ts +3 -6
- package/src/resources/extensions/slash-commands/create-extension.ts +24 -38
- package/src/resources/skills/create-gsd-extension/SKILL.md +5 -9
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
- package/dist/cli-policy.d.ts +0 -13
- package/dist/cli-policy.js +0 -17
- package/dist/resources/.managed-resources-content-hash +0 -1
- package/dist/resources/extensions/gsd/auto-runtime-state.js +0 -31
- package/dist/resources/extensions/gsd/milestone-id-reservation.js +0 -36
- package/dist/resources/extensions/gsd/worktree-session-state.js +0 -33
- package/dist/runtime-checks.d.ts +0 -27
- package/dist/runtime-checks.js +0 -38
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +0 -1
- package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +0 -1
- package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +0 -1
- package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +0 -1
- package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +0 -2
- package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +0 -20
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +0 -1
- package/dist/worktree-status-banner.d.ts +0 -1
- package/dist/worktree-status-banner.js +0 -132
- package/packages/mcp-server/dist/alias-telemetry.d.ts +0 -8
- package/packages/mcp-server/dist/alias-telemetry.d.ts.map +0 -1
- package/packages/mcp-server/dist/alias-telemetry.js +0 -30
- package/packages/mcp-server/dist/alias-telemetry.js.map +0 -1
- package/packages/mcp-server/src/alias-telemetry.test.ts +0 -78
- package/packages/mcp-server/src/alias-telemetry.ts +0 -30
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +0 -231
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +0 -289
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +0 -37
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/token-telemetry.js +0 -49
- package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +0 -133
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +0 -78
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +0 -181
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/token-telemetry.ts +0 -77
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +0 -212
- package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +0 -102
- package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +0 -200
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +0 -2
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +0 -1
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +0 -161
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +0 -1
- package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +0 -219
- package/src/resources/extensions/gsd/auto-runtime-state.ts +0 -51
- package/src/resources/extensions/gsd/milestone-id-reservation.ts +0 -47
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +0 -93
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +0 -63
- package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +0 -81
- package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +0 -57
- package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +0 -145
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +0 -124
- package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +0 -152
- package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +0 -50
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -93
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +0 -101
- package/src/resources/extensions/gsd/worktree-session-state.ts +0 -35
- package/src/resources/extensions/mcp-client/tests/global-config.test.ts +0 -91
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +0 -58
- /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_ssgManifest.js +0 -0
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
resolveModelForComplexity,
|
|
6
6
|
escalateTier,
|
|
7
7
|
defaultRoutingConfig,
|
|
8
|
-
resolveModelForTier,
|
|
9
8
|
scoreModel,
|
|
10
9
|
computeTaskRequirements,
|
|
11
10
|
scoreEligibleModels,
|
|
@@ -249,172 +248,6 @@ test("#2192: known model is still downgraded normally", () => {
|
|
|
249
248
|
assert.notEqual(result.modelId, "claude-opus-4-6");
|
|
250
249
|
});
|
|
251
250
|
|
|
252
|
-
// ─── Cross-provider fallback ──────────────────────────────────────────────────
|
|
253
|
-
|
|
254
|
-
test("uses cross-provider equivalent when configured primary is unavailable", () => {
|
|
255
|
-
const config = { ...defaultRoutingConfig(), enabled: true };
|
|
256
|
-
// Profile default says claude-opus-4-6 for planning, but user is on GPT only
|
|
257
|
-
const result = resolveModelForComplexity(
|
|
258
|
-
makeClassification("heavy"),
|
|
259
|
-
{ primary: "claude-opus-4-6", fallbacks: [] },
|
|
260
|
-
config,
|
|
261
|
-
["gpt-4o", "gpt-4o-mini", "o1"],
|
|
262
|
-
);
|
|
263
|
-
// o1 is the heavy-tier GPT model — should be selected as cross-provider equivalent
|
|
264
|
-
assert.equal(result.modelId, "o1");
|
|
265
|
-
assert.equal(result.wasDowngraded, false);
|
|
266
|
-
assert.match(result.reason, /cross-provider/);
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
test("cross-provider: selects standard-tier equivalent when primary unavailable", () => {
|
|
270
|
-
const config = { ...defaultRoutingConfig(), enabled: true };
|
|
271
|
-
// Planning configured with Opus, but only GPT standard models available
|
|
272
|
-
const result = resolveModelForComplexity(
|
|
273
|
-
makeClassification("heavy"),
|
|
274
|
-
{ primary: "claude-opus-4-6", fallbacks: [] },
|
|
275
|
-
config,
|
|
276
|
-
["gpt-4o", "gpt-4o-mini"],
|
|
277
|
-
);
|
|
278
|
-
// gpt-4o is standard tier, not heavy — no heavy-tier model available
|
|
279
|
-
// Should fall back to gpt-4o (best available)
|
|
280
|
-
assert.ok(result.modelId === "gpt-4o" || result.modelId === "claude-opus-4-6");
|
|
281
|
-
assert.equal(result.wasDowngraded, false);
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
test("cross-provider: configured primary available by bare ID wins over equivalent", () => {
|
|
285
|
-
const config = { ...defaultRoutingConfig(), enabled: true };
|
|
286
|
-
// Provider-prefixed ID — bare match should find it
|
|
287
|
-
const result = resolveModelForComplexity(
|
|
288
|
-
makeClassification("heavy"),
|
|
289
|
-
{ primary: "claude-opus-4-6", fallbacks: [] },
|
|
290
|
-
config,
|
|
291
|
-
["anthropic/claude-opus-4-6", "o1"],
|
|
292
|
-
);
|
|
293
|
-
assert.equal(result.modelId, "claude-opus-4-6");
|
|
294
|
-
assert.equal(result.wasDowngraded, false);
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
// ─── resolveModelForTier (provider-agnostic tier resolution) ────────────────
|
|
298
|
-
|
|
299
|
-
test("resolveModelForTier: returns canonical Anthropic model when no available models", () => {
|
|
300
|
-
assert.equal(resolveModelForTier("heavy", []), "claude-opus-4-6");
|
|
301
|
-
assert.equal(resolveModelForTier("standard", []), "claude-sonnet-4-6");
|
|
302
|
-
assert.equal(resolveModelForTier("light", []), "claude-haiku-4-5");
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
test("resolveModelForTier: returns canonical model when it is available", () => {
|
|
306
|
-
assert.equal(
|
|
307
|
-
resolveModelForTier("heavy", ["claude-opus-4-6", "claude-sonnet-4-6"]),
|
|
308
|
-
"claude-opus-4-6",
|
|
309
|
-
);
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
test("resolveModelForTier: does not prefer canonical over cheaper same-tier model", () => {
|
|
313
|
-
const result = resolveModelForTier("light", ["claude-haiku-4-5", "gpt-4o-mini"]);
|
|
314
|
-
assert.equal(result, "gpt-4o-mini");
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
test("resolveModelForTier: honors configured tier_models pins", () => {
|
|
318
|
-
const config: DynamicRoutingConfig = {
|
|
319
|
-
...defaultRoutingConfig(),
|
|
320
|
-
tier_models: { light: "claude-haiku-4-5" },
|
|
321
|
-
};
|
|
322
|
-
const result = resolveModelForTier("light", ["claude-haiku-4-5", "gpt-4o-mini"], config);
|
|
323
|
-
assert.equal(result, "claude-haiku-4-5");
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
test("resolveModelForTier: picks cross-provider equivalent when Anthropic unavailable", () => {
|
|
327
|
-
// Only OpenAI models available
|
|
328
|
-
const result = resolveModelForTier("heavy", ["gpt-4o", "gpt-4o-mini", "o1"]);
|
|
329
|
-
// o1 is the heavy-tier model in the OpenAI lineup
|
|
330
|
-
assert.equal(result, "o1");
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
test("resolveModelForTier: picks standard-tier cross-provider model", () => {
|
|
334
|
-
const result = resolveModelForTier("standard", ["gpt-4o", "gpt-4o-mini"]);
|
|
335
|
-
assert.equal(result, "gpt-4o");
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
test("resolveModelForTier: picks light-tier cross-provider model", () => {
|
|
339
|
-
const result = resolveModelForTier("light", ["gpt-4o", "gpt-4o-mini"]);
|
|
340
|
-
assert.equal(result, "gpt-4o-mini");
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
test("resolveModelForTier: falls back to canonical when no tier match available", () => {
|
|
344
|
-
// Only unknown models available — getModelTier classifies unknowns as
|
|
345
|
-
// "standard", so a request for "heavy" finds no match and the canonical
|
|
346
|
-
// Anthropic ID is returned as a documented fallback.
|
|
347
|
-
const result = resolveModelForTier("heavy", ["some-custom-model"]);
|
|
348
|
-
assert.equal(result, "claude-opus-4-6");
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
test("resolveModelForTier: handles provider-prefixed available models", () => {
|
|
352
|
-
const result = resolveModelForTier("heavy", ["anthropic/claude-opus-4-6"]);
|
|
353
|
-
assert.equal(result, "claude-opus-4-6");
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
test("resolveModelForTier: picks Gemini models when only Google available", () => {
|
|
357
|
-
const result = resolveModelForTier("light", ["gemini-2.5-pro", "gemini-2.0-flash"]);
|
|
358
|
-
assert.equal(result, "gemini-2.0-flash");
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
// ─── Behavioral: profile defaults are provider-agnostic at runtime ──────────
|
|
362
|
-
|
|
363
|
-
test("resolveProfileDefaults: balanced with only OpenAI models returns OpenAI IDs", async () => {
|
|
364
|
-
const { resolveProfileDefaults } = await import("../preferences-models.js");
|
|
365
|
-
const defaults = resolveProfileDefaults("balanced", ["gpt-4o", "gpt-4o-mini"]);
|
|
366
|
-
assert.ok(defaults.models, "balanced should populate models");
|
|
367
|
-
// All slots must resolve to an available OpenAI ID — not a claude- canonical.
|
|
368
|
-
for (const [phase, modelId] of Object.entries(defaults.models!)) {
|
|
369
|
-
assert.ok(typeof modelId === "string" && modelId.length > 0, `${phase} should resolve to a model ID`);
|
|
370
|
-
assert.ok(
|
|
371
|
-
!String(modelId).startsWith("claude-"),
|
|
372
|
-
`${phase} resolved to ${modelId} but no claude-* model is available — should be OpenAI`,
|
|
373
|
-
);
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
test("resolveProfileDefaults: budget with only OpenAI models picks gpt-4o-mini for light slots", async () => {
|
|
378
|
-
const { resolveProfileDefaults } = await import("../preferences-models.js");
|
|
379
|
-
const defaults = resolveProfileDefaults("budget", ["gpt-4o", "gpt-4o-mini"]);
|
|
380
|
-
// light-tier slots in budget: research, execution_simple, completion, subagent
|
|
381
|
-
assert.equal(defaults.models?.research, "gpt-4o-mini");
|
|
382
|
-
assert.equal(defaults.models?.execution_simple, "gpt-4o-mini");
|
|
383
|
-
assert.equal(defaults.models?.completion, "gpt-4o-mini");
|
|
384
|
-
assert.equal(defaults.models?.subagent, "gpt-4o-mini");
|
|
385
|
-
// standard-tier slots: planning, execution
|
|
386
|
-
assert.equal(defaults.models?.planning, "gpt-4o");
|
|
387
|
-
assert.equal(defaults.models?.execution, "gpt-4o");
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
test("resolveProfileDefaults: honors dynamic routing tier_models pins", async () => {
|
|
391
|
-
const { resolveProfileDefaults } = await import("../preferences-models.js");
|
|
392
|
-
const defaults = resolveProfileDefaults(
|
|
393
|
-
"budget",
|
|
394
|
-
["claude-haiku-4-5", "gpt-4o-mini", "gpt-4o"],
|
|
395
|
-
{ ...defaultRoutingConfig(), tier_models: { light: "claude-haiku-4-5" } },
|
|
396
|
-
);
|
|
397
|
-
assert.equal(defaults.models?.research, "claude-haiku-4-5");
|
|
398
|
-
assert.equal(defaults.models?.execution_simple, "claude-haiku-4-5");
|
|
399
|
-
assert.equal(defaults.models?.completion, "claude-haiku-4-5");
|
|
400
|
-
assert.equal(defaults.models?.subagent, "claude-haiku-4-5");
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
test("resolveProfileDefaults: empty availableModelIds falls back to canonical Anthropic IDs", async () => {
|
|
404
|
-
const { resolveProfileDefaults } = await import("../preferences-models.js");
|
|
405
|
-
const defaults = resolveProfileDefaults("balanced", []);
|
|
406
|
-
// Documented fallback only — when registry is unavailable at bootstrap.
|
|
407
|
-
const planningModel = defaults.models?.planning;
|
|
408
|
-
assert.ok(typeof planningModel === "string" && planningModel.startsWith("claude-"));
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
test("resolveProfileDefaults: burn-max omits models so user choice is preserved", async () => {
|
|
412
|
-
const { resolveProfileDefaults } = await import("../preferences-models.js");
|
|
413
|
-
const defaults = resolveProfileDefaults("burn-max", ["gpt-4o"]);
|
|
414
|
-
assert.equal(defaults.models, undefined, "burn-max must not write model defaults");
|
|
415
|
-
assert.equal(defaults.dynamic_routing?.enabled, false);
|
|
416
|
-
});
|
|
417
|
-
|
|
418
251
|
// ─── Capability Scoring (ADR-004 Phase 2) ───────────────────────────────────
|
|
419
252
|
|
|
420
253
|
test("defaultRoutingConfig includes capability_routing: true", () => {
|
|
@@ -446,8 +279,14 @@ test("scoreModel computes weighted average of capability × requirement", () =>
|
|
|
446
279
|
assert.ok(Math.abs(score - 88.21) < 0.1, `score ${score} should be ~88.21`);
|
|
447
280
|
});
|
|
448
281
|
|
|
449
|
-
|
|
450
|
-
|
|
282
|
+
test("scoreModel returns 50 for empty requirements", () => {
|
|
283
|
+
const caps: ModelCapabilities = {
|
|
284
|
+
coding: 90, debugging: 80, research: 70,
|
|
285
|
+
reasoning: 85, speed: 50, longContext: 60, instruction: 75,
|
|
286
|
+
};
|
|
287
|
+
const score = scoreModel(caps, {});
|
|
288
|
+
assert.equal(score, 50);
|
|
289
|
+
});
|
|
451
290
|
|
|
452
291
|
test("computeTaskRequirements returns base vector for known unit type", () => {
|
|
453
292
|
const reqs = computeTaskRequirements("execute-task");
|
|
@@ -101,14 +101,6 @@ describe("auditOrphanedMilestoneBranches", () => {
|
|
|
101
101
|
result.warnings.some(w => w.includes("NOT merged")),
|
|
102
102
|
"should warn about unmerged branch",
|
|
103
103
|
);
|
|
104
|
-
assert.ok(
|
|
105
|
-
result.warnings.some(w => w.includes("/gsd doctor fix")),
|
|
106
|
-
`warning should suggest the real remediation command; got: ${JSON.stringify(result.warnings)}`,
|
|
107
|
-
);
|
|
108
|
-
assert.ok(
|
|
109
|
-
result.warnings.every(w => !w.includes("/gsd health --fix")),
|
|
110
|
-
`warning must not suggest the removed health --fix command; got: ${JSON.stringify(result.warnings)}`,
|
|
111
|
-
);
|
|
112
104
|
|
|
113
105
|
// Branch should still exist (data safety)
|
|
114
106
|
const branches = run("git branch --list milestone/M001", dir);
|
|
@@ -19,15 +19,13 @@ import { join } from "node:path";
|
|
|
19
19
|
import { tmpdir } from "node:os";
|
|
20
20
|
|
|
21
21
|
import {
|
|
22
|
+
persistState,
|
|
22
23
|
restoreState,
|
|
23
24
|
resetOrchestrator,
|
|
25
|
+
getOrchestratorState,
|
|
24
26
|
type PersistedState,
|
|
25
27
|
} from "../parallel-orchestrator.ts";
|
|
26
|
-
import {
|
|
27
|
-
writeSessionStatus,
|
|
28
|
-
readAllSessionStatuses,
|
|
29
|
-
cleanupStaleSessions,
|
|
30
|
-
} from "../session-status-io.ts";
|
|
28
|
+
import { writeSessionStatus, readAllSessionStatuses, removeSessionStatus } from "../session-status-io.ts";
|
|
31
29
|
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
32
30
|
|
|
33
31
|
function makeTempDir(): string {
|
|
@@ -59,20 +57,17 @@ function makePersistedState(overrides: Partial<PersistedState> = {}): PersistedS
|
|
|
59
57
|
|
|
60
58
|
|
|
61
59
|
describe('parallel-crash-recovery', () => {
|
|
62
|
-
test('Test 1:
|
|
60
|
+
test('Test 1: persistState writes valid JSON', () => {
|
|
63
61
|
const basePath = makeTempDir();
|
|
64
62
|
try {
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
// schema (the contract between persistState's writer and the reader)
|
|
68
|
-
// — earlier this test inlined a test-only writer and re-parsed JSON,
|
|
69
|
-
// bypassing production code entirely.
|
|
63
|
+
// We can't call persistState directly without internal state set up,
|
|
64
|
+
// so we test the round-trip by writing a state file and reading it back
|
|
70
65
|
const state = makePersistedState({
|
|
71
66
|
workers: [
|
|
72
67
|
{
|
|
73
68
|
milestoneId: "M001",
|
|
74
69
|
title: "M001",
|
|
75
|
-
pid: process.pid,
|
|
70
|
+
pid: process.pid,
|
|
76
71
|
worktreePath: "/tmp/wt-M001",
|
|
77
72
|
startedAt: Date.now(),
|
|
78
73
|
state: "running",
|
|
@@ -83,13 +78,13 @@ test('Test 1: orchestrator.json round-trips through restoreState (preserves work
|
|
|
83
78
|
});
|
|
84
79
|
writeStateFile(basePath, state);
|
|
85
80
|
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
assert.deepStrictEqual(
|
|
89
|
-
assert.deepStrictEqual(
|
|
90
|
-
assert.deepStrictEqual(
|
|
91
|
-
assert.deepStrictEqual(
|
|
92
|
-
assert.deepStrictEqual(
|
|
81
|
+
const raw = readFileSync(stateFilePath(basePath), "utf-8");
|
|
82
|
+
const parsed = JSON.parse(raw) as PersistedState;
|
|
83
|
+
assert.deepStrictEqual(parsed.active, true, "persistState: active field preserved");
|
|
84
|
+
assert.deepStrictEqual(parsed.workers.length, 1, "persistState: worker count preserved");
|
|
85
|
+
assert.deepStrictEqual(parsed.workers[0].milestoneId, "M001", "persistState: milestoneId preserved");
|
|
86
|
+
assert.deepStrictEqual(parsed.workers[0].cost, 0.15, "persistState: cost preserved");
|
|
87
|
+
assert.deepStrictEqual(parsed.totalCost, 0.15, "persistState: totalCost preserved");
|
|
93
88
|
} finally {
|
|
94
89
|
rmSync(basePath, { recursive: true, force: true });
|
|
95
90
|
}
|
|
@@ -206,12 +201,11 @@ test('Test 5: restoreState skips stopped/error workers even with alive PIDs', ()
|
|
|
206
201
|
}
|
|
207
202
|
});
|
|
208
203
|
|
|
209
|
-
test('Test 6:
|
|
204
|
+
test('Test 6: orphan detection finds stale sessions', () => {
|
|
210
205
|
const basePath = makeTempDir();
|
|
211
206
|
try {
|
|
207
|
+
// Write a session status with a dead PID
|
|
212
208
|
mkdirSync(join(basePath, ".gsd", "parallel"), { recursive: true });
|
|
213
|
-
|
|
214
|
-
// Dead PID
|
|
215
209
|
writeSessionStatus(basePath, {
|
|
216
210
|
milestoneId: "M001",
|
|
217
211
|
pid: 99999999,
|
|
@@ -224,7 +218,7 @@ test('Test 6: cleanupStaleSessions removes dead-PID sessions and keeps live ones
|
|
|
224
218
|
worktreePath: "/tmp/wt-M001",
|
|
225
219
|
});
|
|
226
220
|
|
|
227
|
-
//
|
|
221
|
+
// Write a session status with alive PID
|
|
228
222
|
writeSessionStatus(basePath, {
|
|
229
223
|
milestoneId: "M002",
|
|
230
224
|
pid: process.pid,
|
|
@@ -237,20 +231,37 @@ test('Test 6: cleanupStaleSessions removes dead-PID sessions and keeps live ones
|
|
|
237
231
|
worktreePath: "/tmp/wt-M002",
|
|
238
232
|
});
|
|
239
233
|
|
|
234
|
+
// Read all sessions — both should exist initially
|
|
240
235
|
const before = readAllSessionStatuses(basePath);
|
|
241
|
-
assert.deepStrictEqual(before.length, 2, "both sessions exist before
|
|
236
|
+
assert.deepStrictEqual(before.length, 2, "orphan: both sessions exist before detection");
|
|
242
237
|
|
|
243
|
-
//
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
238
|
+
// Now simulate orphan detection logic (same as prepareParallelStart)
|
|
239
|
+
const sessions = readAllSessionStatuses(basePath);
|
|
240
|
+
const orphans: Array<{ milestoneId: string; pid: number; alive: boolean }> = [];
|
|
241
|
+
for (const session of sessions) {
|
|
242
|
+
let alive: boolean;
|
|
243
|
+
try {
|
|
244
|
+
process.kill(session.pid, 0);
|
|
245
|
+
alive = true;
|
|
246
|
+
} catch {
|
|
247
|
+
alive = false;
|
|
248
|
+
}
|
|
249
|
+
orphans.push({ milestoneId: session.milestoneId, pid: session.pid, alive });
|
|
250
|
+
if (!alive) {
|
|
251
|
+
removeSessionStatus(basePath, session.milestoneId);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
248
254
|
|
|
249
|
-
assert.
|
|
255
|
+
assert.ok(orphans.length === 2, "orphan: detected both sessions");
|
|
256
|
+
const deadOrphan = orphans.find(o => o.milestoneId === "M001");
|
|
257
|
+
assert.ok(deadOrphan !== undefined && !deadOrphan.alive, "orphan: M001 detected as dead");
|
|
258
|
+
const aliveOrphan = orphans.find(o => o.milestoneId === "M002");
|
|
259
|
+
assert.ok(aliveOrphan !== undefined && aliveOrphan.alive, "orphan: M002 detected as alive");
|
|
250
260
|
|
|
261
|
+
// Dead session should be cleaned up
|
|
251
262
|
const after = readAllSessionStatuses(basePath);
|
|
252
|
-
assert.deepStrictEqual(after.length, 1, "dead session cleaned up");
|
|
253
|
-
assert.deepStrictEqual(after[0].milestoneId, "M002", "alive session remains");
|
|
263
|
+
assert.deepStrictEqual(after.length, 1, "orphan: dead session cleaned up");
|
|
264
|
+
assert.deepStrictEqual(after[0].milestoneId, "M002", "orphan: alive session remains");
|
|
254
265
|
} finally {
|
|
255
266
|
rmSync(basePath, { recursive: true, force: true });
|
|
256
267
|
}
|
|
@@ -18,14 +18,20 @@ const phasesSrc = readFileSync(phasesPath, "utf-8");
|
|
|
18
18
|
|
|
19
19
|
console.log("\n=== #2766: Non-MergeConflictError stops auto mode ===");
|
|
20
20
|
|
|
21
|
-
// ── Test 1:
|
|
21
|
+
// ── Test 1: phases.ts calls logError for non-conflict merge errors ──────
|
|
22
|
+
|
|
23
|
+
assertTrue(
|
|
24
|
+
phasesPath.length > 0 && phasesPath.endsWith("phases.ts"),
|
|
25
|
+
"phases.ts file exists and is readable",
|
|
26
|
+
);
|
|
22
27
|
|
|
23
28
|
// Count all mergeAndExit catch blocks by finding "} catch (mergeErr)" patterns
|
|
24
|
-
const
|
|
29
|
+
const mergeErrCatches = [...phasesPath.matchAll(/\} catch \(mergeErr\)/g)];
|
|
30
|
+
// Use the source itself for matching
|
|
25
31
|
const mergeErrCatchCount = [...phasesSrc.matchAll(/\} catch \(mergeErr\)/g)].length;
|
|
26
32
|
assertTrue(
|
|
27
|
-
mergeErrCatchCount
|
|
28
|
-
`
|
|
33
|
+
mergeErrCatchCount >= 3,
|
|
34
|
+
`all mergeAndExit call sites have catch (mergeErr) blocks (found ${mergeErrCatchCount}, expected >= 3)`,
|
|
29
35
|
);
|
|
30
36
|
|
|
31
37
|
// ── Test 2: Every mergeErr catch block handles non-MergeConflictError ───
|
|
@@ -236,20 +236,6 @@ test("valid values pass through correctly", () => {
|
|
|
236
236
|
assert.equal(p3.auto_supervisor?.model, "claude-opus-4-6");
|
|
237
237
|
});
|
|
238
238
|
|
|
239
|
-
test("min_request_interval_ms floors decimals and rejects timer overflow values", () => {
|
|
240
|
-
const valid = validatePreferences({ min_request_interval_ms: 1000.9 });
|
|
241
|
-
assert.equal(valid.errors.length, 0);
|
|
242
|
-
assert.equal(valid.preferences.min_request_interval_ms, 1000);
|
|
243
|
-
|
|
244
|
-
const max = validatePreferences({ min_request_interval_ms: 2_147_483_647 });
|
|
245
|
-
assert.equal(max.errors.length, 0);
|
|
246
|
-
assert.equal(max.preferences.min_request_interval_ms, 2_147_483_647);
|
|
247
|
-
|
|
248
|
-
const tooHigh = validatePreferences({ min_request_interval_ms: 2_147_483_648 });
|
|
249
|
-
assert.ok(tooHigh.errors.some(e => e.includes("min_request_interval_ms must be a non-negative number <= 2147483647")));
|
|
250
|
-
assert.equal(tooHigh.preferences.min_request_interval_ms, undefined);
|
|
251
|
-
});
|
|
252
|
-
|
|
253
239
|
test("mixed valid/invalid/unknown keys handled correctly", () => {
|
|
254
240
|
const { preferences, errors, warnings } = validatePreferences({
|
|
255
241
|
uat_dispatch: true, totally_made_up: "value", budget_ceiling: "garbage",
|
|
@@ -260,71 +246,6 @@ test("mixed valid/invalid/unknown keys handled correctly", () => {
|
|
|
260
246
|
assert.equal(preferences.budget_ceiling, undefined);
|
|
261
247
|
});
|
|
262
248
|
|
|
263
|
-
test("disabled_model_providers validates and normalizes string arrays", () => {
|
|
264
|
-
const { preferences, errors } = validatePreferences({
|
|
265
|
-
disabled_model_providers: ["google-gemini-cli", " google-gemini-cli ", "openai-codex", " "],
|
|
266
|
-
});
|
|
267
|
-
assert.equal(errors.length, 0);
|
|
268
|
-
assert.deepEqual(preferences.disabled_model_providers, ["google-gemini-cli", "openai-codex"]);
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
test("disabled_model_providers rejects non-array values", () => {
|
|
272
|
-
const { errors } = validatePreferences({ disabled_model_providers: "google-gemini-cli" as any });
|
|
273
|
-
assert.ok(errors.some((e) => e.includes("disabled_model_providers must be an array of strings")));
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
test("loadEffectiveGSDPreferences preserves disabled_model_providers across merge layers", () => {
|
|
277
|
-
const originalCwd = process.cwd();
|
|
278
|
-
const originalGsdHome = process.env.GSD_HOME;
|
|
279
|
-
const tempProject = mkdtempSync(join(tmpdir(), "gsd-disabled-provider-project-"));
|
|
280
|
-
const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-disabled-provider-home-"));
|
|
281
|
-
|
|
282
|
-
try {
|
|
283
|
-
mkdirSync(join(tempProject, ".gsd"), { recursive: true });
|
|
284
|
-
|
|
285
|
-
writeFileSync(
|
|
286
|
-
join(tempGsdHome, "PREFERENCES.md"),
|
|
287
|
-
[
|
|
288
|
-
"---",
|
|
289
|
-
"version: 1",
|
|
290
|
-
"disabled_model_providers:",
|
|
291
|
-
" - google-gemini-cli",
|
|
292
|
-
"---",
|
|
293
|
-
].join("\n"),
|
|
294
|
-
"utf-8",
|
|
295
|
-
);
|
|
296
|
-
|
|
297
|
-
writeFileSync(
|
|
298
|
-
join(tempProject, ".gsd", "PREFERENCES.md"),
|
|
299
|
-
[
|
|
300
|
-
"---",
|
|
301
|
-
"version: 1",
|
|
302
|
-
"disabled_model_providers:",
|
|
303
|
-
" - openai-codex",
|
|
304
|
-
" - google-gemini-cli",
|
|
305
|
-
"---",
|
|
306
|
-
].join("\n"),
|
|
307
|
-
"utf-8",
|
|
308
|
-
);
|
|
309
|
-
|
|
310
|
-
process.env.GSD_HOME = tempGsdHome;
|
|
311
|
-
process.chdir(tempProject);
|
|
312
|
-
|
|
313
|
-
const loaded = loadEffectiveGSDPreferences();
|
|
314
|
-
assert.notEqual(loaded, null);
|
|
315
|
-
assert.deepEqual(
|
|
316
|
-
loaded!.preferences.disabled_model_providers,
|
|
317
|
-
["google-gemini-cli", "openai-codex"],
|
|
318
|
-
);
|
|
319
|
-
} finally {
|
|
320
|
-
process.chdir(originalCwd);
|
|
321
|
-
if (originalGsdHome === undefined) delete process.env.GSD_HOME;
|
|
322
|
-
else process.env.GSD_HOME = originalGsdHome;
|
|
323
|
-
rmSync(tempProject, { recursive: true, force: true });
|
|
324
|
-
rmSync(tempGsdHome, { recursive: true, force: true });
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
|
|
328
249
|
// ── Wizard fields ────────────────────────────────────────────────────────────
|
|
329
250
|
|
|
330
251
|
test("budget fields validate correctly", () => {
|
|
@@ -762,54 +683,6 @@ test("loadEffectiveGSDPreferences exposes slice_parallel prefs to runtime caller
|
|
|
762
683
|
}
|
|
763
684
|
});
|
|
764
685
|
|
|
765
|
-
test("loadEffectiveGSDPreferences merges min_request_interval_ms with project overriding global (#2996)", () => {
|
|
766
|
-
const originalCwd = process.cwd();
|
|
767
|
-
const originalGsdHome = process.env.GSD_HOME;
|
|
768
|
-
const tempProject = mkdtempSync(join(tmpdir(), "gsd-rate-limit-project-"));
|
|
769
|
-
const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-rate-limit-home-"));
|
|
770
|
-
|
|
771
|
-
try {
|
|
772
|
-
mkdirSync(join(tempProject, ".gsd"), { recursive: true });
|
|
773
|
-
|
|
774
|
-
writeFileSync(
|
|
775
|
-
join(tempGsdHome, "PREFERENCES.md"),
|
|
776
|
-
[
|
|
777
|
-
"---",
|
|
778
|
-
"version: 1",
|
|
779
|
-
"min_request_interval_ms: 250",
|
|
780
|
-
"budget_ceiling: 45",
|
|
781
|
-
"---",
|
|
782
|
-
].join("\n"),
|
|
783
|
-
"utf-8",
|
|
784
|
-
);
|
|
785
|
-
|
|
786
|
-
writeFileSync(
|
|
787
|
-
join(tempProject, ".gsd", "PREFERENCES.md"),
|
|
788
|
-
[
|
|
789
|
-
"---",
|
|
790
|
-
"version: 1",
|
|
791
|
-
"min_request_interval_ms: 100",
|
|
792
|
-
"---",
|
|
793
|
-
].join("\n"),
|
|
794
|
-
"utf-8",
|
|
795
|
-
);
|
|
796
|
-
|
|
797
|
-
process.env.GSD_HOME = tempGsdHome;
|
|
798
|
-
process.chdir(tempProject);
|
|
799
|
-
|
|
800
|
-
const loaded = loadEffectiveGSDPreferences();
|
|
801
|
-
assert.notEqual(loaded, null);
|
|
802
|
-
assert.equal(loaded!.preferences.min_request_interval_ms, 100);
|
|
803
|
-
assert.equal(loaded!.preferences.budget_ceiling, 45);
|
|
804
|
-
} finally {
|
|
805
|
-
process.chdir(originalCwd);
|
|
806
|
-
if (originalGsdHome === undefined) delete process.env.GSD_HOME;
|
|
807
|
-
else process.env.GSD_HOME = originalGsdHome;
|
|
808
|
-
rmSync(tempProject, { recursive: true, force: true });
|
|
809
|
-
rmSync(tempGsdHome, { recursive: true, force: true });
|
|
810
|
-
}
|
|
811
|
-
});
|
|
812
|
-
|
|
813
686
|
test("preferences paths use canonical uppercase filenames", () => {
|
|
814
687
|
const originalCwd = process.cwd();
|
|
815
688
|
const originalGsdHome = process.env.GSD_HOME;
|
|
@@ -93,20 +93,4 @@ describe('register-hooks session_before_compact (#3696)', () => {
|
|
|
93
93
|
'session_before_compact should not check isAutoPaused',
|
|
94
94
|
);
|
|
95
95
|
});
|
|
96
|
-
|
|
97
|
-
test('session_before_compact does not gate checkpointing to executing phase (#4258)', () => {
|
|
98
|
-
const compactIdx = registerHooksSrc.indexOf('session_before_compact');
|
|
99
|
-
assert.ok(compactIdx > -1, 'session_before_compact hook should exist');
|
|
100
|
-
|
|
101
|
-
const preCheckpointSection = registerHooksSrc.slice(
|
|
102
|
-
compactIdx,
|
|
103
|
-
registerHooksSrc.indexOf('const sliceDir', compactIdx),
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
const normalized = preCheckpointSection.replace(/\/\/.*$/gm, '');
|
|
107
|
-
assert.ok(
|
|
108
|
-
!/if\s*\(\s*state\.phase\s*!==\s*['"]executing['"]\s*\)\s*\{?\s*return\b/.test(normalized),
|
|
109
|
-
'session_before_compact should not early-return on non-executing phases',
|
|
110
|
-
);
|
|
111
|
-
});
|
|
112
96
|
});
|
|
@@ -103,13 +103,6 @@ test("classifyError detects Codex server_error from extracted message", () => {
|
|
|
103
103
|
assert.ok("retryAfterMs" in result && result.retryAfterMs === 30_000);
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
-
test("classifyError detects stream INTERNAL_ERROR received from peer as transient server", () => {
|
|
107
|
-
const result = classifyError("stream error: stream ID 75; INTERNAL_ERROR; received from peer");
|
|
108
|
-
assert.ok(isTransient(result));
|
|
109
|
-
assert.equal(result.kind, "server");
|
|
110
|
-
assert.ok("retryAfterMs" in result && result.retryAfterMs === 30_000);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
106
|
test("classifyError detects overloaded error", () => {
|
|
114
107
|
const result = classifyError("overloaded_error: Overloaded");
|
|
115
108
|
assert.ok(isTransient(result));
|
|
@@ -23,19 +23,19 @@ describe("quick task turn_end cleanup (#2668)", () => {
|
|
|
23
23
|
"utf-8",
|
|
24
24
|
);
|
|
25
25
|
|
|
26
|
-
it("register-hooks.ts
|
|
26
|
+
it("register-hooks.ts imports cleanupQuickBranch from quick.ts", () => {
|
|
27
27
|
assert.ok(
|
|
28
28
|
hooksSource.includes("cleanupQuickBranch"),
|
|
29
29
|
"register-hooks.ts must reference cleanupQuickBranch",
|
|
30
30
|
);
|
|
31
31
|
|
|
32
|
-
// Verify it
|
|
33
|
-
const importMatch =
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
// Verify it's imported (not just mentioned in a comment)
|
|
33
|
+
const importMatch = hooksSource.match(
|
|
34
|
+
/import\s*\{[^}]*cleanupQuickBranch[^}]*\}\s*from\s*["'][^"']*quick/,
|
|
35
|
+
);
|
|
36
36
|
assert.ok(
|
|
37
37
|
importMatch,
|
|
38
|
-
"cleanupQuickBranch must be
|
|
38
|
+
"cleanupQuickBranch must be imported from quick module",
|
|
39
39
|
);
|
|
40
40
|
});
|
|
41
41
|
|