@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
|
@@ -16,6 +16,7 @@ import { GSDError, GSD_IO_ERROR } from "./errors.js";
|
|
|
16
16
|
const SEQ_PREFIX_RE = /^(\d+)-/;
|
|
17
17
|
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
18
18
|
import { gsdRoot } from "./paths.js";
|
|
19
|
+
import { redactSecrets } from "./redact-secrets.js";
|
|
19
20
|
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
20
21
|
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
21
22
|
|
|
@@ -127,7 +128,9 @@ export function saveActivityLog(
|
|
|
127
128
|
const fd = openSync(filePath, "w");
|
|
128
129
|
try {
|
|
129
130
|
for (const entry of entries) {
|
|
130
|
-
|
|
131
|
+
// Redact secret-shaped substrings before persisting; .gsd/ is skipped by
|
|
132
|
+
// the secret scanner, so raw LLM/tool content could otherwise leak keys.
|
|
133
|
+
writeSync(fd, redactSecrets(JSON.stringify(entry)) + "\n");
|
|
131
134
|
}
|
|
132
135
|
} finally {
|
|
133
136
|
closeSync(fd);
|
|
@@ -45,7 +45,6 @@ import { resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
|
45
45
|
import { hasImplementationArtifacts } from "./milestone-implementation-evidence.js";
|
|
46
46
|
import { loadAllCaptures, loadPendingCaptures } from "./captures.js";
|
|
47
47
|
import { proveMilestoneCloseout } from "./milestone-closeout-proof.js";
|
|
48
|
-
|
|
49
48
|
/**
|
|
50
49
|
* Optional override for the legacy roadmap parser used by verifyExpectedArtifact.
|
|
51
50
|
* Production leaves this null so the real parseLegacyRoadmap runs; tests inject
|
|
@@ -72,6 +71,11 @@ function parseRoadmapForRecovery(content: string): ReturnType<NonNullable<typeof
|
|
|
72
71
|
return parseLegacyRoadmap(content) as unknown as ReturnType<NonNullable<typeof _roadmapParserFn>>;
|
|
73
72
|
}
|
|
74
73
|
|
|
74
|
+
/** Slice count for plan-milestone verification; shared by scoped and legacy paths. */
|
|
75
|
+
export function countPlanMilestoneRoadmapSlices(content: string): number {
|
|
76
|
+
return parseRoadmapForRecovery(content).slices.length;
|
|
77
|
+
}
|
|
78
|
+
|
|
75
79
|
export function diagnoseWorktreeIntegrityFailure(basePath: string): string | null {
|
|
76
80
|
if (!isGsdWorktreePath(basePath)) return null;
|
|
77
81
|
if (!existsSync(basePath)) {
|
|
@@ -336,8 +340,7 @@ export function verifyExpectedArtifact(
|
|
|
336
340
|
|
|
337
341
|
if (unitType === "plan-milestone") {
|
|
338
342
|
try {
|
|
339
|
-
|
|
340
|
-
if (roadmap.slices.length === 0) {
|
|
343
|
+
if (countPlanMilestoneRoadmapSlices(readFileSync(absPath, "utf-8")) === 0) {
|
|
341
344
|
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${absPath}`);
|
|
342
345
|
return false;
|
|
343
346
|
}
|
|
@@ -353,6 +356,19 @@ export function verifyExpectedArtifact(
|
|
|
353
356
|
try {
|
|
354
357
|
let taskIds: string[] | null = null;
|
|
355
358
|
let dbPrimary = false;
|
|
359
|
+
const planContent = readFileSync(absPath, "utf-8");
|
|
360
|
+
let parsedTaskIds: string[] | null = null;
|
|
361
|
+
const getParsedTaskIds = (): string[] => {
|
|
362
|
+
if (parsedTaskIds) return parsedTaskIds;
|
|
363
|
+
parsedTaskIds = parseLegacyPlan(planContent).tasks.map((t: { id: string }) => t.id);
|
|
364
|
+
return parsedTaskIds;
|
|
365
|
+
};
|
|
366
|
+
const tasksBlockMatch = planContent.match(/<tasks>([\s\S]*?)<\/tasks>/i);
|
|
367
|
+
const tasksBlock = tasksBlockMatch?.[1] ?? "";
|
|
368
|
+
const hasEmbeddedTaskEntries =
|
|
369
|
+
tasksBlock.length > 0 &&
|
|
370
|
+
(/^\s*- \[[xX ]\] \*\*T\d+/m.test(tasksBlock) ||
|
|
371
|
+
/^\s*#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(tasksBlock));
|
|
356
372
|
if (isDbAvailable()) {
|
|
357
373
|
const refreshed = refreshWorkflowDatabaseFromDisk();
|
|
358
374
|
if (refreshed) {
|
|
@@ -365,24 +381,24 @@ export function verifyExpectedArtifact(
|
|
|
365
381
|
}
|
|
366
382
|
|
|
367
383
|
if (!taskIds) {
|
|
368
|
-
const planContent = readFileSync(absPath, "utf-8");
|
|
369
384
|
const hasCheckboxTask = /^\s*- \[[xX ]\] \*\*T\d+/m.test(planContent);
|
|
370
385
|
const hasHeadingTask = /^\s*#{2,4}\s+T\d+\s*(?:--|—|:)/m.test(planContent);
|
|
371
386
|
if (!hasCheckboxTask && !hasHeadingTask) {
|
|
372
387
|
logWarning("recovery", `verify-fail ${unitType} ${unitId}: plan has no task checkbox/heading (len=${planContent.length}) at ${absPath}`);
|
|
373
388
|
return false;
|
|
374
389
|
}
|
|
375
|
-
const
|
|
376
|
-
if (
|
|
390
|
+
const parsedIds = getParsedTaskIds();
|
|
391
|
+
if (parsedIds.length > 0) taskIds = parsedIds;
|
|
377
392
|
}
|
|
378
393
|
|
|
379
|
-
if (taskIds && taskIds.length > 0) {
|
|
394
|
+
if (taskIds && taskIds.length > 0 && !hasEmbeddedTaskEntries) {
|
|
380
395
|
const tasksDir = join(dirname(absPath), "tasks");
|
|
381
396
|
if (existsSync(tasksDir)) {
|
|
382
397
|
for (const tid of taskIds) {
|
|
383
398
|
const taskPlanFile = join(tasksDir, `${tid}-PLAN.md`);
|
|
384
|
-
|
|
385
|
-
|
|
399
|
+
const taskSummaryFile = join(tasksDir, `${tid}-SUMMARY.md`);
|
|
400
|
+
if (!existsSync(taskPlanFile) && !existsSync(taskSummaryFile)) {
|
|
401
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: task artifact missing for ${tid}`);
|
|
386
402
|
return false;
|
|
387
403
|
}
|
|
388
404
|
}
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
|
|
4
4
|
import { importExtensionModule, type ExtensionAPI, type ExtensionContext } from "@gsd/pi-coding-agent";
|
|
5
5
|
|
|
6
|
+
import { execFileSync } from "node:child_process";
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
6
8
|
import { join, basename } from "node:path";
|
|
7
|
-
import { existsSync, cpSync } from "node:fs";
|
|
9
|
+
import { existsSync, cpSync, readFileSync } from "node:fs";
|
|
8
10
|
import type { AutoSession } from "./session.js";
|
|
9
11
|
import type { LoopDeps } from "./loop-deps.js";
|
|
10
12
|
import type { GSDState } from "../types.js";
|
|
@@ -16,7 +18,7 @@ import { getIsolationMode } from "../preferences.js";
|
|
|
16
18
|
import { isDbAvailable, getMilestone } from "../gsd-db.js";
|
|
17
19
|
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
18
20
|
import { isClosedStatus } from "../status-guards.js";
|
|
19
|
-
import { gsdRoot } from "../paths.js";
|
|
21
|
+
import { gsdRoot, PLANNING_ARTIFACT_SUFFIXES } from "../paths.js";
|
|
20
22
|
import { atomicWriteSync } from "../atomic-write.js";
|
|
21
23
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
22
24
|
import { debugLog } from "../debug-logger.js";
|
|
@@ -79,13 +81,14 @@ export async function restorePreflightStashOrStop(
|
|
|
79
81
|
}
|
|
80
82
|
|
|
81
83
|
/**
|
|
82
|
-
* Run a milestone merge
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
84
|
+
* Run a milestone merge through Worktree Lifecycle's guarded merge option,
|
|
85
|
+
* which surrounds the inner merge with preflight stash + always-on postflight
|
|
86
|
+
* pop. The previous closeout code popped the stash only after a successful
|
|
87
|
+
* merge, which leaked `gsd-preflight-stash:M00x:*` entries whenever
|
|
88
|
+
* `mergeAndExit` threw — leaving the user's pre-merge working tree silently
|
|
89
|
+
* stashed away after a merge-conflict or other merge error. Lifecycle now
|
|
90
|
+
* restores the stash on every attempted merge path, then this adapter surfaces
|
|
91
|
+
* the merge or stash failure (in priority order) as the loop's stop reason.
|
|
89
92
|
*
|
|
90
93
|
* Returns a `break` action when auto-mode must stop, or `null` when the merge
|
|
91
94
|
* succeeded and the stash (if any) was restored cleanly.
|
|
@@ -97,66 +100,53 @@ export async function _runMilestoneMergeWithStashRestore(
|
|
|
97
100
|
): Promise<{ action: "break"; reason: string } | null> {
|
|
98
101
|
const { ctx, pi, s, deps } = ic;
|
|
99
102
|
|
|
100
|
-
|
|
101
|
-
|
|
103
|
+
// Resolve the project root once, before the merge can flip session path
|
|
104
|
+
// pointers (worktree teardown mutates s.basePath / s.scope). The guarded
|
|
105
|
+
// merge's preflight/postflight stash restore, the pre-merge ignored-markdown
|
|
106
|
+
// snapshot, the dirty-projection check, and the rebuild must all target this
|
|
107
|
+
// same tree; otherwise `.gsd` markdown restored on one tree can be silently
|
|
108
|
+
// overwritten by a rebuild on another. canonicalProjectRoot is the
|
|
109
|
+
// authoritative `.gsd`/DB writer path (see AutoSession.canonicalProjectRoot).
|
|
110
|
+
const projectRoot = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
|
|
111
|
+
const ignoredProjectionSnapshot = snapshotIgnoredGsdMarkdownProjections(projectRoot);
|
|
112
|
+
const mergeResult = deps.lifecycle.exitMilestone(
|
|
102
113
|
milestoneId,
|
|
103
|
-
|
|
114
|
+
{
|
|
115
|
+
merge: true,
|
|
116
|
+
guardedMerge: {
|
|
117
|
+
projectRoot,
|
|
118
|
+
preflightCleanRoot: deps.preflightCleanRoot,
|
|
119
|
+
postflightPopStash: deps.postflightPopStash,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
ctx.ui,
|
|
104
123
|
);
|
|
105
|
-
|
|
106
|
-
|
|
124
|
+
|
|
125
|
+
if (mergeResult.ok) {
|
|
126
|
+
await markMilestoneMergedAndRebuild(s, projectRoot, ignoredProjectionSnapshot);
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (mergeResult.reason === "postflight-stash-restore-failed") {
|
|
131
|
+
await markMilestoneMergedAndRebuild(s, projectRoot, ignoredProjectionSnapshot);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (mergeResult.reason === "preflight-dirty-overlap" || mergeResult.reason === "preflight-unmerged-conflicts") {
|
|
135
|
+
const reason = mergeResult.reason === "preflight-unmerged-conflicts"
|
|
107
136
|
? `Pre-merge unresolved Git conflicts block milestone ${milestoneId}`
|
|
108
137
|
: `Pre-merge dirty working tree overlaps milestone ${milestoneId}`;
|
|
109
138
|
await deps.stopAuto(ctx, pi, reason, {
|
|
110
139
|
preserveCompletedMilestoneBranch: true,
|
|
111
140
|
preserveCloseoutTranscript: options.preserveCloseoutTranscript,
|
|
112
141
|
});
|
|
113
|
-
return {
|
|
114
|
-
action: "break",
|
|
115
|
-
reason: preflight.blockedReason === "unmerged-conflicts"
|
|
116
|
-
? "preflight-unmerged-conflicts"
|
|
117
|
-
: "preflight-dirty-overlap",
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
let mergeError: unknown = null;
|
|
122
|
-
const exitResult = deps.lifecycle.exitMilestone(
|
|
123
|
-
milestoneId,
|
|
124
|
-
{ merge: true },
|
|
125
|
-
ctx.ui,
|
|
126
|
-
);
|
|
127
|
-
if (exitResult.ok) {
|
|
128
|
-
s.milestoneMergedInPhases = true;
|
|
129
|
-
try {
|
|
130
|
-
const projectRoot = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
|
|
131
|
-
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
132
|
-
await rebuildMarkdownProjectionsFromDb(projectRoot);
|
|
133
|
-
} catch (err) {
|
|
134
|
-
logWarning(
|
|
135
|
-
"engine",
|
|
136
|
-
`markdown projection rebuild after milestone merge failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
} else {
|
|
140
|
-
mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Always attempt to restore the stashed working tree, even on merge error.
|
|
144
|
-
// postflightPopStash itself does not throw; failures surface via the
|
|
145
|
-
// PostflightResult.needsManualRecovery flag.
|
|
146
|
-
let stashResult: PostflightResult | null = null;
|
|
147
|
-
if (preflight.stashPushed) {
|
|
148
|
-
stashResult = deps.postflightPopStash(
|
|
149
|
-
s.originalBasePath || s.basePath,
|
|
150
|
-
milestoneId,
|
|
151
|
-
preflight.stashMarker,
|
|
152
|
-
ctx.ui.notify.bind(ctx.ui),
|
|
153
|
-
);
|
|
142
|
+
return { action: "break", reason: mergeResult.reason };
|
|
154
143
|
}
|
|
155
144
|
|
|
156
145
|
// Merge failure takes priority over stash recovery — the merge is the
|
|
157
146
|
// authoritative gate. If the stash also needed manual recovery, the user
|
|
158
147
|
// already saw the postflightPopStash notify above.
|
|
159
|
-
if (
|
|
148
|
+
if (mergeResult.reason === "merge-conflict") {
|
|
149
|
+
const mergeError = mergeResult.cause;
|
|
160
150
|
if (mergeError instanceof MergeConflictError) {
|
|
161
151
|
// A merge conflict is a recoverable human checkpoint, not an
|
|
162
152
|
// infrastructure failure — the user resolves the conflict and runs
|
|
@@ -173,6 +163,10 @@ export async function _runMilestoneMergeWithStashRestore(
|
|
|
173
163
|
});
|
|
174
164
|
return { action: "break", reason: "merge-conflict" };
|
|
175
165
|
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (mergeResult.reason === "merge-failed" || mergeResult.reason === "merge-conflict") {
|
|
169
|
+
const mergeError = mergeResult.cause;
|
|
176
170
|
logError("engine", "Milestone merge failed with non-conflict error", {
|
|
177
171
|
milestone: milestoneId,
|
|
178
172
|
error: String(mergeError),
|
|
@@ -190,12 +184,123 @@ export async function _runMilestoneMergeWithStashRestore(
|
|
|
190
184
|
return { action: "break", reason: "merge-failed" };
|
|
191
185
|
}
|
|
192
186
|
|
|
193
|
-
if (
|
|
194
|
-
return stopOnPostflightRecoveryNeeded(ic,
|
|
187
|
+
if (mergeResult.postflight) {
|
|
188
|
+
return stopOnPostflightRecoveryNeeded(ic, mergeResult.postflight, milestoneId);
|
|
195
189
|
}
|
|
196
190
|
return null;
|
|
197
191
|
}
|
|
198
192
|
|
|
193
|
+
type GsdMarkdownSnapshot = Map<string, string>;
|
|
194
|
+
|
|
195
|
+
async function markMilestoneMergedAndRebuild(
|
|
196
|
+
s: AutoSession,
|
|
197
|
+
rebuildBasePath: string,
|
|
198
|
+
ignoredProjectionSnapshot: GsdMarkdownSnapshot | null,
|
|
199
|
+
): Promise<void> {
|
|
200
|
+
s.milestoneMergedInPhases = true;
|
|
201
|
+
if (hasDirtyGsdMarkdownProjections(rebuildBasePath, ignoredProjectionSnapshot)) {
|
|
202
|
+
logWarning(
|
|
203
|
+
"engine",
|
|
204
|
+
"skipping markdown projection rebuild after milestone merge because restored .gsd edits are dirty",
|
|
205
|
+
);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
211
|
+
await rebuildMarkdownProjectionsFromDb(rebuildBasePath);
|
|
212
|
+
} catch (err) {
|
|
213
|
+
logWarning(
|
|
214
|
+
"engine",
|
|
215
|
+
`markdown projection rebuild after milestone merge failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function hasDirtyGsdMarkdownProjections(
|
|
221
|
+
basePath: string,
|
|
222
|
+
ignoredProjectionSnapshot: GsdMarkdownSnapshot | null,
|
|
223
|
+
): boolean {
|
|
224
|
+
try {
|
|
225
|
+
const output = execFileSync(
|
|
226
|
+
"git",
|
|
227
|
+
["status", "--porcelain", "-z", "--untracked-files=all", "--", ".gsd"],
|
|
228
|
+
{ cwd: basePath, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] },
|
|
229
|
+
);
|
|
230
|
+
const entries = output.split("\0").filter(Boolean);
|
|
231
|
+
for (let i = 0; i < entries.length; i++) {
|
|
232
|
+
const entry = entries[i];
|
|
233
|
+
if (entry.length <= 3) continue;
|
|
234
|
+
const status = entry.slice(0, 2);
|
|
235
|
+
const path = entry.slice(3);
|
|
236
|
+
if (isGeneratedGsdMarkdownProjection(path)) return true;
|
|
237
|
+
if ((status === "R " || status === "C ") && i + 1 < entries.length) {
|
|
238
|
+
const dest = entries[++i];
|
|
239
|
+
if (isGeneratedGsdMarkdownProjection(dest)) return true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
} catch (err) {
|
|
243
|
+
void err;
|
|
244
|
+
// Fall through to ignored-file snapshot comparison below.
|
|
245
|
+
}
|
|
246
|
+
return ignoredGsdMarkdownProjectionSnapshotChanged(basePath, ignoredProjectionSnapshot);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function isGeneratedGsdMarkdownProjection(path: string): boolean {
|
|
250
|
+
const normalized = path.replace(/\\/g, "/");
|
|
251
|
+
if (normalized === ".gsd/DECISIONS.md") return true;
|
|
252
|
+
if (!normalized.startsWith(".gsd/milestones/") && !normalized.startsWith(".gsd/phases/")) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
return isGeneratedPlanningArtifactFileName(basename(normalized));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function isGeneratedPlanningArtifactFileName(fileName: string): boolean {
|
|
259
|
+
if (!fileName.endsWith(".md")) return false;
|
|
260
|
+
const stem = fileName.slice(0, -".md".length).toUpperCase();
|
|
261
|
+
for (const suffix of PLANNING_ARTIFACT_SUFFIXES) {
|
|
262
|
+
if (!stem.endsWith(`-${suffix}`)) continue;
|
|
263
|
+
const idPrefix = stem.slice(0, -suffix.length - 1);
|
|
264
|
+
return /^(?:[MST]\d+|\d{2,})(?:-[A-Z0-9]+)*$/.test(idPrefix);
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function snapshotIgnoredGsdMarkdownProjections(basePath: string): GsdMarkdownSnapshot | null {
|
|
270
|
+
try {
|
|
271
|
+
const output = execFileSync(
|
|
272
|
+
"git",
|
|
273
|
+
["ls-files", "--others", "--ignored", "--exclude-standard", "-z", "--", ".gsd"],
|
|
274
|
+
{ cwd: basePath, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] },
|
|
275
|
+
);
|
|
276
|
+
const snapshot: GsdMarkdownSnapshot = new Map();
|
|
277
|
+
for (const path of output.split("\0")) {
|
|
278
|
+
if (!isGeneratedGsdMarkdownProjection(path)) continue;
|
|
279
|
+
snapshot.set(path, hashFile(join(basePath, path)));
|
|
280
|
+
}
|
|
281
|
+
return snapshot;
|
|
282
|
+
} catch {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function hashFile(path: string): string {
|
|
288
|
+
return createHash("sha256").update(readFileSync(path)).digest("hex");
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function ignoredGsdMarkdownProjectionSnapshotChanged(
|
|
292
|
+
basePath: string,
|
|
293
|
+
before: GsdMarkdownSnapshot | null,
|
|
294
|
+
): boolean {
|
|
295
|
+
if (!before) return true;
|
|
296
|
+
const after = snapshotIgnoredGsdMarkdownProjections(basePath);
|
|
297
|
+
if (!after || after.size !== before.size) return true;
|
|
298
|
+
for (const [path, hash] of before) {
|
|
299
|
+
if (after.get(path) !== hash) return true;
|
|
300
|
+
}
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
|
|
199
304
|
export async function _runMilestoneMergeOnceWithStashRestore(
|
|
200
305
|
ic: IterationContext,
|
|
201
306
|
milestoneId: string,
|
|
@@ -373,6 +373,14 @@ export async function runFinalize(
|
|
|
373
373
|
files: leak.files.map((file) => ({ path: file.path, status: file.status })),
|
|
374
374
|
});
|
|
375
375
|
ctx.ui.notify(message, "error");
|
|
376
|
+
try {
|
|
377
|
+
deps.checkpointWorkflowDatabase?.();
|
|
378
|
+
} catch (err) {
|
|
379
|
+
debugLog("autoLoop", {
|
|
380
|
+
phase: "root-write-leak-checkpoint-failed",
|
|
381
|
+
error: err instanceof Error ? err.message : String(err),
|
|
382
|
+
});
|
|
383
|
+
}
|
|
376
384
|
await deps.stopAuto(ctx, pi, "Root-write leak during isolated auto-mode", {
|
|
377
385
|
preserveCompletedMilestoneBranch: true,
|
|
378
386
|
});
|
|
@@ -34,7 +34,8 @@ import {
|
|
|
34
34
|
preDispatchHealthGate,
|
|
35
35
|
recordHealthSnapshot,
|
|
36
36
|
} from "../doctor-proactive.js";
|
|
37
|
-
import {
|
|
37
|
+
import { autoWorktreeBranch } from "../auto-worktree-branch-lifecycle.js";
|
|
38
|
+
import { checkResourcesStale } from "../auto-worktree-resource-version.js";
|
|
38
39
|
import { getSessionLockStatus } from "../session-lock.js";
|
|
39
40
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
40
41
|
import { emitJournalEvent as _emitJournalEvent } from "../journal.js";
|
|
@@ -49,7 +50,7 @@ import { getPriorSliceCompletionBlocker } from "../dispatch-guard.js";
|
|
|
49
50
|
import { GitServiceImpl } from "../git-service.js";
|
|
50
51
|
import { WorktreeStateProjection } from "../worktree-state-projection.js";
|
|
51
52
|
import { WorktreeLifecycle } from "../worktree-lifecycle.js";
|
|
52
|
-
import {
|
|
53
|
+
import { createDefaultMilestoneMergeTransaction } from "../milestone-merge-transaction.js";
|
|
53
54
|
import { createWorkspace, scopeMilestone } from "../workspace.js";
|
|
54
55
|
import { supportsStructuredQuestions } from "../workflow-mcp.js";
|
|
55
56
|
import { getRegisteredToolSnapshot, getToolBaselineSnapshot } from "../auto-model-selection.js";
|
|
@@ -731,7 +732,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
731
732
|
return new GitServiceImpl(basePath, gitConfig);
|
|
732
733
|
},
|
|
733
734
|
worktreeProjection: new WorktreeStateProjection(),
|
|
734
|
-
|
|
735
|
+
mergeMilestone: createDefaultMilestoneMergeTransaction(),
|
|
735
736
|
});
|
|
736
737
|
}
|
|
737
738
|
|
|
@@ -440,7 +440,8 @@ export async function runPreDispatch(
|
|
|
440
440
|
if (stop) return stop;
|
|
441
441
|
}
|
|
442
442
|
|
|
443
|
-
// PR creation (auto_pr) is handled
|
|
443
|
+
// PR creation (auto_pr) is handled by the publication handoff in
|
|
444
|
+
// the milestone merge transaction (#2302).
|
|
444
445
|
|
|
445
446
|
deps.invalidateAllCaches();
|
|
446
447
|
|
|
@@ -551,7 +552,8 @@ export async function runPreDispatch(
|
|
|
551
552
|
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
552
553
|
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
553
554
|
if (stop) return stop;
|
|
554
|
-
// PR creation (auto_pr) is handled
|
|
555
|
+
// PR creation (auto_pr) is handled by the publication handoff in
|
|
556
|
+
// the milestone merge transaction (#2302).
|
|
555
557
|
}
|
|
556
558
|
const unmappedActive = countUnmappedActiveRequirements();
|
|
557
559
|
const completionStopReason = formatCompletePhaseNextAction(unmappedActive);
|
|
@@ -654,7 +656,8 @@ export async function runPreDispatch(
|
|
|
654
656
|
// #2909 / #5538-followup: preflight stash + always-on postflight pop.
|
|
655
657
|
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
656
658
|
if (stop) return stop;
|
|
657
|
-
// PR creation (auto_pr) is handled
|
|
659
|
+
// PR creation (auto_pr) is handled by the publication handoff in
|
|
660
|
+
// the milestone merge transaction (#2302).
|
|
658
661
|
}
|
|
659
662
|
deps.sendDesktopNotification(
|
|
660
663
|
"GSD",
|
|
@@ -26,7 +26,7 @@ import { debugLog } from "../debug-logger.js";
|
|
|
26
26
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
27
27
|
import { resolveAutoSupervisorConfig } from "../preferences.js";
|
|
28
28
|
import { readUnitRuntimeRecord, type AutoUnitRuntimeRecord } from "../unit-runtime.js";
|
|
29
|
-
import { consumeAutoWakeup } from "./schedule-wakeup.js";
|
|
29
|
+
import { clearAutoWakeup, consumeAutoWakeup } from "./schedule-wakeup.js";
|
|
30
30
|
import { applyUnitSkillVisibility } from "../skill-scope.js";
|
|
31
31
|
|
|
32
32
|
const UNIT_FAILSAFE_BUFFER_MS = 30_000;
|
|
@@ -248,7 +248,7 @@ export async function runUnit(
|
|
|
248
248
|
((supervisor.idle_timeout_minutes ?? 10) * 60 * 1000) + UNIT_FAILSAFE_BUFFER_MS,
|
|
249
249
|
);
|
|
250
250
|
let unitTimeoutHandle: ReturnType<typeof setTimeout> | undefined;
|
|
251
|
-
let result: UnitResult;
|
|
251
|
+
let result: UnitResult = { status: "cancelled" };
|
|
252
252
|
try {
|
|
253
253
|
const awaitAgentEndWithTimeout = (agentEndPromise: Promise<UnitResult>): Promise<UnitResult> => {
|
|
254
254
|
const timeoutResult = new Promise<UnitResult>((resolve) => {
|
|
@@ -360,6 +360,9 @@ export async function runUnit(
|
|
|
360
360
|
}
|
|
361
361
|
} finally {
|
|
362
362
|
if (unitTimeoutHandle) clearTimeout(unitTimeoutHandle);
|
|
363
|
+
if (result.status !== "completed") {
|
|
364
|
+
clearAutoWakeup(s.basePath, unitType, unitId);
|
|
365
|
+
}
|
|
363
366
|
ctx.ui.setWorkingMessage?.(undefined);
|
|
364
367
|
setVisibleSkills?.(undefined);
|
|
365
368
|
}
|
|
@@ -35,6 +35,14 @@ export function consumeAutoWakeup(
|
|
|
35
35
|
return wakeup;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
export function clearAutoWakeup(
|
|
39
|
+
basePath: string,
|
|
40
|
+
unitType: string,
|
|
41
|
+
unitId: string,
|
|
42
|
+
): void {
|
|
43
|
+
pendingWakeups.delete(wakeupKey(basePath, unitType, unitId));
|
|
44
|
+
}
|
|
45
|
+
|
|
38
46
|
export function _resetAutoWakeupsForTest(): void {
|
|
39
47
|
pendingWakeups.clear();
|
|
40
48
|
}
|
|
@@ -29,7 +29,7 @@ import type { MinimalModelRegistry } from "../context-budget.js";
|
|
|
29
29
|
import { parseUnitId } from "../unit-id.js";
|
|
30
30
|
import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
|
|
31
31
|
import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
|
|
32
|
-
import {
|
|
32
|
+
import { getUnitWorkflowDispatchReadinessErrorForModel } from "../tool-contract.js";
|
|
33
33
|
import { prepareWorkflowMcpForProject } from "../workflow-mcp-auto-prep.js";
|
|
34
34
|
import {
|
|
35
35
|
applyThinkingLevelForModel,
|
|
@@ -343,17 +343,13 @@ export async function runUnitPhase(
|
|
|
343
343
|
? `${(s.currentUnitModel as any).provider ?? ""}/${(s.currentUnitModel as any).id ?? ""}`
|
|
344
344
|
: null;
|
|
345
345
|
|
|
346
|
-
const compatibilityError =
|
|
347
|
-
|
|
346
|
+
const compatibilityError = getUnitWorkflowDispatchReadinessErrorForModel({
|
|
347
|
+
model: s.currentUnitModel as any,
|
|
348
|
+
fallbackModel: ctx.model,
|
|
349
|
+
getProviderAuthMode: (provider) => ctx.modelRegistry.getProviderAuthMode(provider),
|
|
348
350
|
projectRoot: s.basePath,
|
|
349
351
|
surface: "auto-mode",
|
|
350
352
|
unitType,
|
|
351
|
-
authMode: s.currentUnitModel?.provider
|
|
352
|
-
? ctx.modelRegistry.getProviderAuthMode(s.currentUnitModel.provider)
|
|
353
|
-
: ctx.model?.provider
|
|
354
|
-
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
355
|
-
: undefined,
|
|
356
|
-
baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
|
|
357
353
|
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
358
354
|
});
|
|
359
355
|
const workflowMcpPrepModel = s.currentUnitModel;
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
} from "./paths.js";
|
|
23
23
|
import { milestoneIdToPhaseNum } from "./layout-policy.js";
|
|
24
24
|
import { parseUnitId } from "./unit-id.js";
|
|
25
|
-
import { dirname, join, relative } from "node:path";
|
|
25
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
26
26
|
import { existsSync } from "node:fs";
|
|
27
27
|
|
|
28
28
|
function resolveMilestoneArtifactPath(
|
|
@@ -221,8 +221,17 @@ export function resolveExpectedArtifactPath(
|
|
|
221
221
|
?? resolveProjectSlicePath(base, mid, sid!)
|
|
222
222
|
?? resolveSlicePath(base, mid, sid!);
|
|
223
223
|
if (!slicePath || !tid) return null;
|
|
224
|
-
|
|
225
|
-
|
|
224
|
+
// Legacy layout: slice dirs live under slices/<SID>/ and task summaries
|
|
225
|
+
// live in a tasks/ subdir. Flat-phase layout: slicePath IS the phase dir
|
|
226
|
+
// and task summaries live beside the plan files at the phase root. A
|
|
227
|
+
// tasks/ subdir may still exist in flat-phase for auxiliary task-scoped
|
|
228
|
+
// artifacts (e.g. T01-VERIFY.json gate outputs) — its mere existence must
|
|
229
|
+
// NOT redirect summary resolution into tasks/ (#1208).
|
|
230
|
+
const isLegacySlice = basename(dirname(slicePath)) === "slices";
|
|
231
|
+
const summaryDir = isLegacySlice
|
|
232
|
+
? (resolveTasksDir(base, mid, sid!) ?? slicePath)
|
|
233
|
+
: slicePath;
|
|
234
|
+
return join(summaryDir, buildTaskFileName(tid, "SUMMARY"));
|
|
226
235
|
}
|
|
227
236
|
case "complete-slice": {
|
|
228
237
|
return resolveSliceArtifactPath(base, mid, sid!, "SUMMARY");
|
|
@@ -27,11 +27,11 @@ import {
|
|
|
27
27
|
buildRunUatPrompt,
|
|
28
28
|
buildReplanSlicePrompt,
|
|
29
29
|
} from "./auto-prompts.js";
|
|
30
|
-
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
30
|
+
import { loadEffectiveGSDPreferences, renderLanguageDirectiveForPrompt } from "./preferences.js";
|
|
31
31
|
import type { MinimalModelRegistry } from "./context-budget.js";
|
|
32
32
|
import { pauseAuto } from "./auto.js";
|
|
33
33
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
34
|
-
import {
|
|
34
|
+
import { getUnitWorkflowDispatchReadinessErrorForModel } from "./tool-contract.js";
|
|
35
35
|
|
|
36
36
|
export function parseDirectDispatchPhase(raw: string): { phase: string; milestoneId?: string } {
|
|
37
37
|
const tokens = raw.trim().split(/\s+/).filter(Boolean);
|
|
@@ -266,13 +266,12 @@ export async function dispatchDirectPhase(
|
|
|
266
266
|
return;
|
|
267
267
|
}
|
|
268
268
|
|
|
269
|
-
const compatibilityError =
|
|
270
|
-
|
|
269
|
+
const compatibilityError = getUnitWorkflowDispatchReadinessErrorForModel({
|
|
270
|
+
model: ctx.model,
|
|
271
|
+
getProviderAuthMode: (provider) => ctx.modelRegistry.getProviderAuthMode(provider),
|
|
271
272
|
projectRoot,
|
|
272
273
|
surface: "direct phase dispatch",
|
|
273
274
|
unitType,
|
|
274
|
-
authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
|
|
275
|
-
baseUrl: ctx.model?.baseUrl,
|
|
276
275
|
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
277
276
|
});
|
|
278
277
|
if (compatibilityError) {
|
|
@@ -287,8 +286,15 @@ export async function dispatchDirectPhase(
|
|
|
287
286
|
ctx.ui.notify("Session creation cancelled.", "warning");
|
|
288
287
|
return;
|
|
289
288
|
}
|
|
289
|
+
// Inject the configured response language into the dispatched prompt content
|
|
290
|
+
// — the new session's system prompt does not carry the preferences block, so
|
|
291
|
+
// the language setting would otherwise never reach the unit (#1210).
|
|
292
|
+
const languageDirective = renderLanguageDirectiveForPrompt(
|
|
293
|
+
loadEffectiveGSDPreferences(dispatchBase)?.preferences,
|
|
294
|
+
);
|
|
295
|
+
const dispatchContent = languageDirective ? `${languageDirective}\n\n${prompt}` : prompt;
|
|
290
296
|
pi.sendMessage(
|
|
291
|
-
{ customType: "gsd-dispatch", content:
|
|
297
|
+
{ customType: "gsd-dispatch", content: dispatchContent, display: false },
|
|
292
298
|
{ triggerTurn: true },
|
|
293
299
|
);
|
|
294
300
|
}
|