@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
|
@@ -23,7 +23,7 @@ import type {
|
|
|
23
23
|
GSDModelPhaseKey,
|
|
24
24
|
GSDThinkingConfig,
|
|
25
25
|
ResolvedModelConfig,
|
|
26
|
-
|
|
26
|
+
ResolvedAutoSupervisorConfig,
|
|
27
27
|
} from "./preferences-types.js";
|
|
28
28
|
import { clearGSDPreferencesCache, loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
29
29
|
import { getUnitPhaseChain } from "./unit-registry.js";
|
|
@@ -86,6 +86,40 @@ function resolveWinningPhase(
|
|
|
86
86
|
return undefined;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
/**
|
|
90
|
+
* Normalize a single model field into a {@link ResolvedModelConfig}.
|
|
91
|
+
*
|
|
92
|
+
* Accepts either the legacy bare-string form or the extended object form
|
|
93
|
+
* (`{ model, provider?, fallbacks? }`). This is the shared normalization used
|
|
94
|
+
* for phase buckets so sibling single-model fields — `post_unit_hooks[].model`,
|
|
95
|
+
* `auto_supervisor.model`, and `reactive_execution.subagent_model` — honor
|
|
96
|
+
* `fallbacks[]` identically rather than accepting a bare string only (#1229).
|
|
97
|
+
*
|
|
98
|
+
* Returns undefined for an unset, blank, or model-less field.
|
|
99
|
+
*/
|
|
100
|
+
export function normalizeModelFieldConfig(
|
|
101
|
+
field: string | GSDPhaseModelConfig | undefined,
|
|
102
|
+
): ResolvedModelConfig | undefined {
|
|
103
|
+
if (!field) return undefined;
|
|
104
|
+
if (typeof field === "string") {
|
|
105
|
+
return field.trim() ? { primary: field, fallbacks: [] } : undefined;
|
|
106
|
+
}
|
|
107
|
+
if (!field.model) return undefined;
|
|
108
|
+
// When provider is explicitly set, prepend it to the model ID so the
|
|
109
|
+
// resolution code in auto.ts can do an explicit provider match.
|
|
110
|
+
const primary = field.provider && !field.model.includes("/")
|
|
111
|
+
? `${field.provider}/${field.model}`
|
|
112
|
+
: field.model;
|
|
113
|
+
// Carry the per-field `thinking` sub-field through so the dispatch site can
|
|
114
|
+
// prefer it over the session/floor level, mirroring phase-inline thinking
|
|
115
|
+
// (#1269). `undefined` is preserved as absent so behavior is unchanged.
|
|
116
|
+
return {
|
|
117
|
+
primary,
|
|
118
|
+
fallbacks: field.fallbacks ?? [],
|
|
119
|
+
...(field.thinking ? { thinking: field.thinking } : {}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
89
123
|
/**
|
|
90
124
|
* Resolve model and fallbacks for a given auto-mode unit type.
|
|
91
125
|
* Returns the primary model and ordered fallbacks, or undefined if not configured.
|
|
@@ -93,6 +127,15 @@ function resolveWinningPhase(
|
|
|
93
127
|
* Supports both legacy string format and extended object format:
|
|
94
128
|
* - Legacy: `planning: claude-opus-4-6`
|
|
95
129
|
* - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
|
|
130
|
+
*
|
|
131
|
+
* Hook unit types (`hook/<name>`) resolve against the matching
|
|
132
|
+
* `post_unit_hooks[]` entry's `model` field so hook sessions honor the same
|
|
133
|
+
* `fallbacks[]` chain as phase buckets — the recovery path can then switch to
|
|
134
|
+
* a fallback provider instead of hard-failing (and potentially pausing) the
|
|
135
|
+
* run on a transient provider trip (#1229).
|
|
136
|
+
*
|
|
137
|
+
* The synthetic `supervisor` unit type resolves against `auto_supervisor.model`
|
|
138
|
+
* for supervisor interventions (wrap-up warnings, timeout recovery).
|
|
96
139
|
*/
|
|
97
140
|
export function resolveModelWithFallbacksForUnit(
|
|
98
141
|
unitType: string,
|
|
@@ -107,27 +150,26 @@ export function resolveModelWithFallbacksForUnit(
|
|
|
107
150
|
...(skipProfileDefaults ? { skipProfileDefaults: true } : {}),
|
|
108
151
|
};
|
|
109
152
|
const prefs = loadEffectiveGSDPreferences(basePath, loadOpts);
|
|
110
|
-
const chain = phaseChainForUnit(unitType);
|
|
111
|
-
if (!chain) return undefined;
|
|
112
|
-
const winner = resolveWinningPhase(prefs?.preferences?.models as GSDModelConfigV2 | undefined, chain);
|
|
113
|
-
if (!winner) return undefined;
|
|
114
|
-
const phaseConfig = winner.config;
|
|
115
153
|
|
|
116
|
-
//
|
|
117
|
-
if (
|
|
118
|
-
return
|
|
154
|
+
// Supervisor interventions resolve against `auto_supervisor.model` (#1229).
|
|
155
|
+
if (unitType === "supervisor") {
|
|
156
|
+
return normalizeModelFieldConfig(prefs?.preferences?.auto_supervisor?.model);
|
|
119
157
|
}
|
|
120
158
|
|
|
121
|
-
//
|
|
122
|
-
//
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
159
|
+
// Hook sessions resolve against their own `post_unit_hooks[].model` field,
|
|
160
|
+
// which now shares the phase-bucket object form (#1229).
|
|
161
|
+
if (unitType.startsWith("hook/")) {
|
|
162
|
+
const hookName = unitType.slice("hook/".length);
|
|
163
|
+
const hooks = prefs?.preferences?.post_unit_hooks;
|
|
164
|
+
const hook = Array.isArray(hooks) ? hooks.find((h) => h.name === hookName) : undefined;
|
|
165
|
+
return normalizeModelFieldConfig(hook?.model);
|
|
166
|
+
}
|
|
126
167
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
168
|
+
const chain = phaseChainForUnit(unitType);
|
|
169
|
+
if (!chain) return undefined;
|
|
170
|
+
const winner = resolveWinningPhase(prefs?.preferences?.models as GSDModelConfigV2 | undefined, chain);
|
|
171
|
+
if (!winner) return undefined;
|
|
172
|
+
return normalizeModelFieldConfig(winner.config);
|
|
131
173
|
}
|
|
132
174
|
|
|
133
175
|
/**
|
|
@@ -157,6 +199,14 @@ export function resolveThinkingLevelForUnit(
|
|
|
157
199
|
basePath?: string,
|
|
158
200
|
availableModelIds?: string[],
|
|
159
201
|
): GSDThinkingLevel | undefined {
|
|
202
|
+
// Single-field configs — `auto_supervisor.model` and `post_unit_hooks[].model`
|
|
203
|
+
// — carry their own inline `thinking` on the object model form and have no
|
|
204
|
+
// phase-bucket chain, so the walk below never covers them. Resolve their
|
|
205
|
+
// per-field level directly (#1269).
|
|
206
|
+
if (unitType === "supervisor" || unitType.startsWith("hook/")) {
|
|
207
|
+
return resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds)?.thinking;
|
|
208
|
+
}
|
|
209
|
+
|
|
160
210
|
const loadOpts = availableModelIds !== undefined ? { availableModelIds } : undefined;
|
|
161
211
|
const prefs = loadEffectiveGSDPreferences(basePath, loadOpts)?.preferences;
|
|
162
212
|
if (!prefs) return undefined;
|
|
@@ -425,16 +475,20 @@ export function resolveDynamicRoutingConfig(): DynamicRoutingConfig {
|
|
|
425
475
|
};
|
|
426
476
|
}
|
|
427
477
|
|
|
428
|
-
export function resolveAutoSupervisorConfig():
|
|
478
|
+
export function resolveAutoSupervisorConfig(): ResolvedAutoSupervisorConfig {
|
|
429
479
|
const prefs = loadEffectiveGSDPreferences();
|
|
430
480
|
const configured = prefs?.preferences.auto_supervisor ?? {};
|
|
431
481
|
|
|
482
|
+
const modelConfig = normalizeModelFieldConfig(configured.model);
|
|
483
|
+
|
|
432
484
|
return {
|
|
433
485
|
soft_timeout_minutes: configured.soft_timeout_minutes ?? 20,
|
|
434
486
|
idle_timeout_minutes: configured.idle_timeout_minutes ?? 10,
|
|
435
487
|
hard_timeout_minutes: configured.hard_timeout_minutes ?? 30,
|
|
436
488
|
stalled_tool_timeout_minutes: configured.stalled_tool_timeout_minutes ?? 5,
|
|
437
|
-
...(
|
|
489
|
+
...(modelConfig
|
|
490
|
+
? { model: modelConfig.primary, modelFallbacks: modelConfig.fallbacks }
|
|
491
|
+
: {}),
|
|
438
492
|
};
|
|
439
493
|
}
|
|
440
494
|
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* to absolute filesystem paths, plus skill discovery and staleness config.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
8
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
9
9
|
import { homedir } from "node:os";
|
|
10
10
|
import { isAbsolute, join } from "node:path";
|
|
11
|
+
import { getSkillDirectories } from "@gsd/pi-coding-agent";
|
|
11
12
|
import { gsdHome } from "./gsd-home.js";
|
|
12
|
-
import { statSync } from "node:fs";
|
|
13
13
|
|
|
14
14
|
import type {
|
|
15
15
|
GSDPreferences,
|
|
@@ -25,26 +25,20 @@ export type { GSDSkillRule, SkillDiscoveryMode, SkillResolution, SkillResolution
|
|
|
25
25
|
/**
|
|
26
26
|
* Known skill directories for **preference reference resolution** (bare skill names).
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* 4. ~/.claude/skills/ and .claude/skills/ (Claude Code compatibility)
|
|
28
|
+
* Sourced from the shared taxonomy (`@gsd/pi-coding-agent` `getSkillDirectories`)
|
|
29
|
+
* so preference resolution, mid-session discovery, and the PackageManager
|
|
30
|
+
* catalog all agree on which directories exist. The `method` is derived from
|
|
31
|
+
* each entry's scope.
|
|
33
32
|
*
|
|
34
33
|
* Note: the ResourceLoader catalog uses PackageManager precedence instead —
|
|
35
34
|
* project `.gsd/skills` and `.agents/skills` can override bundled GSD skills
|
|
36
35
|
* on name collision. See docs/dev/what-is-pi/09-the-customization-stack.md.
|
|
37
36
|
*/
|
|
38
37
|
export function getSkillSearchDirs(cwd: string): Array<{ dir: string; method: SkillResolution["method"] }> {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
// Claude Code official skill directories
|
|
44
|
-
{ dir: join(homedir(), ".claude", "skills"), method: "user-skill" },
|
|
45
|
-
{ dir: join(cwd, ".claude", "skills"), method: "project-skill" },
|
|
46
|
-
];
|
|
47
|
-
return dirs;
|
|
38
|
+
return getSkillDirectories({ cwd, gsdHome: gsdHome() }).map((entry) => ({
|
|
39
|
+
dir: entry.path,
|
|
40
|
+
method: entry.scope === "project" ? "project-skill" : "user-skill",
|
|
41
|
+
}));
|
|
48
42
|
}
|
|
49
43
|
|
|
50
44
|
/**
|
|
@@ -29,6 +29,33 @@ export interface ContextManagementConfig {
|
|
|
29
29
|
tool_result_max_chars?: number; // default: 800, range: 200-10000
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/**
|
|
33
|
+
* User-tunable thresholds for the tool-call loop guard (#1198). Keeps the two
|
|
34
|
+
* guards separately configurable: the identical-args guard (catches real
|
|
35
|
+
* infinite loops) and the repeated-tool-name cap (catches improvisation loops,
|
|
36
|
+
* more likely to false-positive on legitimate automation). All fields are
|
|
37
|
+
* optional; omitted fields fall back to the built-in defaults so existing
|
|
38
|
+
* installs keep their current behavior. Also overridable via GSD_TOOL_LOOP_*
|
|
39
|
+
* environment variables.
|
|
40
|
+
*/
|
|
41
|
+
export interface ToolCallLoopGuardConfig {
|
|
42
|
+
/** Master switch for both guards. Default: true. */
|
|
43
|
+
enabled?: boolean;
|
|
44
|
+
/** Identical-args sliding-window guard. */
|
|
45
|
+
identical_args?: {
|
|
46
|
+
enabled?: boolean; // default: true
|
|
47
|
+
max_consecutive_calls?: number; // default: 4, min: 1
|
|
48
|
+
};
|
|
49
|
+
/** Per-tool-name cap, independent of args. */
|
|
50
|
+
repeated_tool?: {
|
|
51
|
+
enabled?: boolean; // default: true
|
|
52
|
+
default_cap?: number; // default: 6, min: 1
|
|
53
|
+
repeatable_cap?: number; // default: 15, min: 1
|
|
54
|
+
/** Additional tool names exempt from the per-tool cap (merged with built-in defaults). */
|
|
55
|
+
exempt_tools?: string[];
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
32
59
|
/**
|
|
33
60
|
* Opt-in tool-output sandboxing for sub-sessions. When enabled, the gsd_exec
|
|
34
61
|
* MCP tool runs scripts in an isolated subprocess and returns only a short
|
|
@@ -139,6 +166,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
|
|
|
139
166
|
"min_request_interval_ms",
|
|
140
167
|
"stale_commit_threshold_minutes",
|
|
141
168
|
"context_management",
|
|
169
|
+
"tool_call_loop_guard",
|
|
142
170
|
"experimental",
|
|
143
171
|
"codebase",
|
|
144
172
|
"slice_parallel",
|
|
@@ -284,12 +312,24 @@ export interface GSDModelConfigV2 {
|
|
|
284
312
|
export interface ResolvedModelConfig {
|
|
285
313
|
primary: string;
|
|
286
314
|
fallbacks: string[];
|
|
315
|
+
/**
|
|
316
|
+
* Per-field reasoning level carried from the object model form's `thinking`
|
|
317
|
+
* sub-field (e.g. `{ model, thinking: high }` on `post_unit_hooks[].model`,
|
|
318
|
+
* `auto_supervisor.model`, or `reactive_execution.subagent_model`). Applied at
|
|
319
|
+
* the dispatch site in preference to the session/floor level (#1269).
|
|
320
|
+
*/
|
|
321
|
+
thinking?: GSDThinkingLevel;
|
|
287
322
|
}
|
|
288
323
|
|
|
289
324
|
export type SkillDiscoveryMode = "auto" | "suggest" | "off";
|
|
290
325
|
|
|
291
326
|
export interface AutoSupervisorConfig {
|
|
292
|
-
|
|
327
|
+
/**
|
|
328
|
+
* Model ID for the supervisor process. Accepts a bare model ID or the
|
|
329
|
+
* extended `{ model, provider?, fallbacks? }` object form for parity with
|
|
330
|
+
* phase buckets (#1229). Resolution normalizes it to the primary model ID.
|
|
331
|
+
*/
|
|
332
|
+
model?: string | GSDPhaseModelConfig;
|
|
293
333
|
soft_timeout_minutes?: number;
|
|
294
334
|
idle_timeout_minutes?: number;
|
|
295
335
|
hard_timeout_minutes?: number;
|
|
@@ -303,6 +343,17 @@ export interface AutoSupervisorConfig {
|
|
|
303
343
|
stalled_tool_timeout_minutes?: number;
|
|
304
344
|
}
|
|
305
345
|
|
|
346
|
+
/**
|
|
347
|
+
* The supervisor config after resolution by `resolveAutoSupervisorConfig`.
|
|
348
|
+
* Identical to {@link AutoSupervisorConfig} except `model` is always the
|
|
349
|
+
* normalized primary model ID string and `modelFallbacks` carries the ordered
|
|
350
|
+
* fallback chain from the object form accepted in preferences (#1229).
|
|
351
|
+
*/
|
|
352
|
+
export type ResolvedAutoSupervisorConfig = Omit<AutoSupervisorConfig, "model"> & {
|
|
353
|
+
model?: string;
|
|
354
|
+
modelFallbacks?: string[];
|
|
355
|
+
};
|
|
356
|
+
|
|
306
357
|
export interface RemoteQuestionsConfig {
|
|
307
358
|
channel: "slack" | "discord" | "telegram";
|
|
308
359
|
channel_id: string | number;
|
|
@@ -440,6 +491,8 @@ export interface GSDPreferences {
|
|
|
440
491
|
*/
|
|
441
492
|
context_window_override?: number;
|
|
442
493
|
context_management?: ContextManagementConfig;
|
|
494
|
+
/** User-tunable tool-call loop guard thresholds (#1198). */
|
|
495
|
+
tool_call_loop_guard?: ToolCallLoopGuardConfig;
|
|
443
496
|
/**
|
|
444
497
|
* Tool-output sandboxing via gsd_exec. Keeps sub-session context windows
|
|
445
498
|
* clean by running scripts in a subprocess and only surfacing a short
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
SKILL_ACTIONS,
|
|
23
23
|
type WorkflowMode,
|
|
24
24
|
type GSDPreferences,
|
|
25
|
+
type GSDPhaseModelConfig,
|
|
25
26
|
type GSDSkillRule,
|
|
26
27
|
type GSDThinkingLevel,
|
|
27
28
|
} from "./preferences-types.js";
|
|
@@ -41,6 +42,62 @@ const VALID_UOK_TURN_ACTIONS = new Set<"commit" | "snapshot" | "status-only">([
|
|
|
41
42
|
"snapshot",
|
|
42
43
|
"status-only",
|
|
43
44
|
]);
|
|
45
|
+
/**
|
|
46
|
+
* Sanitize a single model field that accepts either a bare model ID or the
|
|
47
|
+
* extended `{ model, provider?, fallbacks? }` object form used by phase buckets
|
|
48
|
+
* (#1229). Returns the sanitized value, or undefined when unset/invalid (in
|
|
49
|
+
* which case an error describing `label` is pushed onto `errors`).
|
|
50
|
+
*/
|
|
51
|
+
function sanitizeModelField(
|
|
52
|
+
raw: unknown,
|
|
53
|
+
label: string,
|
|
54
|
+
errors: string[],
|
|
55
|
+
warnings?: string[],
|
|
56
|
+
): string | GSDPhaseModelConfig | undefined {
|
|
57
|
+
if (raw === undefined) return undefined;
|
|
58
|
+
if (typeof raw === "string") {
|
|
59
|
+
const trimmed = raw.trim();
|
|
60
|
+
if (!trimmed) {
|
|
61
|
+
errors.push(`${label} must not be an empty string`);
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
return trimmed;
|
|
65
|
+
}
|
|
66
|
+
if (raw && typeof raw === "object") {
|
|
67
|
+
const obj = raw as Record<string, unknown>;
|
|
68
|
+
const model = typeof obj.model === "string" ? obj.model.trim() : "";
|
|
69
|
+
if (!model) {
|
|
70
|
+
errors.push(`${label} object form requires a non-empty "model"`);
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
const sanitized: GSDPhaseModelConfig = { model };
|
|
74
|
+
if (typeof obj.provider === "string" && obj.provider.trim()) {
|
|
75
|
+
sanitized.provider = obj.provider.trim();
|
|
76
|
+
}
|
|
77
|
+
if (obj.fallbacks !== undefined) {
|
|
78
|
+
const fallbacks = normalizeStringArray(obj.fallbacks);
|
|
79
|
+
if (fallbacks.length > 0) sanitized.fallbacks = fallbacks;
|
|
80
|
+
}
|
|
81
|
+
// Preserve the object form's `thinking` sub-field so the dispatch site can
|
|
82
|
+
// pin the hook/supervisor/subagent reasoning level (#1269). An illegal level
|
|
83
|
+
// is warned-and-stripped, mirroring inline per-phase thinking, so a typo can't
|
|
84
|
+
// reach the resolver and be treated as explicit configuration.
|
|
85
|
+
if (obj.thinking !== undefined) {
|
|
86
|
+
if (VALID_THINKING_LEVELS.has(obj.thinking as GSDThinkingLevel)) {
|
|
87
|
+
sanitized.thinking = obj.thinking as GSDThinkingLevel;
|
|
88
|
+
} else {
|
|
89
|
+
warnings?.push(
|
|
90
|
+
`${label} thinking "${String(obj.thinking)}" is not a valid thinking level ` +
|
|
91
|
+
`(off, minimal, low, medium, high, xhigh) — ignored`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return sanitized;
|
|
96
|
+
}
|
|
97
|
+
errors.push(`${label} must be a string or an object with a "model" field`);
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
|
|
44
101
|
const VALID_POST_UNIT_HOOK_CRITICALITIES = new Set(["advisory", "blocking"]);
|
|
45
102
|
const VALID_POST_UNIT_HOOK_ON_BLOCK_ACTIONS = new Set([
|
|
46
103
|
"retry-unit",
|
|
@@ -476,7 +533,15 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
476
533
|
// ─── Auto Supervisor ────────────────────────────────────────────────
|
|
477
534
|
if (preferences.auto_supervisor !== undefined) {
|
|
478
535
|
if (preferences.auto_supervisor && typeof preferences.auto_supervisor === "object") {
|
|
479
|
-
|
|
536
|
+
// Validate `model` through the shared sanitizer so the
|
|
537
|
+
// `{ model, provider?, fallbacks? }` object form is rejected on the same
|
|
538
|
+
// terms as its post_unit_hooks / reactive_execution siblings (#1229).
|
|
539
|
+
// Other supervisor fields pass through unchanged.
|
|
540
|
+
const supervisor = { ...preferences.auto_supervisor };
|
|
541
|
+
if (supervisor.model !== undefined) {
|
|
542
|
+
supervisor.model = sanitizeModelField(supervisor.model, "auto_supervisor.model", errors, warnings);
|
|
543
|
+
}
|
|
544
|
+
validated.auto_supervisor = supervisor;
|
|
480
545
|
} else {
|
|
481
546
|
errors.push("auto_supervisor must be an object");
|
|
482
547
|
}
|
|
@@ -568,8 +633,9 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
568
633
|
const mc = typeof hook.max_cycles === "number" ? hook.max_cycles : Number(hook.max_cycles);
|
|
569
634
|
validHook.max_cycles = Number.isFinite(mc) ? Math.max(1, Math.min(10, Math.round(mc))) : 1;
|
|
570
635
|
}
|
|
571
|
-
|
|
572
|
-
|
|
636
|
+
const hookModel = sanitizeModelField(hook.model, `post_unit_hooks "${name}" model`, errors, warnings);
|
|
637
|
+
if (hookModel !== undefined) {
|
|
638
|
+
validHook.model = hookModel;
|
|
573
639
|
}
|
|
574
640
|
if (typeof hook.artifact === "string" && hook.artifact.trim()) {
|
|
575
641
|
validHook.artifact = hook.artifact.trim();
|
|
@@ -794,6 +860,75 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
794
860
|
}
|
|
795
861
|
}
|
|
796
862
|
|
|
863
|
+
// ─── Tool-call loop guard (#1198) ────────────────────────────────────────
|
|
864
|
+
if (preferences.tool_call_loop_guard !== undefined) {
|
|
865
|
+
if (typeof preferences.tool_call_loop_guard === "object" && preferences.tool_call_loop_guard !== null) {
|
|
866
|
+
const g = preferences.tool_call_loop_guard as unknown as Record<string, unknown>;
|
|
867
|
+
const validGuard: Record<string, unknown> = {};
|
|
868
|
+
|
|
869
|
+
if (g.enabled !== undefined) {
|
|
870
|
+
if (typeof g.enabled === "boolean") validGuard.enabled = g.enabled;
|
|
871
|
+
else errors.push("tool_call_loop_guard.enabled must be a boolean");
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
if (g.identical_args !== undefined) {
|
|
875
|
+
if (typeof g.identical_args === "object" && g.identical_args !== null) {
|
|
876
|
+
const ia = g.identical_args as Record<string, unknown>;
|
|
877
|
+
const validIa: Record<string, unknown> = {};
|
|
878
|
+
if (ia.enabled !== undefined) {
|
|
879
|
+
if (typeof ia.enabled === "boolean") validIa.enabled = ia.enabled;
|
|
880
|
+
else errors.push("tool_call_loop_guard.identical_args.enabled must be a boolean");
|
|
881
|
+
}
|
|
882
|
+
if (ia.max_consecutive_calls !== undefined) {
|
|
883
|
+
const n = ia.max_consecutive_calls;
|
|
884
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1) validIa.max_consecutive_calls = n;
|
|
885
|
+
else errors.push("tool_call_loop_guard.identical_args.max_consecutive_calls must be an integer >= 1");
|
|
886
|
+
}
|
|
887
|
+
if (Object.keys(validIa).length > 0) validGuard.identical_args = validIa;
|
|
888
|
+
} else {
|
|
889
|
+
errors.push("tool_call_loop_guard.identical_args must be an object");
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
if (g.repeated_tool !== undefined) {
|
|
894
|
+
if (typeof g.repeated_tool === "object" && g.repeated_tool !== null) {
|
|
895
|
+
const rt = g.repeated_tool as Record<string, unknown>;
|
|
896
|
+
const validRt: Record<string, unknown> = {};
|
|
897
|
+
if (rt.enabled !== undefined) {
|
|
898
|
+
if (typeof rt.enabled === "boolean") validRt.enabled = rt.enabled;
|
|
899
|
+
else errors.push("tool_call_loop_guard.repeated_tool.enabled must be a boolean");
|
|
900
|
+
}
|
|
901
|
+
if (rt.default_cap !== undefined) {
|
|
902
|
+
const n = rt.default_cap;
|
|
903
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1) validRt.default_cap = n;
|
|
904
|
+
else errors.push("tool_call_loop_guard.repeated_tool.default_cap must be an integer >= 1");
|
|
905
|
+
}
|
|
906
|
+
if (rt.repeatable_cap !== undefined) {
|
|
907
|
+
const n = rt.repeatable_cap;
|
|
908
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1) validRt.repeatable_cap = n;
|
|
909
|
+
else errors.push("tool_call_loop_guard.repeated_tool.repeatable_cap must be an integer >= 1");
|
|
910
|
+
}
|
|
911
|
+
if (rt.exempt_tools !== undefined) {
|
|
912
|
+
if (Array.isArray(rt.exempt_tools) && rt.exempt_tools.every((t) => typeof t === "string")) {
|
|
913
|
+
validRt.exempt_tools = rt.exempt_tools;
|
|
914
|
+
} else {
|
|
915
|
+
errors.push("tool_call_loop_guard.repeated_tool.exempt_tools must be an array of strings");
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
if (Object.keys(validRt).length > 0) validGuard.repeated_tool = validRt;
|
|
919
|
+
} else {
|
|
920
|
+
errors.push("tool_call_loop_guard.repeated_tool must be an object");
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
if (Object.keys(validGuard).length > 0) {
|
|
925
|
+
validated.tool_call_loop_guard = validGuard as any;
|
|
926
|
+
}
|
|
927
|
+
} else {
|
|
928
|
+
errors.push("tool_call_loop_guard must be an object");
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
|
|
797
932
|
// ─── Context Mode (gsd_exec sandbox) ────────────────────────────────────
|
|
798
933
|
if (preferences.context_mode !== undefined) {
|
|
799
934
|
if (typeof preferences.context_mode === "object" && preferences.context_mode !== null) {
|
|
@@ -952,12 +1087,14 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
952
1087
|
}
|
|
953
1088
|
}
|
|
954
1089
|
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
1090
|
+
const subagentModel = sanitizeModelField(
|
|
1091
|
+
re.subagent_model,
|
|
1092
|
+
"reactive_execution.subagent_model",
|
|
1093
|
+
errors,
|
|
1094
|
+
warnings,
|
|
1095
|
+
);
|
|
1096
|
+
if (subagentModel !== undefined) {
|
|
1097
|
+
validRe.subagent_model = subagentModel;
|
|
961
1098
|
}
|
|
962
1099
|
|
|
963
1100
|
const knownReKeys = new Set(["enabled", "max_parallel", "isolation_mode", "subagent_model"]);
|
|
@@ -1033,6 +1033,26 @@ export function renderPreferencesForSystemPrompt(
|
|
|
1033
1033
|
return lines.join("\n");
|
|
1034
1034
|
}
|
|
1035
1035
|
|
|
1036
|
+
/**
|
|
1037
|
+
* Render a compact response-language directive for injection into dispatched
|
|
1038
|
+
* prompt *content* (discuss/QA and auto-execution unit prompts).
|
|
1039
|
+
*
|
|
1040
|
+
* The main session's system prompt already carries the full GSD Skill
|
|
1041
|
+
* Preferences block (including language) via `before_agent_start`, but
|
|
1042
|
+
* discuss/QA turns and auto-execution units are dispatched as separate
|
|
1043
|
+
* turns/sessions whose prompts are assembled here — without that block — so the
|
|
1044
|
+
* configured language never reaches them (#1210). Injecting this directive into
|
|
1045
|
+
* the dispatched prompt content makes the `language` preference effective across
|
|
1046
|
+
* both guided and auto workflows.
|
|
1047
|
+
*
|
|
1048
|
+
* Returns "" when no language is configured.
|
|
1049
|
+
*/
|
|
1050
|
+
export function renderLanguageDirectiveForPrompt(preferences: GSDPreferences | undefined): string {
|
|
1051
|
+
if (!preferences?.language) return "";
|
|
1052
|
+
const safeLang = preferences.language.replace(/[\r\n]/g, " ").slice(0, 50);
|
|
1053
|
+
return `## Response Language\n\nAlways respond in ${safeLang} — questions, explanations, and summaries.`;
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1036
1056
|
// ─── Hook Resolution ──────────────────────────────────────────────────────────
|
|
1037
1057
|
|
|
1038
1058
|
/**
|
|
@@ -38,7 +38,7 @@ If a `GSD Skill Preferences` block appears below, treat it as durable guidance f
|
|
|
38
38
|
|
|
39
39
|
### Naming Convention
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
GSD projects use a flat-phase layout. Phase directories are `{MM}-{slug}` where `{MM}` is the zero-padded phase number and `{slug}` is derived from the phase title (e.g. `47-real-time-runtime-hardening`). Phase-level files are `{MM}-SUFFIX.md` (e.g. `47-CONTEXT.md`, `47-RESEARCH.md`, `47-ROADMAP.md`, `47-VALIDATION.md`, `47-SUMMARY.md`). Slice/plan files live directly in the phase directory as `{MM}-{SS}-SUFFIX.md` (e.g. `47-01-PLAN.md`, `47-01-SUMMARY.md`, `47-01-UAT.md`). Task plan content lives inside the slice plan file (`{MM}-{SS}-PLAN.md`) as checkboxes; there is no `tasks/` subdirectory and no `tasks/T##-PLAN.md`. Titles live inside content, not names. Prefer GSD-provided layout-aware paths/resolvers over hardcoding artifact paths, since phase slugs are title-derived.
|
|
42
42
|
|
|
43
43
|
### Directory Structure
|
|
44
44
|
|
|
@@ -46,13 +46,13 @@ Directories use bare IDs. Files use ID-SUFFIX format. Milestones: `M001/` or `M{
|
|
|
46
46
|
.gsd/
|
|
47
47
|
PROJECT.md, REQUIREMENTS.md, DECISIONS.md, KNOWLEDGE.md, CODEBASE.md, OVERRIDES.md, QUEUE.md, STATE.md
|
|
48
48
|
runtime/, activity/, worktrees/
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
S01-CONTEXT.md, S01-RESEARCH.md, S01-PLAN.md, S01-SUMMARY.md, S01-UAT.md
|
|
53
|
-
tasks/T01-PLAN.md, tasks/T01-SUMMARY.md
|
|
49
|
+
phases/{MM}-{slug}/
|
|
50
|
+
{MM}-CONTEXT.md, {MM}-RESEARCH.md, {MM}-ROADMAP.md, {MM}-VALIDATION.md, {MM}-SUMMARY.md
|
|
51
|
+
{MM}-{SS}-PLAN.md, {MM}-{SS}-SUMMARY.md, {MM}-{SS}-UAT.md
|
|
54
52
|
```
|
|
55
53
|
|
|
54
|
+
Task plan content is embedded in `{MM}-{SS}-PLAN.md`; do not expect `tasks/T##-PLAN.md`.
|
|
55
|
+
|
|
56
56
|
`runtime/`, `activity/`, `worktrees/`, and `STATE.md` are system-managed. `PROJECT.md` is current state; `REQUIREMENTS.md` is the active capability contract; `DECISIONS.md` and `KNOWLEDGE.md` are append-only; `CODEBASE.md` is an auto-refreshed codebase map.
|
|
57
57
|
|
|
58
58
|
### Isolation Model
|
|
@@ -15,7 +15,7 @@ import { isAbsolute, join, relative, resolve } from "node:path";
|
|
|
15
15
|
import { QUICK_BRANCH_RE } from "./branch-patterns.js";
|
|
16
16
|
import { loadPrompt } from "./prompt-loader.js";
|
|
17
17
|
import { gsdRoot } from "./paths.js";
|
|
18
|
-
import { GitServiceImpl, runGit } from "./git-service.js";
|
|
18
|
+
import { GitServiceImpl, runGit, taskBranchArgs } from "./git-service.js";
|
|
19
19
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
20
20
|
import { nativeBranchExists, nativeDetectMainBranch, nativeDiffNumstat } from "./native-git-bridge.js";
|
|
21
21
|
import { nativeHasStagedChanges } from "./native-git-bridge.js";
|
|
@@ -365,6 +365,7 @@ export async function handleQuick(
|
|
|
365
365
|
const git = new GitServiceImpl(basePath, gitPrefs);
|
|
366
366
|
const branchName = `gsd/quick/${taskNum}-${slug}`;
|
|
367
367
|
let originalBranch = git.getCurrentBranch();
|
|
368
|
+
let returnBranch = originalBranch;
|
|
368
369
|
|
|
369
370
|
const { getIsolationMode } = await import("./preferences.js");
|
|
370
371
|
const usesBranch = getIsolationMode() !== "none" && isGitOpsEnabled();
|
|
@@ -381,7 +382,14 @@ export async function handleQuick(
|
|
|
381
382
|
}
|
|
382
383
|
} catch { /* nothing to commit — fine */ }
|
|
383
384
|
|
|
384
|
-
|
|
385
|
+
const branchArgs = taskBranchArgs(basePath, branchName, current, git.getMainBranch());
|
|
386
|
+
const startPoint = branchArgs[3];
|
|
387
|
+
// When the quick branch is redirected off a stale task branch, the
|
|
388
|
+
// squash-merge on closeout must return to the same base — merging a
|
|
389
|
+
// base-branch-rooted quick branch back into the stale task branch
|
|
390
|
+
// would drag the base's newer history into it.
|
|
391
|
+
if (startPoint) returnBranch = startPoint;
|
|
392
|
+
runGit(basePath, branchArgs);
|
|
385
393
|
branchCreated = true;
|
|
386
394
|
}
|
|
387
395
|
} catch (err) {
|
|
@@ -395,7 +403,7 @@ export async function handleQuick(
|
|
|
395
403
|
if (actualBranch === branchName && originalBranch !== branchName) {
|
|
396
404
|
persistPendingReturn({
|
|
397
405
|
basePath,
|
|
398
|
-
originalBranch,
|
|
406
|
+
originalBranch: returnBranch,
|
|
399
407
|
quickBranch: branchName,
|
|
400
408
|
taskNum,
|
|
401
409
|
slug,
|