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
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression tests for the optional sharp dependency in capture.ts.
|
|
3
|
+
*
|
|
4
|
+
* Behaviour:
|
|
5
|
+
* - constrainScreenshot must fall back to returning the raw buffer
|
|
6
|
+
* unchanged when sharp is unavailable, rather than throwing.
|
|
7
|
+
* - When sharp IS available, oversized screenshots get resized.
|
|
8
|
+
*
|
|
9
|
+
* No source-grep. The test drives the real constrainScreenshot function
|
|
10
|
+
* after seeding the module-private `_sharp` cache via the test-only
|
|
11
|
+
* `__setSharpForTesting` export.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const { describe, it, afterEach } = require("node:test");
|
|
15
|
+
const assert = require("node:assert/strict");
|
|
16
|
+
const jiti = require("jiti")(__filename, { interopDefault: true, debug: false });
|
|
17
|
+
|
|
18
|
+
const { constrainScreenshot, __setSharpForTesting } = jiti("../capture.ts");
|
|
19
|
+
|
|
20
|
+
describe("constrainScreenshot — sharp unavailable (null)", () => {
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
// Clear the test override so later tests don't inherit a null sharp.
|
|
23
|
+
__setSharpForTesting(undefined);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("returns the raw buffer unchanged when sharp is null", async () => {
|
|
27
|
+
__setSharpForTesting(null);
|
|
28
|
+
|
|
29
|
+
const rawBuffer = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); // PNG magic bytes
|
|
30
|
+
const result = await constrainScreenshot(null, rawBuffer, "image/png", 80);
|
|
31
|
+
|
|
32
|
+
assert.strictEqual(
|
|
33
|
+
result,
|
|
34
|
+
rawBuffer,
|
|
35
|
+
"constrainScreenshot must return the exact same buffer instance when sharp is null",
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("returns the raw buffer unchanged for JPEG input when sharp is null", async () => {
|
|
40
|
+
__setSharpForTesting(null);
|
|
41
|
+
|
|
42
|
+
const rawBuffer = Buffer.from([0xff, 0xd8, 0xff, 0xe0]); // JPEG magic bytes
|
|
43
|
+
const result = await constrainScreenshot(null, rawBuffer, "image/jpeg", 80);
|
|
44
|
+
|
|
45
|
+
assert.strictEqual(result, rawBuffer);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe("constrainScreenshot — sharp available", () => {
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
__setSharpForTesting(undefined);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("passes through a small image unchanged (below cap)", async () => {
|
|
55
|
+
const sharp = require("sharp");
|
|
56
|
+
const small = await sharp({
|
|
57
|
+
create: {
|
|
58
|
+
width: 400,
|
|
59
|
+
height: 300,
|
|
60
|
+
channels: 3,
|
|
61
|
+
background: { r: 128, g: 128, b: 128 },
|
|
62
|
+
},
|
|
63
|
+
})
|
|
64
|
+
.jpeg({ quality: 80 })
|
|
65
|
+
.toBuffer();
|
|
66
|
+
|
|
67
|
+
const result = await constrainScreenshot(null, small, "image/jpeg", 80);
|
|
68
|
+
const meta = await sharp(result).metadata();
|
|
69
|
+
assert.equal(meta.width, 400, "small images must not be resized");
|
|
70
|
+
assert.equal(meta.height, 300);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("resizes an oversized image to within 1568px", async () => {
|
|
74
|
+
const sharp = require("sharp");
|
|
75
|
+
const big = await sharp({
|
|
76
|
+
create: {
|
|
77
|
+
width: 3000,
|
|
78
|
+
height: 2000,
|
|
79
|
+
channels: 3,
|
|
80
|
+
background: { r: 128, g: 128, b: 128 },
|
|
81
|
+
},
|
|
82
|
+
})
|
|
83
|
+
.jpeg({ quality: 80 })
|
|
84
|
+
.toBuffer();
|
|
85
|
+
|
|
86
|
+
const result = await constrainScreenshot(null, big, "image/jpeg", 80);
|
|
87
|
+
const meta = await sharp(result).metadata();
|
|
88
|
+
assert.ok(meta.width <= 1568, `width ${meta.width} must be <= 1568`);
|
|
89
|
+
assert.ok(meta.height <= 1568, `height ${meta.height} must be <= 1568`);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -163,17 +163,6 @@ function resolveDispatchNodeKind(unitType, sidecarItem) {
|
|
|
163
163
|
}
|
|
164
164
|
return "unit";
|
|
165
165
|
}
|
|
166
|
-
async function enforceMinRequestInterval(s, prefs) {
|
|
167
|
-
const minInterval = prefs?.min_request_interval_ms ?? 0;
|
|
168
|
-
if (minInterval > 0 && s.lastRequestTimestamp > 0) {
|
|
169
|
-
const elapsed = Date.now() - s.lastRequestTimestamp;
|
|
170
|
-
if (elapsed < minInterval) {
|
|
171
|
-
const waitMs = minInterval - elapsed;
|
|
172
|
-
debugLog("autoLoop", { phase: "rate-limit-wait", waitMs });
|
|
173
|
-
await new Promise(r => setTimeout(r, waitMs));
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
166
|
async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem) {
|
|
178
167
|
if (dispatchContract === "legacy-direct") {
|
|
179
168
|
return runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
@@ -403,13 +392,7 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
403
392
|
break;
|
|
404
393
|
}
|
|
405
394
|
// ── Unit execution (shared with dev path) ──
|
|
406
|
-
await enforceMinRequestInterval(s, prefs);
|
|
407
395
|
const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState);
|
|
408
|
-
if (unitPhaseResult.action === "next") {
|
|
409
|
-
const requestTimestamp = unitPhaseResult.data.requestDispatchedAt ?? unitPhaseResult.data.unitStartedAt;
|
|
410
|
-
if (typeof requestTimestamp === "number")
|
|
411
|
-
s.lastRequestTimestamp = requestTimestamp;
|
|
412
|
-
}
|
|
413
396
|
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
414
397
|
unitType: iterData.unitType,
|
|
415
398
|
unitId: iterData.unitId,
|
|
@@ -572,13 +555,7 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
572
555
|
sidecarKind: sidecarItem.kind,
|
|
573
556
|
});
|
|
574
557
|
}
|
|
575
|
-
await enforceMinRequestInterval(s, prefs);
|
|
576
558
|
const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem);
|
|
577
|
-
if (unitPhaseResult.action === "next") {
|
|
578
|
-
const requestTimestamp = unitPhaseResult.data.requestDispatchedAt ?? unitPhaseResult.data.unitStartedAt;
|
|
579
|
-
if (typeof requestTimestamp === "number")
|
|
580
|
-
s.lastRequestTimestamp = requestTimestamp;
|
|
581
|
-
}
|
|
582
559
|
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
583
560
|
unitType: iterData.unitType,
|
|
584
561
|
unitId: iterData.unitId,
|
|
@@ -1365,7 +1365,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
1365
1365
|
ctx.ui.notify(`${unitType} ${unitId} completed with 0 tool calls — context exhaustion, will retry`, "warning");
|
|
1366
1366
|
// Fall through to next iteration where dispatch will re-derive
|
|
1367
1367
|
// and re-dispatch this unit.
|
|
1368
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt
|
|
1368
|
+
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
|
|
1369
1369
|
}
|
|
1370
1370
|
}
|
|
1371
1371
|
}
|
|
@@ -1418,7 +1418,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
1418
1418
|
}
|
|
1419
1419
|
s.checkpointSha = null;
|
|
1420
1420
|
}
|
|
1421
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt
|
|
1421
|
+
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
|
|
1422
1422
|
}
|
|
1423
1423
|
// ─── runFinalize ──────────────────────────────────────────────────────────────
|
|
1424
1424
|
/**
|
|
@@ -138,7 +138,6 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
138
138
|
const capturedTurnGen = getCurrentTurnGeneration();
|
|
139
139
|
// ── Send the prompt ──
|
|
140
140
|
debugLog("runUnit", { phase: "send-message", unitType, unitId });
|
|
141
|
-
const requestDispatchedAt = Date.now();
|
|
142
141
|
pi.sendMessage({ customType: "gsd-auto", content: prompt, display: s.verbose }, { triggerTurn: true });
|
|
143
142
|
// ── Await agent_end with absolute timeout (H4 fix) ──
|
|
144
143
|
// If supervision fails to resolve unitPromise within 30s, treat as cancelled.
|
|
@@ -161,7 +160,6 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
161
160
|
unitId,
|
|
162
161
|
status: result.status,
|
|
163
162
|
});
|
|
164
|
-
const finalResult = { ...result, requestDispatchedAt };
|
|
165
163
|
// Discard trailing follow-up messages (e.g. async_job_result notifications)
|
|
166
164
|
// from the completed unit. Without this, queued follow-ups trigger wasteful
|
|
167
165
|
// LLM turns before the next session can start (#1642).
|
|
@@ -176,5 +174,5 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
176
174
|
catch (e) {
|
|
177
175
|
logWarning("engine", "clearQueue failed after unit completion", { error: String(e) });
|
|
178
176
|
}
|
|
179
|
-
return
|
|
177
|
+
return result;
|
|
180
178
|
}
|
|
@@ -118,8 +118,6 @@ export class AutoSession {
|
|
|
118
118
|
lastPromptCharCount;
|
|
119
119
|
lastBaselineCharCount;
|
|
120
120
|
pendingQuickTasks = [];
|
|
121
|
-
/** Timestamp of the last LLM request dispatch (ms since epoch). Used for proactive rate limiting. */
|
|
122
|
-
lastRequestTimestamp = 0;
|
|
123
121
|
// ── Safety harness ───────────────────────────────────────────────────────
|
|
124
122
|
/** SHA of the pre-unit git checkpoint ref. Cleared on success or rollback. */
|
|
125
123
|
checkpointSha = null;
|
|
@@ -217,7 +215,6 @@ export class AutoSession {
|
|
|
217
215
|
this.lastPromptCharCount = undefined;
|
|
218
216
|
this.lastBaselineCharCount = undefined;
|
|
219
217
|
this.pendingQuickTasks = [];
|
|
220
|
-
this.lastRequestTimestamp = 0;
|
|
221
218
|
this.sidecarQueue = [];
|
|
222
219
|
this.rewriteAttemptCount = 0;
|
|
223
220
|
this.consecutiveCompleteBootstraps = 0;
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
* globals or AutoContext dependency.
|
|
8
8
|
*/
|
|
9
9
|
import { parseUnitId } from "./unit-id.js";
|
|
10
|
-
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
11
10
|
import { appendEvent } from "./workflow-events.js";
|
|
12
11
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
13
12
|
import { clearParseCache } from "./files.js";
|
|
@@ -169,35 +168,8 @@ function getChangedFilesSinceBranch(basePath, targetBranch) {
|
|
|
169
168
|
}
|
|
170
169
|
}
|
|
171
170
|
function getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId) {
|
|
172
|
-
// Primary: path-scoped log against .gsd/milestones/<id>. Fast and unbounded
|
|
173
|
-
// by depth when .gsd/ is tracked in git.
|
|
174
|
-
const scoped = scanGsdTaggedCommits(basePath, milestoneId, [
|
|
175
|
-
"log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
|
|
176
|
-
]);
|
|
177
|
-
if (!scoped.ok)
|
|
178
|
-
return scoped;
|
|
179
|
-
if (scoped.matched)
|
|
180
|
-
return scoped;
|
|
181
|
-
// Fallback (#5033): when .gsd/ is gitignored / external / untracked, the
|
|
182
|
-
// path-scoped scan matches no commits even though GSD-tagged commits
|
|
183
|
-
// referencing the milestone exist on the integration branch. Re-scan all
|
|
184
|
-
// of HEAD's history and rely on commitMatchesMilestone to bind by
|
|
185
|
-
// explicit milestone mention in the message body.
|
|
186
|
-
//
|
|
187
|
-
// Intentionally unbounded — symmetric with the primary scan, and avoids
|
|
188
|
-
// reintroducing the rolling-depth failure class removed in #4699 where
|
|
189
|
-
// milestone evidence aged out behind unrelated activity.
|
|
190
|
-
return scanGsdTaggedCommits(basePath, milestoneId, [
|
|
191
|
-
"log", "--format=%H%x1f%B%x1e", "HEAD",
|
|
192
|
-
]);
|
|
193
|
-
}
|
|
194
|
-
function scanGsdTaggedCommits(basePath, milestoneId, gitArgs) {
|
|
195
171
|
try {
|
|
196
|
-
const logOutput = execFileSync("git", [
|
|
197
|
-
cwd: basePath,
|
|
198
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
199
|
-
encoding: "utf-8",
|
|
200
|
-
});
|
|
172
|
+
const logOutput = execFileSync("git", ["log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`], { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
|
|
201
173
|
const records = logOutput
|
|
202
174
|
.split("\x1e")
|
|
203
175
|
.map((record) => record.trim())
|
|
@@ -241,24 +213,13 @@ function commitMatchesMilestone(message, milestoneId, files) {
|
|
|
241
213
|
if (commitTrailerStartsWithMilestone(message, milestoneId))
|
|
242
214
|
return true;
|
|
243
215
|
// Meaningful execute-task commits currently store task scope as Sxx/Tyy
|
|
244
|
-
// rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone
|
|
245
|
-
//
|
|
246
|
-
// where .gsd/ is gitignored/external (#5033) — the message explicitly
|
|
247
|
-
// names the milestone.
|
|
216
|
+
// rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone only
|
|
217
|
+
// when the commit also touched this milestone's artifacts.
|
|
248
218
|
if (/^GSD-Task:\s*S[^/\s]+\/T\S+/m.test(message)) {
|
|
249
|
-
|
|
250
|
-
return true;
|
|
251
|
-
if (commitMessageMentionsMilestone(message, milestoneId))
|
|
252
|
-
return true;
|
|
219
|
+
return files.some((file) => isMilestoneArtifactPath(file, milestoneId));
|
|
253
220
|
}
|
|
254
221
|
return false;
|
|
255
222
|
}
|
|
256
|
-
function commitMessageMentionsMilestone(message, milestoneId) {
|
|
257
|
-
if (!MILESTONE_ID_RE.test(milestoneId))
|
|
258
|
-
return false;
|
|
259
|
-
const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
260
|
-
return new RegExp(`\\b${escapedMilestone}\\b`).test(message);
|
|
261
|
-
}
|
|
262
223
|
function commitTrailerStartsWithMilestone(message, milestoneId) {
|
|
263
224
|
const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
264
225
|
const trailerPattern = new RegExp(`^GSD-(?:Task|Unit):\\s*${escapedMilestone}(?:$|[\\s/])`, "m");
|
|
@@ -208,7 +208,7 @@ export function auditOrphanedMilestoneBranches(basePath, isolationMode) {
|
|
|
208
208
|
else {
|
|
209
209
|
// Branch is NOT merged — preserve for safety, warn the user
|
|
210
210
|
warnings.push(`Branch ${branch} exists for completed milestone ${milestoneId} but is NOT merged into ${mainBranch}. ` +
|
|
211
|
-
`This may contain unmerged work. Merge manually or run \`/gsd
|
|
211
|
+
`This may contain unmerged work. Merge manually or run \`/gsd health --fix\` to resolve.`);
|
|
212
212
|
// #4764 telemetry
|
|
213
213
|
try {
|
|
214
214
|
emitWorktreeOrphaned(basePath, milestoneId, {
|
|
@@ -139,6 +139,6 @@ export const DETERMINISTIC_POLICY_ERROR_STRINGS = [
|
|
|
139
139
|
export function isDeterministicPolicyError(errorMsg) {
|
|
140
140
|
if (!errorMsg)
|
|
141
141
|
return false;
|
|
142
|
-
return DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg)
|
|
143
|
-
|
|
142
|
+
return (DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg) ||
|
|
143
|
+
DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s)));
|
|
144
144
|
}
|
|
@@ -857,11 +857,6 @@ export function runWorktreePostCreateHook(sourceDir, worktreeDir, hookPath) {
|
|
|
857
857
|
export function autoWorktreeBranch(milestoneId) {
|
|
858
858
|
return `milestone/${milestoneId}`;
|
|
859
859
|
}
|
|
860
|
-
function normalizeLocalBranchRef(branch) {
|
|
861
|
-
return branch.startsWith("refs/heads/")
|
|
862
|
-
? branch.slice("refs/heads/".length)
|
|
863
|
-
: branch;
|
|
864
|
-
}
|
|
865
860
|
// ─── Branch-mode Entry ─────────────────────────────────────────────────────
|
|
866
861
|
/**
|
|
867
862
|
* Enter branch isolation mode for a milestone.
|
|
@@ -1038,13 +1033,6 @@ function reconcilePlanCheckboxes(projectRoot, wtPath, milestoneId) {
|
|
|
1038
1033
|
}
|
|
1039
1034
|
}
|
|
1040
1035
|
export function createAutoWorktree(basePath, milestoneId) {
|
|
1041
|
-
// Check if repo has commits — git worktree requires a valid HEAD
|
|
1042
|
-
try {
|
|
1043
|
-
execFileSync("git", ["rev-parse", "--verify", "HEAD"], { cwd: basePath, stdio: "pipe" });
|
|
1044
|
-
}
|
|
1045
|
-
catch {
|
|
1046
|
-
throw new GSDError(GSD_GIT_ERROR, `Cannot create worktree: repository has no commits yet. Worktree isolation requires at least one commit.`);
|
|
1047
|
-
}
|
|
1048
1036
|
const branch = autoWorktreeBranch(milestoneId);
|
|
1049
1037
|
// Check if the milestone branch already exists — it survives auto-mode
|
|
1050
1038
|
// stop/pause and contains committed work from prior sessions. If it exists,
|
|
@@ -1420,10 +1408,6 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1420
1408
|
}
|
|
1421
1409
|
}
|
|
1422
1410
|
// 3. chdir to original base
|
|
1423
|
-
// Note: previousCwd captures the cwd at this point — i.e. the worktree cwd
|
|
1424
|
-
// entering the function. Subsequent throws restore to previousCwd, leaving
|
|
1425
|
-
// the caller in worktree-cwd; callers (worktree-resolver) are responsible
|
|
1426
|
-
// for any further cwd movement on the error path.
|
|
1427
1411
|
const previousCwd = process.cwd();
|
|
1428
1412
|
process.chdir(originalBasePath_);
|
|
1429
1413
|
// 4. Resolve integration branch — prefer milestone metadata, then preferences,
|
|
@@ -1438,20 +1422,6 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1438
1422
|
? prefs.main_branch
|
|
1439
1423
|
: undefined;
|
|
1440
1424
|
const mainBranch = integrationBranch ?? validatedPrefBranch ?? nativeDetectMainBranch(originalBasePath_);
|
|
1441
|
-
// Fail closed when the resolved integration branch is the milestone branch
|
|
1442
|
-
// itself (#5024). Stale or corrupt metadata (e.g. integrationBranch recorded
|
|
1443
|
-
// as "milestone/<MID>") would otherwise let the squash merge resolve to a
|
|
1444
|
-
// self-merge: nothing-to-commit + empty self-diff in the post-merge safety
|
|
1445
|
-
// check (#1792) collapse to a false success, and the worktree-resolver
|
|
1446
|
-
// emits worktree-merged for work that never landed on a distinct
|
|
1447
|
-
// integration branch.
|
|
1448
|
-
if (normalizeLocalBranchRef(mainBranch) === milestoneBranch) {
|
|
1449
|
-
process.chdir(previousCwd);
|
|
1450
|
-
throw new GSDError(GSD_GIT_ERROR, `Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
|
|
1451
|
-
`"${milestoneBranch}" — refusing to self-merge. Integration branch metadata is invalid; ` +
|
|
1452
|
-
`set a distinct main_branch in GSD preferences or repair the milestone integration record ` +
|
|
1453
|
-
`before retrying milestone completion.`);
|
|
1454
|
-
}
|
|
1455
1425
|
// Remove transient project-root state files before any branch or merge
|
|
1456
1426
|
// operation. Untracked milestone metadata can otherwise block squash merges.
|
|
1457
1427
|
clearProjectRootStateFiles(originalBasePath_, milestoneId);
|
|
@@ -80,12 +80,13 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
|
|
|
80
80
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
81
81
|
import { WorktreeResolver, } from "./worktree-resolver.js";
|
|
82
82
|
import { reorderForCaching } from "./prompt-ordering.js";
|
|
83
|
+
// ─── Session State ─────────────────────────────────────────────────────────
|
|
84
|
+
import { AutoSession, } from "./auto/session.js";
|
|
83
85
|
export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
|
|
84
|
-
import { autoSession as s } from "./auto-runtime-state.js";
|
|
85
86
|
// ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
|
|
86
87
|
// ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
|
|
87
88
|
// This file must NOT declare module-level `let` or `var` variables for state.
|
|
88
|
-
// The single
|
|
89
|
+
// The single `s` instance below is the only mutable module-level binding.
|
|
89
90
|
//
|
|
90
91
|
// When adding features or fixing bugs:
|
|
91
92
|
// - New mutable state → add a property to AutoSession, not a module-level variable
|
|
@@ -94,6 +95,7 @@ import { autoSession as s } from "./auto-runtime-state.js";
|
|
|
94
95
|
//
|
|
95
96
|
// Tests in auto-session-encapsulation.test.ts enforce this invariant.
|
|
96
97
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
98
|
+
const s = new AutoSession();
|
|
97
99
|
/** Throttle STATE.md rebuilds — at most once per 30 seconds */
|
|
98
100
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
99
101
|
function captureProjectRootEnv(projectRoot) {
|
|
@@ -1406,21 +1408,10 @@ const widgetStateAccessors = {
|
|
|
1406
1408
|
* Ensure directories, branches, and other prerequisites exist before
|
|
1407
1409
|
* dispatching a unit. The LLM should never need to mkdir or git checkout.
|
|
1408
1410
|
*/
|
|
1409
|
-
|
|
1411
|
+
function ensurePreconditions(unitType, unitId, base, state) {
|
|
1410
1412
|
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
1411
1413
|
const mDir = resolveMilestonePath(base, mid);
|
|
1412
1414
|
if (!mDir) {
|
|
1413
|
-
// Fix #4996: When dispatching a slice unit against an unrecognised milestone,
|
|
1414
|
-
// only create the directory if the milestone has a DB row.
|
|
1415
|
-
// Without this guard, forward-referenced unit IDs (e.g. from REQUIREMENTS.md)
|
|
1416
|
-
// silently scaffold empty stub directories that later skew nextMilestoneId.
|
|
1417
|
-
if (sid !== undefined) {
|
|
1418
|
-
const hasDbRow = isDbAvailable() && getMilestone(mid) != null;
|
|
1419
|
-
if (!hasDbRow) {
|
|
1420
|
-
logWarning("engine", `ensurePreconditions: skipping mkdir for unrecognised milestone ${mid} referenced by slice unit ${unitId} — no DB row exists`, { file: "auto.ts" });
|
|
1421
|
-
return;
|
|
1422
|
-
}
|
|
1423
|
-
}
|
|
1424
1415
|
const newDir = join(milestonesDir(base), mid);
|
|
1425
1416
|
mkdirSync(join(newDir, "slices"), { recursive: true });
|
|
1426
1417
|
}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
2
|
import { Text } from "@gsd/pi-tui";
|
|
3
|
+
import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
|
|
3
4
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
4
5
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
5
6
|
import { StringEnum } from "@gsd/pi-ai";
|
|
6
7
|
import { logError } from "../workflow-logger.js";
|
|
7
|
-
|
|
8
|
-
return import("../tools/workflow-tool-executors.js");
|
|
9
|
-
}
|
|
8
|
+
import { executeCompleteMilestone, executePlanMilestone, executePlanSlice, executeReplanSlice, executeReassessRoadmap, executeSaveGateResult, executeSliceComplete, executeSummarySave, executeTaskComplete, executeValidateMilestone, } from "../tools/workflow-tool-executors.js";
|
|
10
9
|
/**
|
|
11
10
|
* Register an alias tool that shares the same execute function as its canonical counterpart.
|
|
12
11
|
* The alias description and promptGuidelines direct the LLM to prefer the canonical name.
|
|
@@ -281,7 +280,6 @@ export function registerDbTools(pi) {
|
|
|
281
280
|
registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
|
|
282
281
|
// ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
|
|
283
282
|
const summarySaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
284
|
-
const { executeSummarySave } = await loadWorkflowExecutors();
|
|
285
283
|
return executeSummarySave(params, process.cwd());
|
|
286
284
|
};
|
|
287
285
|
const summarySaveTool = {
|
|
@@ -332,7 +330,6 @@ export function registerDbTools(pi) {
|
|
|
332
330
|
try {
|
|
333
331
|
// Claim a reserved ID if the guided-flow already previewed one to the user.
|
|
334
332
|
// This guarantees the ID shown in the UI matches the one materialised on disk.
|
|
335
|
-
const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
|
|
336
333
|
const reserved = claimReservedId();
|
|
337
334
|
if (reserved) {
|
|
338
335
|
await ensureMilestoneDbRow(reserved);
|
|
@@ -411,7 +408,6 @@ export function registerDbTools(pi) {
|
|
|
411
408
|
registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
|
|
412
409
|
// ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
|
|
413
410
|
const planMilestoneExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
414
|
-
const { executePlanMilestone } = await loadWorkflowExecutors();
|
|
415
411
|
return executePlanMilestone(params, process.cwd());
|
|
416
412
|
};
|
|
417
413
|
const planMilestoneTool = {
|
|
@@ -476,7 +472,6 @@ export function registerDbTools(pi) {
|
|
|
476
472
|
registerAlias(pi, planMilestoneTool, "gsd_milestone_plan", "gsd_plan_milestone");
|
|
477
473
|
// ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
|
|
478
474
|
const planSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
479
|
-
const { executePlanSlice } = await loadWorkflowExecutors();
|
|
480
475
|
return executePlanSlice(params, process.cwd());
|
|
481
476
|
};
|
|
482
477
|
const planSliceTool = {
|
|
@@ -590,7 +585,6 @@ export function registerDbTools(pi) {
|
|
|
590
585
|
registerAlias(pi, planTaskTool, "gsd_task_plan", "gsd_plan_task");
|
|
591
586
|
// ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
|
|
592
587
|
const taskCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
593
|
-
const { executeTaskComplete } = await loadWorkflowExecutors();
|
|
594
588
|
return executeTaskComplete(params, process.cwd());
|
|
595
589
|
};
|
|
596
590
|
const taskCompleteTool = {
|
|
@@ -653,7 +647,6 @@ export function registerDbTools(pi) {
|
|
|
653
647
|
registerAlias(pi, taskCompleteTool, "gsd_complete_task", "gsd_task_complete");
|
|
654
648
|
// ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
|
|
655
649
|
const sliceCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
656
|
-
const { executeSliceComplete } = await loadWorkflowExecutors();
|
|
657
650
|
return executeSliceComplete(params, process.cwd());
|
|
658
651
|
};
|
|
659
652
|
const sliceCompleteTool = {
|
|
@@ -818,7 +811,6 @@ export function registerDbTools(pi) {
|
|
|
818
811
|
});
|
|
819
812
|
// ─── gsd_complete_milestone ────────────────────────────────────────────
|
|
820
813
|
const milestoneCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
821
|
-
const { executeCompleteMilestone } = await loadWorkflowExecutors();
|
|
822
814
|
return executeCompleteMilestone(params, process.cwd());
|
|
823
815
|
};
|
|
824
816
|
const milestoneCompleteTool = {
|
|
@@ -859,7 +851,6 @@ export function registerDbTools(pi) {
|
|
|
859
851
|
registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
|
|
860
852
|
// ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
|
|
861
853
|
const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
862
|
-
const { executeValidateMilestone } = await loadWorkflowExecutors();
|
|
863
854
|
return executeValidateMilestone(params, process.cwd());
|
|
864
855
|
};
|
|
865
856
|
const milestoneValidateTool = {
|
|
@@ -892,7 +883,6 @@ export function registerDbTools(pi) {
|
|
|
892
883
|
registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
|
|
893
884
|
// ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
|
|
894
885
|
const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
895
|
-
const { executeReplanSlice } = await loadWorkflowExecutors();
|
|
896
886
|
return executeReplanSlice(params, process.cwd());
|
|
897
887
|
};
|
|
898
888
|
const replanSliceTool = {
|
|
@@ -935,7 +925,6 @@ export function registerDbTools(pi) {
|
|
|
935
925
|
registerAlias(pi, replanSliceTool, "gsd_slice_replan", "gsd_replan_slice");
|
|
936
926
|
// ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
|
|
937
927
|
const reassessRoadmapExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
938
|
-
const { executeReassessRoadmap } = await loadWorkflowExecutors();
|
|
939
928
|
return executeReassessRoadmap(params, process.cwd());
|
|
940
929
|
};
|
|
941
930
|
const reassessRoadmapTool = {
|
|
@@ -1168,7 +1157,6 @@ export function registerDbTools(pi) {
|
|
|
1168
1157
|
registerAlias(pi, reopenMilestoneTool, "gsd_reopen_milestone", "gsd_milestone_reopen");
|
|
1169
1158
|
// ─── gsd_save_gate_result ──────────────────────────────────────────────
|
|
1170
1159
|
const saveGateResultExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
1171
|
-
const { executeSaveGateResult } = await loadWorkflowExecutors();
|
|
1172
1160
|
return executeSaveGateResult(params, process.cwd());
|
|
1173
1161
|
};
|
|
1174
1162
|
const saveGateResultTool = {
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
// Exposes the `gsd_exec` tool over MCP. Opt-in: disabled unless
|
|
4
4
|
// `context_mode.enabled: true` is set in preferences.
|
|
5
5
|
import { Type } from "@sinclair/typebox";
|
|
6
|
+
import { executeGsdExec } from "../tools/exec-tool.js";
|
|
7
|
+
import { executeExecSearch } from "../tools/exec-search-tool.js";
|
|
8
|
+
import { executeResume } from "../tools/resume-tool.js";
|
|
9
|
+
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
10
|
+
import { logWarning } from "../workflow-logger.js";
|
|
6
11
|
export function registerExecTools(pi) {
|
|
7
12
|
pi.registerTool({
|
|
8
13
|
name: "gsd_exec",
|
|
@@ -30,11 +35,6 @@ export function registerExecTools(pi) {
|
|
|
30
35
|
})),
|
|
31
36
|
}),
|
|
32
37
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
33
|
-
const [{ executeGsdExec }, { loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
|
|
34
|
-
import("../tools/exec-tool.js"),
|
|
35
|
-
import("../preferences.js"),
|
|
36
|
-
import("../workflow-logger.js"),
|
|
37
|
-
]);
|
|
38
38
|
let prefs = null;
|
|
39
39
|
try {
|
|
40
40
|
prefs = loadEffectiveGSDPreferences();
|
|
@@ -67,7 +67,6 @@ export function registerExecTools(pi) {
|
|
|
67
67
|
limit: Type.Optional(Type.Number({ description: "Max results (default 20, cap 200)", minimum: 1, maximum: 200 })),
|
|
68
68
|
}),
|
|
69
69
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
70
|
-
const { executeExecSearch } = await import("../tools/exec-search-tool.js");
|
|
71
70
|
return executeExecSearch(params, {
|
|
72
71
|
baseDir: process.cwd(),
|
|
73
72
|
});
|
|
@@ -86,7 +85,6 @@ export function registerExecTools(pi) {
|
|
|
86
85
|
],
|
|
87
86
|
parameters: Type.Object({}),
|
|
88
87
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
89
|
-
const { executeResume } = await import("../tools/resume-tool.js");
|
|
90
88
|
return executeResume(params, {
|
|
91
89
|
baseDir: process.cwd(),
|
|
92
90
|
});
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// GSD2 — Read-only query tools exposing DB state to the LLM via the WAL connection
|
|
2
2
|
import { Type } from "@sinclair/typebox";
|
|
3
3
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
4
|
+
import { executeMilestoneStatus } from "../tools/workflow-tool-executors.js";
|
|
5
|
+
import { checkpointDatabase } from "../gsd-db.js";
|
|
4
6
|
export function registerQueryTools(pi) {
|
|
5
7
|
pi.registerTool({
|
|
6
8
|
name: "gsd_milestone_status",
|
|
@@ -23,7 +25,6 @@ export function registerQueryTools(pi) {
|
|
|
23
25
|
details: { operation: "milestone_status", error: "db_unavailable" },
|
|
24
26
|
};
|
|
25
27
|
}
|
|
26
|
-
const { executeMilestoneStatus } = await import("../tools/workflow-tool-executors.js");
|
|
27
28
|
return executeMilestoneStatus(params);
|
|
28
29
|
},
|
|
29
30
|
});
|
|
@@ -48,7 +49,6 @@ export function registerQueryTools(pi) {
|
|
|
48
49
|
details: { operation: "checkpoint_db", error: "db_unavailable" },
|
|
49
50
|
};
|
|
50
51
|
}
|
|
51
|
-
const { checkpointDatabase } = await import("../gsd-db.js");
|
|
52
52
|
checkpointDatabase();
|
|
53
53
|
return {
|
|
54
54
|
content: [{ type: "text", text: "WAL checkpoint complete. gsd.db is now up to date and safe to stage with git add." }],
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// GSD2 — Extension registration: wires all GSD tools, commands, and hooks into pi
|
|
2
2
|
import { registerExitCommand } from "../exit-command.js";
|
|
3
|
-
import {
|
|
3
|
+
import { registerWorktreeCommand } from "../worktree-command.js";
|
|
4
|
+
import { loadEcosystemExtensions } from "../ecosystem/loader.js";
|
|
4
5
|
import { registerDbTools } from "./db-tools.js";
|
|
5
6
|
import { registerDynamicTools } from "./dynamic-tools.js";
|
|
6
7
|
import { registerExecTools } from "./exec-tools.js";
|
|
@@ -63,7 +64,7 @@ function installEpipeGuard() {
|
|
|
63
64
|
export function registerGsdExtension(pi) {
|
|
64
65
|
// Note: registerGSDCommand is called by index.ts before this function,
|
|
65
66
|
// so we intentionally skip it here to avoid double-registration.
|
|
66
|
-
|
|
67
|
+
registerWorktreeCommand(pi);
|
|
67
68
|
registerExitCommand(pi);
|
|
68
69
|
// Wire the Layer 2 event emitter bridge so deeply-nested GSD code can emit
|
|
69
70
|
// extension events (git lifecycle, verify, budget, milestone, unit) without
|
|
@@ -101,9 +102,7 @@ export function registerGsdExtension(pi) {
|
|
|
101
102
|
["cmux-events", () => initCmuxEventListeners(pi.events)],
|
|
102
103
|
["hooks", () => registerHooks(pi, ecosystemHandlers)],
|
|
103
104
|
["ecosystem", () => {
|
|
104
|
-
void
|
|
105
|
-
.then(({ loadEcosystemExtensions }) => loadEcosystemExtensions(pi, ecosystemHandlers))
|
|
106
|
-
.catch((err) => {
|
|
105
|
+
void loadEcosystemExtensions(pi, ecosystemHandlers).catch((err) => {
|
|
107
106
|
logWarning("ecosystem", `loader failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
108
107
|
});
|
|
109
108
|
}],
|