@opengsd/gsd-pi 1.4.0 → 1.5.0-dev.4fb2d460
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/ask-user-questions.js +1 -1
- 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-artifact-paths.js +12 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +31 -7
- 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-recovery.js +50 -6
- package/dist/resources/extensions/gsd/auto-start.js +8 -6
- 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 +134 -7
- 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 +194 -28
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +14 -1
- package/dist/resources/extensions/gsd/codebase-generator.js +164 -20
- 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/db/writers/cascades.js +20 -2
- 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 +106 -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 +75 -11
- package/dist/resources/extensions/gsd/guidance.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow.js +62 -19
- 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/md-importer.js +89 -23
- package/dist/resources/extensions/gsd/migrate-external.js +24 -7
- package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
- 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/paths.js +17 -3
- 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-skills.js +10 -16
- 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 +49 -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/skill-discovery.js +36 -23
- 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/reopen-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
- 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/resources/extensions/shared/interview-ui.js +62 -9
- 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 +9 -9
- 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 +9 -9
- 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/package-manager.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
- package/packages/pi-coding-agent/dist/core/resource-loader.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/dist/core/skill-directories.d.ts +66 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
- package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +4 -1
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.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/ask-user-questions.ts +1 -1
- 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-artifact-paths.ts +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +35 -7
- 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-recovery.ts +50 -6
- package/src/resources/extensions/gsd/auto-start.ts +9 -6
- 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 +148 -7
- 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 +229 -28
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +23 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +186 -19
- 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/db/writers/cascades.ts +23 -1
- 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 +132 -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 +105 -11
- package/src/resources/extensions/gsd/guidance.ts +2 -0
- package/src/resources/extensions/gsd/guided-flow.ts +71 -20
- 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/md-importer.ts +93 -22
- package/src/resources/extensions/gsd/migrate-external.ts +23 -6
- package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
- 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/paths.ts +21 -3
- 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-skills.ts +10 -16
- 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 +58 -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/skill-discovery.ts +47 -23
- 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-artifact-paths.test.ts +169 -1
- 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 +111 -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 +387 -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 +109 -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/import-completion-lost-update.test.ts +196 -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/journal-integration.test.ts +16 -15
- 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/migration-auto-check.test.ts +91 -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 +169 -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/reopen-slice.test.ts +52 -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/skill-discovery.test.ts +46 -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 +259 -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/reopen-slice.ts +5 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
- 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/src/resources/extensions/shared/interview-ui.ts +58 -11
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
- 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 → gXoWec4UNqcR0tkuHwYCr}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → gXoWec4UNqcR0tkuHwYCr}/_ssgManifest.js +0 -0
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
//
|
|
21
21
|
// Not yet declared here (remaining ADR-033 steps): the manifest data
|
|
22
22
|
// (`UNIT_MANIFESTS` stays in unit-context-manifest.ts, already type-enforced
|
|
23
|
-
// against the registry's `UnitType`)
|
|
24
|
-
//
|
|
23
|
+
// against the registry's `UnitType`). Prompt-template association is declared
|
|
24
|
+
// for direct one-template units and verified conditional template sets;
|
|
25
|
+
// composition logic stays with prompt builders.
|
|
25
26
|
import { BROWSER_CONTRACT_TOOL_NAMES } from "../shared/browser-contract.js";
|
|
26
27
|
// ─── Shared tool-name constants (used by registry rows) ──────────────────
|
|
27
28
|
export const RUN_UAT_WORKFLOW_TOOL_NAMES = [
|
|
@@ -50,6 +51,7 @@ export const UNIT_REGISTRY = {
|
|
|
50
51
|
kind: "primary",
|
|
51
52
|
scopeClass: "standard",
|
|
52
53
|
phaseChain: ["research"],
|
|
54
|
+
promptTemplate: "research-milestone",
|
|
53
55
|
toolContract: {
|
|
54
56
|
allowedGsdTools: [
|
|
55
57
|
"gsd_summary_save",
|
|
@@ -65,6 +67,7 @@ export const UNIT_REGISTRY = {
|
|
|
65
67
|
kind: "primary",
|
|
66
68
|
scopeClass: "standard",
|
|
67
69
|
phaseChain: ["planning"],
|
|
70
|
+
promptTemplate: "plan-milestone",
|
|
68
71
|
toolContract: {
|
|
69
72
|
allowedGsdTools: [
|
|
70
73
|
"gsd_milestone_status",
|
|
@@ -81,6 +84,7 @@ export const UNIT_REGISTRY = {
|
|
|
81
84
|
kind: "primary",
|
|
82
85
|
scopeClass: "standard",
|
|
83
86
|
phaseChain: ["discuss", "planning"],
|
|
87
|
+
promptTemplates: ["discuss", "discuss-headless", "guided-discuss-milestone"],
|
|
84
88
|
toolContract: {
|
|
85
89
|
allowedGsdTools: [
|
|
86
90
|
"gsd_summary_save",
|
|
@@ -113,6 +117,7 @@ export const UNIT_REGISTRY = {
|
|
|
113
117
|
kind: "primary",
|
|
114
118
|
scopeClass: "section-close",
|
|
115
119
|
phaseChain: ["validation", "planning"],
|
|
120
|
+
promptTemplate: "validate-milestone",
|
|
116
121
|
toolContract: {
|
|
117
122
|
allowedGsdTools: [
|
|
118
123
|
"gsd_milestone_status",
|
|
@@ -130,6 +135,7 @@ export const UNIT_REGISTRY = {
|
|
|
130
135
|
kind: "primary",
|
|
131
136
|
scopeClass: "standard",
|
|
132
137
|
phaseChain: ["completion"],
|
|
138
|
+
promptTemplate: "complete-milestone",
|
|
133
139
|
toolContract: {
|
|
134
140
|
allowedGsdTools: [
|
|
135
141
|
"gsd_milestone_status",
|
|
@@ -153,6 +159,7 @@ export const UNIT_REGISTRY = {
|
|
|
153
159
|
kind: "primary",
|
|
154
160
|
scopeClass: "standard",
|
|
155
161
|
phaseChain: ["research"],
|
|
162
|
+
promptTemplate: "research-slice",
|
|
156
163
|
toolContract: {
|
|
157
164
|
allowedGsdTools: [
|
|
158
165
|
"gsd_milestone_status",
|
|
@@ -169,6 +176,7 @@ export const UNIT_REGISTRY = {
|
|
|
169
176
|
kind: "primary",
|
|
170
177
|
scopeClass: "standard",
|
|
171
178
|
phaseChain: ["planning"],
|
|
179
|
+
promptTemplate: "plan-slice",
|
|
172
180
|
toolContract: {
|
|
173
181
|
allowedGsdTools: [
|
|
174
182
|
"gsd_milestone_status",
|
|
@@ -187,6 +195,7 @@ export const UNIT_REGISTRY = {
|
|
|
187
195
|
kind: "primary",
|
|
188
196
|
scopeClass: "standard",
|
|
189
197
|
phaseChain: ["planning"],
|
|
198
|
+
promptTemplate: "refine-slice",
|
|
190
199
|
toolContract: {
|
|
191
200
|
allowedGsdTools: [
|
|
192
201
|
"gsd_milestone_status",
|
|
@@ -203,6 +212,7 @@ export const UNIT_REGISTRY = {
|
|
|
203
212
|
kind: "primary",
|
|
204
213
|
scopeClass: "standard",
|
|
205
214
|
phaseChain: ["planning"],
|
|
215
|
+
promptTemplate: "replan-slice",
|
|
206
216
|
toolContract: {
|
|
207
217
|
allowedGsdTools: ["gsd_replan_slice", "gsd_decision_save"],
|
|
208
218
|
requiredWorkflowTools: ["gsd_replan_slice"],
|
|
@@ -212,6 +222,7 @@ export const UNIT_REGISTRY = {
|
|
|
212
222
|
kind: "primary",
|
|
213
223
|
scopeClass: "section-close",
|
|
214
224
|
phaseChain: ["completion"],
|
|
225
|
+
promptTemplate: "complete-slice",
|
|
215
226
|
toolContract: {
|
|
216
227
|
allowedGsdTools: [
|
|
217
228
|
"gsd_milestone_status",
|
|
@@ -246,6 +257,7 @@ export const UNIT_REGISTRY = {
|
|
|
246
257
|
kind: "primary",
|
|
247
258
|
scopeClass: "standard",
|
|
248
259
|
phaseChain: ["validation", "planning"],
|
|
260
|
+
promptTemplate: "reassess-roadmap",
|
|
249
261
|
toolContract: {
|
|
250
262
|
allowedGsdTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
|
|
251
263
|
requiredWorkflowTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
|
|
@@ -255,6 +267,7 @@ export const UNIT_REGISTRY = {
|
|
|
255
267
|
kind: "primary",
|
|
256
268
|
scopeClass: "execute-task",
|
|
257
269
|
phaseChain: ["execution"],
|
|
270
|
+
promptTemplate: "execute-task",
|
|
258
271
|
toolContract: {
|
|
259
272
|
allowedGsdTools: [
|
|
260
273
|
"gsd_task_complete",
|
|
@@ -299,6 +312,7 @@ export const UNIT_REGISTRY = {
|
|
|
299
312
|
kind: "primary",
|
|
300
313
|
scopeClass: "execute-task",
|
|
301
314
|
phaseChain: ["execution"],
|
|
315
|
+
promptTemplate: "reactive-execute",
|
|
302
316
|
toolContract: {
|
|
303
317
|
allowedGsdTools: [
|
|
304
318
|
"gsd_milestone_status",
|
|
@@ -314,6 +328,7 @@ export const UNIT_REGISTRY = {
|
|
|
314
328
|
kind: "primary",
|
|
315
329
|
scopeClass: "standard",
|
|
316
330
|
phaseChain: ["uat", "completion"],
|
|
331
|
+
promptTemplate: "run-uat",
|
|
317
332
|
toolContract: {
|
|
318
333
|
allowedGsdTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent"],
|
|
319
334
|
requiredWorkflowTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES],
|
|
@@ -328,6 +343,7 @@ export const UNIT_REGISTRY = {
|
|
|
328
343
|
kind: "primary",
|
|
329
344
|
scopeClass: "standard",
|
|
330
345
|
phaseChain: ["validation", "planning"],
|
|
346
|
+
promptTemplate: "gate-evaluate",
|
|
331
347
|
toolContract: {
|
|
332
348
|
allowedGsdTools: ["gsd_save_gate_result"],
|
|
333
349
|
requiredWorkflowTools: ["gsd_save_gate_result"],
|
|
@@ -337,6 +353,7 @@ export const UNIT_REGISTRY = {
|
|
|
337
353
|
kind: "primary",
|
|
338
354
|
scopeClass: "standard",
|
|
339
355
|
phaseChain: ["validation", "planning"],
|
|
356
|
+
promptTemplate: "rewrite-docs",
|
|
340
357
|
toolContract: {
|
|
341
358
|
allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
|
|
342
359
|
requiredWorkflowTools: [],
|
|
@@ -361,6 +378,7 @@ export const UNIT_REGISTRY = {
|
|
|
361
378
|
kind: "primary",
|
|
362
379
|
scopeClass: "standard",
|
|
363
380
|
phaseChain: ["discuss", "planning"],
|
|
381
|
+
promptTemplate: "guided-workflow-preferences",
|
|
364
382
|
toolContract: {
|
|
365
383
|
allowedGsdTools: ["gsd_summary_save"],
|
|
366
384
|
requiredWorkflowTools: [],
|
|
@@ -370,6 +388,7 @@ export const UNIT_REGISTRY = {
|
|
|
370
388
|
kind: "primary",
|
|
371
389
|
scopeClass: "standard",
|
|
372
390
|
phaseChain: ["discuss", "planning"],
|
|
391
|
+
promptTemplate: "guided-discuss-project",
|
|
373
392
|
toolContract: {
|
|
374
393
|
allowedGsdTools: ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
|
|
375
394
|
requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
|
|
@@ -379,6 +398,7 @@ export const UNIT_REGISTRY = {
|
|
|
379
398
|
kind: "primary",
|
|
380
399
|
scopeClass: "standard",
|
|
381
400
|
phaseChain: ["discuss", "planning"],
|
|
401
|
+
promptTemplate: "guided-discuss-requirements",
|
|
382
402
|
toolContract: {
|
|
383
403
|
allowedGsdTools: ["gsd_requirement_save", "gsd_summary_save"],
|
|
384
404
|
requiredWorkflowTools: ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"],
|
|
@@ -388,6 +408,7 @@ export const UNIT_REGISTRY = {
|
|
|
388
408
|
kind: "primary",
|
|
389
409
|
scopeClass: "standard",
|
|
390
410
|
phaseChain: ["discuss", "planning"],
|
|
411
|
+
promptTemplate: "guided-research-decision",
|
|
391
412
|
toolContract: {
|
|
392
413
|
allowedGsdTools: ["gsd_summary_save"],
|
|
393
414
|
requiredWorkflowTools: ["ask_user_questions"],
|
|
@@ -400,6 +421,7 @@ export const UNIT_REGISTRY = {
|
|
|
400
421
|
kind: "primary",
|
|
401
422
|
scopeClass: "standard",
|
|
402
423
|
phaseChain: ["research"],
|
|
424
|
+
promptTemplate: "guided-research-project",
|
|
403
425
|
toolContract: {
|
|
404
426
|
allowedGsdTools: [],
|
|
405
427
|
requiredWorkflowTools: [],
|
|
@@ -419,3 +441,16 @@ export function getUnitDescriptor(unitType) {
|
|
|
419
441
|
export function getUnitPhaseChain(unitType) {
|
|
420
442
|
return getUnitDescriptor(unitType)?.phaseChain ?? null;
|
|
421
443
|
}
|
|
444
|
+
/** Prompt template id for units with a direct one-template builder. */
|
|
445
|
+
export function getUnitPromptTemplate(unitType) {
|
|
446
|
+
return getUnitDescriptor(unitType)?.promptTemplate;
|
|
447
|
+
}
|
|
448
|
+
/** Prompt template ids for any verified direct or conditional prompt builder. */
|
|
449
|
+
export function getUnitPromptTemplates(unitType) {
|
|
450
|
+
const descriptor = getUnitDescriptor(unitType);
|
|
451
|
+
if (!descriptor)
|
|
452
|
+
return [];
|
|
453
|
+
if (descriptor.promptTemplates)
|
|
454
|
+
return descriptor.promptTemplates;
|
|
455
|
+
return descriptor.promptTemplate ? [descriptor.promptTemplate] : [];
|
|
456
|
+
}
|
|
@@ -93,6 +93,8 @@ export function writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, up
|
|
|
93
93
|
const path = runtimePath(basePath, unitType, unitId);
|
|
94
94
|
return withRecordLock(path, () => {
|
|
95
95
|
const prev = readUnitRuntimeRecord(basePath, unitType, unitId);
|
|
96
|
+
const sameRun = prev?.startedAt === startedAt;
|
|
97
|
+
const updatesHarnessAbort = Object.prototype.hasOwnProperty.call(updates, "harnessAbort");
|
|
96
98
|
const next = {
|
|
97
99
|
version: 1,
|
|
98
100
|
unitType,
|
|
@@ -109,11 +111,24 @@ export function writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, up
|
|
|
109
111
|
recovery: updates.recovery ?? prev?.recovery,
|
|
110
112
|
recoveryAttempts: updates.recoveryAttempts ?? prev?.recoveryAttempts ?? 0,
|
|
111
113
|
lastRecoveryReason: updates.lastRecoveryReason ?? prev?.lastRecoveryReason,
|
|
114
|
+
harnessAbort: updatesHarnessAbort
|
|
115
|
+
? updates.harnessAbort
|
|
116
|
+
: (sameRun ? prev?.harnessAbort : undefined),
|
|
112
117
|
};
|
|
113
118
|
atomicWriteSync(path, JSON.stringify(next, null, 2) + "\n", "utf-8");
|
|
114
119
|
return next;
|
|
115
120
|
});
|
|
116
121
|
}
|
|
122
|
+
export function recordUnitHarnessAbort(basePath, unitType, unitId, startedAt, abort) {
|
|
123
|
+
return writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, {
|
|
124
|
+
harnessAbort: {
|
|
125
|
+
...abort,
|
|
126
|
+
recordedAt: abort.recordedAt ?? Date.now(),
|
|
127
|
+
},
|
|
128
|
+
lastProgressAt: Date.now(),
|
|
129
|
+
lastProgressKind: `harness-abort:${abort.kind}`,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
117
132
|
export function readUnitRuntimeRecord(basePath, unitType, unitId) {
|
|
118
133
|
const path = runtimePath(basePath, unitType, unitId);
|
|
119
134
|
if (!existsSync(path))
|
|
@@ -125,6 +140,12 @@ export function readUnitRuntimeRecord(basePath, unitType, unitId) {
|
|
|
125
140
|
return null;
|
|
126
141
|
}
|
|
127
142
|
}
|
|
143
|
+
export function readUnitHarnessAbort(basePath, unitType, unitId, startedAt) {
|
|
144
|
+
const record = readUnitRuntimeRecord(basePath, unitType, unitId);
|
|
145
|
+
if (!record || record.startedAt !== startedAt)
|
|
146
|
+
return null;
|
|
147
|
+
return record.harnessAbort ?? null;
|
|
148
|
+
}
|
|
128
149
|
export function clearUnitRuntimeRecord(basePath, unitType, unitId) {
|
|
129
150
|
const path = runtimePath(basePath, unitType, unitId);
|
|
130
151
|
if (existsSync(path))
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// File Purpose: Block new workflow entry when completed milestone branches are still unmerged.
|
|
3
3
|
import { execFileSync } from "node:child_process";
|
|
4
4
|
import { nativeBranchExists, nativeDetectMainBranch, nativeDiffNumstat, nativeIsAncestor, } from "./native-git-bridge.js";
|
|
5
|
-
import { autoWorktreeBranch } from "./auto-worktree.js";
|
|
5
|
+
import { autoWorktreeBranch } from "./auto-worktree-branch-lifecycle.js";
|
|
6
6
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
7
7
|
import { getAllMilestones } from "./gsd-db.js";
|
|
8
8
|
import { resolveMilestoneIntegrationBranch } from "./git-service.js";
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared command gate for validation-blocked milestones.
|
|
3
3
|
import { existsSync } from "node:fs";
|
|
4
|
-
import {
|
|
4
|
+
import { isInAutoWorktree } from "./auto-worktree-entry.js";
|
|
5
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
5
6
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
6
7
|
import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
7
8
|
import { getIsolationMode } from "./preferences.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Unified workspace git preflight probe, heal, and readiness checks.
|
|
3
3
|
import { existsSync, realpathSync } from "node:fs";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { isSafeToAutoResolve } from "./auto-worktree-conflict-auto-resolve.js";
|
|
5
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
6
6
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
7
7
|
import { listMergeStateBlockers, probeGitConflictState, reconcileGitConflictsOnSignal, } from "./git-conflict-state.js";
|
|
8
8
|
import { deriveState } from "./state.js";
|
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
// gsd-pi + Workspace handle: single source of truth for path resolution per milestone
|
|
2
|
-
import { join, resolve } from "node:path";
|
|
3
|
-
import { resolveGsdPathContract, normalizeRealPath } from "./paths.js";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { buildMilestoneFileName, canonicalPhaseDirName, isLegacyMilestonesLayout, milestonesDir, resolveGsdPathContract, resolveMilestoneFile, resolveMilestonePath, normalizeRealPath, } from "./paths.js";
|
|
4
4
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
5
5
|
function tryRealpath(p) {
|
|
6
6
|
return normalizeRealPath(p);
|
|
7
7
|
}
|
|
8
|
+
function isLegacyMilestoneDirectory(dir) {
|
|
9
|
+
const parent = dirname(dir);
|
|
10
|
+
return parent.endsWith("/milestones") || parent.endsWith("\\milestones");
|
|
11
|
+
}
|
|
12
|
+
function scopeMilestoneDir(basePath, milestoneId) {
|
|
13
|
+
return resolveMilestonePath(basePath, milestoneId) ?? join(milestonesDir(basePath), isLegacyMilestonesLayout(basePath) ? milestoneId : canonicalPhaseDirName(milestoneId));
|
|
14
|
+
}
|
|
15
|
+
function scopeMilestoneFile(basePath, milestoneId, suffix) {
|
|
16
|
+
const existing = resolveMilestoneFile(basePath, milestoneId, suffix);
|
|
17
|
+
if (existing)
|
|
18
|
+
return existing;
|
|
19
|
+
const dir = scopeMilestoneDir(basePath, milestoneId);
|
|
20
|
+
const filename = isLegacyMilestoneDirectory(dir)
|
|
21
|
+
? `${milestoneId}-${suffix}.md`
|
|
22
|
+
: buildMilestoneFileName(milestoneId, suffix);
|
|
23
|
+
return join(dir, filename);
|
|
24
|
+
}
|
|
8
25
|
/**
|
|
9
26
|
* Create an immutable GsdWorkspace handle from a raw base path.
|
|
10
27
|
* Resolves both the project root and (when applicable) the worktree root,
|
|
@@ -39,21 +56,22 @@ export function createWorkspace(rawBasePath) {
|
|
|
39
56
|
* Bind a milestoneId to a workspace, producing an immutable MilestoneScope
|
|
40
57
|
* with path-returning closures for DB-authoritative project state.
|
|
41
58
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
59
|
+
* DB paths route to contract.projectGsd. Milestone artifact paths resolve from
|
|
60
|
+
* the pinned project root with the layout-aware resolvers, so flat-phase and
|
|
61
|
+
* legacy projects use the same scope surface.
|
|
45
62
|
*/
|
|
46
63
|
export function scopeMilestone(workspace, milestoneId) {
|
|
47
64
|
const { contract } = workspace;
|
|
48
65
|
const gsd = contract.projectGsd;
|
|
66
|
+
const basePath = workspace.projectRoot;
|
|
49
67
|
const scope = Object.freeze({
|
|
50
68
|
workspace,
|
|
51
69
|
milestoneId,
|
|
52
|
-
contextFile: () =>
|
|
53
|
-
roadmapFile: () =>
|
|
70
|
+
contextFile: () => scopeMilestoneFile(basePath, milestoneId, "CONTEXT"),
|
|
71
|
+
roadmapFile: () => scopeMilestoneFile(basePath, milestoneId, "ROADMAP"),
|
|
54
72
|
stateFile: () => join(gsd, "STATE.md"),
|
|
55
73
|
dbPath: () => contract.projectDb,
|
|
56
|
-
milestoneDir: () =>
|
|
74
|
+
milestoneDir: () => scopeMilestoneDir(basePath, milestoneId),
|
|
57
75
|
metaJson: () => join(gsd, `${milestoneId}-META.json`),
|
|
58
76
|
});
|
|
59
77
|
return scope;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { loadPrompt } from "./prompt-loader.js";
|
|
13
13
|
import { autoCommitCurrentBranch, getMainBranch, nudgeGitBranchCache } from "./worktree.js";
|
|
14
|
-
import { runWorktreePostCreateHook } from "./
|
|
14
|
+
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
15
15
|
import { showConfirm } from "../shared/tui.js";
|
|
16
16
|
import { gsdRoot, milestonesDir, resolveGsdPathContract } from "./paths.js";
|
|
17
17
|
import { createWorktree, listWorktrees, removeWorktree, mergeWorktreeToMain, diffWorktreeAll, diffWorktreeNumstat, getWorktreeGSDDiff, getWorktreeCodeDiff, getWorktreeLog, worktreeBranchName, worktreePath, } from "./worktree-manager.js";
|
|
@@ -47,11 +47,15 @@ import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
|
47
47
|
// adding type churn without enabling any test variation.
|
|
48
48
|
import { autoCommitCurrentBranch, getCurrentBranch, } from "./worktree.js";
|
|
49
49
|
import { nativeCheckoutBranch } from "./native-git-bridge.js";
|
|
50
|
-
// ADR-016 phase 2 / C2 (#5625):
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
import { autoWorktreeBranch,
|
|
50
|
+
// ADR-016 phase 2 / C2 (#5625): lifecycle uses focused auto-worktree
|
|
51
|
+
// modules instead of the legacy compatibility barrel. Branch, entry/path,
|
|
52
|
+
// creation, and teardown primitives are still implementation-level seams for
|
|
53
|
+
// Lifecycle; tests vary them through `WorktreeLifecycleTestOverrides` below.
|
|
54
|
+
import { autoWorktreeBranch, enterBranchModeForMilestone, } from "./auto-worktree-branch-lifecycle.js";
|
|
55
|
+
import { createAutoWorktree } from "./auto-worktree-creation.js";
|
|
56
|
+
import { enterAutoWorktree, isInAutoWorktree, } from "./auto-worktree-entry.js";
|
|
57
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
58
|
+
import { teardownAutoWorktree } from "./auto-worktree-teardown.js";
|
|
55
59
|
import { resolveRoadmapForMilestoneMerge } from "./milestone-merge-roadmap.js";
|
|
56
60
|
const recentWorktreeMergeFailures = new Map();
|
|
57
61
|
const MERGE_FAILURE_DEDUPE_MS = 60_000;
|
|
@@ -102,6 +106,51 @@ class UserNotifiedError extends Error {
|
|
|
102
106
|
function isSamePathPhysical(a, b) {
|
|
103
107
|
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
104
108
|
}
|
|
109
|
+
function preflightBlockedMergeReason(blockedReason) {
|
|
110
|
+
if (blockedReason?.startsWith("unmerged-conflicts")) {
|
|
111
|
+
return "preflight-unmerged-conflicts";
|
|
112
|
+
}
|
|
113
|
+
return "preflight-dirty-overlap";
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Run a milestone merge behind the Worktree Lifecycle seam with the root-clean
|
|
117
|
+
* stash guard that protects user changes around merge.
|
|
118
|
+
*
|
|
119
|
+
* The helper owns the invariant ordering (preflight -> merge callback ->
|
|
120
|
+
* postflight on every attempted merge path) and returns the same typed result
|
|
121
|
+
* shape as `exitMilestone`. Auto closeout remains responsible for translating
|
|
122
|
+
* that result into loop policy (pause vs. stop, visible transcript
|
|
123
|
+
* preservation, projection rebuild).
|
|
124
|
+
*/
|
|
125
|
+
function runGuardedMilestoneMerge(request) {
|
|
126
|
+
const { merge, guard, milestoneId, notify } = request;
|
|
127
|
+
const preflight = guard.preflightCleanRoot(guard.projectRoot, milestoneId, notify);
|
|
128
|
+
if (preflight.blocked) {
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
reason: preflightBlockedMergeReason(preflight.blockedReason),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
let mergeError = null;
|
|
135
|
+
const exitResult = merge();
|
|
136
|
+
if (!exitResult.ok) {
|
|
137
|
+
mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
|
|
138
|
+
}
|
|
139
|
+
let postflight;
|
|
140
|
+
if (preflight.stashPushed) {
|
|
141
|
+
postflight = guard.postflightPopStash(guard.projectRoot, milestoneId, preflight.stashMarker, notify);
|
|
142
|
+
}
|
|
143
|
+
if (mergeError instanceof MergeConflictError) {
|
|
144
|
+
return { ok: false, reason: "merge-conflict", cause: mergeError, postflight };
|
|
145
|
+
}
|
|
146
|
+
if (mergeError) {
|
|
147
|
+
return { ok: false, reason: "merge-failed", cause: mergeError, postflight };
|
|
148
|
+
}
|
|
149
|
+
if (postflight?.needsManualRecovery) {
|
|
150
|
+
return { ok: false, reason: "postflight-stash-restore-failed", postflight };
|
|
151
|
+
}
|
|
152
|
+
return exitResult;
|
|
153
|
+
}
|
|
105
154
|
// ─── Validation ──────────────────────────────────────────────────────────
|
|
106
155
|
function isValidMilestoneId(milestoneId) {
|
|
107
156
|
return !/[\/\\]|\.\./.test(milestoneId);
|
|
@@ -645,7 +694,7 @@ function _mergeWorktreeModeImpl(deps, mctx) {
|
|
|
645
694
|
pushed: false,
|
|
646
695
|
};
|
|
647
696
|
}
|
|
648
|
-
const mergeResult = deps.
|
|
697
|
+
const mergeResult = deps.mergeMilestone(originalBasePath, milestoneId, roadmapResolution.content);
|
|
649
698
|
// #2945 Bug 3: mergeMilestoneToMain performs best-effort worktree
|
|
650
699
|
// cleanup internally (step 12), but it can silently fail on Windows
|
|
651
700
|
// or when the worktree directory is locked. Perform a secondary
|
|
@@ -780,7 +829,7 @@ function _mergeBranchModeImpl(deps, mctx) {
|
|
|
780
829
|
pushed: false,
|
|
781
830
|
};
|
|
782
831
|
}
|
|
783
|
-
const mergeResult = deps.
|
|
832
|
+
const mergeResult = deps.mergeMilestone(worktreeBasePath, milestoneId, roadmapResolution.content);
|
|
784
833
|
if (mergeResult.codeFilesChanged) {
|
|
785
834
|
notify(`Milestone ${milestoneId} merged (branch mode).${mergeResult.pushed ? " Pushed to remote." : ""}`, "info");
|
|
786
835
|
}
|
|
@@ -829,8 +878,9 @@ function _mergeBranchModeImpl(deps, mctx) {
|
|
|
829
878
|
* **CWD anchor**: anchors `process.cwd()` at `originalBasePath` before
|
|
830
879
|
* non-worktree merge paths to mirror the single-loop guard against ENOENT
|
|
831
880
|
* after teardown (de73fb43d). Worktree-mode merge paths keep the real
|
|
832
|
-
* worktree as cwd because
|
|
833
|
-
*
|
|
881
|
+
* worktree as cwd because the default milestone merge transaction delegates
|
|
882
|
+
* to the legacy merge primitive, which infers source worktree state from
|
|
883
|
+
* `process.cwd()`. Best-effort; silent on failure.
|
|
834
884
|
*
|
|
835
885
|
* **Failure handling**: `MergeConflictError` and other unrecoverable errors
|
|
836
886
|
* propagate to the caller. The caller is responsible for any state restore
|
|
@@ -918,8 +968,8 @@ export function mergeMilestoneStandalone(deps, mctx) {
|
|
|
918
968
|
}
|
|
919
969
|
// Set cwd to the correct anchor before dispatching to mode implementations.
|
|
920
970
|
// Worktree mode / in-worktree override must run from the live worktree so
|
|
921
|
-
//
|
|
922
|
-
// the original project root. Best-effort for synthetic test paths.
|
|
971
|
+
// The default merge transaction can find worktree-local state; branch mode
|
|
972
|
+
// runs from the original project root. Best-effort for synthetic test paths.
|
|
923
973
|
const targetCwd = mode === "worktree" || inWorktree
|
|
924
974
|
? worktreeBasePath
|
|
925
975
|
: originalBasePath;
|
|
@@ -983,14 +1033,31 @@ export class WorktreeLifecycle {
|
|
|
983
1033
|
* With `opts.merge === false`, runs auto-commit and teardown without
|
|
984
1034
|
* merging to main.
|
|
985
1035
|
*
|
|
1036
|
+
* When `opts.guardedMerge` is present with `opts.merge === true`, the
|
|
1037
|
+
* lifecycle verb also owns the root-clean guard around the merge: preflight
|
|
1038
|
+
* runs before the inner merge, postflight stash restore runs after every
|
|
1039
|
+
* attempted merge path, and guard failures are returned as typed
|
|
1040
|
+
* `ExitResult` reasons.
|
|
1041
|
+
*
|
|
986
1042
|
* Returns a typed `ExitResult`. `MergeConflictError` is surfaced as
|
|
987
1043
|
* `{ ok: false, reason: "merge-conflict", cause }` instead of thrown,
|
|
988
|
-
* giving callers a typed branch for the expected failure path.
|
|
989
|
-
*
|
|
990
|
-
*
|
|
1044
|
+
* giving callers a typed branch for the expected failure path. Guarded merge
|
|
1045
|
+
* failures surface as `preflight-dirty-overlap`,
|
|
1046
|
+
* `preflight-unmerged-conflicts`, `merge-failed`, or
|
|
1047
|
+
* `postflight-stash-restore-failed`. Unexpected failures (filesystem, git
|
|
1048
|
+
* permissions, etc.) are wrapped as
|
|
1049
|
+
* `{ ok: false, reason: "teardown-failed", cause }` so callers always
|
|
991
1050
|
* receive a discriminated union — no exceptions for any expected outcome.
|
|
992
1051
|
*/
|
|
993
1052
|
exitMilestone(milestoneId, opts, ctx) {
|
|
1053
|
+
if (opts.merge && opts.guardedMerge) {
|
|
1054
|
+
return runGuardedMilestoneMerge({
|
|
1055
|
+
merge: () => this.exitMilestone(milestoneId, { merge: true }, ctx),
|
|
1056
|
+
guard: opts.guardedMerge,
|
|
1057
|
+
milestoneId,
|
|
1058
|
+
notify: ctx.notify,
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
994
1061
|
if (opts.merge) {
|
|
995
1062
|
try {
|
|
996
1063
|
const merged = this._mergeAndExit(milestoneId, ctx);
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* 3. merge() — LLM-guided reconciliation of .gsd/ artifacts back to main
|
|
18
18
|
* 4. remove() — git worktree remove + branch cleanup
|
|
19
19
|
*/
|
|
20
|
-
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync, unlinkSync } from "node:fs";
|
|
20
|
+
import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
|
|
21
21
|
import { execFileSync } from "node:child_process";
|
|
22
22
|
import { join, resolve, sep } from "node:path";
|
|
23
23
|
import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
|
|
@@ -163,6 +163,76 @@ function isRegisteredGitWorktreeAtPath(basePath, wtPath) {
|
|
|
163
163
|
return false;
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
|
+
function inspectUncommittedWorktreeState(wtPath) {
|
|
167
|
+
try {
|
|
168
|
+
const status = execFileSync("git", ["status", "--porcelain=v1", "--untracked-files=all"], { cwd: wtPath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trimEnd();
|
|
169
|
+
return { dirty: status.length > 0, status };
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
173
|
+
logWarning("worktree", `dirty worktree inspection failed for ${wtPath}: ${message}`);
|
|
174
|
+
// Fail closed: unknown state must quarantine rather than force-remove.
|
|
175
|
+
return { dirty: true, status: `git status failed: ${message}` };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function timestampForPath() {
|
|
179
|
+
return new Date().toISOString().replace(/[:.]/g, "-");
|
|
180
|
+
}
|
|
181
|
+
function uniqueQuarantinePath(basePath, name) {
|
|
182
|
+
const root = join(basePath, ".gsd", "quarantine", "worktrees");
|
|
183
|
+
const baseName = `${name}-${timestampForPath()}`;
|
|
184
|
+
let candidate = join(root, baseName);
|
|
185
|
+
let suffix = 2;
|
|
186
|
+
while (existsSync(candidate)) {
|
|
187
|
+
candidate = join(root, `${baseName}-${suffix}`);
|
|
188
|
+
suffix++;
|
|
189
|
+
}
|
|
190
|
+
return candidate;
|
|
191
|
+
}
|
|
192
|
+
function quarantineDirtyWorktree(basePath, name, branch, wtPath, status) {
|
|
193
|
+
const quarantinePath = uniqueQuarantinePath(basePath, name);
|
|
194
|
+
mkdirSync(join(basePath, ".gsd", "quarantine", "worktrees"), { recursive: true });
|
|
195
|
+
let moved = false;
|
|
196
|
+
try {
|
|
197
|
+
renameSync(wtPath, quarantinePath);
|
|
198
|
+
moved = true;
|
|
199
|
+
}
|
|
200
|
+
catch (renameErr) {
|
|
201
|
+
logWarning("worktree", `dirty worktree rename quarantine failed for ${name}: ${renameErr instanceof Error ? renameErr.message : String(renameErr)}; trying copy snapshot`);
|
|
202
|
+
try {
|
|
203
|
+
cpSync(wtPath, quarantinePath, { recursive: true, force: false, errorOnExist: true });
|
|
204
|
+
}
|
|
205
|
+
catch (copyErr) {
|
|
206
|
+
logWarning("reconcile", `Dirty worktree quarantine failed; preserving original worktree ${wtPath}: ${copyErr instanceof Error ? copyErr.message : String(copyErr)}`, { worktree: name, path: wtPath });
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
try {
|
|
211
|
+
const gitFile = join(quarantinePath, ".git");
|
|
212
|
+
if (existsSync(gitFile) && lstatSync(gitFile).isFile()) {
|
|
213
|
+
unlinkSync(gitFile);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
logWarning("worktree", `failed to remove quarantined worktree git pointer: ${err instanceof Error ? err.message : String(err)}`);
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
writeFileSync(join(quarantinePath, ".gsd-quarantine.json"), JSON.stringify({
|
|
221
|
+
kind: "dirty-worktree",
|
|
222
|
+
worktree: name,
|
|
223
|
+
branch,
|
|
224
|
+
originalPath: wtPath,
|
|
225
|
+
moved,
|
|
226
|
+
quarantinedAt: new Date().toISOString(),
|
|
227
|
+
status,
|
|
228
|
+
}, null, 2) + "\n", "utf-8");
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
logWarning("worktree", `failed to write worktree quarantine metadata: ${err instanceof Error ? err.message : String(err)}`);
|
|
232
|
+
}
|
|
233
|
+
logWarning("reconcile", `Quarantined dirty worktree ${name} at ${quarantinePath} before removal. Branch ${branch} was preserved.`, { worktree: name, path: quarantinePath, branch });
|
|
234
|
+
return quarantinePath;
|
|
235
|
+
}
|
|
166
236
|
/** True when `wtPath` has a git worktree checkout marker (`.git` file with gitdir pointer). */
|
|
167
237
|
export function isLiveGitWorktreeCheckout(wtPath) {
|
|
168
238
|
const gitPath = join(wtPath, ".git");
|
|
@@ -610,6 +680,7 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
610
680
|
let wtPath = worktreePath(basePath, name);
|
|
611
681
|
const branch = opts.branch ?? worktreeBranchName(name);
|
|
612
682
|
const { deleteBranch = true, force = true } = opts;
|
|
683
|
+
let deleteBranchAfterRemoval = deleteBranch;
|
|
613
684
|
// Resolve the ACTUAL worktree path from git's worktree list.
|
|
614
685
|
// The computed path may differ when .gsd/ is (or was) a symlink to an
|
|
615
686
|
// external state directory — git resolves symlinks at worktree creation
|
|
@@ -664,10 +735,10 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
664
735
|
}
|
|
665
736
|
if (!existsSync(wtPath)) {
|
|
666
737
|
nativeWorktreePrune(basePath);
|
|
667
|
-
if (
|
|
738
|
+
if (deleteBranchAfterRemoval) {
|
|
668
739
|
deleteBranchIfPresent(basePath, branch, "nativeBranchDelete failed");
|
|
669
740
|
}
|
|
670
|
-
return;
|
|
741
|
+
return true;
|
|
671
742
|
}
|
|
672
743
|
// Submodule safety (#2337): detect submodules with uncommitted changes
|
|
673
744
|
// before force-removing the worktree. Force removal destroys all uncommitted
|
|
@@ -721,6 +792,27 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
721
792
|
}
|
|
722
793
|
}
|
|
723
794
|
}
|
|
795
|
+
// Dirty-worktree quarantine (#2365): once submodule (#2337) and nested-.git
|
|
796
|
+
// (#2616) rescue have run — they commit/clean the tree first — quarantine any
|
|
797
|
+
// uncommitted state that remains instead of force-deleting it. Gate on a live
|
|
798
|
+
// git checkout so a stale local directory left behind by state-sync (which
|
|
799
|
+
// has no `.git` file and is not a registered worktree) is removed normally
|
|
800
|
+
// rather than quarantined; otherwise its branch would never be deleted and
|
|
801
|
+
// the worktree would never be unregistered (#1852).
|
|
802
|
+
if (force && resolvedPathSafe && isLiveGitWorktreeCheckout(resolvedWtPath)) {
|
|
803
|
+
const dirtyState = inspectUncommittedWorktreeState(resolvedWtPath);
|
|
804
|
+
if (dirtyState.dirty) {
|
|
805
|
+
const quarantinePath = quarantineDirtyWorktree(basePath, name, branch, resolvedWtPath, dirtyState.status);
|
|
806
|
+
if (!quarantinePath) {
|
|
807
|
+
return false;
|
|
808
|
+
}
|
|
809
|
+
deleteBranchAfterRemoval = false;
|
|
810
|
+
if (!existsSync(resolvedWtPath)) {
|
|
811
|
+
nativeWorktreePrune(basePath);
|
|
812
|
+
return true;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
}
|
|
724
816
|
// Remove worktree — only use force/rmSync when the path is safely contained
|
|
725
817
|
if (resolvedPathSafe) {
|
|
726
818
|
// Remove worktree: try non-force first when submodules have changes,
|
|
@@ -778,9 +870,10 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
778
870
|
}
|
|
779
871
|
// Prune stale entries so git knows the worktree is gone
|
|
780
872
|
nativeWorktreePrune(basePath);
|
|
781
|
-
if (
|
|
873
|
+
if (deleteBranchAfterRemoval) {
|
|
782
874
|
deleteBranchIfPresent(basePath, branch, "final branch delete failed");
|
|
783
875
|
}
|
|
876
|
+
return true;
|
|
784
877
|
}
|
|
785
878
|
/**
|
|
786
879
|
* Paths to skip in all worktree diffs (internal/runtime artifacts).
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
// back into the worktree. The worktree path is fully derivable from state, so we
|
|
7
7
|
// resolve and chdir into it directly instead.
|
|
8
8
|
import { readdirSync } from "node:fs";
|
|
9
|
-
import { enterAutoWorktree
|
|
9
|
+
import { enterAutoWorktree } from "./auto-worktree-entry.js";
|
|
10
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
10
11
|
import { getIsolationMode } from "./preferences.js";
|
|
11
12
|
import { allWorktreesDirs } from "./worktree-manager.js";
|
|
12
13
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|