@opengsd/gsd-pi 1.5.0 → 1.6.0-dev.aa7f94e8
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 +10 -10
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +114 -36
- package/dist/resources/extensions/gsd/activity-log.js +1 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +97 -5
- package/dist/resources/extensions/gsd/auto/orchestrator.js +20 -13
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -5
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +69 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +28 -1
- package/dist/resources/extensions/gsd/auto-post-unit.js +23 -6
- package/dist/resources/extensions/gsd/auto-prompts.js +49 -117
- package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
- package/dist/resources/extensions/gsd/auto-start.js +57 -33
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +12 -2
- package/dist/resources/extensions/gsd/auto-timers.js +9 -2
- 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 -2073
- package/dist/resources/extensions/gsd/auto.js +118 -34
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +20 -2
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +185 -27
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +68 -2
- package/dist/resources/extensions/gsd/codebase-generator.js +7 -1
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
- package/dist/resources/extensions/gsd/compat/compat-marker.js +44 -0
- package/dist/resources/extensions/gsd/config-overlay.js +7 -2
- package/dist/resources/extensions/gsd/db/engine.js +33 -0
- package/dist/resources/extensions/gsd/db/queries.js +9 -9
- package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
- package/dist/resources/extensions/gsd/db-adapter.js +30 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +3 -3
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +93 -11
- package/dist/resources/extensions/gsd/flat-phase-migration.js +32 -3
- 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 +45 -0
- package/dist/resources/extensions/gsd/gsd-db.js +23 -11
- package/dist/resources/extensions/gsd/guided-flow.js +22 -17
- package/dist/resources/extensions/gsd/journal.js +1 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +34 -79
- package/dist/resources/extensions/gsd/md-importer.js +89 -23
- package/dist/resources/extensions/gsd/metrics.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +11 -0
- 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 +87 -52
- package/dist/resources/extensions/gsd/post-unit-hooks.js +27 -0
- package/dist/resources/extensions/gsd/preferences-models.js +66 -15
- 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 +148 -10
- package/dist/resources/extensions/gsd/preferences.js +20 -0
- package/dist/resources/extensions/gsd/prompts/system.md +6 -6
- package/dist/resources/extensions/gsd/quick.js +12 -3
- package/dist/resources/extensions/gsd/reopen-reason.js +98 -0
- package/dist/resources/extensions/gsd/rule-registry.js +106 -10
- package/dist/resources/extensions/gsd/session-status-io.js +31 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
- 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/state-reconciliation/drift/artifact-db.js +1 -10
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +3 -24
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +10 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -5
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +16 -10
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +28 -5
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -8
- package/dist/resources/extensions/gsd/uat-dispatch.js +94 -0
- package/dist/resources/extensions/gsd/unit-registry.js +12 -2
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +31 -2
- package/dist/resources/extensions/gsd/uok/audit.js +3 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +22 -30
- package/dist/resources/extensions/gsd/uok/gitops.js +18 -15
- package/dist/resources/extensions/gsd/uok/kernel.js +120 -46
- package/dist/resources/extensions/gsd/uok/model-policy.js +17 -14
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +1 -1
- package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +9 -26
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
- package/dist/resources/extensions/gsd/workspace.js +5 -14
- package/dist/resources/extensions/gsd/worktree-command.js +1 -1
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +14 -9
- package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
- package/dist/resources/extensions/shared/gsd-browser-cli.js +51 -5
- 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 +6 -6
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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 +6 -6
- package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- 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/worktree-cli-create.d.ts +10 -0
- package/dist/worktree-cli-create.js +11 -0
- package/dist/worktree-cli-format.d.ts +12 -0
- package/dist/worktree-cli-format.js +38 -0
- package/dist/worktree-cli-plan.d.ts +16 -0
- package/dist/worktree-cli-plan.js +19 -0
- package/dist/worktree-cli-session.d.ts +13 -0
- package/dist/worktree-cli-session.js +18 -0
- package/dist/worktree-cli-status.d.ts +35 -0
- package/dist/worktree-cli-status.js +54 -0
- package/dist/worktree-cli.d.ts +1 -16
- package/dist/worktree-cli.js +28 -122
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +25 -36
- package/integrations/hermes/pyproject.toml +1 -1
- package/integrations/hermes/tests/test_gsd_client_timeout.py +4 -4
- package/package.json +6 -6
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-cli.d.ts +1 -1
- package/packages/daemon/dist/cloud-cli.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-cli.js +42 -2
- package/packages/daemon/dist/cloud-cli.js.map +1 -1
- package/packages/daemon/dist/cloud-config.d.ts +1 -0
- package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-config.js +1 -1
- package/packages/daemon/dist/cloud-config.js.map +1 -1
- package/packages/daemon/dist/device-flow.d.ts +24 -0
- package/packages/daemon/dist/device-flow.d.ts.map +1 -0
- package/packages/daemon/dist/device-flow.js +128 -0
- package/packages/daemon/dist/device-flow.js.map +1 -0
- package/packages/daemon/dist/device-flow.test.d.ts +2 -0
- package/packages/daemon/dist/device-flow.test.d.ts.map +1 -0
- package/packages/daemon/dist/device-flow.test.js +172 -0
- package/packages/daemon/dist/device-flow.test.js.map +1 -0
- package/packages/daemon/dist/orchestrator-agent.d.ts +21 -0
- package/packages/daemon/dist/orchestrator-agent.d.ts.map +1 -0
- package/packages/daemon/dist/orchestrator-agent.js +113 -0
- package/packages/daemon/dist/orchestrator-agent.js.map +1 -0
- package/packages/daemon/dist/orchestrator-tools.d.ts +12 -0
- package/packages/daemon/dist/orchestrator-tools.d.ts.map +1 -0
- package/packages/daemon/dist/orchestrator-tools.js +137 -0
- package/packages/daemon/dist/orchestrator-tools.js.map +1 -0
- package/packages/daemon/dist/orchestrator.d.ts +4 -56
- package/packages/daemon/dist/orchestrator.d.ts.map +1 -1
- package/packages/daemon/dist/orchestrator.js +13 -303
- package/packages/daemon/dist/orchestrator.js.map +1 -1
- package/packages/daemon/dist/orchestrator.test.js +11 -1
- package/packages/daemon/dist/orchestrator.test.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
- 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/package.json +7 -7
- package/packages/gsd-cloud/README.md +34 -0
- package/packages/gsd-cloud/bin/gsd-cloud.js +27 -0
- package/packages/gsd-cloud/package.json +38 -0
- 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/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 +8 -20
- 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/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/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/package.json +2 -2
- package/pkg/dist/core/export-html/template.js +53 -4
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +1 -1
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +146 -33
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +44 -0
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +93 -0
- package/src/resources/extensions/gsd/activity-log.ts +1 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +114 -7
- package/src/resources/extensions/gsd/auto/orchestrator.ts +21 -14
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
- package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -4
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +77 -16
- package/src/resources/extensions/gsd/auto-model-selection.ts +33 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +26 -5
- package/src/resources/extensions/gsd/auto-prompts.ts +73 -113
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
- package/src/resources/extensions/gsd/auto-start.ts +62 -31
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -2
- package/src/resources/extensions/gsd/auto-timers.ts +9 -2
- 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 -2429
- package/src/resources/extensions/gsd/auto.ts +126 -47
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +20 -2
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +218 -27
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +77 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +7 -1
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
- package/src/resources/extensions/gsd/compat/compat-marker.ts +47 -0
- package/src/resources/extensions/gsd/config-overlay.ts +7 -1
- package/src/resources/extensions/gsd/db/engine.ts +36 -0
- package/src/resources/extensions/gsd/db/queries.ts +9 -9
- package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
- package/src/resources/extensions/gsd/db-adapter.ts +29 -3
- package/src/resources/extensions/gsd/docs/preferences-reference.md +3 -3
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +109 -10
- package/src/resources/extensions/gsd/flat-phase-migration.ts +34 -3
- 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 +53 -0
- package/src/resources/extensions/gsd/gsd-db.ts +33 -11
- package/src/resources/extensions/gsd/guided-flow.ts +26 -18
- package/src/resources/extensions/gsd/journal.ts +1 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +52 -91
- package/src/resources/extensions/gsd/md-importer.ts +93 -22
- package/src/resources/extensions/gsd/metrics.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +15 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
- 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 +108 -51
- package/src/resources/extensions/gsd/post-unit-hooks.ts +32 -0
- package/src/resources/extensions/gsd/preferences-models.ts +74 -20
- package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
- package/src/resources/extensions/gsd/preferences-types.ts +54 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +146 -9
- package/src/resources/extensions/gsd/preferences.ts +20 -0
- package/src/resources/extensions/gsd/prompts/system.md +6 -6
- package/src/resources/extensions/gsd/quick.ts +11 -3
- package/src/resources/extensions/gsd/reopen-reason.ts +109 -0
- package/src/resources/extensions/gsd/rule-registry.ts +111 -9
- package/src/resources/extensions/gsd/session-status-io.ts +34 -0
- package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
- 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/state-reconciliation/drift/artifact-db.ts +1 -9
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +2 -22
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +14 -0
- 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-orchestrator.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-supervisor-inflight-guard.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +2 -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/browser-daemon-auto-prep.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-writable-probe.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +174 -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 +71 -1
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +46 -1
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +72 -32
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -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/paths.test.ts +88 -1
- 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/merge-closeout-consistency-gate.test.ts +1 -1
- 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/migration-auto-check.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +24 -0
- 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/parsers-legacy-importers.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +269 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/preferences.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +49 -1
- package/src/resources/extensions/gsd/tests/reopen-reason.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +95 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/sibling-model-fallbacks.test.ts +189 -0
- package/src/resources/extensions/gsd/tests/single-field-model-thinking.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +32 -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/steer-worktree-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/supervisor-model-swap-inflight-guard.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/supervisor-model-swap-thinking-clamp.test.ts +122 -0
- 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/tool-call-loop-guard.test.ts +196 -0
- package/src/resources/extensions/gsd/tests/uat-dispatch.test.ts +211 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +226 -2
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/worker-resume-wait.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +213 -2
- 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-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 +5 -2
- 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/tool-contract.ts +29 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +9 -5
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +19 -8
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +28 -5
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +13 -9
- package/src/resources/extensions/gsd/types.ts +23 -4
- package/src/resources/extensions/gsd/uat-dispatch.ts +176 -0
- package/src/resources/extensions/gsd/unit-registry.ts +16 -2
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +32 -2
- package/src/resources/extensions/gsd/uok/audit.ts +2 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +26 -36
- package/src/resources/extensions/gsd/uok/gitops.ts +21 -18
- package/src/resources/extensions/gsd/uok/kernel.ts +169 -48
- package/src/resources/extensions/gsd/uok/model-policy.ts +20 -17
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +1 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +9 -24
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
- package/src/resources/extensions/gsd/workspace.ts +5 -21
- package/src/resources/extensions/gsd/worktree-command.ts +1 -1
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +19 -15
- package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
- package/src/resources/extensions/shared/gsd-browser-cli.ts +64 -7
- 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/{bCg3aYrFN1DKZr2dqgE7L → XFuMvz26Zb_lrrR-8dvkd}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → XFuMvz26Zb_lrrR-8dvkd}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -28,16 +28,16 @@ See [CHANGELOG.md](./CHANGELOG.md) for release-by-release fixes and [Legacy Rele
|
|
|
28
28
|
## Latest Release Highlights
|
|
29
29
|
|
|
30
30
|
<!-- release-highlights:start -->
|
|
31
|
-
Latest release: **v1.
|
|
32
|
-
|
|
33
|
-
- **
|
|
34
|
-
- **gsd:**
|
|
35
|
-
- **
|
|
36
|
-
- **
|
|
37
|
-
- **
|
|
38
|
-
- **
|
|
39
|
-
- **
|
|
40
|
-
- **
|
|
31
|
+
Latest release: **v1.6.0**
|
|
32
|
+
|
|
33
|
+
- **skills:** Load .claude/skills into the catalog (mirror Claude Code).
|
|
34
|
+
- **gsd:** Extract uat dispatch discovery.
|
|
35
|
+
- **daemon:** Split orchestrator agent loop.
|
|
36
|
+
- **daemon:** Extract orchestrator tool execution.
|
|
37
|
+
- **uok:** Scope audit degradation to kernel workspace.
|
|
38
|
+
- **browser-tools:** Abort pending daemon starts on close.
|
|
39
|
+
- **browser-tools:** Guard managed daemon connection lifecycle.
|
|
40
|
+
- **worktree:** Centralize changed scan.
|
|
41
41
|
|
|
42
42
|
<!-- release-highlights:end -->
|
|
43
43
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1995c618cd0898a5
|
|
@@ -209,7 +209,7 @@ export default function AskUserQuestions(pi) {
|
|
|
209
209
|
"For single-select: each question must have 2-3 options. Put the recommended option first with '(Recommended)' suffix. Do not include an 'Other' or 'None of the above' option - the client adds one automatically.",
|
|
210
210
|
"For multi-select: set allowMultiple: true. The user can pick any number of options. No 'None of the above' is added.",
|
|
211
211
|
"When options involve code patterns, config choices, or architecture decisions, add a 'preview' field with markdown content (code blocks, lists, headers, etc.). The preview renders in a side-by-side panel when the option is highlighted.",
|
|
212
|
-
"Preview content is rendered in a fixed-height panel (max ~20 lines visible). Keep previews concise — show the most relevant snippet, not exhaustive examples. Longer content
|
|
212
|
+
"Preview content is rendered in a fixed-height panel (max ~20 lines visible). Keep previews concise — show the most relevant snippet, not exhaustive examples. Longer content stays fully accessible: the user scrolls it with PgUp/PgDn, with '▲/▼ N more' indicators marking hidden rows.",
|
|
213
213
|
],
|
|
214
214
|
parameters: AskUserQuestionsParams,
|
|
215
215
|
async execute(_toolCallId, params, signal, _onUpdate, ctx) {
|
|
@@ -4,8 +4,6 @@ import { Type } from "@sinclair/typebox";
|
|
|
4
4
|
import { BROWSER_CONTRACT_TOOL_NAMES } from "../../shared/browser-contract.js";
|
|
5
5
|
import { resolveGsdBrowserMcpLaunchConfig } from "../../shared/gsd-browser-cli.js";
|
|
6
6
|
import { buildMcpChildEnv } from "../../mcp-client/manager.js";
|
|
7
|
-
const connections = new Map();
|
|
8
|
-
const pendingConnections = new Map();
|
|
9
7
|
const DEFAULT_MAX_LINES = 2_000;
|
|
10
8
|
const DEFAULT_MAX_BYTES = 50 * 1024;
|
|
11
9
|
const MCP_CALL_TIMEOUT_MS = 60_000;
|
|
@@ -297,6 +295,103 @@ function buildConnectionKey(launch) {
|
|
|
297
295
|
env: launch.env ?? {},
|
|
298
296
|
});
|
|
299
297
|
}
|
|
298
|
+
function combineAbortSignals(poolSignal, callerSignal) {
|
|
299
|
+
if (!callerSignal)
|
|
300
|
+
return poolSignal;
|
|
301
|
+
if (typeof AbortSignal.any === "function") {
|
|
302
|
+
return AbortSignal.any([poolSignal, callerSignal]);
|
|
303
|
+
}
|
|
304
|
+
const controller = new AbortController();
|
|
305
|
+
const abort = () => {
|
|
306
|
+
if (!controller.signal.aborted)
|
|
307
|
+
controller.abort();
|
|
308
|
+
};
|
|
309
|
+
if (poolSignal.aborted || callerSignal.aborted) {
|
|
310
|
+
abort();
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
poolSignal.addEventListener("abort", abort, { once: true });
|
|
314
|
+
callerSignal.addEventListener("abort", abort, { once: true });
|
|
315
|
+
}
|
|
316
|
+
return controller.signal;
|
|
317
|
+
}
|
|
318
|
+
export class ManagedGsdBrowserConnectionPool {
|
|
319
|
+
connections = new Map();
|
|
320
|
+
pendingConnections = new Map();
|
|
321
|
+
connect;
|
|
322
|
+
closeConnection;
|
|
323
|
+
generation = 0;
|
|
324
|
+
closing = false;
|
|
325
|
+
constructor(connect, closeConnection) {
|
|
326
|
+
this.connect = connect;
|
|
327
|
+
this.closeConnection = closeConnection;
|
|
328
|
+
}
|
|
329
|
+
get activeCount() {
|
|
330
|
+
return this.connections.size;
|
|
331
|
+
}
|
|
332
|
+
get pendingCount() {
|
|
333
|
+
return this.pendingConnections.size;
|
|
334
|
+
}
|
|
335
|
+
getOrConnect(launch, signal) {
|
|
336
|
+
if (this.closing) {
|
|
337
|
+
return Promise.reject(new Error("gsd-browser connection pool is closing"));
|
|
338
|
+
}
|
|
339
|
+
const key = buildConnectionKey(launch);
|
|
340
|
+
const existing = this.connections.get(key);
|
|
341
|
+
if (existing)
|
|
342
|
+
return Promise.resolve(existing);
|
|
343
|
+
const pending = this.pendingConnections.get(key);
|
|
344
|
+
if (pending)
|
|
345
|
+
return pending.promise;
|
|
346
|
+
const generation = this.generation;
|
|
347
|
+
const abortController = new AbortController();
|
|
348
|
+
const connectionSignal = combineAbortSignals(abortController.signal, signal);
|
|
349
|
+
const connectionPromise = this.connect(launch, connectionSignal)
|
|
350
|
+
.then(async (connection) => {
|
|
351
|
+
if (this.closing || this.generation !== generation) {
|
|
352
|
+
await this.closeConnection(connection);
|
|
353
|
+
throw new Error("gsd-browser connection closed during startup");
|
|
354
|
+
}
|
|
355
|
+
this.connections.set(key, connection);
|
|
356
|
+
return connection;
|
|
357
|
+
})
|
|
358
|
+
.finally(() => {
|
|
359
|
+
if (this.pendingConnections.get(key)?.promise === connectionPromise) {
|
|
360
|
+
this.pendingConnections.delete(key);
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
this.pendingConnections.set(key, { promise: connectionPromise, abortController });
|
|
364
|
+
return connectionPromise;
|
|
365
|
+
}
|
|
366
|
+
async closeAll() {
|
|
367
|
+
this.closing = true;
|
|
368
|
+
this.generation += 1;
|
|
369
|
+
const activeConnections = Array.from(this.connections.values());
|
|
370
|
+
const pendingConnections = Array.from(this.pendingConnections.values());
|
|
371
|
+
this.connections.clear();
|
|
372
|
+
this.pendingConnections.clear();
|
|
373
|
+
for (const pending of pendingConnections) {
|
|
374
|
+
pending.abortController.abort();
|
|
375
|
+
}
|
|
376
|
+
const closingActive = activeConnections.map((connection) => this.closeConnection(connection));
|
|
377
|
+
const closingPending = pendingConnections.map(async (pending) => {
|
|
378
|
+
try {
|
|
379
|
+
const connection = await pending.promise;
|
|
380
|
+
await this.closeConnection(connection);
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
// Failed or invalidated connection attempts have already cleaned up.
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
try {
|
|
387
|
+
await Promise.allSettled([...closingActive, ...closingPending]);
|
|
388
|
+
}
|
|
389
|
+
finally {
|
|
390
|
+
this.closing = false;
|
|
391
|
+
this.generation += 1;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
300
395
|
async function connectManagedGsdBrowser(launch, signal) {
|
|
301
396
|
const client = new Client({ name: "gsd-pi-browser-tools", version: "1.0.0" });
|
|
302
397
|
const transport = new StdioClientTransport({
|
|
@@ -326,27 +421,26 @@ async function connectManagedGsdBrowser(launch, signal) {
|
|
|
326
421
|
throw error;
|
|
327
422
|
}
|
|
328
423
|
}
|
|
424
|
+
async function closeManagedGsdBrowserConnection(connection) {
|
|
425
|
+
try {
|
|
426
|
+
await connection.client.close();
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// Best-effort cleanup.
|
|
430
|
+
}
|
|
431
|
+
try {
|
|
432
|
+
await connection.transport.close();
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
// Best-effort cleanup.
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
const connectionPool = new ManagedGsdBrowserConnectionPool(connectManagedGsdBrowser, closeManagedGsdBrowserConnection);
|
|
329
439
|
async function getOrConnectManagedGsdBrowser(ctx, signal) {
|
|
330
440
|
const launch = resolveGsdBrowserMcpLaunchConfig(resolveProjectRoot(ctx), process.env, {
|
|
331
441
|
sessionSuffix: resolveManagedSessionSuffix(ctx),
|
|
332
442
|
});
|
|
333
|
-
|
|
334
|
-
const existing = connections.get(key);
|
|
335
|
-
if (existing)
|
|
336
|
-
return existing;
|
|
337
|
-
const pending = pendingConnections.get(key);
|
|
338
|
-
if (pending)
|
|
339
|
-
return pending;
|
|
340
|
-
const connectionPromise = connectManagedGsdBrowser(launch, signal);
|
|
341
|
-
pendingConnections.set(key, connectionPromise);
|
|
342
|
-
try {
|
|
343
|
-
const connection = await connectionPromise;
|
|
344
|
-
connections.set(key, connection);
|
|
345
|
-
return connection;
|
|
346
|
-
}
|
|
347
|
-
finally {
|
|
348
|
-
pendingConnections.delete(key);
|
|
349
|
-
}
|
|
443
|
+
return connectionPool.getOrConnect(launch, signal);
|
|
350
444
|
}
|
|
351
445
|
function isUnknownMcpToolError(error) {
|
|
352
446
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -609,23 +703,7 @@ export function registerManagedGsdBrowserTools(pi) {
|
|
|
609
703
|
}
|
|
610
704
|
}
|
|
611
705
|
export async function closeManagedGsdBrowser() {
|
|
612
|
-
|
|
613
|
-
try {
|
|
614
|
-
await connection.client.close();
|
|
615
|
-
}
|
|
616
|
-
catch {
|
|
617
|
-
// Best-effort cleanup.
|
|
618
|
-
}
|
|
619
|
-
try {
|
|
620
|
-
await connection.transport.close();
|
|
621
|
-
}
|
|
622
|
-
catch {
|
|
623
|
-
// Best-effort cleanup.
|
|
624
|
-
}
|
|
625
|
-
connections.delete(key);
|
|
626
|
-
});
|
|
627
|
-
await Promise.allSettled(closing);
|
|
628
|
-
pendingConnections.clear();
|
|
706
|
+
await connectionPool.closeAll();
|
|
629
707
|
}
|
|
630
708
|
export async function _resetManagedGsdBrowserForTest() {
|
|
631
709
|
await closeManagedGsdBrowser();
|
|
@@ -115,7 +115,7 @@ export function saveActivityLog(ctx, basePath, unitType, unitId) {
|
|
|
115
115
|
}
|
|
116
116
|
state.nextSeq += 1;
|
|
117
117
|
state.lastSnapshotKeyByUnit.set(unitKey, key);
|
|
118
|
-
if (isUnifiedAuditEnabled()) {
|
|
118
|
+
if (isUnifiedAuditEnabled(basePath)) {
|
|
119
119
|
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
120
120
|
traceId: `activity:${unitType}:${unitId}`,
|
|
121
121
|
turnId: unitId,
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Auto-loop closeout, milestone report, and merge helpers.
|
|
3
3
|
import { importExtensionModule } from "@gsd/pi-coding-agent";
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
import { join, basename } from "node:path";
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
4
8
|
import { MergeConflictError } from "../git-service.js";
|
|
5
9
|
import { findUnmergedCompletedMilestones } from "../unmerged-milestone-guard.js";
|
|
6
10
|
import { getIsolationMode } from "../preferences.js";
|
|
7
11
|
import { isDbAvailable, getMilestone } from "../gsd-db.js";
|
|
8
12
|
import { refreshWorkflowDatabaseFromDisk } from "../db-workspace.js";
|
|
9
13
|
import { isClosedStatus } from "../status-guards.js";
|
|
14
|
+
import { PLANNING_ARTIFACT_SUFFIXES } from "../paths.js";
|
|
10
15
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
11
16
|
import { debugLog } from "../debug-logger.js";
|
|
12
17
|
import { _resolveReportBasePath } from "./phase-helpers.js";
|
|
@@ -51,7 +56,15 @@ export async function restorePreflightStashOrStop(ic, preflight, milestoneId) {
|
|
|
51
56
|
*/
|
|
52
57
|
export async function _runMilestoneMergeWithStashRestore(ic, milestoneId, options = {}) {
|
|
53
58
|
const { ctx, pi, s, deps } = ic;
|
|
54
|
-
|
|
59
|
+
// Resolve the project root once, before the merge can flip session path
|
|
60
|
+
// pointers (worktree teardown mutates s.basePath / s.scope). The guarded
|
|
61
|
+
// merge's preflight/postflight stash restore, the pre-merge ignored-markdown
|
|
62
|
+
// snapshot, the dirty-projection check, and the rebuild must all target this
|
|
63
|
+
// same tree; otherwise `.gsd` markdown restored on one tree can be silently
|
|
64
|
+
// overwritten by a rebuild on another. canonicalProjectRoot is the
|
|
65
|
+
// authoritative `.gsd`/DB writer path (see AutoSession.canonicalProjectRoot).
|
|
66
|
+
const projectRoot = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
|
|
67
|
+
const ignoredProjectionSnapshot = snapshotIgnoredGsdMarkdownProjections(projectRoot);
|
|
55
68
|
const mergeResult = deps.lifecycle.exitMilestone(milestoneId, {
|
|
56
69
|
merge: true,
|
|
57
70
|
guardedMerge: {
|
|
@@ -61,11 +74,11 @@ export async function _runMilestoneMergeWithStashRestore(ic, milestoneId, option
|
|
|
61
74
|
},
|
|
62
75
|
}, ctx.ui);
|
|
63
76
|
if (mergeResult.ok) {
|
|
64
|
-
await markMilestoneMergedAndRebuild(s);
|
|
77
|
+
await markMilestoneMergedAndRebuild(s, projectRoot, ignoredProjectionSnapshot);
|
|
65
78
|
return null;
|
|
66
79
|
}
|
|
67
80
|
if (mergeResult.reason === "postflight-stash-restore-failed") {
|
|
68
|
-
await markMilestoneMergedAndRebuild(s);
|
|
81
|
+
await markMilestoneMergedAndRebuild(s, projectRoot, ignoredProjectionSnapshot);
|
|
69
82
|
}
|
|
70
83
|
if (mergeResult.reason === "preflight-dirty-overlap" || mergeResult.reason === "preflight-unmerged-conflicts") {
|
|
71
84
|
const reason = mergeResult.reason === "preflight-unmerged-conflicts"
|
|
@@ -122,10 +135,13 @@ export async function _runMilestoneMergeWithStashRestore(ic, milestoneId, option
|
|
|
122
135
|
}
|
|
123
136
|
return null;
|
|
124
137
|
}
|
|
125
|
-
async function markMilestoneMergedAndRebuild(s) {
|
|
138
|
+
async function markMilestoneMergedAndRebuild(s, rebuildBasePath, ignoredProjectionSnapshot) {
|
|
126
139
|
s.milestoneMergedInPhases = true;
|
|
140
|
+
if (hasDirtyGsdMarkdownProjections(rebuildBasePath, ignoredProjectionSnapshot)) {
|
|
141
|
+
logWarning("engine", "skipping markdown projection rebuild after milestone merge because restored .gsd edits are dirty");
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
127
144
|
try {
|
|
128
|
-
const rebuildBasePath = s.originalBasePath || s.canonicalProjectRoot || s.basePath;
|
|
129
145
|
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
130
146
|
await rebuildMarkdownProjectionsFromDb(rebuildBasePath);
|
|
131
147
|
}
|
|
@@ -133,6 +149,82 @@ async function markMilestoneMergedAndRebuild(s) {
|
|
|
133
149
|
logWarning("engine", `markdown projection rebuild after milestone merge failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
134
150
|
}
|
|
135
151
|
}
|
|
152
|
+
function hasDirtyGsdMarkdownProjections(basePath, ignoredProjectionSnapshot) {
|
|
153
|
+
try {
|
|
154
|
+
const output = execFileSync("git", ["status", "--porcelain", "-z", "--untracked-files=all", "--", ".gsd"], { cwd: basePath, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
155
|
+
const entries = output.split("\0").filter(Boolean);
|
|
156
|
+
for (let i = 0; i < entries.length; i++) {
|
|
157
|
+
const entry = entries[i];
|
|
158
|
+
if (entry.length <= 3)
|
|
159
|
+
continue;
|
|
160
|
+
const status = entry.slice(0, 2);
|
|
161
|
+
const path = entry.slice(3);
|
|
162
|
+
if (isGeneratedGsdMarkdownProjection(path))
|
|
163
|
+
return true;
|
|
164
|
+
if ((status === "R " || status === "C ") && i + 1 < entries.length) {
|
|
165
|
+
const dest = entries[++i];
|
|
166
|
+
if (isGeneratedGsdMarkdownProjection(dest))
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
void err;
|
|
173
|
+
// Fall through to ignored-file snapshot comparison below.
|
|
174
|
+
}
|
|
175
|
+
return ignoredGsdMarkdownProjectionSnapshotChanged(basePath, ignoredProjectionSnapshot);
|
|
176
|
+
}
|
|
177
|
+
function isGeneratedGsdMarkdownProjection(path) {
|
|
178
|
+
const normalized = path.replace(/\\/g, "/");
|
|
179
|
+
if (normalized === ".gsd/DECISIONS.md")
|
|
180
|
+
return true;
|
|
181
|
+
if (!normalized.startsWith(".gsd/milestones/") && !normalized.startsWith(".gsd/phases/")) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
return isGeneratedPlanningArtifactFileName(basename(normalized));
|
|
185
|
+
}
|
|
186
|
+
function isGeneratedPlanningArtifactFileName(fileName) {
|
|
187
|
+
if (!fileName.endsWith(".md"))
|
|
188
|
+
return false;
|
|
189
|
+
const stem = fileName.slice(0, -".md".length).toUpperCase();
|
|
190
|
+
for (const suffix of PLANNING_ARTIFACT_SUFFIXES) {
|
|
191
|
+
if (!stem.endsWith(`-${suffix}`))
|
|
192
|
+
continue;
|
|
193
|
+
const idPrefix = stem.slice(0, -suffix.length - 1);
|
|
194
|
+
return /^(?:[MST]\d+|\d{2,})(?:-[A-Z0-9]+)*$/.test(idPrefix);
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
function snapshotIgnoredGsdMarkdownProjections(basePath) {
|
|
199
|
+
try {
|
|
200
|
+
const output = execFileSync("git", ["ls-files", "--others", "--ignored", "--exclude-standard", "-z", "--", ".gsd"], { cwd: basePath, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
201
|
+
const snapshot = new Map();
|
|
202
|
+
for (const path of output.split("\0")) {
|
|
203
|
+
if (!isGeneratedGsdMarkdownProjection(path))
|
|
204
|
+
continue;
|
|
205
|
+
snapshot.set(path, hashFile(join(basePath, path)));
|
|
206
|
+
}
|
|
207
|
+
return snapshot;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function hashFile(path) {
|
|
214
|
+
return createHash("sha256").update(readFileSync(path)).digest("hex");
|
|
215
|
+
}
|
|
216
|
+
function ignoredGsdMarkdownProjectionSnapshotChanged(basePath, before) {
|
|
217
|
+
if (!before)
|
|
218
|
+
return true;
|
|
219
|
+
const after = snapshotIgnoredGsdMarkdownProjections(basePath);
|
|
220
|
+
if (!after || after.size !== before.size)
|
|
221
|
+
return true;
|
|
222
|
+
for (const [path, hash] of before) {
|
|
223
|
+
if (after.get(path) !== hash)
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
136
228
|
export async function _runMilestoneMergeOnceWithStashRestore(ic, milestoneId, options = {}) {
|
|
137
229
|
if (ic.s.milestoneMergedInPhases) {
|
|
138
230
|
debugLog("autoLoop", {
|
|
@@ -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
|
-
mergeMilestone:
|
|
564
|
+
mergeMilestone: createDefaultMilestoneMergeTransaction(),
|
|
564
565
|
});
|
|
565
566
|
}
|
|
566
567
|
rebuildScope(rawPath, milestoneId) {
|
|
@@ -998,16 +999,22 @@ export class AutoOrchestrator {
|
|
|
998
999
|
this.postAdvanceRecord(skipped);
|
|
999
1000
|
return skipped;
|
|
1000
1001
|
}
|
|
1001
|
-
// Stuck-loop detection:
|
|
1002
|
-
//
|
|
1003
|
-
//
|
|
1004
|
-
//
|
|
1005
|
-
//
|
|
1006
|
-
//
|
|
1007
|
-
//
|
|
1008
|
-
//
|
|
1009
|
-
//
|
|
1010
|
-
|
|
1002
|
+
// Stuck-loop detection: consult the Dispatch History module's full
|
|
1003
|
+
// detect-stuck rule set once the window is *full* — not only when a
|
|
1004
|
+
// single key saturates it. Gating on a single key's saturation count
|
|
1005
|
+
// (matchingCount >= STUCK_WINDOW_SIZE) let two-unit oscillations slip
|
|
1006
|
+
// through forever: an execute-task ↔ complete-slice loop (a slice gate
|
|
1007
|
+
// that keeps reopening the same task, #1225) fills the window with two
|
|
1008
|
+
// alternating keys, so neither key ever reaches the saturation count and
|
|
1009
|
+
// detect-stuck's oscillation/repeat rules were never even invoked. Firing
|
|
1010
|
+
// on window saturation instead covers both shapes. Consecutive same-key
|
|
1011
|
+
// re-advances (the benign pause/resume churn the old count gate guarded
|
|
1012
|
+
// against) are already short-circuited above by the idempotency skip, and
|
|
1013
|
+
// legitimate retry backoff is still suppressed inside detect-stuck via the
|
|
1014
|
+
// dispatch ledger — a saturated window with no verdict means we are inside
|
|
1015
|
+
// the unit's retry-backoff budget, so let the retry proceed.
|
|
1016
|
+
const windowSaturated = this.dispatchHistory.getRecentWindow().length >= STUCK_WINDOW_SIZE;
|
|
1017
|
+
const stuckVerdict = windowSaturated ? this.dispatchHistory.detectStuck() : null;
|
|
1011
1018
|
if (stuckVerdict) {
|
|
1012
1019
|
// #442: before declaring a stuck loop, verify the unit didn't actually
|
|
1013
1020
|
// complete on disk (stale DB) and recover if so — legacy graduated
|
|
@@ -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");
|
|
@@ -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;
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
// resolveExpectedArtifactPath and diagnoseExpectedArtifact moved here from
|
|
6
6
|
// auto-recovery.ts (Phase 5 dead-code cleanup). The artifact verification
|
|
7
7
|
// function was removed entirely — callers now query WorkflowEngine directly.
|
|
8
|
-
import { gsdRoot, resolveDir, resolveFile, resolveMilestonePath, resolveMilestoneFile, resolveSliceFile, relMilestoneFile, relSliceFile, buildTaskFileName, resolveSlicePath, resolveTasksDir, dirIsMetaOnlyLegacyMilestone, } from "./paths.js";
|
|
8
|
+
import { gsdRoot, resolveDir, resolveFile, resolveMilestonePath, resolveMilestoneFile, resolveSliceFile, relMilestoneFile, relSliceFile, buildTaskFileName, resolveSlicePath, resolveTasksDir, dirIsMetaOnlyLegacyMilestone, normalizeRealPath, } 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");
|
|
@@ -299,7 +308,7 @@ export function resolveSliceResearchLocation(basePath, mid, sid) {
|
|
|
299
308
|
if (canonicalPath && existsSync(canonicalPath)) {
|
|
300
309
|
return {
|
|
301
310
|
absolutePath: canonicalPath,
|
|
302
|
-
relativePath: relative(basePath, canonicalPath),
|
|
311
|
+
relativePath: relative(normalizeRealPath(basePath), canonicalPath),
|
|
303
312
|
};
|
|
304
313
|
}
|
|
305
314
|
return { absolutePath: null, relativePath: null };
|
|
@@ -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
|
}
|