@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
|
@@ -280,6 +280,15 @@ export async function runFinalize(ic, iterData, loopState, sidecarItem) {
|
|
|
280
280
|
files: leak.files.map((file) => ({ path: file.path, status: file.status })),
|
|
281
281
|
});
|
|
282
282
|
ctx.ui.notify(message, "error");
|
|
283
|
+
try {
|
|
284
|
+
deps.checkpointWorkflowDatabase?.();
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
debugLog("autoLoop", {
|
|
288
|
+
phase: "root-write-leak-checkpoint-failed",
|
|
289
|
+
error: err instanceof Error ? err.message : String(err),
|
|
290
|
+
});
|
|
291
|
+
}
|
|
283
292
|
await deps.stopAuto(ctx, pi, "Root-write leak during isolated auto-mode", {
|
|
284
293
|
preserveCompletedMilestoneBranch: true,
|
|
285
294
|
});
|
|
@@ -21,7 +21,8 @@ import { createWorktreeSafetyModule } from "../worktree-safety.js";
|
|
|
21
21
|
import { repairAutoWorktreeSafetyFailure } from "../auto-worktree-repair.js";
|
|
22
22
|
import { resolveManifest } from "../unit-context-manifest.js";
|
|
23
23
|
import { preDispatchHealthGate, recordHealthSnapshot, } from "../doctor-proactive.js";
|
|
24
|
-
import {
|
|
24
|
+
import { autoWorktreeBranch } from "../auto-worktree-branch-lifecycle.js";
|
|
25
|
+
import { checkResourcesStale } from "../auto-worktree-resource-version.js";
|
|
25
26
|
import { getSessionLockStatus } from "../session-lock.js";
|
|
26
27
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
27
28
|
import { emitJournalEvent as _emitJournalEvent } from "../journal.js";
|
|
@@ -31,7 +32,7 @@ import { getPriorSliceCompletionBlocker } from "../dispatch-guard.js";
|
|
|
31
32
|
import { GitServiceImpl } from "../git-service.js";
|
|
32
33
|
import { WorktreeStateProjection } from "../worktree-state-projection.js";
|
|
33
34
|
import { WorktreeLifecycle } from "../worktree-lifecycle.js";
|
|
34
|
-
import {
|
|
35
|
+
import { createDefaultMilestoneMergeTransaction } from "../milestone-merge-transaction.js";
|
|
35
36
|
import { createWorkspace, scopeMilestone } from "../workspace.js";
|
|
36
37
|
import { supportsStructuredQuestions } from "../workflow-mcp.js";
|
|
37
38
|
import { getRegisteredToolSnapshot, getToolBaselineSnapshot } from "../auto-model-selection.js";
|
|
@@ -560,7 +561,7 @@ export class AutoOrchestrator {
|
|
|
560
561
|
return new GitServiceImpl(basePath, gitConfig);
|
|
561
562
|
},
|
|
562
563
|
worktreeProjection: new WorktreeStateProjection(),
|
|
563
|
-
|
|
564
|
+
mergeMilestone: createDefaultMilestoneMergeTransaction(),
|
|
564
565
|
});
|
|
565
566
|
}
|
|
566
567
|
rebuildScope(rawPath, milestoneId) {
|
|
@@ -345,7 +345,8 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
345
345
|
if (stop)
|
|
346
346
|
return stop;
|
|
347
347
|
}
|
|
348
|
-
// PR creation (auto_pr) is handled
|
|
348
|
+
// PR creation (auto_pr) is handled by the publication handoff in
|
|
349
|
+
// the milestone merge transaction (#2302).
|
|
349
350
|
deps.invalidateAllCaches();
|
|
350
351
|
state = await deps.deriveState(s.canonicalProjectRoot);
|
|
351
352
|
mid = state.activeMilestone?.id;
|
|
@@ -430,7 +431,8 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
430
431
|
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
431
432
|
if (stop)
|
|
432
433
|
return stop;
|
|
433
|
-
// PR creation (auto_pr) is handled
|
|
434
|
+
// PR creation (auto_pr) is handled by the publication handoff in
|
|
435
|
+
// the milestone merge transaction (#2302).
|
|
434
436
|
}
|
|
435
437
|
const unmappedActive = countUnmappedActiveRequirements();
|
|
436
438
|
const completionStopReason = formatCompletePhaseNextAction(unmappedActive);
|
|
@@ -506,7 +508,8 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
506
508
|
const stop = await _runMilestoneMergeOnceWithStashRestore(ic, s.currentMilestoneId);
|
|
507
509
|
if (stop)
|
|
508
510
|
return stop;
|
|
509
|
-
// PR creation (auto_pr) is handled
|
|
511
|
+
// PR creation (auto_pr) is handled by the publication handoff in
|
|
512
|
+
// the milestone merge transaction (#2302).
|
|
510
513
|
}
|
|
511
514
|
deps.sendDesktopNotification("GSD", `Milestone ${mid} complete!`, "success", "milestone", basename(s.originalBasePath || s.basePath));
|
|
512
515
|
deps.logCmuxEvent(prefs, `Milestone ${mid} complete.`, "success");
|
|
@@ -6,7 +6,7 @@ import { debugLog } from "../debug-logger.js";
|
|
|
6
6
|
import { logWarning } from "../workflow-logger.js";
|
|
7
7
|
import { resolveAutoSupervisorConfig } from "../preferences.js";
|
|
8
8
|
import { readUnitRuntimeRecord } from "../unit-runtime.js";
|
|
9
|
-
import { consumeAutoWakeup } from "./schedule-wakeup.js";
|
|
9
|
+
import { clearAutoWakeup, consumeAutoWakeup } from "./schedule-wakeup.js";
|
|
10
10
|
import { applyUnitSkillVisibility } from "../skill-scope.js";
|
|
11
11
|
const UNIT_FAILSAFE_BUFFER_MS = 30_000;
|
|
12
12
|
const UNIT_FAILSAFE_RECHECK_MS = 30_000;
|
|
@@ -192,7 +192,7 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
192
192
|
const UNIT_HARD_TIMEOUT_MS = Math.max(UNIT_FAILSAFE_BUFFER_MS, ((supervisor.hard_timeout_minutes ?? 30) * 60 * 1000) + UNIT_FAILSAFE_BUFFER_MS);
|
|
193
193
|
const freshProgressMs = Math.max(UNIT_FAILSAFE_BUFFER_MS, ((supervisor.idle_timeout_minutes ?? 10) * 60 * 1000) + UNIT_FAILSAFE_BUFFER_MS);
|
|
194
194
|
let unitTimeoutHandle;
|
|
195
|
-
let result;
|
|
195
|
+
let result = { status: "cancelled" };
|
|
196
196
|
try {
|
|
197
197
|
const awaitAgentEndWithTimeout = (agentEndPromise) => {
|
|
198
198
|
const timeoutResult = new Promise((resolve) => {
|
|
@@ -297,6 +297,9 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
297
297
|
finally {
|
|
298
298
|
if (unitTimeoutHandle)
|
|
299
299
|
clearTimeout(unitTimeoutHandle);
|
|
300
|
+
if (result.status !== "completed") {
|
|
301
|
+
clearAutoWakeup(s.basePath, unitType, unitId);
|
|
302
|
+
}
|
|
300
303
|
ctx.ui.setWorkingMessage?.(undefined);
|
|
301
304
|
setVisibleSkills?.(undefined);
|
|
302
305
|
}
|
|
@@ -13,6 +13,9 @@ export function consumeAutoWakeup(basePath, unitType, unitId) {
|
|
|
13
13
|
pendingWakeups.delete(key);
|
|
14
14
|
return wakeup;
|
|
15
15
|
}
|
|
16
|
+
export function clearAutoWakeup(basePath, unitType, unitId) {
|
|
17
|
+
pendingWakeups.delete(wakeupKey(basePath, unitType, unitId));
|
|
18
|
+
}
|
|
16
19
|
export function _resetAutoWakeupsForTest() {
|
|
17
20
|
pendingWakeups.clear();
|
|
18
21
|
}
|
|
@@ -17,7 +17,7 @@ import { isDbAvailable, getTask } from "../gsd-db.js";
|
|
|
17
17
|
import { parseUnitId } from "../unit-id.js";
|
|
18
18
|
import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
|
|
19
19
|
import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
|
|
20
|
-
import {
|
|
20
|
+
import { getUnitWorkflowDispatchReadinessErrorForModel } from "../tool-contract.js";
|
|
21
21
|
import { prepareWorkflowMcpForProject } from "../workflow-mcp-auto-prep.js";
|
|
22
22
|
import { applyThinkingLevelForModel, floorThinkingLevelForUnit, } from "../auto-model-selection.js";
|
|
23
23
|
import { isSuspiciousGhostCompletion } from "../auto-unit-closeout.js";
|
|
@@ -246,17 +246,13 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
246
246
|
s.currentDispatchedModelId = s.currentUnitModel
|
|
247
247
|
? `${s.currentUnitModel.provider ?? ""}/${s.currentUnitModel.id ?? ""}`
|
|
248
248
|
: null;
|
|
249
|
-
const compatibilityError =
|
|
250
|
-
|
|
249
|
+
const compatibilityError = getUnitWorkflowDispatchReadinessErrorForModel({
|
|
250
|
+
model: s.currentUnitModel,
|
|
251
|
+
fallbackModel: ctx.model,
|
|
252
|
+
getProviderAuthMode: (provider) => ctx.modelRegistry.getProviderAuthMode(provider),
|
|
251
253
|
projectRoot: s.basePath,
|
|
252
254
|
surface: "auto-mode",
|
|
253
255
|
unitType,
|
|
254
|
-
authMode: s.currentUnitModel?.provider
|
|
255
|
-
? ctx.modelRegistry.getProviderAuthMode(s.currentUnitModel.provider)
|
|
256
|
-
: ctx.model?.provider
|
|
257
|
-
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
258
|
-
: undefined,
|
|
259
|
-
baseUrl: s.currentUnitModel?.baseUrl ?? ctx.model?.baseUrl,
|
|
260
256
|
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
261
257
|
});
|
|
262
258
|
const workflowMcpPrepModel = s.currentUnitModel;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { gsdRoot, resolveDir, resolveFile, resolveMilestonePath, resolveMilestoneFile, resolveSliceFile, relMilestoneFile, relSliceFile, buildTaskFileName, resolveSlicePath, resolveTasksDir, dirIsMetaOnlyLegacyMilestone, } from "./paths.js";
|
|
9
9
|
import { milestoneIdToPhaseNum } from "./layout-policy.js";
|
|
10
10
|
import { parseUnitId } from "./unit-id.js";
|
|
11
|
-
import { dirname, join, relative } from "node:path";
|
|
11
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
12
12
|
import { existsSync } from "node:fs";
|
|
13
13
|
function resolveMilestoneArtifactPath(base, mid, suffix) {
|
|
14
14
|
const existing = resolveProjectedMilestoneFile(base, mid, suffix) ?? resolveProjectMilestoneFile(base, mid, suffix);
|
|
@@ -193,8 +193,17 @@ export function resolveExpectedArtifactPath(unitType, unitId, base) {
|
|
|
193
193
|
?? resolveSlicePath(base, mid, sid);
|
|
194
194
|
if (!slicePath || !tid)
|
|
195
195
|
return null;
|
|
196
|
-
|
|
197
|
-
|
|
196
|
+
// Legacy layout: slice dirs live under slices/<SID>/ and task summaries
|
|
197
|
+
// live in a tasks/ subdir. Flat-phase layout: slicePath IS the phase dir
|
|
198
|
+
// and task summaries live beside the plan files at the phase root. A
|
|
199
|
+
// tasks/ subdir may still exist in flat-phase for auxiliary task-scoped
|
|
200
|
+
// artifacts (e.g. T01-VERIFY.json gate outputs) — its mere existence must
|
|
201
|
+
// NOT redirect summary resolution into tasks/ (#1208).
|
|
202
|
+
const isLegacySlice = basename(dirname(slicePath)) === "slices";
|
|
203
|
+
const summaryDir = isLegacySlice
|
|
204
|
+
? (resolveTasksDir(base, mid, sid) ?? slicePath)
|
|
205
|
+
: slicePath;
|
|
206
|
+
return join(summaryDir, buildTaskFileName(tid, "SUMMARY"));
|
|
198
207
|
}
|
|
199
208
|
case "complete-slice": {
|
|
200
209
|
return resolveSliceArtifactPath(base, mid, sid, "SUMMARY");
|
|
@@ -7,10 +7,10 @@ import { loadFile } from "./files.js";
|
|
|
7
7
|
import { isDbAvailable, getClosedSliceIds } from "./gsd-db.js";
|
|
8
8
|
import { resolveSliceFile, relSliceFile, } from "./paths.js";
|
|
9
9
|
import { buildResearchSlicePrompt, buildResearchMilestonePrompt, buildPlanSlicePrompt, buildPlanMilestonePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReassessRoadmapPrompt, buildRunUatPrompt, buildReplanSlicePrompt, } from "./auto-prompts.js";
|
|
10
|
-
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
10
|
+
import { loadEffectiveGSDPreferences, renderLanguageDirectiveForPrompt } from "./preferences.js";
|
|
11
11
|
import { pauseAuto } from "./auto.js";
|
|
12
12
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
13
|
-
import {
|
|
13
|
+
import { getUnitWorkflowDispatchReadinessErrorForModel } from "./tool-contract.js";
|
|
14
14
|
export function parseDirectDispatchPhase(raw) {
|
|
15
15
|
const tokens = raw.trim().split(/\s+/).filter(Boolean);
|
|
16
16
|
if (tokens.length === 0)
|
|
@@ -213,13 +213,12 @@ export async function dispatchDirectPhase(ctx, pi, phase, base, opts = {}) {
|
|
|
213
213
|
ctx.ui.notify(`Unknown phase "${phase}". Valid phases: research, plan, execute, complete, validate, reassess, uat, replan.`, "warning");
|
|
214
214
|
return;
|
|
215
215
|
}
|
|
216
|
-
const compatibilityError =
|
|
217
|
-
|
|
216
|
+
const compatibilityError = getUnitWorkflowDispatchReadinessErrorForModel({
|
|
217
|
+
model: ctx.model,
|
|
218
|
+
getProviderAuthMode: (provider) => ctx.modelRegistry.getProviderAuthMode(provider),
|
|
218
219
|
projectRoot,
|
|
219
220
|
surface: "direct phase dispatch",
|
|
220
221
|
unitType,
|
|
221
|
-
authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
|
|
222
|
-
baseUrl: ctx.model?.baseUrl,
|
|
223
222
|
activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
|
|
224
223
|
});
|
|
225
224
|
if (compatibilityError) {
|
|
@@ -232,5 +231,10 @@ export async function dispatchDirectPhase(ctx, pi, phase, base, opts = {}) {
|
|
|
232
231
|
ctx.ui.notify("Session creation cancelled.", "warning");
|
|
233
232
|
return;
|
|
234
233
|
}
|
|
235
|
-
|
|
234
|
+
// Inject the configured response language into the dispatched prompt content
|
|
235
|
+
// — the new session's system prompt does not carry the preferences block, so
|
|
236
|
+
// the language setting would otherwise never reach the unit (#1210).
|
|
237
|
+
const languageDirective = renderLanguageDirectiveForPrompt(loadEffectiveGSDPreferences(dispatchBase)?.preferences);
|
|
238
|
+
const dispatchContent = languageDirective ? `${languageDirective}\n\n${prompt}` : prompt;
|
|
239
|
+
pi.sendMessage({ customType: "gsd-dispatch", content: dispatchContent, display: false }, { triggerTurn: true });
|
|
236
240
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Declarative auto-mode dispatch rules and dispatch resolver.
|
|
3
|
+
import { renderLanguageDirectiveForPrompt } from "./preferences.js";
|
|
3
4
|
import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
|
|
4
5
|
import { getUatBrowserToolSupportError } from "./uat-policy.js";
|
|
5
6
|
import { isDbAvailable, getMilestoneSlices, getMilestoneSliceSummaries, getClosedSliceIds, getPendingGatesForTurn, markPendingGatesOmittedForTurn, getMilestone, insertArtifact, insertAssessment, setSliceSketchFlag, transaction, getAssessment, getSliceRunUatAssessment, } from "./gsd-db.js";
|
|
@@ -596,7 +597,7 @@ export const DISPATCH_RULES = [
|
|
|
596
597
|
},
|
|
597
598
|
},
|
|
598
599
|
{
|
|
599
|
-
name: "uat-verdict-gate (non-PASS
|
|
600
|
+
name: "uat-verdict-gate (non-PASS observed; closeout enforces)",
|
|
600
601
|
match: async ({ mid, basePath, prefs }) => {
|
|
601
602
|
// Only applies when UAT dispatch is enabled
|
|
602
603
|
if (!prefs?.uat_dispatch)
|
|
@@ -611,9 +612,9 @@ export const DISPATCH_RULES = [
|
|
|
611
612
|
continue;
|
|
612
613
|
const { verdict, uatType } = result;
|
|
613
614
|
if (!isAcceptableUatVerdict(verdict, uatType)) {
|
|
614
|
-
//
|
|
615
|
-
// so follow-up slices can remediate, while
|
|
616
|
-
// enforces manual UAT PASS sign-off before closure.
|
|
615
|
+
// Observe non-PASS verdicts without hard-stopping auto-mode. Allow
|
|
616
|
+
// progression so follow-up slices can remediate, while
|
|
617
|
+
// complete-milestone still enforces manual UAT PASS sign-off before closure.
|
|
617
618
|
continue;
|
|
618
619
|
}
|
|
619
620
|
}
|
|
@@ -902,9 +903,19 @@ export const DISPATCH_RULES = [
|
|
|
902
903
|
const sliceContextFile = resolveSliceFile(basePath, mid, state.activeSlice.id, "CONTEXT");
|
|
903
904
|
if (sliceContextFile && existsSync(sliceContextFile))
|
|
904
905
|
return null; // discussion already done, proceed
|
|
906
|
+
const closedSliceIds = getClosedSliceIds(mid);
|
|
907
|
+
const justClosedSliceId = closedSliceIds[closedSliceIds.length - 1];
|
|
908
|
+
let priorVerdictWarning = "";
|
|
909
|
+
if (justClosedSliceId) {
|
|
910
|
+
const prior = await readUatGateVerdict(basePath, mid, justClosedSliceId);
|
|
911
|
+
if (prior && !isAcceptableUatVerdict(prior.verdict, prior.uatType)) {
|
|
912
|
+
priorVerdictWarning =
|
|
913
|
+
` Note: the slice just closed (${justClosedSliceId}) recorded a non-PASS UAT verdict (${prior.verdict.toUpperCase()}); review before continuing.`;
|
|
914
|
+
}
|
|
915
|
+
}
|
|
905
916
|
return {
|
|
906
917
|
action: "stop",
|
|
907
|
-
reason: `Slice ${state.activeSlice.id} requires discussion before planning (require_slice_discussion is enabled). Run /gsd discuss to discuss this slice, then /gsd auto to resume
|
|
918
|
+
reason: `Slice ${state.activeSlice.id} requires discussion before planning (require_slice_discussion is enabled). Run /gsd discuss to discuss this slice, then /gsd auto to resume.${priorVerdictWarning}`,
|
|
908
919
|
level: "warning",
|
|
909
920
|
};
|
|
910
921
|
},
|
|
@@ -1490,6 +1501,19 @@ export const DISPATCH_RULES = [
|
|
|
1490
1501
|
},
|
|
1491
1502
|
];
|
|
1492
1503
|
import { getRegistry } from "./rule-registry.js";
|
|
1504
|
+
/**
|
|
1505
|
+
* Prepend the configured response-language directive to a dispatched unit
|
|
1506
|
+
* prompt so auto-execution units respond in the language set in PREFERENCES.md
|
|
1507
|
+
* (#1210). No-op for non-dispatch actions or when no language is configured.
|
|
1508
|
+
*/
|
|
1509
|
+
function applyLanguageDirectiveToDispatch(action, prefs) {
|
|
1510
|
+
if (action.action !== "dispatch" || !action.prompt)
|
|
1511
|
+
return action;
|
|
1512
|
+
const directive = renderLanguageDirectiveForPrompt(prefs);
|
|
1513
|
+
if (!directive)
|
|
1514
|
+
return action;
|
|
1515
|
+
return { ...action, prompt: `${directive}\n\n${action.prompt}` };
|
|
1516
|
+
}
|
|
1493
1517
|
// ─── Resolver ─────────────────────────────────────────────────────────────
|
|
1494
1518
|
/**
|
|
1495
1519
|
* Evaluate dispatch rules in order. Returns the first matching action,
|
|
@@ -1541,7 +1565,7 @@ export async function resolveDispatch(ctx) {
|
|
|
1541
1565
|
level: "error",
|
|
1542
1566
|
};
|
|
1543
1567
|
}
|
|
1544
|
-
return action;
|
|
1568
|
+
return applyLanguageDirectiveToDispatch(action, ctx.prefs);
|
|
1545
1569
|
}
|
|
1546
1570
|
catch (err) {
|
|
1547
1571
|
// Registry not initialized — fall back to inline loop
|
|
@@ -1562,7 +1586,7 @@ export async function resolveDispatch(ctx) {
|
|
|
1562
1586
|
matchedRule: rule.name,
|
|
1563
1587
|
};
|
|
1564
1588
|
}
|
|
1565
|
-
return action;
|
|
1589
|
+
return applyLanguageDirectiveToDispatch(action, ctx.prefs);
|
|
1566
1590
|
}
|
|
1567
1591
|
}
|
|
1568
1592
|
// No rule matched — unhandled phase.
|
|
@@ -326,7 +326,7 @@ export function floorThinkingLevelForUnit(unitType, level) {
|
|
|
326
326
|
return EXECUTE_TASK_MIN_THINKING_LEVEL;
|
|
327
327
|
}
|
|
328
328
|
export function resolvePreferredModelConfig(unitType, autoModeStartModel, isAutoMode = true, basePath, availableModelIds, preferredModelId) {
|
|
329
|
-
const explicitConfig = resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds, preferredModelId);
|
|
329
|
+
const explicitConfig = resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds, preferredModelId, true);
|
|
330
330
|
if (explicitConfig) {
|
|
331
331
|
return {
|
|
332
332
|
...explicitConfig,
|
|
@@ -338,23 +338,45 @@ export function resolvePreferredModelConfig(unitType, autoModeStartModel, isAuto
|
|
|
338
338
|
if (!isAutoMode)
|
|
339
339
|
return undefined;
|
|
340
340
|
const routingConfig = resolveDynamicRoutingConfig();
|
|
341
|
-
if (!routingConfig.enabled
|
|
341
|
+
if (!routingConfig.enabled)
|
|
342
342
|
return undefined;
|
|
343
|
-
//
|
|
344
|
-
//
|
|
345
|
-
//
|
|
346
|
-
|
|
343
|
+
// Only an explicit flat-rate opt-out suppresses synthesized routing.
|
|
344
|
+
// `dynamic_routing.enabled: true` is user intent to run routing even when
|
|
345
|
+
// the start provider is a flat-rate subscription. Applied ahead of both the
|
|
346
|
+
// tier-pin and profile-derived synthesis paths so the opt-out is uniform.
|
|
347
|
+
if (routingConfig.allow_flat_rate_providers === false &&
|
|
347
348
|
autoModeStartModel &&
|
|
348
349
|
isFlatRateProvider(autoModeStartModel.provider, autoModeStartModel.flatRateCtx)) {
|
|
349
350
|
return undefined;
|
|
350
351
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
if (
|
|
352
|
+
// With explicit `tier_models` pins, synthesize a heavy-tier ceiling that
|
|
353
|
+
// dynamic routing downgrades from per unit.
|
|
354
|
+
if (routingConfig.tier_models) {
|
|
355
|
+
const ceilingModel = routingConfig.tier_models.heavy
|
|
356
|
+
?? (autoModeStartModel ? `${autoModeStartModel.provider}/${autoModeStartModel.id}` : undefined);
|
|
357
|
+
if (!ceilingModel)
|
|
358
|
+
return undefined;
|
|
359
|
+
return {
|
|
360
|
+
primary: ceilingModel,
|
|
361
|
+
fallbacks: [],
|
|
362
|
+
source: "synthesized",
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
// No `tier_models` pins: fall back to the token-profile's per-phase model so
|
|
366
|
+
// profile tier resolution survives. `skipProfileDefaults` is left false here
|
|
367
|
+
// (unlike the explicit-detection call above) precisely because we WANT the
|
|
368
|
+
// profile defaults this time — they are the routing ceiling, not a hard
|
|
369
|
+
// user selection. Labeling the result `synthesized` (not `explicit`) keeps
|
|
370
|
+
// dynamic routing and fallbacks enabled downstream. Without this branch,
|
|
371
|
+
// `resolvePreferredModelConfig` returns undefined for profile-only configs
|
|
372
|
+
// and auto dispatch bleeds the start model onto every unit, silently
|
|
373
|
+
// discarding the profile (#1115: routing/fallbacks disabled when a
|
|
374
|
+
// token_profile is set but no tier_models are pinned).
|
|
375
|
+
const profileConfig = resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds, preferredModelId, false);
|
|
376
|
+
if (!profileConfig)
|
|
354
377
|
return undefined;
|
|
355
378
|
return {
|
|
356
|
-
|
|
357
|
-
fallbacks: [],
|
|
379
|
+
...profileConfig,
|
|
358
380
|
source: "synthesized",
|
|
359
381
|
};
|
|
360
382
|
}
|
|
@@ -510,15 +532,11 @@ autoModeStartThinkingLevel) {
|
|
|
510
532
|
]));
|
|
511
533
|
}
|
|
512
534
|
}
|
|
513
|
-
// Disable routing for flat-rate providers
|
|
514
|
-
//
|
|
515
|
-
// model provides no cost benefit — it only degrades quality.
|
|
535
|
+
// Disable routing for flat-rate providers only when the user explicitly
|
|
536
|
+
// opts out with dynamic_routing.allow_flat_rate_providers: false.
|
|
516
537
|
// Fail-closed: if primary model can't be resolved, fall back to
|
|
517
538
|
// provider-level signals rather than allowing unwanted downgrades.
|
|
518
|
-
|
|
519
|
-
// claude-code subscribers can still get intelligent per-task selection
|
|
520
|
-
// across their subscription (#4386).
|
|
521
|
-
if (routingConfig.enabled && !routingConfig.allow_flat_rate_providers) {
|
|
539
|
+
if (routingConfig.enabled && routingConfig.allow_flat_rate_providers === false) {
|
|
522
540
|
const primaryModel = resolveModelId(modelConfig.primary, routingEligibleModels, ctx.model?.provider);
|
|
523
541
|
if (primaryModel) {
|
|
524
542
|
const primaryFlatRateCtx = buildFlatRateContext(primaryModel.provider, ctx, prefs);
|
|
@@ -12,12 +12,13 @@ import { hasVerdict, extractVerdict } from "./verdict-parser.js";
|
|
|
12
12
|
import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
13
13
|
import { resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveTasksDir, resolveTaskFiles, resolveTaskFile, relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath, relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile, } from "./paths.js";
|
|
14
14
|
import { resolveInlineLevel, loadEffectiveGSDPreferences } from "./preferences.js";
|
|
15
|
+
import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
|
|
15
16
|
import { isContextModeEnabled } from "./preferences-types.js";
|
|
16
17
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
17
|
-
import { join } from "node:path";
|
|
18
|
+
import { join, relative, sep } from "node:path";
|
|
18
19
|
import { existsSync } from "node:fs";
|
|
19
20
|
import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary } from "./context-budget.js";
|
|
20
|
-
import { getPendingGatesForTurn } from "./gsd-db.js";
|
|
21
|
+
import { getGateResults, getPendingGatesForTurn } from "./gsd-db.js";
|
|
21
22
|
import { assertGateCoverage, getGatesForTurn, } from "./gate-registry.js";
|
|
22
23
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
23
24
|
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
@@ -295,6 +296,37 @@ function formatExecutorConstraints(sessionContextWindow, modelRegistry, sessionP
|
|
|
295
296
|
`- Keep individual tasks completable within a single context window — if a task needs more context than fits, split it`,
|
|
296
297
|
].join("\n");
|
|
297
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Builds the Declared Repositories block for parent-workspace planners.
|
|
301
|
+
* Returns "" for single-repo projects so the common-case prompt is unchanged;
|
|
302
|
+
* only parent mode with declared child repos gets the registry list and the
|
|
303
|
+
* targetRepositories assignment instruction.
|
|
304
|
+
*/
|
|
305
|
+
export function buildRepoRegistryBlock(base) {
|
|
306
|
+
let registry;
|
|
307
|
+
try {
|
|
308
|
+
registry = createRepositoryRegistryFromPreferences(base, loadEffectiveGSDPreferences(base)?.preferences);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return "";
|
|
312
|
+
}
|
|
313
|
+
const hasChildRepo = registry.repositories.some((repo) => repo.id !== "project");
|
|
314
|
+
if (registry.mode !== "parent" || !hasChildRepo)
|
|
315
|
+
return "";
|
|
316
|
+
const lines = registry.repositories.map((repo) => {
|
|
317
|
+
const relPath = relative(registry.projectRoot, repo.root).split(sep).join("/") || ".";
|
|
318
|
+
const role = repo.role ? ` — ${repo.role}` : "";
|
|
319
|
+
const root = repo.id === "project" ? " (root)" : ` (${relPath})`;
|
|
320
|
+
return `- \`${repo.id}\`${root}${role}`;
|
|
321
|
+
});
|
|
322
|
+
return [
|
|
323
|
+
"### Declared Repositories",
|
|
324
|
+
"",
|
|
325
|
+
...lines,
|
|
326
|
+
"",
|
|
327
|
+
"This is a parent workspace. Assign each task's `targetRepositories` to the repository id(s) it touches (from the list above). Omit `targetRepositories` to inherit the slice-wide default from `gsd_plan_slice`; set it explicitly when a task differs (e.g. `[\"project\"]` for parent-root work).",
|
|
328
|
+
].join("\n");
|
|
329
|
+
}
|
|
298
330
|
/**
|
|
299
331
|
* Returns a markdown bullet list of known context file paths for the given
|
|
300
332
|
* milestone (and optionally slice). Falls back to a generic tool-agnostic
|
|
@@ -2174,6 +2206,7 @@ async function renderSlicePrompt(options) {
|
|
|
2174
2206
|
inlinedContext,
|
|
2175
2207
|
dependencySummaries: depContent,
|
|
2176
2208
|
sourceFilePaths: buildSourceFilePaths(base, mid, sid),
|
|
2209
|
+
repoRegistry: buildRepoRegistryBlock(base),
|
|
2177
2210
|
executorContextConstraints,
|
|
2178
2211
|
commitInstruction,
|
|
2179
2212
|
skillActivation: buildSkillActivationBlock({
|
|
@@ -2906,6 +2939,47 @@ export async function buildValidateMilestonePrompt(mid, midTitle, base, level) {
|
|
|
2906
2939
|
inlined.push(outstandingBlock);
|
|
2907
2940
|
trackPromptContext(contextTelemetry, "outstanding-items", "inline", outstandingBlock);
|
|
2908
2941
|
}
|
|
2942
|
+
const persistedGateFlags = [];
|
|
2943
|
+
try {
|
|
2944
|
+
const gateLabels = {
|
|
2945
|
+
Q3: "Threat Surface",
|
|
2946
|
+
Q4: "Requirement Impact",
|
|
2947
|
+
};
|
|
2948
|
+
for (const sid of seenValSlices) {
|
|
2949
|
+
for (const gate of getGateResults(mid, sid, "slice")) {
|
|
2950
|
+
if (gate.gate_id !== "Q3" && gate.gate_id !== "Q4")
|
|
2951
|
+
continue;
|
|
2952
|
+
const findings = gate.findings.trim();
|
|
2953
|
+
const rationale = gate.rationale.trim();
|
|
2954
|
+
const verdict = gate.verdict ?? "";
|
|
2955
|
+
const hasNonPassVerdict = verdict !== "" && verdict !== "pass" && verdict !== "omitted";
|
|
2956
|
+
if (!findings && !hasNonPassVerdict)
|
|
2957
|
+
continue;
|
|
2958
|
+
const displayVerdict = verdict || gate.status;
|
|
2959
|
+
const detail = findings || rationale || "_No findings text recorded; reconcile the persisted non-pass verdict._";
|
|
2960
|
+
persistedGateFlags.push(`- **${sid} / ${gate.gate_id} (${gateLabels[gate.gate_id]}) / ${displayVerdict}:** ${detail}`);
|
|
2961
|
+
if (findings && rationale)
|
|
2962
|
+
persistedGateFlags.push(` - Rationale: ${rationale}`);
|
|
2963
|
+
}
|
|
2964
|
+
}
|
|
2965
|
+
}
|
|
2966
|
+
catch (err) {
|
|
2967
|
+
logWarning("prompt", `buildValidateMilestonePrompt persisted gate flags lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2968
|
+
}
|
|
2969
|
+
if (persistedGateFlags.length > 0) {
|
|
2970
|
+
const persistedGateFlagsBlock = [
|
|
2971
|
+
"### Persisted Slice-Level Gate Flags (from quality_gates)",
|
|
2972
|
+
"",
|
|
2973
|
+
"These slice gates recorded findings or non-pass verdicts during execution. Reconcile each against the milestone-level evidence before returning MV03/MV04 verdicts.",
|
|
2974
|
+
"",
|
|
2975
|
+
...persistedGateFlags,
|
|
2976
|
+
].join("\n");
|
|
2977
|
+
inlined.push(persistedGateFlagsBlock);
|
|
2978
|
+
trackPromptContext(contextTelemetry, "persisted-slice-gate-flags", "inline", persistedGateFlagsBlock);
|
|
2979
|
+
}
|
|
2980
|
+
else {
|
|
2981
|
+
trackPromptContext(contextTelemetry, "persisted-slice-gate-flags", "skipped", null, "none");
|
|
2982
|
+
}
|
|
2909
2983
|
// Inline existing VALIDATION file if this is a re-validation round
|
|
2910
2984
|
const validationPath = resolveMilestoneFile(base, mid, "VALIDATION");
|
|
2911
2985
|
const validationRel = relMilestoneFile(base, mid, "VALIDATION");
|
|
@@ -149,12 +149,56 @@ export function refreshRecoveryDbForArtifact(unitType, unitId, basePath) {
|
|
|
149
149
|
};
|
|
150
150
|
}
|
|
151
151
|
if (!isClosedStatus(task.status)) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
152
|
+
// The artifact was already confirmed on disk by verifyExpectedArtifact
|
|
153
|
+
// upstream (Gate 1 accepts a checked disk checkbox as proof of completion),
|
|
154
|
+
// but the DB task row is still open. A bare refreshWorkflowDatabaseFromDisk
|
|
155
|
+
// never promotes the disk checkbox into task status (the checkbox is
|
|
156
|
+
// rendered *from* the DB, never *into* it), so this divergence can never
|
|
157
|
+
// self-heal. Promote the task to align the DB with disk instead of failing
|
|
158
|
+
// shut — otherwise the lowest-pending derivation re-picks the same task
|
|
159
|
+
// forever and execute-task hard-stops with "state did not advance" (#1204).
|
|
160
|
+
// Mirrors the promotion pattern used by the context-exhaustion and
|
|
161
|
+
// reactive-execute-blocker recovery paths.
|
|
162
|
+
const ts = new Date().toISOString();
|
|
163
|
+
// Only the DB promotion is load-bearing: if it throws, nothing advanced
|
|
164
|
+
// and failing shut is correct. The plan checkbox rewrite and cache clears
|
|
165
|
+
// are best-effort follow-ups — a throw there must NOT abort recovery, or
|
|
166
|
+
// the DB is left complete without ever emitting the stuck-artifact-recovery
|
|
167
|
+
// event (#1221), stranding worktree reconciliation.
|
|
168
|
+
try {
|
|
169
|
+
updateTaskStatus(mid, sid, tid, "complete", ts);
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
return {
|
|
173
|
+
ok: false,
|
|
174
|
+
fatal: true,
|
|
175
|
+
reason: "execute-task-artifact-db-promote-failed",
|
|
176
|
+
message: `Stuck recovery found execute-task ${unitId} artifacts, but promoting the DB task status from '${task.status}' failed: ${getErrorMessage(e)}`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
const artifactBase = resolveArtifactVerificationBase(unitId, basePath);
|
|
181
|
+
const planPath = resolveExpectedArtifactPath("plan-slice", `${mid}/${sid}`, artifactBase);
|
|
182
|
+
if (planPath && existsSync(planPath)) {
|
|
183
|
+
const planContent = readFileSync(planPath, "utf-8");
|
|
184
|
+
const updatedPlan = planContent.replace(new RegExp(`^(\\s*-\\s+)\\[ \\]\\s+\\*\\*${tid}:`, "m"), `$1[x] **${tid}:`);
|
|
185
|
+
if (updatedPlan !== planContent) {
|
|
186
|
+
atomicWriteSync(planPath, updatedPlan);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
clearPathCache();
|
|
190
|
+
clearParseCache();
|
|
191
|
+
}
|
|
192
|
+
catch (e) {
|
|
193
|
+
logWarning("recovery", `stuck-artifact plan checkbox sync failed after DB promotion of ${unitId}: ${getErrorMessage(e)}`);
|
|
194
|
+
}
|
|
195
|
+
// Append event so worktree reconciliation can replay this recovery completion.
|
|
196
|
+
try {
|
|
197
|
+
appendEvent(basePath, { cmd: "complete-task", params: { milestoneId: mid, sliceId: sid, taskId: tid }, ts, actor: "system", trigger_reason: "stuck-artifact-recovery" });
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
logWarning("recovery", `appendEvent failed for stuck-artifact task promotion: ${getErrorMessage(e)}`);
|
|
201
|
+
}
|
|
158
202
|
}
|
|
159
203
|
return { ok: true };
|
|
160
204
|
}
|
|
@@ -27,9 +27,10 @@ import { ensureGitignore, untrackRuntimeFiles } from "./gitignore.js";
|
|
|
27
27
|
import { nativeIsRepo, nativeInit, nativeAddAll, nativeCommit, nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchList, nativeBranchExists, nativeBranchListMerged, nativeBranchDelete, nativeWorktreeRemove, nativeCommitCountBetween, nativeHasChanges, } from "./native-git-bridge.js";
|
|
28
28
|
import { GitServiceImpl } from "./git-service.js";
|
|
29
29
|
import { captureIntegrationBranch, detectWorktreeName, setActiveMilestoneId, } from "./worktree.js";
|
|
30
|
-
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
30
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
31
31
|
import { checkoutBranchWithStashGuard } from "./worktree-git-recovery.js";
|
|
32
|
-
import {
|
|
32
|
+
import { cleanStaleRuntimeUnits } from "./auto-worktree-runtime-cleanup.js";
|
|
33
|
+
import { readResourceVersion } from "./auto-worktree-resource-version.js";
|
|
33
34
|
import { worktreePath as getWorktreeDir, isInsideWorktreesDir } from "./worktree-manager.js";
|
|
34
35
|
import { emitWorktreeOrphaned } from "./worktree-telemetry.js";
|
|
35
36
|
import { queryJournal } from "./journal.js";
|
|
@@ -1409,7 +1410,7 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
1409
1410
|
}
|
|
1410
1411
|
// Snapshot installed skills
|
|
1411
1412
|
if (resolveSkillDiscoveryMode(base) !== "off") {
|
|
1412
|
-
snapshotSkills();
|
|
1413
|
+
snapshotSkills({ cwd: s.basePath });
|
|
1413
1414
|
}
|
|
1414
1415
|
setAutoActiveStatus(ctx, s.stepMode ? "next" : "auto");
|
|
1415
1416
|
ctx.ui.setWidget("gsd-health", undefined);
|
|
@@ -1435,15 +1436,16 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
1435
1436
|
? `${s.autoModeStartModel.provider}/${s.autoModeStartModel.id}`
|
|
1436
1437
|
: ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : "default";
|
|
1437
1438
|
// Flat-rate providers (e.g. GitHub Copilot, claude-code, user-declared
|
|
1438
|
-
// subscription proxies, externalCli CLIs) suppress routing
|
|
1439
|
-
//
|
|
1439
|
+
// subscription proxies, externalCli CLIs) suppress routing only when the
|
|
1440
|
+
// user explicitly opts out with allow_flat_rate_providers: false. Reflect
|
|
1441
|
+
// that in the banner. Thread the same
|
|
1440
1442
|
// FlatRateContext used by selectAndApplyModel so user-declared
|
|
1441
1443
|
// flat-rate providers and externalCli auto-detection are respected.
|
|
1442
1444
|
const { isFlatRateProvider, buildFlatRateContext } = await import("./auto-model-selection.js");
|
|
1443
1445
|
const bannerPrefs = loadEffectiveGSDPreferencesWithRegistry(ctx.modelRegistry, base, resolveProfileAnchorProvider(ctx.model?.provider, s.autoModeStartModel?.provider), s.autoModeStartModel ? `${s.autoModeStartModel.provider}/${s.autoModeStartModel.id}` : undefined)?.preferences;
|
|
1444
1446
|
const effectiveProvider = s.autoModeStartModel?.provider ?? ctx.model?.provider;
|
|
1445
1447
|
const effectivelyEnabled = routingConfig.enabled
|
|
1446
|
-
&& (routingConfig.allow_flat_rate_providers
|
|
1448
|
+
&& (routingConfig.allow_flat_rate_providers !== false
|
|
1447
1449
|
|| !(effectiveProvider && isFlatRateProvider(effectiveProvider, buildFlatRateContext(effectiveProvider, ctx, bannerPrefs))));
|
|
1448
1450
|
// The actual ceiling may come from tier_models.heavy, not the start model.
|
|
1449
1451
|
const effectiveCeiling = (routingConfig.enabled && routingConfig.tier_models?.heavy)
|
|
@@ -56,6 +56,8 @@ export async function recoverTimedOutUnit(ctx, pi, unitType, unitId, reason, rct
|
|
|
56
56
|
lastProgressAt: Date.now(),
|
|
57
57
|
progressCount: (runtime?.progressCount ?? 0) + 1,
|
|
58
58
|
lastProgressKind: reason === "idle" ? "idle-recovery-retry" : "hard-recovery-retry",
|
|
59
|
+
// This steering retry is a fresh chance for the same unit to save a valid result.
|
|
60
|
+
harnessAbort: undefined,
|
|
59
61
|
});
|
|
60
62
|
const steeringLines = isEscalation
|
|
61
63
|
? [
|
|
@@ -151,6 +153,8 @@ export async function recoverTimedOutUnit(ctx, pi, unitType, unitId, reason, rct
|
|
|
151
153
|
lastProgressAt: Date.now(),
|
|
152
154
|
progressCount: (runtime?.progressCount ?? 0) + 1,
|
|
153
155
|
lastProgressKind: reason === "idle" ? "idle-recovery-retry" : "hard-recovery-retry",
|
|
156
|
+
// This steering retry is a fresh chance for the same unit to save a valid result.
|
|
157
|
+
harnessAbort: undefined,
|
|
154
158
|
});
|
|
155
159
|
const steeringLines = isEscalation
|
|
156
160
|
? [
|