@opengsd/gsd-pi 1.4.0 → 1.5.0-dev.553dc518
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 +11 -11
- package/dist/onboarding.js +11 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +20 -25
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +118 -53
- package/dist/resources/extensions/cursor-cli/index.js +16 -0
- package/dist/resources/extensions/cursor-cli/models.js +63 -0
- package/dist/resources/extensions/cursor-cli/package.json +11 -0
- package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
- package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
- package/dist/resources/extensions/gsd/activity-log.js +4 -1
- package/dist/resources/extensions/gsd/artifact-verification.js +25 -9
- package/dist/resources/extensions/gsd/auto/closeout.js +137 -42
- package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -3
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
- package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +4 -5
- package/dist/resources/extensions/gsd/auto-dispatch.js +15 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
- package/dist/resources/extensions/gsd/auto-prompts.js +76 -2
- package/dist/resources/extensions/gsd/auto-start.js +7 -5
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
- package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
- package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
- package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
- package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
- package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
- package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
- package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
- package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +20 -2046
- package/dist/resources/extensions/gsd/auto.js +31 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +133 -6
- package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +127 -22
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +14 -1
- package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
- package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +153 -1
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
- package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
- package/dist/resources/extensions/gsd/db/queries.js +48 -9
- package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +292 -18
- package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
- package/dist/resources/extensions/gsd/doctor.js +93 -3
- package/dist/resources/extensions/gsd/exec-sandbox.js +6 -2
- package/dist/resources/extensions/gsd/flat-phase-migration.js +88 -26
- package/dist/resources/extensions/gsd/forensics.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
- package/dist/resources/extensions/gsd/git-service.js +59 -18
- package/dist/resources/extensions/gsd/gsd-db.js +63 -0
- package/dist/resources/extensions/gsd/guidance.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow.js +46 -12
- package/dist/resources/extensions/gsd/key-manager.js +1 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +40 -11
- package/dist/resources/extensions/gsd/migrate-external.js +24 -7
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +14 -3
- package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +107 -2
- package/dist/resources/extensions/gsd/preferences.js +29 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/dist/resources/extensions/gsd/prompts/system.md +6 -6
- package/dist/resources/extensions/gsd/quick.js +12 -3
- package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
- package/dist/resources/extensions/gsd/repo-identity.js +16 -0
- package/dist/resources/extensions/gsd/repository-registry.js +6 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -2
- package/dist/resources/extensions/gsd/safe-fs.js +23 -2
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
- package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
- package/dist/resources/extensions/gsd/tool-contract.js +14 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +76 -8
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
- package/dist/resources/extensions/gsd/unit-registry.js +37 -2
- package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
- package/dist/resources/extensions/gsd/workspace.js +26 -8
- package/dist/resources/extensions/gsd/worktree-command.js +1 -1
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +81 -14
- package/dist/resources/extensions/gsd/worktree-manager.js +97 -4
- package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
- 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 +10 -10
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/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/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/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 -2
- 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 +1 -1
- 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 +1 -1
- 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 +10 -10
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- 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/server.js +1 -1
- package/dist/wizard.d.ts +8 -0
- package/dist/wizard.js +8 -1
- package/integrations/hermes/CONTEXT.md +47 -0
- package/integrations/hermes/README.md +21 -0
- package/integrations/hermes/__init__.py +31 -0
- package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
- package/integrations/hermes/docs/setup.md +4 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +141 -0
- package/integrations/hermes/open_gsd_hermes/config.py +2 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +591 -39
- package/integrations/hermes/open_gsd_hermes/notifications.py +10 -1
- package/integrations/hermes/plugin.yaml +4 -0
- package/integrations/hermes/tests/test_config.py +6 -0
- package/integrations/hermes/tests/test_directory_loader.py +37 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +3 -0
- package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
- package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
- package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
- package/integrations/hermes/tests/test_milestone_client.py +447 -0
- package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +40 -0
- package/package.json +8 -8
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-runtime.js +25 -1
- package/packages/daemon/dist/cloud-runtime.js.map +1 -1
- package/packages/daemon/dist/cloud-runtime.test.js +51 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
- package/packages/daemon/dist/message-batcher.d.ts +7 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
- package/packages/daemon/dist/message-batcher.js +13 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -1
- package/packages/daemon/dist/message-batcher.test.js +48 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -1
- package/packages/daemon/dist/session-manager.js +1 -1
- package/packages/daemon/dist/session-manager.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +18 -5
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +46 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +14 -9
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +3 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
- package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
- package/packages/pi-ai/dist/tool-result-content.js +62 -0
- package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
- package/packages/pi-ai/dist/types.d.ts +10 -22
- 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/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +3 -0
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/dist/rpc-client.js +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/core/export-html/template.js +53 -4
- package/pkg/package.json +1 -1
- package/scripts/link-workspace-packages.cjs +14 -4
- package/src/resources/GSD-WORKFLOW.md +20 -25
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +130 -51
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +371 -39
- package/src/resources/extensions/cursor-cli/index.ts +18 -0
- package/src/resources/extensions/cursor-cli/models.ts +65 -0
- package/src/resources/extensions/cursor-cli/package.json +11 -0
- package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
- package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
- package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
- package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
- package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
- package/src/resources/extensions/gsd/activity-log.ts +4 -1
- package/src/resources/extensions/gsd/artifact-verification.ts +25 -9
- package/src/resources/extensions/gsd/auto/closeout.ts +163 -58
- package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -3
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
- package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +4 -5
- package/src/resources/extensions/gsd/auto-dispatch.ts +17 -5
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +73 -2
- package/src/resources/extensions/gsd/auto-start.ts +8 -5
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
- package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
- package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
- package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
- package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
- package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
- package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
- package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
- package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
- package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
- package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +69 -2390
- package/src/resources/extensions/gsd/auto.ts +32 -19
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -0
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +147 -6
- package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +163 -22
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +23 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
- package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +135 -1
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
- package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
- package/src/resources/extensions/gsd/db/queries.ts +49 -9
- package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +372 -22
- package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
- package/src/resources/extensions/gsd/doctor-types.ts +5 -1
- package/src/resources/extensions/gsd/doctor.ts +95 -3
- package/src/resources/extensions/gsd/exec-sandbox.ts +6 -2
- package/src/resources/extensions/gsd/flat-phase-migration.ts +112 -25
- package/src/resources/extensions/gsd/forensics.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +67 -17
- package/src/resources/extensions/gsd/gsd-db.ts +85 -0
- package/src/resources/extensions/gsd/guidance.ts +2 -0
- package/src/resources/extensions/gsd/guided-flow.ts +52 -13
- package/src/resources/extensions/gsd/key-manager.ts +1 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -10
- package/src/resources/extensions/gsd/migrate-external.ts +23 -6
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +19 -4
- package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
- package/src/resources/extensions/gsd/model-router.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -3
- package/src/resources/extensions/gsd/preferences-types.ts +30 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +97 -2
- package/src/resources/extensions/gsd/preferences.ts +38 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/src/resources/extensions/gsd/prompts/system.md +6 -6
- package/src/resources/extensions/gsd/quick.ts +11 -3
- package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
- package/src/resources/extensions/gsd/repo-identity.ts +17 -0
- package/src/resources/extensions/gsd/repository-registry.ts +7 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +3 -2
- package/src/resources/extensions/gsd/safe-fs.ts +22 -2
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
- package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
- package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -5
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +571 -5
- package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +82 -2
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
- package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +592 -23
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +264 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +31 -9
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +208 -1
- package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +36 -3
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
- package/src/resources/extensions/gsd/tool-contract.ts +29 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +107 -9
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
- package/src/resources/extensions/gsd/unit-registry.ts +48 -2
- package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
- package/src/resources/extensions/gsd/workspace.ts +42 -8
- package/src/resources/extensions/gsd/worktree-command.ts +1 -1
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +154 -26
- package/src/resources/extensions/gsd/worktree-manager.ts +143 -5
- package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → ZpFDazP-38PXBPiI_LdZf}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → ZpFDazP-38PXBPiI_LdZf}/_ssgManifest.js +0 -0
|
@@ -42,7 +42,7 @@ import { gsdHome } from "./gsd-home.js";
|
|
|
42
42
|
import {
|
|
43
43
|
gsdRoot, milestonesDir, legacyMilestonesDir, resolveMilestoneFile,
|
|
44
44
|
resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile,
|
|
45
|
-
relMilestoneFile, relSliceFile,
|
|
45
|
+
relMilestoneFile, relSliceFile, clearPathCache,
|
|
46
46
|
} from "./paths.js";
|
|
47
47
|
import { join } from "node:path";
|
|
48
48
|
import { readFileSync, existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
|
|
@@ -51,7 +51,7 @@ import { nativeAddAll, nativeCommit, nativeHasCommittedHead, nativeIsRepo, nativ
|
|
|
51
51
|
import { isInheritedRepo } from "./repo-identity.js";
|
|
52
52
|
import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
|
|
53
53
|
import { getIsolationMode, loadEffectiveGSDPreferences } from "./preferences.js";
|
|
54
|
-
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
54
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
55
55
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
56
56
|
import { ensurePlanV2Graph, isMissingFinalizedContextResult } from "./uok/plan-v2.js";
|
|
57
57
|
import { detectProjectState, hasGsdBootstrapArtifacts } from "./detection.js";
|
|
@@ -94,13 +94,14 @@ import {
|
|
|
94
94
|
import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
|
|
95
95
|
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
96
96
|
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
97
|
-
import {
|
|
97
|
+
import { getUnitWorkflowDispatchReadinessErrorForModel } from "./tool-contract.js";
|
|
98
98
|
import {
|
|
99
99
|
runPreparation,
|
|
100
100
|
formatCodebaseBrief,
|
|
101
101
|
formatPriorContextBrief,
|
|
102
102
|
} from "./preparation.js";
|
|
103
103
|
import { verifyExpectedArtifact } from "./auto-recovery.js";
|
|
104
|
+
import { countPlanMilestoneRoadmapSlices } from "./artifact-verification.js";
|
|
104
105
|
import type { MilestoneScope } from "./workspace.js";
|
|
105
106
|
import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
|
|
106
107
|
import {
|
|
@@ -164,7 +165,7 @@ export const _scheduleAutoStartAfterIdleForTest = scheduleAutoStartAfterIdle;
|
|
|
164
165
|
// These thin wrappers accept a MilestoneScope so callers that already hold a
|
|
165
166
|
// pinned scope never have to re-derive (basePath, milestoneId) separately.
|
|
166
167
|
// The underlying implementations in auto-recovery.ts / auto-artifact-paths.ts /
|
|
167
|
-
// state.ts
|
|
168
|
+
// state.ts remain the default for non-scope-specific units.
|
|
168
169
|
|
|
169
170
|
/**
|
|
170
171
|
* Scope-based overload of verifyExpectedArtifact.
|
|
@@ -176,9 +177,47 @@ export function verifyExpectedArtifactForScope(
|
|
|
176
177
|
unitType: string,
|
|
177
178
|
unitId: string,
|
|
178
179
|
): boolean {
|
|
180
|
+
if (
|
|
181
|
+
unitId === scope.milestoneId &&
|
|
182
|
+
(unitType === "discuss-milestone" || unitType === "plan-milestone")
|
|
183
|
+
) {
|
|
184
|
+
// Layout-aware scope paths use resolveMilestoneFile; clear stale dir listings
|
|
185
|
+
// primed before discuss/plan wrote CONTEXT.md or ROADMAP.md (see checkAutoStartAfterDiscuss).
|
|
186
|
+
clearPathCache();
|
|
187
|
+
}
|
|
188
|
+
if (
|
|
189
|
+
unitId === scope.milestoneId &&
|
|
190
|
+
unitType === "discuss-milestone"
|
|
191
|
+
) {
|
|
192
|
+
const path = resolveExpectedArtifactPathForScope(scope, unitType, unitId);
|
|
193
|
+
return path ? existsSync(path) : false;
|
|
194
|
+
}
|
|
195
|
+
if (unitId === scope.milestoneId && unitType === "plan-milestone") {
|
|
196
|
+
const path = resolveExpectedArtifactPathForScope(scope, unitType, unitId);
|
|
197
|
+
return verifyScopedPlanMilestoneArtifact(path, unitType, unitId);
|
|
198
|
+
}
|
|
179
199
|
return verifyExpectedArtifact(unitType, unitId, scope.workspace.projectRoot);
|
|
180
200
|
}
|
|
181
201
|
|
|
202
|
+
function verifyScopedPlanMilestoneArtifact(
|
|
203
|
+
path: string | null,
|
|
204
|
+
unitType: string,
|
|
205
|
+
unitId: string,
|
|
206
|
+
): boolean {
|
|
207
|
+
if (!path || !existsSync(path)) return false;
|
|
208
|
+
try {
|
|
209
|
+
const roadmapContent = readFileSync(path, "utf-8");
|
|
210
|
+
if (countPlanMilestoneRoadmapSlices(roadmapContent) === 0) {
|
|
211
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${path}`);
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
return true;
|
|
215
|
+
} catch (err) {
|
|
216
|
+
logWarning("recovery", `plan-milestone roadmap verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
182
221
|
/**
|
|
183
222
|
* Scope-based overload of resolveExpectedArtifactPath.
|
|
184
223
|
* Returns the canonical absolute path (or null) using the scope's projectRoot.
|
|
@@ -188,6 +227,10 @@ export function resolveExpectedArtifactPathForScope(
|
|
|
188
227
|
unitType: string,
|
|
189
228
|
unitId: string,
|
|
190
229
|
): string | null {
|
|
230
|
+
if (unitId === scope.milestoneId) {
|
|
231
|
+
if (unitType === "discuss-milestone") return scope.contextFile();
|
|
232
|
+
if (unitType === "plan-milestone") return scope.roadmapFile();
|
|
233
|
+
}
|
|
191
234
|
return resolveExpectedArtifactPath(unitType, unitId, scope.workspace.projectRoot);
|
|
192
235
|
}
|
|
193
236
|
|
|
@@ -570,7 +613,7 @@ interface DispatchWorkflowOptions {
|
|
|
570
613
|
deps?: {
|
|
571
614
|
loadPreferences?: typeof loadEffectiveGSDPreferences;
|
|
572
615
|
selectModel?: typeof selectAndApplyModel;
|
|
573
|
-
getDispatchReadinessError?: typeof
|
|
616
|
+
getDispatchReadinessError?: typeof getUnitWorkflowDispatchReadinessErrorForModel;
|
|
574
617
|
};
|
|
575
618
|
}
|
|
576
619
|
|
|
@@ -687,7 +730,7 @@ async function dispatchWorkflow(
|
|
|
687
730
|
const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
|
|
688
731
|
const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
|
|
689
732
|
const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
|
|
690
|
-
??
|
|
733
|
+
?? getUnitWorkflowDispatchReadinessErrorForModel;
|
|
691
734
|
|
|
692
735
|
// Route through the dynamic routing pipeline (complexity classification,
|
|
693
736
|
// tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
|
|
@@ -707,16 +750,12 @@ async function dispatchWorkflow(
|
|
|
707
750
|
}
|
|
708
751
|
|
|
709
752
|
const compatibilityError = getDispatchReadinessError({
|
|
710
|
-
|
|
753
|
+
model: result.appliedModel,
|
|
754
|
+
fallbackModel: ctx.model,
|
|
755
|
+
getProviderAuthMode: (provider) => ctx.modelRegistry.getProviderAuthMode(provider),
|
|
711
756
|
projectRoot,
|
|
712
757
|
surface: "guided flow",
|
|
713
758
|
unitType,
|
|
714
|
-
authMode: result.appliedModel?.provider
|
|
715
|
-
? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
|
|
716
|
-
: ctx.model?.provider
|
|
717
|
-
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
718
|
-
: undefined,
|
|
719
|
-
baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
|
|
720
759
|
// Guided flow starts the MCP workflow server as part of dispatch, so the
|
|
721
760
|
// parent session's activeTools doesn't include MCP tools yet. The MCP
|
|
722
761
|
// launch config check (detectWorkflowMcpLaunchConfig) is the right gate
|
|
@@ -43,6 +43,7 @@ export const PROVIDER_REGISTRY: ProviderInfo[] = [
|
|
|
43
43
|
// must be in the canonical registry so all consumers see the same catalog.
|
|
44
44
|
// See: https://github.com/open-gsd/gsd-pi/issues/4541
|
|
45
45
|
{ id: "claude-code", label: "Claude Code CLI", category: "llm", authMode: "externalCli" },
|
|
46
|
+
{ id: "cursor-agent", label: "Cursor Agent", category: "llm", envVar: "CURSOR_API_KEY", authMode: "externalCli" },
|
|
46
47
|
{ id: "openai", label: "OpenAI", category: "llm", envVar: "OPENAI_API_KEY", prefixes: ["sk-"], dashboardUrl: "platform.openai.com/api-keys" },
|
|
47
48
|
{ id: "github-copilot", label: "GitHub Copilot", category: "llm", envVar: "GITHUB_TOKEN", authMode: "browserOAuth" },
|
|
48
49
|
{ id: "openai-codex", label: "ChatGPT Plus/Pro (Codex)",category: "llm", authMode: "browserOAuth" },
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
getSliceScopedArtifacts,
|
|
21
21
|
getMilestoneSlices,
|
|
22
22
|
getSliceTasks,
|
|
23
|
+
getTasksBySliceIds,
|
|
23
24
|
getTask,
|
|
24
25
|
getSlice,
|
|
25
26
|
insertArtifact,
|
|
@@ -136,6 +137,12 @@ function meaningfulSection(value: string | null | undefined): string {
|
|
|
136
137
|
return trimmed;
|
|
137
138
|
}
|
|
138
139
|
|
|
140
|
+
function renderGateFindings(gate: GateRow): string {
|
|
141
|
+
const findings = gate.findings.trim() || `- **Verdict:** ${gate.verdict}\n- **Rationale:** ${gate.rationale}`;
|
|
142
|
+
if (gate.verdict !== "flag") return findings;
|
|
143
|
+
return `> **Warning:** Verdict: flag - concerns recorded below\n\n${findings}`;
|
|
144
|
+
}
|
|
145
|
+
|
|
139
146
|
function pushIndented(lines: string[], value: string, indent = " "): void {
|
|
140
147
|
for (const line of value.split("\n")) {
|
|
141
148
|
lines.push(`${indent}${line}`);
|
|
@@ -356,7 +363,7 @@ function renderTaskPlanMarkdown(task: TaskRow, taskGates: GateRow[] = []): strin
|
|
|
356
363
|
if (gate && gate.verdict !== "omitted") {
|
|
357
364
|
lines.push(`## ${label}`);
|
|
358
365
|
lines.push("");
|
|
359
|
-
lines.push(
|
|
366
|
+
lines.push(renderGateFindings(gate));
|
|
360
367
|
lines.push("");
|
|
361
368
|
}
|
|
362
369
|
}
|
|
@@ -390,7 +397,7 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
|
|
|
390
397
|
if (q3 && q3.verdict !== "omitted") {
|
|
391
398
|
lines.push("## Threat Surface");
|
|
392
399
|
lines.push("");
|
|
393
|
-
lines.push(
|
|
400
|
+
lines.push(renderGateFindings(q3));
|
|
394
401
|
lines.push("");
|
|
395
402
|
}
|
|
396
403
|
|
|
@@ -398,7 +405,7 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
|
|
|
398
405
|
if (q4 && q4.verdict !== "omitted") {
|
|
399
406
|
lines.push("## Requirement Impact");
|
|
400
407
|
lines.push("");
|
|
401
|
-
lines.push(
|
|
408
|
+
lines.push(renderGateFindings(q4));
|
|
402
409
|
lines.push("");
|
|
403
410
|
}
|
|
404
411
|
|
|
@@ -876,6 +883,17 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
876
883
|
const result: RenderAllResult = { rendered: 0, skipped: 0, errors: [] };
|
|
877
884
|
const milestones = getAllMilestones();
|
|
878
885
|
|
|
886
|
+
// Pre-fetch slices once per milestone and batch-load all tasks in one query
|
|
887
|
+
// family, avoiding an N+1 (previously one task query per slice).
|
|
888
|
+
const slicesByMilestone = new Map<string, SliceRow[]>();
|
|
889
|
+
const slicePairs: Array<{ milestoneId: string; sliceId: string }> = [];
|
|
890
|
+
for (const milestone of milestones) {
|
|
891
|
+
const slices = getMilestoneSlices(milestone.id);
|
|
892
|
+
slicesByMilestone.set(milestone.id, slices);
|
|
893
|
+
for (const slice of slices) slicePairs.push({ milestoneId: milestone.id, sliceId: slice.id });
|
|
894
|
+
}
|
|
895
|
+
const tasksBySlice = getTasksBySliceIds(slicePairs);
|
|
896
|
+
|
|
879
897
|
for (const milestone of milestones) {
|
|
880
898
|
// Render roadmap checkboxes
|
|
881
899
|
try {
|
|
@@ -894,8 +912,8 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
894
912
|
result.errors.push(`milestone artifacts ${milestone.id}: ${(err as Error).message}`);
|
|
895
913
|
}
|
|
896
914
|
|
|
897
|
-
// Iterate slices
|
|
898
|
-
const slices =
|
|
915
|
+
// Iterate slices (pre-fetched above)
|
|
916
|
+
const slices = slicesByMilestone.get(milestone.id) ?? [];
|
|
899
917
|
for (const slice of slices) {
|
|
900
918
|
// Preserve slice-scoped artifacts imported from disk, including real PLAN
|
|
901
919
|
// fallback content when task rows cannot regenerate it.
|
|
@@ -931,8 +949,8 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
931
949
|
);
|
|
932
950
|
}
|
|
933
951
|
|
|
934
|
-
// Iterate tasks
|
|
935
|
-
const tasks =
|
|
952
|
+
// Iterate tasks (batched above)
|
|
953
|
+
const tasks = tasksBySlice.get(`${milestone.id}\0${slice.id}`) ?? [];
|
|
936
954
|
for (const task of tasks) {
|
|
937
955
|
try {
|
|
938
956
|
const ok = await renderTaskSummary(
|
|
@@ -1281,9 +1299,21 @@ export async function renderAssessmentFromDb(
|
|
|
1281
1299
|
sliceId: string,
|
|
1282
1300
|
assessmentData: AssessmentData,
|
|
1283
1301
|
): Promise<{ assessmentPath: string; content: string }> {
|
|
1284
|
-
// Flat-phase: assessment file lives in the phase dir
|
|
1285
|
-
|
|
1286
|
-
|
|
1302
|
+
// Flat-phase: the assessment file lives in the phase dir, NOT in a slices/SID/
|
|
1303
|
+
// subdir. resolveSlicePath() detects a slices/SID/ dir unconditionally, so a
|
|
1304
|
+
// stray slices/SID/ created by an earlier planning step would send this write
|
|
1305
|
+
// to a hybrid path (wrong dir, flat filename) that verification cannot find.
|
|
1306
|
+
// Guard with the same legacy-base check relSlicePath() uses so flat-phase
|
|
1307
|
+
// milestones always target the phase dir.
|
|
1308
|
+
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
1309
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
1310
|
+
const isLegacyLayout = mDir
|
|
1311
|
+
? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
|
|
1312
|
+
: false;
|
|
1313
|
+
const fallbackDir = join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
1314
|
+
const slicePath = isLegacyLayout
|
|
1315
|
+
? (resolveSlicePath(basePath, milestoneId, sliceId) ?? fallbackDir)
|
|
1316
|
+
: (mDir ?? fallbackDir);
|
|
1287
1317
|
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
1288
1318
|
const planNum = sliceIdToPlanNum(sliceId);
|
|
1289
1319
|
const absPath = join(slicePath, planFileName(phaseNum, planNum, "ASSESSMENT"));
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { execFileSync } from "node:child_process";
|
|
10
10
|
import { existsSync, lstatSync, mkdirSync, readdirSync, realpathSync, renameSync, cpSync, rmSync, statSync, symlinkSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import { externalGsdRoot, isInsideWorktree } from "./repo-identity.js";
|
|
12
|
+
import { externalGsdRoot, externalStateAlreadyExistsForProject, isInsideWorktree } from "./repo-identity.js";
|
|
13
13
|
import { getErrorMessage } from "./error-utils.js";
|
|
14
14
|
import { hasGitTrackedGsdFiles } from "./gitignore.js";
|
|
15
15
|
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
@@ -85,6 +85,16 @@ export function migrateToExternalState(basePath: string): MigrationResult {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
// If external state already contains project data, this is not a legacy
|
|
89
|
+
// migration source. It is likely an already-migrated project whose symlink
|
|
90
|
+
// was replaced by a real directory, so copying would risk data loss.
|
|
91
|
+
if (externalStateAlreadyExistsForProject(basePath)) {
|
|
92
|
+
return {
|
|
93
|
+
migrated: false,
|
|
94
|
+
error: "External state already exists for this project; leaving local .gsd directory untouched to avoid overwriting authoritative state",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
88
98
|
const externalPath = externalGsdRoot(basePath);
|
|
89
99
|
const migratingPath = join(basePath, ".gsd.migrating");
|
|
90
100
|
|
|
@@ -94,12 +104,12 @@ export function migrateToExternalState(basePath: string): MigrationResult {
|
|
|
94
104
|
|
|
95
105
|
// Rename .gsd -> .gsd.migrating (atomic lock).
|
|
96
106
|
// On Windows, NTFS may reject rename with EPERM if file descriptors are
|
|
97
|
-
// open (VS Code watchers, antivirus on-access scan).
|
|
98
|
-
// copy+delete (#1292).
|
|
107
|
+
// open (VS Code watchers, antivirus on-access scan). WSL/DrvFs can report
|
|
108
|
+
// the same transient lock as EACCES. Fall back to copy+delete (#1292).
|
|
99
109
|
try {
|
|
100
110
|
renameSync(localGsd, migratingPath);
|
|
101
111
|
} catch (renameErr: any) {
|
|
102
|
-
if (renameErr?.code === "EPERM" || renameErr?.code === "EBUSY") {
|
|
112
|
+
if (renameErr?.code === "EPERM" || renameErr?.code === "EBUSY" || renameErr?.code === "EACCES") {
|
|
103
113
|
try {
|
|
104
114
|
cpSync(localGsd, migratingPath, { recursive: true, force: true });
|
|
105
115
|
rmSync(localGsd, { recursive: true, force: true });
|
|
@@ -237,7 +247,7 @@ function isLocalGsdExternalStateJunction(basePath: string, localGsd: string): bo
|
|
|
237
247
|
* Recover from a failed migration (`.gsd.migrating` exists).
|
|
238
248
|
* Moves `.gsd.migrating` back to `.gsd` if `.gsd` doesn't exist, or removes an
|
|
239
249
|
* orphaned staging directory when `.gsd` is already a verified external state
|
|
240
|
-
* junction with intact current state.
|
|
250
|
+
* junction, or an intact real directory, with intact current state.
|
|
241
251
|
*/
|
|
242
252
|
export function recoverFailedMigration(basePath: string): boolean {
|
|
243
253
|
const localGsd = join(basePath, ".gsd");
|
|
@@ -245,8 +255,15 @@ export function recoverFailedMigration(basePath: string): boolean {
|
|
|
245
255
|
|
|
246
256
|
if (!existsSync(migratingPath)) return false;
|
|
247
257
|
if (existsSync(localGsd)) {
|
|
248
|
-
if (!isLocalGsdExternalStateJunction(basePath, localGsd)) return false;
|
|
249
258
|
if (!isCurrentGsdStateIntactForMigratingCleanup(basePath)) return false;
|
|
259
|
+
if (!isLocalGsdExternalStateJunction(basePath, localGsd)) {
|
|
260
|
+
try {
|
|
261
|
+
const stat = lstatSync(localGsd);
|
|
262
|
+
if (!stat.isDirectory()) return false;
|
|
263
|
+
} catch {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
250
267
|
try {
|
|
251
268
|
rmSync(migratingPath, { recursive: true, force: true });
|
|
252
269
|
return true;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Process-level transaction wrapper for milestone merge closeout.
|
|
3
3
|
|
|
4
|
+
import { mergeMilestoneToMain } from "./auto-worktree-merge.js";
|
|
5
|
+
|
|
4
6
|
export interface MilestoneMergeTransactionResult {
|
|
5
7
|
pushed: boolean;
|
|
6
8
|
codeFilesChanged: boolean;
|
|
@@ -21,14 +23,14 @@ export type MilestoneMergeTransactionRunner = (
|
|
|
21
23
|
) => MilestoneMergeTransactionResult;
|
|
22
24
|
|
|
23
25
|
export interface MilestoneMergeTransactionDeps {
|
|
24
|
-
|
|
26
|
+
mergeMilestone: MilestoneMergeTransactionRunner;
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
export function runMilestoneMergeTransaction(
|
|
28
30
|
deps: MilestoneMergeTransactionDeps,
|
|
29
31
|
input: MilestoneMergeTransactionInput,
|
|
30
32
|
): MilestoneMergeTransactionResult {
|
|
31
|
-
return deps.
|
|
33
|
+
return deps.mergeMilestone(
|
|
32
34
|
input.basePath,
|
|
33
35
|
input.milestoneId,
|
|
34
36
|
input.roadmapContent,
|
|
@@ -36,12 +38,25 @@ export function runMilestoneMergeTransaction(
|
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
export function createMilestoneMergeTransaction(
|
|
39
|
-
|
|
41
|
+
mergeMilestone: MilestoneMergeTransactionRunner,
|
|
40
42
|
): MilestoneMergeTransactionRunner {
|
|
41
43
|
return function mergeMilestoneTransaction(basePath, milestoneId, roadmapContent) {
|
|
42
44
|
return runMilestoneMergeTransaction(
|
|
43
|
-
{
|
|
45
|
+
{ mergeMilestone },
|
|
44
46
|
{ basePath, milestoneId, roadmapContent },
|
|
45
47
|
);
|
|
46
48
|
};
|
|
47
49
|
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Production merge transaction adapter.
|
|
53
|
+
*
|
|
54
|
+
* This is the only production construction point that knows the legacy
|
|
55
|
+
* `auto-worktree.ts` merge primitive. Lifecycle callers depend on the
|
|
56
|
+
* transaction runner interface, not the legacy implementation module.
|
|
57
|
+
*/
|
|
58
|
+
export function createDefaultMilestoneMergeTransaction(
|
|
59
|
+
mergeMilestone: MilestoneMergeTransactionRunner = mergeMilestoneToMain,
|
|
60
|
+
): MilestoneMergeTransactionRunner {
|
|
61
|
+
return createMilestoneMergeTransaction(mergeMilestone);
|
|
62
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Milestone closeout settlement state across DB proof, artifacts, merge, and cleanup.
|
|
3
3
|
|
|
4
|
-
import { isInAutoWorktree } from "./auto-worktree.js";
|
|
4
|
+
import { isInAutoWorktree } from "./auto-worktree-entry.js";
|
|
5
5
|
import {
|
|
6
6
|
formatCloseoutProofBlock,
|
|
7
7
|
proveMilestoneCloseout,
|
|
@@ -24,11 +24,10 @@ export interface DynamicRoutingConfig {
|
|
|
24
24
|
cross_provider?: boolean; // default: true
|
|
25
25
|
hooks?: boolean; // default: true
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
* GitHub Copilot).
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* subscription (e.g. haiku for research, opus for architecture). (#4386)
|
|
27
|
+
* Override dynamic routing for flat-rate providers (e.g. claude-code,
|
|
28
|
+
* GitHub Copilot). Omit or set true to honor `dynamic_routing.enabled`;
|
|
29
|
+
* set false to preserve one-model dispatch when the subscription makes
|
|
30
|
+
* per-request cost identical.
|
|
32
31
|
*/
|
|
33
32
|
allow_flat_rate_providers?: boolean;
|
|
34
33
|
}
|
|
@@ -10,7 +10,7 @@ import { join } from "node:path";
|
|
|
10
10
|
import { spawnSync } from "node:child_process";
|
|
11
11
|
import { resolveGsdPathContract } from "./paths.js";
|
|
12
12
|
import { worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
13
|
-
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
13
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
14
14
|
import { buildWorktreeLifecycleDeps } from "./auto.js";
|
|
15
15
|
import {
|
|
16
16
|
mergeMilestoneStandalone,
|
|
@@ -21,7 +21,9 @@ import { join, dirname } from "node:path";
|
|
|
21
21
|
import { fileURLToPath } from "node:url";
|
|
22
22
|
import { gsdRoot } from "./paths.js";
|
|
23
23
|
import { createWorktree, worktreePath } from "./worktree-manager.js";
|
|
24
|
-
import { autoWorktreeBranch, fastForwardReusedMilestoneBranchIfSafe
|
|
24
|
+
import { autoWorktreeBranch, fastForwardReusedMilestoneBranchIfSafe } from "./auto-worktree-branch-lifecycle.js";
|
|
25
|
+
import { syncGsdStateToWorktreeByScope } from "./auto-worktree-sync.js";
|
|
26
|
+
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
25
27
|
import { nativeBranchExists } from "./native-git-bridge.js";
|
|
26
28
|
import { readIntegrationBranch } from "./git-service.js";
|
|
27
29
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { PreferenceDiagnostic } from "./preferences-types.js";
|
|
2
2
|
import {
|
|
3
|
+
loadEffectiveGSDPreferences,
|
|
3
4
|
loadGlobalGSDPreferences,
|
|
4
5
|
loadProjectGSDPreferences,
|
|
5
6
|
} from "./preferences.js";
|
|
7
|
+
import { crossAxisPreferenceWarnings } from "./preferences-validation.js";
|
|
6
8
|
|
|
7
9
|
interface PreferenceNotificationContext {
|
|
8
10
|
ui: {
|
|
@@ -30,6 +32,28 @@ export function collectPreferenceDiagnostics(basePath?: string): PreferenceDiagn
|
|
|
30
32
|
seen.add(signature);
|
|
31
33
|
unique.push(diagnostic);
|
|
32
34
|
}
|
|
35
|
+
|
|
36
|
+
const effective = loadEffectiveGSDPreferences(basePath);
|
|
37
|
+
if (effective) {
|
|
38
|
+
const existingMessages = new Set(unique.map((diagnostic) => diagnostic.message));
|
|
39
|
+
for (const message of crossAxisPreferenceWarnings(effective.preferences)) {
|
|
40
|
+
if (existingMessages.has(message)) continue;
|
|
41
|
+
const diagnostic: PreferenceDiagnostic = {
|
|
42
|
+
path: effective.path,
|
|
43
|
+
scope: effective.scope,
|
|
44
|
+
severity: "warning",
|
|
45
|
+
kind: "validation",
|
|
46
|
+
message,
|
|
47
|
+
sanitized: true,
|
|
48
|
+
};
|
|
49
|
+
const signature = preferenceDiagnosticSignature(diagnostic);
|
|
50
|
+
if (seen.has(signature)) continue;
|
|
51
|
+
seen.add(signature);
|
|
52
|
+
existingMessages.add(message);
|
|
53
|
+
unique.push(diagnostic);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
33
57
|
return unique;
|
|
34
58
|
}
|
|
35
59
|
|
|
@@ -99,10 +99,13 @@ export function resolveModelWithFallbacksForUnit(
|
|
|
99
99
|
basePath?: string,
|
|
100
100
|
availableModelIds?: string[],
|
|
101
101
|
preferredModelId?: string,
|
|
102
|
+
skipProfileDefaults = false,
|
|
102
103
|
): ResolvedModelConfig | undefined {
|
|
103
|
-
const loadOpts =
|
|
104
|
-
? { availableModelIds
|
|
105
|
-
:
|
|
104
|
+
const loadOpts = {
|
|
105
|
+
...(availableModelIds !== undefined ? { availableModelIds } : {}),
|
|
106
|
+
...(preferredModelId !== undefined ? { preferredModelId } : {}),
|
|
107
|
+
...(skipProfileDefaults ? { skipProfileDefaults: true } : {}),
|
|
108
|
+
};
|
|
106
109
|
const prefs = loadEffectiveGSDPreferences(basePath, loadOpts);
|
|
107
110
|
const chain = phaseChainForUnit(unitType);
|
|
108
111
|
if (!chain) return undefined;
|
|
@@ -29,6 +29,33 @@ export interface ContextManagementConfig {
|
|
|
29
29
|
tool_result_max_chars?: number; // default: 800, range: 200-10000
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/**
|
|
33
|
+
* User-tunable thresholds for the tool-call loop guard (#1198). Keeps the two
|
|
34
|
+
* guards separately configurable: the identical-args guard (catches real
|
|
35
|
+
* infinite loops) and the repeated-tool-name cap (catches improvisation loops,
|
|
36
|
+
* more likely to false-positive on legitimate automation). All fields are
|
|
37
|
+
* optional; omitted fields fall back to the built-in defaults so existing
|
|
38
|
+
* installs keep their current behavior. Also overridable via GSD_TOOL_LOOP_*
|
|
39
|
+
* environment variables.
|
|
40
|
+
*/
|
|
41
|
+
export interface ToolCallLoopGuardConfig {
|
|
42
|
+
/** Master switch for both guards. Default: true. */
|
|
43
|
+
enabled?: boolean;
|
|
44
|
+
/** Identical-args sliding-window guard. */
|
|
45
|
+
identical_args?: {
|
|
46
|
+
enabled?: boolean; // default: true
|
|
47
|
+
max_consecutive_calls?: number; // default: 4, min: 1
|
|
48
|
+
};
|
|
49
|
+
/** Per-tool-name cap, independent of args. */
|
|
50
|
+
repeated_tool?: {
|
|
51
|
+
enabled?: boolean; // default: true
|
|
52
|
+
default_cap?: number; // default: 6, min: 1
|
|
53
|
+
repeatable_cap?: number; // default: 15, min: 1
|
|
54
|
+
/** Additional tool names exempt from the per-tool cap (merged with built-in defaults). */
|
|
55
|
+
exempt_tools?: string[];
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
32
59
|
/**
|
|
33
60
|
* Opt-in tool-output sandboxing for sub-sessions. When enabled, the gsd_exec
|
|
34
61
|
* MCP tool runs scripts in an isolated subprocess and returns only a short
|
|
@@ -139,6 +166,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
|
|
|
139
166
|
"min_request_interval_ms",
|
|
140
167
|
"stale_commit_threshold_minutes",
|
|
141
168
|
"context_management",
|
|
169
|
+
"tool_call_loop_guard",
|
|
142
170
|
"experimental",
|
|
143
171
|
"codebase",
|
|
144
172
|
"slice_parallel",
|
|
@@ -440,6 +468,8 @@ export interface GSDPreferences {
|
|
|
440
468
|
*/
|
|
441
469
|
context_window_override?: number;
|
|
442
470
|
context_management?: ContextManagementConfig;
|
|
471
|
+
/** User-tunable tool-call loop guard thresholds (#1198). */
|
|
472
|
+
tool_call_loop_guard?: ToolCallLoopGuardConfig;
|
|
443
473
|
/**
|
|
444
474
|
* Tool-output sandboxing via gsd_exec. Keeps sub-session context windows
|
|
445
475
|
* clean by running scripts in a subprocess and only surfacing a short
|