@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
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// gsd-pi — Auto-worktree cleanup helpers.
|
|
2
|
+
//
|
|
3
|
+
// Owns shared cleanup primitives used by teardown and merge cleanup paths:
|
|
4
|
+
// same-file DB reconciliation checks, transient project-root state removal,
|
|
5
|
+
// git pathspec conversion for externally-rooted .gsd paths, and expected
|
|
6
|
+
// unlink error classification.
|
|
7
|
+
|
|
8
|
+
import { execFileSync } from "node:child_process";
|
|
9
|
+
import { existsSync, realpathSync, unlinkSync } from "node:fs";
|
|
10
|
+
import { isAbsolute, join, relative } from "node:path";
|
|
11
|
+
|
|
12
|
+
import { gsdRoot } from "./paths.js";
|
|
13
|
+
import { logWarning } from "./workflow-logger.js";
|
|
14
|
+
|
|
15
|
+
function isSamePath(a: string, b: string): boolean {
|
|
16
|
+
try {
|
|
17
|
+
return realpathSync(a) === realpathSync(b);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
if ((e as NodeJS.ErrnoException).code === "ENOENT") return false;
|
|
20
|
+
logWarning("worktree", `isSamePath failed: ${(e as Error).message}`);
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function _isSamePath(a: string, b: string): boolean {
|
|
26
|
+
return isSamePath(a, b);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function _shouldReconcileWorktreeDb(
|
|
30
|
+
worktreeDbPath: string,
|
|
31
|
+
mainDbPath: string,
|
|
32
|
+
pathExists: (path: string) => boolean = existsSync,
|
|
33
|
+
samePath: (a: string, b: string) => boolean = isSamePath,
|
|
34
|
+
): boolean {
|
|
35
|
+
return pathExists(worktreeDbPath) && !samePath(worktreeDbPath, mainDbPath);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function _isExpectedWorktreeUnlinkError(
|
|
39
|
+
code: string | undefined,
|
|
40
|
+
): boolean {
|
|
41
|
+
return code === "ENOENT" || code === "EISDIR";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function gitPathspecForWorktreePath(
|
|
45
|
+
basePath: string,
|
|
46
|
+
targetPath: string,
|
|
47
|
+
): string | null {
|
|
48
|
+
let base = basePath;
|
|
49
|
+
let target = targetPath;
|
|
50
|
+
try {
|
|
51
|
+
base = execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
52
|
+
cwd: basePath,
|
|
53
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
54
|
+
encoding: "utf-8",
|
|
55
|
+
}).trim() || basePath;
|
|
56
|
+
} catch {
|
|
57
|
+
/* keep original */
|
|
58
|
+
void base;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
base = realpathSync.native(base);
|
|
62
|
+
} catch {
|
|
63
|
+
/* keep original */
|
|
64
|
+
void base;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
target = realpathSync.native(targetPath);
|
|
68
|
+
} catch {
|
|
69
|
+
/* keep original */
|
|
70
|
+
void target;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const rel = relative(base, target);
|
|
74
|
+
if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) return null;
|
|
75
|
+
return rel.replaceAll("\\", "/");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function _gitPathspecForWorktreePath(
|
|
79
|
+
basePath: string,
|
|
80
|
+
targetPath: string,
|
|
81
|
+
): string | null {
|
|
82
|
+
return gitPathspecForWorktreePath(basePath, targetPath);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function clearProjectRootStateFiles(
|
|
86
|
+
basePath: string,
|
|
87
|
+
milestoneId: string,
|
|
88
|
+
): void {
|
|
89
|
+
const gsdDir = gsdRoot(basePath);
|
|
90
|
+
// Phase C pt 2: auto.lock removed from this list — the file is gone
|
|
91
|
+
// (migrated to the workers + unit_dispatches + runtime_kv tables). The
|
|
92
|
+
// remaining transient files (STATE.md, {MID}-META.json) are still
|
|
93
|
+
// worth removing on teardown.
|
|
94
|
+
const transientFiles = [
|
|
95
|
+
join(gsdDir, "STATE.md"),
|
|
96
|
+
join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
for (const file of transientFiles) {
|
|
100
|
+
try {
|
|
101
|
+
unlinkSync(file);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
// ENOENT is expected — file may not exist (#3597)
|
|
104
|
+
if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
105
|
+
logWarning(
|
|
106
|
+
"worktree",
|
|
107
|
+
`file unlink failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Clean up legacy synced milestone directories and runtime/units.
|
|
114
|
+
// Older versions copied these into the project root during execution.
|
|
115
|
+
// If they remain as untracked files when we attempt
|
|
116
|
+
// `git merge --squash`, git rejects the merge with "local changes would
|
|
117
|
+
// be overwritten", causing silent data loss (#1738).
|
|
118
|
+
const syncedDirs = [
|
|
119
|
+
join(gsdDir, "milestones", milestoneId),
|
|
120
|
+
join(gsdDir, "runtime", "units"),
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
for (const dir of syncedDirs) {
|
|
124
|
+
try {
|
|
125
|
+
if (!existsSync(dir)) continue;
|
|
126
|
+
|
|
127
|
+
const pathspec = gitPathspecForWorktreePath(basePath, dir);
|
|
128
|
+
if (!pathspec) continue;
|
|
129
|
+
|
|
130
|
+
// Only remove files that are untracked by git — tracked files are
|
|
131
|
+
// managed by the branch checkout and should not be deleted.
|
|
132
|
+
const untrackedOutput = execFileSync(
|
|
133
|
+
"git",
|
|
134
|
+
["ls-files", "--others", "--exclude-standard", pathspec],
|
|
135
|
+
{
|
|
136
|
+
cwd: basePath,
|
|
137
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
138
|
+
encoding: "utf-8",
|
|
139
|
+
},
|
|
140
|
+
).trim();
|
|
141
|
+
if (!untrackedOutput) continue;
|
|
142
|
+
|
|
143
|
+
for (const f of untrackedOutput.split("\n").filter(Boolean)) {
|
|
144
|
+
try {
|
|
145
|
+
unlinkSync(join(basePath, f));
|
|
146
|
+
} catch (err) {
|
|
147
|
+
// ENOENT/EISDIR are expected for already-removed or
|
|
148
|
+
// directory entries (#3597).
|
|
149
|
+
const code = (err as NodeJS.ErrnoException).code;
|
|
150
|
+
if (!_isExpectedWorktreeUnlinkError(code)) {
|
|
151
|
+
logWarning(
|
|
152
|
+
"worktree",
|
|
153
|
+
`untracked file unlink failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
} catch (err) {
|
|
159
|
+
/* non-fatal — git command may fail if not in repo */
|
|
160
|
+
logWarning(
|
|
161
|
+
"worktree",
|
|
162
|
+
`untracked file cleanup failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// gsd-pi — Conflict auto-resolve policy for auto-worktree merges.
|
|
2
|
+
//
|
|
3
|
+
// Owns the pure path policy for conflict paths that are safe to resolve
|
|
4
|
+
// mechanically. Git mutation stays in git-conflict-resolve.ts.
|
|
5
|
+
|
|
6
|
+
/** Patterns for machine-generated build artifacts that can be safely
|
|
7
|
+
* auto-resolved by accepting --theirs during merge. These files are
|
|
8
|
+
* regenerable and never contain meaningful manual edits. */
|
|
9
|
+
export const SAFE_AUTO_RESOLVE_PATTERNS: RegExp[] = [
|
|
10
|
+
/\.tsbuildinfo$/,
|
|
11
|
+
/\.pyc$/,
|
|
12
|
+
/\/__pycache__\//,
|
|
13
|
+
/\.DS_Store$/,
|
|
14
|
+
/\.map$/,
|
|
15
|
+
// Regenerable dependency lockfiles. These are fully derivable from their
|
|
16
|
+
// manifests by the package manager, so accepting the merge side during
|
|
17
|
+
// auto-resolve clears the conflict markers without losing meaningful edits —
|
|
18
|
+
// and stops auto-mode from hard-pausing on a lockfile conflict (issue #828).
|
|
19
|
+
/(?:^|\/)pnpm-lock\.yaml$/,
|
|
20
|
+
/(?:^|\/)package-lock\.json$/,
|
|
21
|
+
/(?:^|\/)npm-shrinkwrap\.json$/,
|
|
22
|
+
/(?:^|\/)yarn\.lock$/,
|
|
23
|
+
/(?:^|\/)bun\.lockb?$/,
|
|
24
|
+
/(?:^|\/)Cargo\.lock$/,
|
|
25
|
+
/(?:^|\/)composer\.lock$/,
|
|
26
|
+
/(?:^|\/)Gemfile\.lock$/,
|
|
27
|
+
/(?:^|\/)Pipfile\.lock$/,
|
|
28
|
+
/(?:^|\/)poetry\.lock$/,
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
/** Returns true if the file path is safe to auto-resolve during merge.
|
|
32
|
+
* Covers `.gsd/` state files, common build artifacts, and regenerable
|
|
33
|
+
* dependency lockfiles. */
|
|
34
|
+
export function isSafeToAutoResolve(filePath: string): boolean {
|
|
35
|
+
return filePath.startsWith(".gsd/")
|
|
36
|
+
|| SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
|
|
37
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// gsd-pi — Auto-worktree creation module.
|
|
2
|
+
//
|
|
3
|
+
// Owns the creation path for milestone worktrees: repository readiness,
|
|
4
|
+
// branch reuse/start-point selection, initial untracked-content import,
|
|
5
|
+
// post-create hook, cwd transition, and session registry update.
|
|
6
|
+
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
8
|
+
import { cpSync, existsSync, mkdirSync } from "node:fs";
|
|
9
|
+
import { dirname, join } from "node:path";
|
|
10
|
+
|
|
11
|
+
import { classifyProject } from "./detection.js";
|
|
12
|
+
import { GSDError, GSD_GIT_ERROR, GSD_IO_ERROR } from "./errors.js";
|
|
13
|
+
import { readIntegrationBranch } from "./git-service.js";
|
|
14
|
+
import { nativeBranchExists } from "./native-git-bridge.js";
|
|
15
|
+
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
16
|
+
import {
|
|
17
|
+
autoWorktreeBranch,
|
|
18
|
+
fastForwardReusedMilestoneBranchIfSafe,
|
|
19
|
+
_resolveAutoWorktreeStartPoint,
|
|
20
|
+
} from "./auto-worktree-branch-lifecycle.js";
|
|
21
|
+
import { setActiveWorkspace } from "./auto-worktree-session-registry.js";
|
|
22
|
+
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
23
|
+
import { createWorktree } from "./worktree-manager.js";
|
|
24
|
+
import { nudgeGitBranchCache } from "./worktree.js";
|
|
25
|
+
import { resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
26
|
+
import { createWorkspace } from "./workspace.js";
|
|
27
|
+
import { debugLog } from "./debug-logger.js";
|
|
28
|
+
import { logWarning } from "./workflow-logger.js";
|
|
29
|
+
|
|
30
|
+
function importUntrackedProjectRootContentIntoEmptyWorktree(
|
|
31
|
+
projectRoot: string,
|
|
32
|
+
worktreeRoot: string,
|
|
33
|
+
milestoneId: string,
|
|
34
|
+
): number {
|
|
35
|
+
const worktreeClassification = classifyProject(worktreeRoot);
|
|
36
|
+
if (worktreeClassification.kind !== "greenfield") return 0;
|
|
37
|
+
|
|
38
|
+
const projectRootClassification = classifyProject(projectRoot);
|
|
39
|
+
if (
|
|
40
|
+
projectRootClassification.kind === "greenfield" ||
|
|
41
|
+
projectRootClassification.kind === "invalid-repo" ||
|
|
42
|
+
projectRootClassification.untrackedFiles.length === 0
|
|
43
|
+
) {
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let copied = 0;
|
|
48
|
+
for (const relPath of projectRootClassification.untrackedFiles) {
|
|
49
|
+
const src = join(projectRoot, relPath);
|
|
50
|
+
if (!existsSync(src)) continue;
|
|
51
|
+
|
|
52
|
+
const dst = join(worktreeRoot, relPath);
|
|
53
|
+
if (existsSync(dst)) continue;
|
|
54
|
+
|
|
55
|
+
mkdirSync(dirname(dst), { recursive: true });
|
|
56
|
+
cpSync(src, dst, { recursive: true, force: false });
|
|
57
|
+
copied++;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (copied > 0) {
|
|
61
|
+
debugLog("createAutoWorktree", {
|
|
62
|
+
phase: "import-untracked-project-content",
|
|
63
|
+
milestoneId,
|
|
64
|
+
copied,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return copied;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function createAutoWorktree(
|
|
72
|
+
basePath: string,
|
|
73
|
+
milestoneId: string,
|
|
74
|
+
): string {
|
|
75
|
+
basePath = resolveWorktreeProjectRoot(basePath);
|
|
76
|
+
|
|
77
|
+
// Check if repo has commits — git worktree requires a valid HEAD.
|
|
78
|
+
try {
|
|
79
|
+
execFileSync("git", ["rev-parse", "--verify", "HEAD"], {
|
|
80
|
+
cwd: basePath,
|
|
81
|
+
stdio: "pipe",
|
|
82
|
+
});
|
|
83
|
+
} catch {
|
|
84
|
+
throw new GSDError(
|
|
85
|
+
GSD_GIT_ERROR,
|
|
86
|
+
"Cannot create worktree: repository has no commits yet. Worktree isolation requires at least one commit.",
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const branch = autoWorktreeBranch(milestoneId);
|
|
91
|
+
|
|
92
|
+
// Check if the milestone branch already exists — it survives auto-mode
|
|
93
|
+
// stop/pause and contains committed work from prior sessions. If it exists,
|
|
94
|
+
// re-attach the worktree to it WITHOUT resetting. Only create a fresh branch
|
|
95
|
+
// from the integration branch when no prior work exists.
|
|
96
|
+
const branchExists = nativeBranchExists(basePath, branch);
|
|
97
|
+
|
|
98
|
+
let info: { name: string; path: string; branch: string; exists: boolean };
|
|
99
|
+
if (branchExists) {
|
|
100
|
+
// #5538-followup: fast-forward the reused branch onto the integration
|
|
101
|
+
// branch when safe so the next milestone forks from up-to-date code.
|
|
102
|
+
// Without this, a milestone that was created before another milestone
|
|
103
|
+
// merged into main would carry a stale base into its worktree.
|
|
104
|
+
fastForwardReusedMilestoneBranchIfSafe(basePath, milestoneId, branch);
|
|
105
|
+
|
|
106
|
+
// Re-attach worktree to the existing milestone branch (preserving commits).
|
|
107
|
+
info = createWorktree(basePath, milestoneId, {
|
|
108
|
+
branch,
|
|
109
|
+
reuseExistingBranch: true,
|
|
110
|
+
});
|
|
111
|
+
} else {
|
|
112
|
+
// Fresh start — create branch from integration branch.
|
|
113
|
+
// Use the same 3-tier fallback as mergeMilestoneToMain (#3461):
|
|
114
|
+
// 1. META.json integration branch (explicit per-milestone override)
|
|
115
|
+
// 2. git.main_branch preference (user's configured working branch)
|
|
116
|
+
// 3. nativeDetectMainBranch (origin/HEAD auto-detection)
|
|
117
|
+
// Without tier 2, projects with main_branch=dev but origin/HEAD→master
|
|
118
|
+
// would fork worktrees from the wrong (stale) branch.
|
|
119
|
+
const integrationBranch = readIntegrationBranch(basePath, milestoneId)
|
|
120
|
+
?? undefined;
|
|
121
|
+
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
122
|
+
const startPoint = _resolveAutoWorktreeStartPoint(
|
|
123
|
+
integrationBranch,
|
|
124
|
+
gitPrefs?.main_branch,
|
|
125
|
+
(branchName) => nativeBranchExists(basePath, branchName),
|
|
126
|
+
);
|
|
127
|
+
info = createWorktree(basePath, milestoneId, {
|
|
128
|
+
branch,
|
|
129
|
+
startPoint,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Phase C: copyPlanningArtifacts and reconcilePlanCheckboxes were
|
|
134
|
+
// deleted. Both addressed the same problem (worktree-local .gsd/
|
|
135
|
+
// projection lagging behind project-root state) by maintaining a stale
|
|
136
|
+
// copy. Now that auto-mode writers in workflow-projections.ts,
|
|
137
|
+
// triage-resolution.ts, rule-registry.ts, and auto-post-unit.ts route
|
|
138
|
+
// through s.canonicalProjectRoot, the worktree never needs a local
|
|
139
|
+
// .gsd/ — both reads and writes converge on the project-root .gsd/.
|
|
140
|
+
// The original concerns (#759, #778) no longer apply because there is
|
|
141
|
+
// no second copy to drift.
|
|
142
|
+
importUntrackedProjectRootContentIntoEmptyWorktree(
|
|
143
|
+
basePath,
|
|
144
|
+
info.path,
|
|
145
|
+
milestoneId,
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// Run user-configured post-create hook (#597) — e.g. copy .env, symlink assets.
|
|
149
|
+
const hookError = runWorktreePostCreateHook(basePath, info.path);
|
|
150
|
+
if (hookError) {
|
|
151
|
+
// Non-fatal — log but don't prevent worktree usage.
|
|
152
|
+
logWarning("reconcile", hookError, { worktree: info.name });
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const previousCwd = process.cwd();
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
process.chdir(info.path);
|
|
159
|
+
setActiveWorkspace(createWorkspace(basePath));
|
|
160
|
+
} catch (err) {
|
|
161
|
+
// If chdir fails, the worktree was created but we couldn't enter it.
|
|
162
|
+
// Don't set activeWorkspace -- caller can retry or clean up.
|
|
163
|
+
throw new GSDError(
|
|
164
|
+
GSD_IO_ERROR,
|
|
165
|
+
`Auto-worktree created at ${info.path} but chdir failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
nudgeGitBranchCache(previousCwd);
|
|
170
|
+
return info.path;
|
|
171
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// gsd-pi — Auto-worktree entry and presence detection module.
|
|
2
|
+
//
|
|
3
|
+
// Owns the small interface for finding, entering, and identifying milestone
|
|
4
|
+
// worktrees. The legacy auto-worktree barrel re-exports these functions for
|
|
5
|
+
// compatibility while lifecycle callers can depend on this focused module.
|
|
6
|
+
|
|
7
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
|
|
10
|
+
import { GSDError, GSD_GIT_ERROR, GSD_IO_ERROR } from "./errors.js";
|
|
11
|
+
import { nativeGetCurrentBranch } from "./native-git-bridge.js";
|
|
12
|
+
import { worktreePath } from "./worktree-manager.js";
|
|
13
|
+
import { worktreePathFor } from "./worktree-placement.js";
|
|
14
|
+
import { nudgeGitBranchCache } from "./worktree.js";
|
|
15
|
+
import {
|
|
16
|
+
isGsdWorktreePath,
|
|
17
|
+
normalizeWorktreePathForCompare,
|
|
18
|
+
resolveWorktreeProjectRoot,
|
|
19
|
+
} from "./worktree-root.js";
|
|
20
|
+
import {
|
|
21
|
+
getAutoWorktreeOriginalBase,
|
|
22
|
+
setActiveWorkspace,
|
|
23
|
+
} from "./auto-worktree-session-registry.js";
|
|
24
|
+
import { createWorkspace } from "./workspace.js";
|
|
25
|
+
import { logWarning } from "./workflow-logger.js";
|
|
26
|
+
|
|
27
|
+
function safeCwd(fallback: string): string {
|
|
28
|
+
try {
|
|
29
|
+
return process.cwd();
|
|
30
|
+
} catch {
|
|
31
|
+
return fallback;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Detect if the process is currently inside an auto-worktree.
|
|
37
|
+
* Uses the current directory structure plus git branch prefix so detection
|
|
38
|
+
* still works after process restart when module state has been reset.
|
|
39
|
+
*/
|
|
40
|
+
export function isInAutoWorktree(basePath: string): boolean {
|
|
41
|
+
const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
|
|
42
|
+
if (!isGsdWorktreePath(targetPath)) return false;
|
|
43
|
+
|
|
44
|
+
const storedBase = getAutoWorktreeOriginalBase();
|
|
45
|
+
const projectRoot = resolveWorktreeProjectRoot(basePath, storedBase);
|
|
46
|
+
const targetProjectRoot = resolveWorktreeProjectRoot(targetPath, storedBase);
|
|
47
|
+
if (
|
|
48
|
+
normalizeWorktreePathForCompare(projectRoot) !==
|
|
49
|
+
normalizeWorktreePathForCompare(targetProjectRoot)
|
|
50
|
+
) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
const branch = nativeGetCurrentBranch(targetPath);
|
|
56
|
+
return branch.startsWith("milestone/");
|
|
57
|
+
} catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get the filesystem path for an auto-worktree, or null if it doesn't exist
|
|
64
|
+
* or is not a valid git worktree.
|
|
65
|
+
*
|
|
66
|
+
* Validates that the path is a real git worktree (has a .git file with a
|
|
67
|
+
* gitdir: pointer) rather than just a stray directory. This prevents
|
|
68
|
+
* mis-detection of leftover directories as active worktrees (#695).
|
|
69
|
+
*/
|
|
70
|
+
export function getAutoWorktreePath(
|
|
71
|
+
basePath: string,
|
|
72
|
+
milestoneId: string,
|
|
73
|
+
): string | null {
|
|
74
|
+
basePath = resolveWorktreeProjectRoot(basePath);
|
|
75
|
+
|
|
76
|
+
// basePath is already the resolved project root — go straight to placement
|
|
77
|
+
// instead of worktreePath(), which would re-resolve the root.
|
|
78
|
+
const p = worktreePathFor(basePath, milestoneId);
|
|
79
|
+
if (!existsSync(p)) return null;
|
|
80
|
+
|
|
81
|
+
// Validate this is a real git worktree, not a stray directory.
|
|
82
|
+
// A git worktree has a .git *file* (not directory) containing "gitdir: <path>".
|
|
83
|
+
const gitPath = join(p, ".git");
|
|
84
|
+
if (!existsSync(gitPath)) return null;
|
|
85
|
+
try {
|
|
86
|
+
const content = readFileSync(gitPath, "utf8").trim();
|
|
87
|
+
if (!content.startsWith("gitdir: ")) return null;
|
|
88
|
+
} catch (e) {
|
|
89
|
+
logWarning("worktree", `getAutoWorktreePath .git read failed: ${(e as Error).message}`);
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return p;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Enter an existing auto-worktree (chdir into it, store originalBase).
|
|
98
|
+
* Use for resume -- the worktree already exists from a prior create.
|
|
99
|
+
*
|
|
100
|
+
* Atomic: chdir + originalBase update in same try block.
|
|
101
|
+
*/
|
|
102
|
+
export function enterAutoWorktree(
|
|
103
|
+
basePath: string,
|
|
104
|
+
milestoneId: string,
|
|
105
|
+
): string {
|
|
106
|
+
basePath = resolveWorktreeProjectRoot(basePath);
|
|
107
|
+
|
|
108
|
+
const p = worktreePath(basePath, milestoneId);
|
|
109
|
+
if (!existsSync(p)) {
|
|
110
|
+
throw new GSDError(
|
|
111
|
+
GSD_IO_ERROR,
|
|
112
|
+
`Auto-worktree for ${milestoneId} does not exist at ${p}`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Validate this is a real git worktree, not a stray directory (#695)
|
|
117
|
+
const gitPath = join(p, ".git");
|
|
118
|
+
if (!existsSync(gitPath)) {
|
|
119
|
+
throw new GSDError(
|
|
120
|
+
GSD_GIT_ERROR,
|
|
121
|
+
`Auto-worktree path ${p} exists but is not a git worktree (no .git)`,
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const content = readFileSync(gitPath, "utf8").trim();
|
|
126
|
+
if (!content.startsWith("gitdir: ")) {
|
|
127
|
+
throw new GSDError(
|
|
128
|
+
GSD_GIT_ERROR,
|
|
129
|
+
`Auto-worktree path ${p} has a .git but it is not a worktree gitdir pointer`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
} catch (err) {
|
|
133
|
+
if (err instanceof Error && err.message.includes("worktree")) throw err;
|
|
134
|
+
throw new GSDError(
|
|
135
|
+
GSD_IO_ERROR,
|
|
136
|
+
`Auto-worktree path ${p} exists but .git is unreadable`,
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const previousCwd = process.cwd();
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
process.chdir(p);
|
|
144
|
+
setActiveWorkspace(createWorkspace(basePath));
|
|
145
|
+
} catch (err) {
|
|
146
|
+
throw new GSDError(
|
|
147
|
+
GSD_IO_ERROR,
|
|
148
|
+
`Failed to enter auto-worktree at ${p}: ${err instanceof Error ? err.message : String(err)}`,
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
nudgeGitBranchCache(previousCwd);
|
|
153
|
+
return p;
|
|
154
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// gsd-pi — Already-merged milestone merge fast path.
|
|
2
|
+
//
|
|
3
|
+
// Owns the safety invariant for milestone branches already reachable from the
|
|
4
|
+
// integration branch: skip the squash merge only when milestone-touched code is
|
|
5
|
+
// still anchored on the current integration branch, then run normal cleanup.
|
|
6
|
+
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
8
|
+
|
|
9
|
+
import { debugLog } from "./debug-logger.js";
|
|
10
|
+
import { GSDError, GSD_GIT_ERROR } from "./errors.js";
|
|
11
|
+
import {
|
|
12
|
+
nativeDiffNumstat,
|
|
13
|
+
nativeIsAncestor,
|
|
14
|
+
} from "./native-git-bridge.js";
|
|
15
|
+
import { cleanupMergedMilestoneWorktree } from "./auto-worktree-merge-cleanup.js";
|
|
16
|
+
import { logWarning } from "./workflow-logger.js";
|
|
17
|
+
|
|
18
|
+
export interface AlreadyMergedMilestoneRequest {
|
|
19
|
+
projectRoot: string;
|
|
20
|
+
milestoneId: string;
|
|
21
|
+
milestoneBranch: string;
|
|
22
|
+
mainBranch: string;
|
|
23
|
+
previousCwd: string;
|
|
24
|
+
commitMessage: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface AlreadyMergedMilestoneResult {
|
|
28
|
+
commitMessage: string;
|
|
29
|
+
pushed: false;
|
|
30
|
+
prCreated: false;
|
|
31
|
+
codeFilesChanged: true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function finalizeAlreadyMergedMilestoneIfReachable(
|
|
35
|
+
request: AlreadyMergedMilestoneRequest,
|
|
36
|
+
): AlreadyMergedMilestoneResult | null {
|
|
37
|
+
const {
|
|
38
|
+
projectRoot,
|
|
39
|
+
milestoneId,
|
|
40
|
+
milestoneBranch,
|
|
41
|
+
mainBranch,
|
|
42
|
+
previousCwd,
|
|
43
|
+
commitMessage,
|
|
44
|
+
} = request;
|
|
45
|
+
|
|
46
|
+
if (!nativeIsAncestor(projectRoot, milestoneBranch, mainBranch)) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
assertNoUnanchoredRegularMergeCodeChanges({
|
|
51
|
+
projectRoot,
|
|
52
|
+
milestoneBranch,
|
|
53
|
+
mainBranch,
|
|
54
|
+
previousCwd,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
debugLog("mergeMilestoneToMain", {
|
|
58
|
+
action: "skip-squash-already-merged",
|
|
59
|
+
milestoneId,
|
|
60
|
+
milestoneBranch,
|
|
61
|
+
mainBranch,
|
|
62
|
+
});
|
|
63
|
+
cleanupMergedMilestoneWorktree({
|
|
64
|
+
projectRoot,
|
|
65
|
+
milestoneId,
|
|
66
|
+
milestoneBranch,
|
|
67
|
+
previousCwd,
|
|
68
|
+
clearProjectRootState: true,
|
|
69
|
+
chdirWarningContext: "after already-merged cleanup",
|
|
70
|
+
});
|
|
71
|
+
return { commitMessage, pushed: false, prCreated: false, codeFilesChanged: true };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function assertNoUnanchoredRegularMergeCodeChanges(request: {
|
|
75
|
+
projectRoot: string;
|
|
76
|
+
milestoneBranch: string;
|
|
77
|
+
mainBranch: string;
|
|
78
|
+
previousCwd: string;
|
|
79
|
+
}): void {
|
|
80
|
+
const { projectRoot, milestoneBranch, mainBranch, previousCwd } = request;
|
|
81
|
+
const codeChanges = nativeDiffNumstat(
|
|
82
|
+
projectRoot,
|
|
83
|
+
mainBranch,
|
|
84
|
+
milestoneBranch,
|
|
85
|
+
).filter((entry) => !entry.path.startsWith(".gsd/"));
|
|
86
|
+
if (codeChanges.length === 0) return;
|
|
87
|
+
|
|
88
|
+
const regularMergeChangedPaths = findRegularMergeChangedPaths(
|
|
89
|
+
projectRoot,
|
|
90
|
+
milestoneBranch,
|
|
91
|
+
mainBranch,
|
|
92
|
+
);
|
|
93
|
+
const unanchoredCodeChanges = codeChanges.filter((entry) =>
|
|
94
|
+
regularMergeChangedPaths.has(entry.path)
|
|
95
|
+
);
|
|
96
|
+
if (unanchoredCodeChanges.length === 0) return;
|
|
97
|
+
|
|
98
|
+
process.chdir(previousCwd);
|
|
99
|
+
throw new GSDError(
|
|
100
|
+
GSD_GIT_ERROR,
|
|
101
|
+
`Milestone branch "${milestoneBranch}" is reachable from "${mainBranch}" ` +
|
|
102
|
+
`but has ${unanchoredCodeChanges.length} milestone-touched code file(s) not on current "${mainBranch}". ` +
|
|
103
|
+
`Aborting worktree teardown to prevent data loss.`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function findRegularMergeChangedPaths(
|
|
108
|
+
basePath: string,
|
|
109
|
+
milestoneBranch: string,
|
|
110
|
+
mainBranch: string,
|
|
111
|
+
): Set<string> {
|
|
112
|
+
const changedPaths = new Set<string>();
|
|
113
|
+
let mergeLog = "";
|
|
114
|
+
try {
|
|
115
|
+
mergeLog = execFileSync(
|
|
116
|
+
"git",
|
|
117
|
+
["rev-list", "--merges", "--parents", mainBranch],
|
|
118
|
+
{
|
|
119
|
+
cwd: basePath,
|
|
120
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
121
|
+
encoding: "utf-8",
|
|
122
|
+
},
|
|
123
|
+
).trim();
|
|
124
|
+
} catch (err) {
|
|
125
|
+
logWarning("worktree", `regular merge lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
126
|
+
return changedPaths;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (const line of mergeLog.split("\n").filter(Boolean)) {
|
|
130
|
+
const [mergeCommit, firstParent, ...otherParents] = line.split(" ");
|
|
131
|
+
if (!mergeCommit || !firstParent || otherParents.length === 0) continue;
|
|
132
|
+
const mergedMilestone = otherParents.some((parent) => {
|
|
133
|
+
try {
|
|
134
|
+
return nativeIsAncestor(basePath, milestoneBranch, parent);
|
|
135
|
+
} catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
if (!mergedMilestone) continue;
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
const output = execFileSync(
|
|
143
|
+
"git",
|
|
144
|
+
["diff", "--name-only", firstParent, mergeCommit],
|
|
145
|
+
{
|
|
146
|
+
cwd: basePath,
|
|
147
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
148
|
+
encoding: "utf-8",
|
|
149
|
+
},
|
|
150
|
+
).trim();
|
|
151
|
+
for (const path of output.split("\n").filter(Boolean)) {
|
|
152
|
+
if (!path.startsWith(".gsd/")) changedPaths.add(path);
|
|
153
|
+
}
|
|
154
|
+
} catch (err) {
|
|
155
|
+
logWarning("worktree", `regular merge diff lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
156
|
+
}
|
|
157
|
+
return changedPaths;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return changedPaths;
|
|
161
|
+
}
|