@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
|
@@ -6,7 +6,7 @@ import { cpSync, existsSync, mkdirSync, readdirSync, renameSync, rmSync, statSyn
|
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
|
|
8
8
|
import { renderAllFromDb, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
9
|
-
import { getAllMilestones, getMilestoneSlices } from "./gsd-db.js";
|
|
9
|
+
import { deleteArtifactsByPathPrefix, getAllMilestones, getMilestoneSlices } from "./gsd-db.js";
|
|
10
10
|
import { migrateFromMarkdown } from "./md-importer.js";
|
|
11
11
|
import { countDbHierarchy } from "./migration-auto-check.js";
|
|
12
12
|
import { logWarning } from "./workflow-logger.js";
|
|
@@ -108,15 +108,35 @@ function rollbackPartialMigration(
|
|
|
108
108
|
`rollback: could not remove partial ${LAYOUT_SEGMENTS.level1}/: ${(removeErr as Error).message}`,
|
|
109
109
|
);
|
|
110
110
|
}
|
|
111
|
+
// Only the standalone .gsd-backups/migrate-<ts>/ copy is disposable once the
|
|
112
|
+
// restore succeeds. When resuming an interrupted migration, backupDir IS the
|
|
113
|
+
// preserved migrating tree (the sole surviving data source) and must never be
|
|
114
|
+
// removed here. Deleting the backup after a successful rollback keeps the gate
|
|
115
|
+
// from leaking one .gsd-backups/migrate-<ts>/ per session_start.
|
|
116
|
+
const isDisposableBackup = Boolean(backupDir) && backupDir !== migratingPath;
|
|
117
|
+
const cleanupBackup = (): void => {
|
|
118
|
+
if (!isDisposableBackup || !existsSync(backupDir)) return;
|
|
119
|
+
try {
|
|
120
|
+
removePathWithRetries(backupDir);
|
|
121
|
+
} catch (cleanupErr) {
|
|
122
|
+
logWarning(
|
|
123
|
+
"migration",
|
|
124
|
+
`rollback: could not clean backup ${backupDir}: ${(cleanupErr as Error).message}`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
111
129
|
// Restore milestones/ — prefer renaming the preserved migrating copy back.
|
|
112
130
|
const milestonesPath = join(basePath, ".gsd", "milestones");
|
|
113
131
|
try {
|
|
114
132
|
if (migratingPath && existsSync(migratingPath) && !existsSync(milestonesPath)) {
|
|
115
133
|
movePathWithCopyDeleteFallback(migratingPath, milestonesPath);
|
|
134
|
+
cleanupBackup();
|
|
116
135
|
return;
|
|
117
136
|
}
|
|
118
137
|
if (existsSync(backupDir)) {
|
|
119
138
|
cpSync(backupDir, milestonesPath, { recursive: true });
|
|
139
|
+
cleanupBackup();
|
|
120
140
|
}
|
|
121
141
|
if (migratingPath && existsSync(migratingPath)) {
|
|
122
142
|
removePathWithRetries(migratingPath);
|
|
@@ -195,7 +215,8 @@ export function pruneStaleFlatPhaseBackups(basePath: string): number {
|
|
|
195
215
|
* 2. Rename .gsd/milestones/ aside so path resolvers target phases/
|
|
196
216
|
* 3. Render flat-phase from the DB (which already has the data)
|
|
197
217
|
* 4. Verify counts match
|
|
198
|
-
* 5.
|
|
218
|
+
* 5. Prune legacy milestones/ artifact rows
|
|
219
|
+
* 6. Remove the renamed legacy tree
|
|
199
220
|
*
|
|
200
221
|
* Idempotent: if .gsd/milestones/ doesn't exist, returns immediately.
|
|
201
222
|
*/
|
|
@@ -313,7 +334,17 @@ export async function migrateToFlatPhase(basePath: string): Promise<void> {
|
|
|
313
334
|
throw new Error("flat-phase migration verification failed: no artifacts rendered");
|
|
314
335
|
}
|
|
315
336
|
|
|
316
|
-
// 6. Verified —
|
|
337
|
+
// 6. Verified — prune legacy artifact rows now that renderAllFromDb has
|
|
338
|
+
// re-inserted flat-phase rows for artifacts that still have files.
|
|
339
|
+
try {
|
|
340
|
+
deleteArtifactsByPathPrefix("milestones/");
|
|
341
|
+
} catch (err) {
|
|
342
|
+
logWarning("migration", `flat-phase migration could not prune legacy artifact rows: ${(err as Error).message}`);
|
|
343
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
344
|
+
throw err;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// 7. Remove the renamed legacy tree (backup already on disk).
|
|
317
348
|
try {
|
|
318
349
|
removePathWithRetries(migratingPath);
|
|
319
350
|
} catch (err) {
|
|
@@ -30,7 +30,7 @@ import { loadPrompt } from "./prompt-loader.js";
|
|
|
30
30
|
import { gsdRoot } from "./paths.js";
|
|
31
31
|
import { isDbAvailable, getHierarchyCompletionCounts } from "./gsd-db.js";
|
|
32
32
|
import { formatDuration } from "../shared/format-utils.js";
|
|
33
|
-
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
33
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
34
34
|
import { clearGSDPreferencesCache, loadEffectiveGSDPreferences, loadGlobalGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
35
35
|
import { showNextAction } from "../shared/tui.js";
|
|
36
36
|
import {
|
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
nativeCheckoutTheirs,
|
|
8
8
|
nativeRmForce,
|
|
9
9
|
} from "./native-git-bridge.js";
|
|
10
|
-
import { isSafeToAutoResolve } from "./auto-worktree.js";
|
|
10
|
+
import { isSafeToAutoResolve } from "./auto-worktree-conflict-auto-resolve.js";
|
|
11
11
|
|
|
12
|
-
export { isSafeToAutoResolve } from "./auto-worktree.js";
|
|
12
|
+
export { isSafeToAutoResolve } from "./auto-worktree-conflict-auto-resolve.js";
|
|
13
13
|
|
|
14
14
|
export interface AutoResolveSafePathsResult {
|
|
15
15
|
resolved: string[];
|
|
@@ -704,6 +704,59 @@ export function runGit(basePath: string, args: string[], options: { allowFailure
|
|
|
704
704
|
}
|
|
705
705
|
}
|
|
706
706
|
|
|
707
|
+
/**
|
|
708
|
+
* Arguments for creating a task/workflow branch.
|
|
709
|
+
*
|
|
710
|
+
* When the current branch is a leftover GSD task branch (workflow template,
|
|
711
|
+
* quick task, or slice), the new branch starts from `baseBranch` — the
|
|
712
|
+
* caller's resolved integration branch, normally `GitServiceImpl.getMainBranch()`
|
|
713
|
+
* so `main_branch` preference, milestone integration branch, and worktree base
|
|
714
|
+
* all take priority over repo-default detection. Branching from HEAD there
|
|
715
|
+
* silently stacks consecutive workflow branches on top of each other, so every
|
|
716
|
+
* new gsd/* branch (and its eventual PR) drags along the previous workflow's
|
|
717
|
+
* commits.
|
|
718
|
+
*
|
|
719
|
+
* On any other branch (a user's feature branch, a worktree base, the main
|
|
720
|
+
* branch itself) the legacy branch-from-HEAD behavior is kept: basing new work
|
|
721
|
+
* on the branch the user chose to stand on is intentional there.
|
|
722
|
+
*
|
|
723
|
+
* Falls back to branch-from-HEAD, with a logged warning, when the base branch
|
|
724
|
+
* has no local ref or the working tree is still dirty (a start point that
|
|
725
|
+
* changes the tree would abort the checkout or strand in-flight changes).
|
|
726
|
+
* The base is the local ref — deliberately no fetch, so branch creation stays
|
|
727
|
+
* offline-safe even if the local base is behind its remote.
|
|
728
|
+
*/
|
|
729
|
+
export function taskBranchArgs(basePath: string, branchName: string, currentBranch: string, baseBranch: string): string[] {
|
|
730
|
+
const args = ["checkout", "-b", branchName];
|
|
731
|
+
const onTaskBranch =
|
|
732
|
+
WORKFLOW_BRANCH_RE.test(currentBranch) ||
|
|
733
|
+
QUICK_BRANCH_RE.test(currentBranch) ||
|
|
734
|
+
SLICE_BRANCH_RE.test(currentBranch);
|
|
735
|
+
if (!onTaskBranch || !baseBranch || baseBranch === currentBranch) return args;
|
|
736
|
+
try {
|
|
737
|
+
if (!nativeBranchExists(basePath, baseBranch)) {
|
|
738
|
+
logWarning(
|
|
739
|
+
"engine",
|
|
740
|
+
`taskBranchArgs: base branch "${baseBranch}" has no local ref — branching ${branchName} from HEAD (${currentBranch})`,
|
|
741
|
+
{ file: "git-service.ts" },
|
|
742
|
+
);
|
|
743
|
+
return args;
|
|
744
|
+
}
|
|
745
|
+
if (nativeHasChanges(basePath)) {
|
|
746
|
+
logWarning(
|
|
747
|
+
"engine",
|
|
748
|
+
`taskBranchArgs: working tree still dirty after auto-commit — branching ${branchName} from HEAD (${currentBranch}) to preserve in-flight changes`,
|
|
749
|
+
{ file: "git-service.ts" },
|
|
750
|
+
);
|
|
751
|
+
return args;
|
|
752
|
+
}
|
|
753
|
+
} catch {
|
|
754
|
+
return args;
|
|
755
|
+
}
|
|
756
|
+
args.push(baseBranch);
|
|
757
|
+
return args;
|
|
758
|
+
}
|
|
759
|
+
|
|
707
760
|
// ─── Commit Type Inference ─────────────────────────────────────────────────
|
|
708
761
|
|
|
709
762
|
/**
|
|
@@ -454,6 +454,14 @@ export function insertTask(t: {
|
|
|
454
454
|
fullSummaryMd?: string;
|
|
455
455
|
sequence?: number;
|
|
456
456
|
planning?: Partial<TaskPlanningRecord>;
|
|
457
|
+
// #1222 (metadata half): when re-importing from markdown, the caller only
|
|
458
|
+
// knows the plan/status — not the execution prose that gsd_task_complete
|
|
459
|
+
// wrote to the DB. Setting this preserves the existing row's execution
|
|
460
|
+
// columns (and completed_at) whenever the incoming value is empty/default,
|
|
461
|
+
// so a re-import cannot silently blank a completed task's summary metadata
|
|
462
|
+
// or refresh its completion timestamp. Off by default: callers that own the
|
|
463
|
+
// execution metadata (gsd_task_complete, planning) keep overwrite semantics.
|
|
464
|
+
preserveCompletionMetadata?: boolean;
|
|
457
465
|
}): void {
|
|
458
466
|
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
459
467
|
getDbOrNull()!.prepare(
|
|
@@ -473,17 +481,17 @@ export function insertTask(t: {
|
|
|
473
481
|
ON CONFLICT(milestone_id, slice_id, id) DO UPDATE SET
|
|
474
482
|
title = CASE WHEN NULLIF(:title, '') IS NOT NULL THEN :title ELSE tasks.title END,
|
|
475
483
|
status = :status,
|
|
476
|
-
one_liner = :one_liner,
|
|
477
|
-
narrative = :narrative,
|
|
478
|
-
verification_result = :verification_result,
|
|
479
|
-
duration = :duration,
|
|
480
|
-
completed_at = :completed_at,
|
|
481
|
-
blocker_discovered = :blocker_discovered,
|
|
482
|
-
deviations = :deviations,
|
|
483
|
-
known_issues = :known_issues,
|
|
484
|
-
key_files = :key_files,
|
|
485
|
-
key_decisions = :key_decisions,
|
|
486
|
-
full_summary_md = :full_summary_md,
|
|
484
|
+
one_liner = CASE WHEN :preserve_completion = 1 AND NULLIF(:one_liner, '') IS NULL THEN tasks.one_liner ELSE :one_liner END,
|
|
485
|
+
narrative = CASE WHEN :preserve_completion = 1 AND NULLIF(:narrative, '') IS NULL THEN tasks.narrative ELSE :narrative END,
|
|
486
|
+
verification_result = CASE WHEN :preserve_completion = 1 AND NULLIF(:verification_result, '') IS NULL THEN tasks.verification_result ELSE :verification_result END,
|
|
487
|
+
duration = CASE WHEN :preserve_completion = 1 AND NULLIF(:duration, '') IS NULL THEN tasks.duration ELSE :duration END,
|
|
488
|
+
completed_at = CASE WHEN :preserve_completion = 1 AND tasks.completed_at IS NOT NULL THEN tasks.completed_at ELSE :completed_at END,
|
|
489
|
+
blocker_discovered = CASE WHEN :preserve_completion = 1 AND :blocker_discovered = 0 THEN tasks.blocker_discovered ELSE :blocker_discovered END,
|
|
490
|
+
deviations = CASE WHEN :preserve_completion = 1 AND NULLIF(:deviations, '') IS NULL THEN tasks.deviations ELSE :deviations END,
|
|
491
|
+
known_issues = CASE WHEN :preserve_completion = 1 AND NULLIF(:known_issues, '') IS NULL THEN tasks.known_issues ELSE :known_issues END,
|
|
492
|
+
key_files = CASE WHEN :preserve_completion = 1 AND NULLIF(:key_files, '[]') IS NULL THEN tasks.key_files ELSE :key_files END,
|
|
493
|
+
key_decisions = CASE WHEN :preserve_completion = 1 AND NULLIF(:key_decisions, '[]') IS NULL THEN tasks.key_decisions ELSE :key_decisions END,
|
|
494
|
+
full_summary_md = CASE WHEN :preserve_completion = 1 AND NULLIF(:full_summary_md, '') IS NULL THEN tasks.full_summary_md ELSE :full_summary_md END,
|
|
487
495
|
description = CASE WHEN NULLIF(:description, '') IS NOT NULL THEN :description ELSE tasks.description END,
|
|
488
496
|
estimate = CASE WHEN NULLIF(:estimate, '') IS NOT NULL THEN :estimate ELSE tasks.estimate END,
|
|
489
497
|
files = CASE WHEN NULLIF(:files, '[]') IS NOT NULL THEN :files ELSE tasks.files END,
|
|
@@ -523,6 +531,7 @@ export function insertTask(t: {
|
|
|
523
531
|
":observability_impact": t.planning?.observabilityImpact ?? "",
|
|
524
532
|
":full_plan_md": t.planning?.fullPlanMd ?? "",
|
|
525
533
|
":sequence": t.sequence ?? 0,
|
|
534
|
+
":preserve_completion": t.preserveCompletionMetadata && (t.status === "complete" || t.status === "done") ? 1 : 0,
|
|
526
535
|
":target_repositories": JSON.stringify(t.planning?.targetRepositories ?? []),
|
|
527
536
|
":raw_target_repositories":
|
|
528
537
|
t.planning && "targetRepositories" in t.planning
|
|
@@ -1397,6 +1406,19 @@ export function deleteArtifactByPath(path: string): void {
|
|
|
1397
1406
|
getDbOrNull()!.prepare("DELETE FROM artifacts WHERE path = :path").run({ ":path": path });
|
|
1398
1407
|
}
|
|
1399
1408
|
|
|
1409
|
+
/** Delete artifact rows whose paths share a DB-relative prefix. */
|
|
1410
|
+
export function deleteArtifactsByPathPrefix(prefix: string): number {
|
|
1411
|
+
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1412
|
+
return transaction(() => {
|
|
1413
|
+
const likePrefix = `${prefix}%`;
|
|
1414
|
+
const countRow = getDbOrNull()!.prepare(
|
|
1415
|
+
"SELECT COUNT(*) AS count FROM artifacts WHERE path LIKE :prefix",
|
|
1416
|
+
).get({ ":prefix": likePrefix });
|
|
1417
|
+
getDbOrNull()!.prepare("DELETE FROM artifacts WHERE path LIKE :prefix").run({ ":prefix": likePrefix });
|
|
1418
|
+
return Number(countRow?.["count"] ?? 0);
|
|
1419
|
+
});
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1400
1422
|
/**
|
|
1401
1423
|
* Drop hierarchy rows in dependency order inside a transaction. Used by
|
|
1402
1424
|
* `gsd recover --confirm` to rebuild engine state from markdown.
|
|
@@ -50,8 +50,8 @@ import { readSessionLockData, isSessionLockProcessAlive } from "./session-lock.j
|
|
|
50
50
|
import { nativeAddAll, nativeCommit, nativeHasCommittedHead, nativeIsRepo, nativeInit } from "./native-git-bridge.js";
|
|
51
51
|
import { isInheritedRepo } from "./repo-identity.js";
|
|
52
52
|
import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
|
|
53
|
-
import { getIsolationMode, loadEffectiveGSDPreferences } from "./preferences.js";
|
|
54
|
-
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
53
|
+
import { getIsolationMode, loadEffectiveGSDPreferences, renderLanguageDirectiveForPrompt } from "./preferences.js";
|
|
54
|
+
import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
|
|
55
55
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
56
56
|
import { ensurePlanV2Graph, isMissingFinalizedContextResult } from "./uok/plan-v2.js";
|
|
57
57
|
import { detectProjectState, hasGsdBootstrapArtifacts } from "./detection.js";
|
|
@@ -94,7 +94,7 @@ import {
|
|
|
94
94
|
import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
|
|
95
95
|
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
96
96
|
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
97
|
-
import {
|
|
97
|
+
import { getUnitWorkflowDispatchReadinessErrorForModel } from "./tool-contract.js";
|
|
98
98
|
import {
|
|
99
99
|
runPreparation,
|
|
100
100
|
formatCodebaseBrief,
|
|
@@ -613,7 +613,7 @@ interface DispatchWorkflowOptions {
|
|
|
613
613
|
deps?: {
|
|
614
614
|
loadPreferences?: typeof loadEffectiveGSDPreferences;
|
|
615
615
|
selectModel?: typeof selectAndApplyModel;
|
|
616
|
-
getDispatchReadinessError?: typeof
|
|
616
|
+
getDispatchReadinessError?: typeof getUnitWorkflowDispatchReadinessErrorForModel;
|
|
617
617
|
};
|
|
618
618
|
}
|
|
619
619
|
|
|
@@ -730,7 +730,7 @@ async function dispatchWorkflow(
|
|
|
730
730
|
const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
|
|
731
731
|
const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
|
|
732
732
|
const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
|
|
733
|
-
??
|
|
733
|
+
?? getUnitWorkflowDispatchReadinessErrorForModel;
|
|
734
734
|
|
|
735
735
|
// Route through the dynamic routing pipeline (complexity classification,
|
|
736
736
|
// tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
|
|
@@ -750,16 +750,12 @@ async function dispatchWorkflow(
|
|
|
750
750
|
}
|
|
751
751
|
|
|
752
752
|
const compatibilityError = getDispatchReadinessError({
|
|
753
|
-
|
|
753
|
+
model: result.appliedModel,
|
|
754
|
+
fallbackModel: ctx.model,
|
|
755
|
+
getProviderAuthMode: (provider) => ctx.modelRegistry.getProviderAuthMode(provider),
|
|
754
756
|
projectRoot,
|
|
755
757
|
surface: "guided flow",
|
|
756
758
|
unitType,
|
|
757
|
-
authMode: result.appliedModel?.provider
|
|
758
|
-
? ctx.modelRegistry.getProviderAuthMode(result.appliedModel.provider)
|
|
759
|
-
: ctx.model?.provider
|
|
760
|
-
? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
|
|
761
|
-
: undefined,
|
|
762
|
-
baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
|
|
763
759
|
// Guided flow starts the MCP workflow server as part of dispatch, so the
|
|
764
760
|
// parent session's activeTools doesn't include MCP tools yet. The MCP
|
|
765
761
|
// launch config check (detectWorkflowMcpLaunchConfig) is the right gate
|
|
@@ -925,7 +921,7 @@ function resolveAvailableModel<T extends { id: string; provider: string }>(
|
|
|
925
921
|
* Build the discuss-and-plan prompt for a new milestone.
|
|
926
922
|
* Used by all three "new milestone" paths (first ever, no active, all complete).
|
|
927
923
|
*/
|
|
928
|
-
function buildDiscussPrompt(nextId: string, preamble: string,
|
|
924
|
+
function buildDiscussPrompt(nextId: string, preamble: string, basePath: string, pi: ExtensionAPI, ctx: ExtensionCommandContext, preparationContext?: string): string {
|
|
929
925
|
const milestoneRel = `.gsd/milestones/${nextId}`;
|
|
930
926
|
const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
|
|
931
927
|
const inlinedTemplates = [
|
|
@@ -935,7 +931,7 @@ function buildDiscussPrompt(nextId: string, preamble: string, _basePath: string,
|
|
|
935
931
|
inlineTemplate("roadmap", "Roadmap"),
|
|
936
932
|
inlineTemplate("decisions", "Decisions"),
|
|
937
933
|
].join("\n\n---\n\n");
|
|
938
|
-
return loadPrompt("discuss", {
|
|
934
|
+
return prependLanguageDirective(basePath, loadPrompt("discuss", {
|
|
939
935
|
milestoneId: nextId,
|
|
940
936
|
preamble,
|
|
941
937
|
preparationContext: preparationContext ?? "",
|
|
@@ -945,14 +941,26 @@ function buildDiscussPrompt(nextId: string, preamble: string, _basePath: string,
|
|
|
945
941
|
inlinedTemplates,
|
|
946
942
|
commitInstruction: buildDocsCommitInstruction(`docs(${nextId}): context, requirements, and roadmap`),
|
|
947
943
|
multiMilestoneCommitInstruction: buildDocsCommitInstruction("docs: project plan — N milestones"),
|
|
948
|
-
});
|
|
944
|
+
}));
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
/**
|
|
948
|
+
* Prepend the configured response-language directive to a dispatched discuss
|
|
949
|
+
* prompt so the discuss/QA conversation is held in the language set in
|
|
950
|
+
* PREFERENCES.md (#1210). No-op when no language is configured.
|
|
951
|
+
*/
|
|
952
|
+
function prependLanguageDirective(basePath: string, prompt: string): string {
|
|
953
|
+
const directive = renderLanguageDirectiveForPrompt(
|
|
954
|
+
loadEffectiveGSDPreferences(basePath)?.preferences,
|
|
955
|
+
);
|
|
956
|
+
return directive ? `${directive}\n\n${prompt}` : prompt;
|
|
949
957
|
}
|
|
950
958
|
|
|
951
959
|
/**
|
|
952
960
|
* Build the discuss prompt for headless milestone creation.
|
|
953
961
|
* Uses the discuss-headless prompt template with seed context injected.
|
|
954
962
|
*/
|
|
955
|
-
function buildHeadlessDiscussPrompt(nextId: string, seedContext: string,
|
|
963
|
+
function buildHeadlessDiscussPrompt(nextId: string, seedContext: string, basePath: string): string {
|
|
956
964
|
const milestoneRel = `.gsd/milestones/${nextId}`;
|
|
957
965
|
const inlinedTemplates = [
|
|
958
966
|
inlineTemplate("project", "Project"),
|
|
@@ -961,7 +969,7 @@ function buildHeadlessDiscussPrompt(nextId: string, seedContext: string, _basePa
|
|
|
961
969
|
inlineTemplate("roadmap", "Roadmap"),
|
|
962
970
|
inlineTemplate("decisions", "Decisions"),
|
|
963
971
|
].join("\n\n---\n\n");
|
|
964
|
-
return loadPrompt("discuss-headless", {
|
|
972
|
+
return prependLanguageDirective(basePath, loadPrompt("discuss-headless", {
|
|
965
973
|
milestoneId: nextId,
|
|
966
974
|
seedContext,
|
|
967
975
|
contextPath: `${milestoneRel}/${nextId}-CONTEXT.md`,
|
|
@@ -969,7 +977,7 @@ function buildHeadlessDiscussPrompt(nextId: string, seedContext: string, _basePa
|
|
|
969
977
|
inlinedTemplates,
|
|
970
978
|
commitInstruction: buildDocsCommitInstruction(`docs(${nextId}): context, requirements, and roadmap`),
|
|
971
979
|
multiMilestoneCommitInstruction: buildDocsCommitInstruction("docs: project plan — N milestones"),
|
|
972
|
-
});
|
|
980
|
+
}));
|
|
973
981
|
}
|
|
974
982
|
|
|
975
983
|
/**
|
|
@@ -142,7 +142,7 @@ export function emitJournalEvent(basePath: string, entry: JournalEntry): void {
|
|
|
142
142
|
// Silent failure — journal must never break auto-mode
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
if (!isUnifiedAuditEnabled()) return;
|
|
145
|
+
if (!isUnifiedAuditEnabled(basePath)) return;
|
|
146
146
|
try {
|
|
147
147
|
const causedBy = entry.causedBy
|
|
148
148
|
? `${entry.causedBy.flowId}:${entry.causedBy.seq}`
|
|
@@ -38,9 +38,10 @@ import {
|
|
|
38
38
|
resolveSlicePath,
|
|
39
39
|
resolveTaskFile,
|
|
40
40
|
resolveTasksDir,
|
|
41
|
+
targetMilestoneFile,
|
|
42
|
+
targetSliceFile,
|
|
41
43
|
gsdProjectionRoot,
|
|
42
44
|
gsdRoot,
|
|
43
|
-
buildMilestoneFileName,
|
|
44
45
|
buildTaskFileName,
|
|
45
46
|
buildSliceFileName,
|
|
46
47
|
} from "./paths.js";
|
|
@@ -52,9 +53,6 @@ import { readCompatMarker, writeCompatMarker, computeProjectionSha } from "./com
|
|
|
52
53
|
import type { RiskLevel } from "./types.js";
|
|
53
54
|
import {
|
|
54
55
|
phaseDirName,
|
|
55
|
-
planFileName,
|
|
56
|
-
milestoneIdToPhaseNum,
|
|
57
|
-
sliceIdToPlanNum,
|
|
58
56
|
derivePhaseSlug,
|
|
59
57
|
} from "./layout-policy.js";
|
|
60
58
|
|
|
@@ -176,23 +174,6 @@ function sanitizeInlineRoadmapText(value: string | null | undefined): string {
|
|
|
176
174
|
.trim();
|
|
177
175
|
}
|
|
178
176
|
|
|
179
|
-
function resolveRoadmapProjectionPath(basePath: string, milestoneId: string): string {
|
|
180
|
-
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
181
|
-
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
182
|
-
const legacyBase = legacyMilestonesDir(basePath);
|
|
183
|
-
const isLegacyLayout = existing
|
|
184
|
-
? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
|
|
185
|
-
: isLegacyMilestonesLayout(basePath);
|
|
186
|
-
const phaseDir = existing ?? join(
|
|
187
|
-
isLegacyLayout ? legacyBase : milestonesDir(basePath),
|
|
188
|
-
isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
|
|
189
|
-
);
|
|
190
|
-
const roadmapFileName = isLegacyLayout
|
|
191
|
-
? `${milestoneId}-ROADMAP.md`
|
|
192
|
-
: `${String(phaseNum).padStart(2, "0")}-ROADMAP.md`;
|
|
193
|
-
return join(phaseDir, roadmapFileName);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
177
|
function isMilestoneFlatPhaseLayout(basePath: string, milestoneId: string): boolean {
|
|
197
178
|
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
198
179
|
const legacyBase = legacyMilestonesDir(basePath);
|
|
@@ -600,7 +581,7 @@ export async function renderRoadmapFromDb(
|
|
|
600
581
|
"projection",
|
|
601
582
|
`renderRoadmapFromDb skipped unplanned milestone ${milestoneId} (zero slices, empty vision) — refusing to write a stub ROADMAP`,
|
|
602
583
|
);
|
|
603
|
-
const absPath =
|
|
584
|
+
const absPath = targetMilestoneFile(basePath, milestoneId, "ROADMAP", milestone.title);
|
|
604
585
|
if (existsSync(absPath)) {
|
|
605
586
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
606
587
|
unlinkSync(absPath);
|
|
@@ -614,7 +595,7 @@ export async function renderRoadmapFromDb(
|
|
|
614
595
|
return { skipped: "unplanned-milestone" };
|
|
615
596
|
}
|
|
616
597
|
|
|
617
|
-
const absPath =
|
|
598
|
+
const absPath = targetMilestoneFile(basePath, milestoneId, "ROADMAP", milestone.title);
|
|
618
599
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
619
600
|
const content = renderRoadmapMarkdown(milestone, slices);
|
|
620
601
|
|
|
@@ -655,25 +636,20 @@ export async function renderMilestoneArtifactsFromDb(
|
|
|
655
636
|
const artifacts = getMilestoneScopedArtifacts(milestoneId);
|
|
656
637
|
if (artifacts.length === 0) return false;
|
|
657
638
|
|
|
658
|
-
const
|
|
659
|
-
join(
|
|
660
|
-
milestonesDir(basePath),
|
|
661
|
-
canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
|
|
662
|
-
);
|
|
663
|
-
mkdirSync(phaseDir, { recursive: true });
|
|
664
|
-
|
|
665
|
-
const legacyBase = legacyMilestonesDir(basePath);
|
|
666
|
-
const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
|
|
639
|
+
const milestone = getMilestone(milestoneId);
|
|
667
640
|
|
|
668
641
|
let wrote = false;
|
|
669
642
|
for (const artifact of artifacts) {
|
|
670
643
|
if (artifact.artifact_type === "ROADMAP") continue;
|
|
671
644
|
if (!artifact.full_content.trim()) continue;
|
|
672
645
|
|
|
673
|
-
const
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
646
|
+
const absPath = targetMilestoneFile(
|
|
647
|
+
basePath,
|
|
648
|
+
milestoneId,
|
|
649
|
+
artifact.artifact_type,
|
|
650
|
+
milestone?.title,
|
|
651
|
+
);
|
|
652
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
677
653
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
678
654
|
await writeAndStore(absPath, artifactPath, artifact.full_content, {
|
|
679
655
|
artifact_type: artifact.artifact_type,
|
|
@@ -824,22 +800,12 @@ export async function renderSliceSummary(
|
|
|
824
800
|
return false; // No slice data — skip silently
|
|
825
801
|
}
|
|
826
802
|
|
|
827
|
-
|
|
828
|
-
// finds existing dirs. In flat-phase the slice "path" is the phase dir.
|
|
829
|
-
let slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
830
|
-
if (!slicePath) {
|
|
831
|
-
const mDir = milestonesDir(basePath);
|
|
832
|
-
const dirName = canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title);
|
|
833
|
-
slicePath = join(mDir, dirName);
|
|
834
|
-
mkdirSync(slicePath, { recursive: true });
|
|
835
|
-
}
|
|
836
|
-
|
|
803
|
+
const milestoneTitle = getMilestone(milestoneId)?.title;
|
|
837
804
|
let wrote = false;
|
|
838
805
|
|
|
839
|
-
// Write SUMMARY — flat-phase: NN-MM-SUMMARY.md inside phase dir
|
|
840
806
|
if (slice.full_summary_md) {
|
|
841
|
-
const
|
|
842
|
-
|
|
807
|
+
const summaryAbs = targetSliceFile(basePath, milestoneId, sliceId, "SUMMARY", milestoneTitle);
|
|
808
|
+
mkdirSync(dirname(summaryAbs), { recursive: true });
|
|
843
809
|
const summaryArtifact = toArtifactPath(summaryAbs, basePath);
|
|
844
810
|
|
|
845
811
|
await writeAndStore(summaryAbs, summaryArtifact, slice.full_summary_md, {
|
|
@@ -850,10 +816,9 @@ export async function renderSliceSummary(
|
|
|
850
816
|
wrote = true;
|
|
851
817
|
}
|
|
852
818
|
|
|
853
|
-
// Write UAT — flat-phase: NN-MM-UAT.md inside phase dir
|
|
854
819
|
if (slice.full_uat_md) {
|
|
855
|
-
const
|
|
856
|
-
|
|
820
|
+
const uatAbs = targetSliceFile(basePath, milestoneId, sliceId, "UAT", milestoneTitle);
|
|
821
|
+
mkdirSync(dirname(uatAbs), { recursive: true });
|
|
857
822
|
const uatArtifact = toArtifactPath(uatAbs, basePath);
|
|
858
823
|
|
|
859
824
|
await writeAndStore(uatAbs, uatArtifact, slice.full_uat_md, {
|
|
@@ -1080,7 +1045,7 @@ function detectStaleRendersImpl(basePath: string): StaleEntry[] {
|
|
|
1080
1045
|
// TODO(flat-phase): roadmap checkbox parsing may not match flat-phase
|
|
1081
1046
|
// roadmap format, causing false-positive drift loops. Skip during transition.
|
|
1082
1047
|
/*
|
|
1083
|
-
const roadmapPath =
|
|
1048
|
+
const roadmapPath = targetMilestoneFile(basePath, milestone.id, "ROADMAP", milestone.title);
|
|
1084
1049
|
if (existsSync(roadmapPath)) {
|
|
1085
1050
|
try {
|
|
1086
1051
|
const parsed = parseProjectionByIdentity(roadmapPath, parseRoadmap) as ReturnType<typeof parseRoadmap>;
|
|
@@ -1172,36 +1137,28 @@ function detectStaleRendersImpl(basePath: string): StaleEntry[] {
|
|
|
1172
1137
|
}
|
|
1173
1138
|
}
|
|
1174
1139
|
|
|
1175
|
-
// Check missing slice summary/UAT files
|
|
1140
|
+
// Check missing slice summary/UAT files. Use the same target helper as
|
|
1141
|
+
// renderSliceSummary so detection and repair agree on flat-phase vs legacy
|
|
1142
|
+
// output locations.
|
|
1176
1143
|
const sliceRow = getSlice(milestone.id, slice.id);
|
|
1177
1144
|
if (sliceRow && sliceRow.status === "complete") {
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
if (sliceRow.full_summary_md) {
|
|
1186
|
-
const summaryName = planFileName(phaseNum, planNum, "SUMMARY");
|
|
1187
|
-
const summaryAbsPath = join(slicePath, summaryName);
|
|
1188
|
-
if (!existsSync(summaryAbsPath)) {
|
|
1189
|
-
stale.push({
|
|
1190
|
-
path: summaryAbsPath,
|
|
1191
|
-
reason: `${slice.id} is complete with summary in DB but SUMMARY.md missing on disk`,
|
|
1192
|
-
});
|
|
1193
|
-
}
|
|
1145
|
+
if (sliceRow.full_summary_md) {
|
|
1146
|
+
const summaryAbsPath = targetSliceFile(basePath, milestone.id, slice.id, "SUMMARY", milestone.title);
|
|
1147
|
+
if (!existsSync(summaryAbsPath)) {
|
|
1148
|
+
stale.push({
|
|
1149
|
+
path: summaryAbsPath,
|
|
1150
|
+
reason: `${slice.id} is complete with summary in DB but SUMMARY.md missing on disk`,
|
|
1151
|
+
});
|
|
1194
1152
|
}
|
|
1153
|
+
}
|
|
1195
1154
|
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
});
|
|
1204
|
-
}
|
|
1155
|
+
if (sliceRow.full_uat_md) {
|
|
1156
|
+
const uatAbsPath = targetSliceFile(basePath, milestone.id, slice.id, "UAT", milestone.title);
|
|
1157
|
+
if (!existsSync(uatAbsPath)) {
|
|
1158
|
+
stale.push({
|
|
1159
|
+
path: uatAbsPath,
|
|
1160
|
+
reason: `${slice.id} is complete with UAT in DB but UAT.md missing on disk`,
|
|
1161
|
+
});
|
|
1205
1162
|
}
|
|
1206
1163
|
}
|
|
1207
1164
|
}
|
|
@@ -1257,12 +1214,14 @@ export async function renderReplanFromDb(
|
|
|
1257
1214
|
sliceId: string,
|
|
1258
1215
|
replanData: ReplanData,
|
|
1259
1216
|
): Promise<{ replanPath: string; content: string }> {
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1217
|
+
const absPath = targetSliceFile(
|
|
1218
|
+
basePath,
|
|
1219
|
+
milestoneId,
|
|
1220
|
+
sliceId,
|
|
1221
|
+
"REPLAN",
|
|
1222
|
+
getMilestone(milestoneId)?.title,
|
|
1223
|
+
);
|
|
1224
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
1266
1225
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
1267
1226
|
|
|
1268
1227
|
const lines: string[] = [];
|
|
@@ -1299,12 +1258,14 @@ export async function renderAssessmentFromDb(
|
|
|
1299
1258
|
sliceId: string,
|
|
1300
1259
|
assessmentData: AssessmentData,
|
|
1301
1260
|
): Promise<{ assessmentPath: string; content: string }> {
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1261
|
+
const absPath = targetSliceFile(
|
|
1262
|
+
basePath,
|
|
1263
|
+
milestoneId,
|
|
1264
|
+
sliceId,
|
|
1265
|
+
"ASSESSMENT",
|
|
1266
|
+
getMilestone(milestoneId)?.title,
|
|
1267
|
+
);
|
|
1268
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
1308
1269
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
1309
1270
|
|
|
1310
1271
|
const lines: string[] = [];
|