@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
|
@@ -66,6 +66,39 @@ function resolveWinningPhase(models, chain) {
|
|
|
66
66
|
}
|
|
67
67
|
return undefined;
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Normalize a single model field into a {@link ResolvedModelConfig}.
|
|
71
|
+
*
|
|
72
|
+
* Accepts either the legacy bare-string form or the extended object form
|
|
73
|
+
* (`{ model, provider?, fallbacks? }`). This is the shared normalization used
|
|
74
|
+
* for phase buckets so sibling single-model fields — `post_unit_hooks[].model`,
|
|
75
|
+
* `auto_supervisor.model`, and `reactive_execution.subagent_model` — honor
|
|
76
|
+
* `fallbacks[]` identically rather than accepting a bare string only (#1229).
|
|
77
|
+
*
|
|
78
|
+
* Returns undefined for an unset, blank, or model-less field.
|
|
79
|
+
*/
|
|
80
|
+
export function normalizeModelFieldConfig(field) {
|
|
81
|
+
if (!field)
|
|
82
|
+
return undefined;
|
|
83
|
+
if (typeof field === "string") {
|
|
84
|
+
return field.trim() ? { primary: field, fallbacks: [] } : undefined;
|
|
85
|
+
}
|
|
86
|
+
if (!field.model)
|
|
87
|
+
return undefined;
|
|
88
|
+
// When provider is explicitly set, prepend it to the model ID so the
|
|
89
|
+
// resolution code in auto.ts can do an explicit provider match.
|
|
90
|
+
const primary = field.provider && !field.model.includes("/")
|
|
91
|
+
? `${field.provider}/${field.model}`
|
|
92
|
+
: field.model;
|
|
93
|
+
// Carry the per-field `thinking` sub-field through so the dispatch site can
|
|
94
|
+
// prefer it over the session/floor level, mirroring phase-inline thinking
|
|
95
|
+
// (#1269). `undefined` is preserved as absent so behavior is unchanged.
|
|
96
|
+
return {
|
|
97
|
+
primary,
|
|
98
|
+
fallbacks: field.fallbacks ?? [],
|
|
99
|
+
...(field.thinking ? { thinking: field.thinking } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
69
102
|
/**
|
|
70
103
|
* Resolve model and fallbacks for a given auto-mode unit type.
|
|
71
104
|
* Returns the primary model and ordered fallbacks, or undefined if not configured.
|
|
@@ -73,6 +106,15 @@ function resolveWinningPhase(models, chain) {
|
|
|
73
106
|
* Supports both legacy string format and extended object format:
|
|
74
107
|
* - Legacy: `planning: claude-opus-4-6`
|
|
75
108
|
* - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
|
|
109
|
+
*
|
|
110
|
+
* Hook unit types (`hook/<name>`) resolve against the matching
|
|
111
|
+
* `post_unit_hooks[]` entry's `model` field so hook sessions honor the same
|
|
112
|
+
* `fallbacks[]` chain as phase buckets — the recovery path can then switch to
|
|
113
|
+
* a fallback provider instead of hard-failing (and potentially pausing) the
|
|
114
|
+
* run on a transient provider trip (#1229).
|
|
115
|
+
*
|
|
116
|
+
* The synthetic `supervisor` unit type resolves against `auto_supervisor.model`
|
|
117
|
+
* for supervisor interventions (wrap-up warnings, timeout recovery).
|
|
76
118
|
*/
|
|
77
119
|
export function resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds, preferredModelId, skipProfileDefaults = false) {
|
|
78
120
|
const loadOpts = {
|
|
@@ -81,26 +123,25 @@ export function resolveModelWithFallbacksForUnit(unitType, basePath, availableMo
|
|
|
81
123
|
...(skipProfileDefaults ? { skipProfileDefaults: true } : {}),
|
|
82
124
|
};
|
|
83
125
|
const prefs = loadEffectiveGSDPreferences(basePath, loadOpts);
|
|
126
|
+
// Supervisor interventions resolve against `auto_supervisor.model` (#1229).
|
|
127
|
+
if (unitType === "supervisor") {
|
|
128
|
+
return normalizeModelFieldConfig(prefs?.preferences?.auto_supervisor?.model);
|
|
129
|
+
}
|
|
130
|
+
// Hook sessions resolve against their own `post_unit_hooks[].model` field,
|
|
131
|
+
// which now shares the phase-bucket object form (#1229).
|
|
132
|
+
if (unitType.startsWith("hook/")) {
|
|
133
|
+
const hookName = unitType.slice("hook/".length);
|
|
134
|
+
const hooks = prefs?.preferences?.post_unit_hooks;
|
|
135
|
+
const hook = Array.isArray(hooks) ? hooks.find((h) => h.name === hookName) : undefined;
|
|
136
|
+
return normalizeModelFieldConfig(hook?.model);
|
|
137
|
+
}
|
|
84
138
|
const chain = phaseChainForUnit(unitType);
|
|
85
139
|
if (!chain)
|
|
86
140
|
return undefined;
|
|
87
141
|
const winner = resolveWinningPhase(prefs?.preferences?.models, chain);
|
|
88
142
|
if (!winner)
|
|
89
143
|
return undefined;
|
|
90
|
-
|
|
91
|
-
// Normalize: string -> { model, fallbacks: [] }
|
|
92
|
-
if (typeof phaseConfig === "string") {
|
|
93
|
-
return { primary: phaseConfig, fallbacks: [] };
|
|
94
|
-
}
|
|
95
|
-
// When provider is explicitly set, prepend it to the model ID so the
|
|
96
|
-
// resolution code in auto.ts can do an explicit provider match.
|
|
97
|
-
const primary = phaseConfig.provider && !phaseConfig.model.includes("/")
|
|
98
|
-
? `${phaseConfig.provider}/${phaseConfig.model}`
|
|
99
|
-
: phaseConfig.model;
|
|
100
|
-
return {
|
|
101
|
-
primary,
|
|
102
|
-
fallbacks: phaseConfig.fallbacks ?? [],
|
|
103
|
-
};
|
|
144
|
+
return normalizeModelFieldConfig(winner.config);
|
|
104
145
|
}
|
|
105
146
|
/**
|
|
106
147
|
* Resolve the explicitly configured reasoning effort for a unit type (ADR-026).
|
|
@@ -125,6 +166,13 @@ export function resolveModelWithFallbacksForUnit(unitType, basePath, availableMo
|
|
|
125
166
|
* applied here.
|
|
126
167
|
*/
|
|
127
168
|
export function resolveThinkingLevelForUnit(unitType, basePath, availableModelIds) {
|
|
169
|
+
// Single-field configs — `auto_supervisor.model` and `post_unit_hooks[].model`
|
|
170
|
+
// — carry their own inline `thinking` on the object model form and have no
|
|
171
|
+
// phase-bucket chain, so the walk below never covers them. Resolve their
|
|
172
|
+
// per-field level directly (#1269).
|
|
173
|
+
if (unitType === "supervisor" || unitType.startsWith("hook/")) {
|
|
174
|
+
return resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds)?.thinking;
|
|
175
|
+
}
|
|
128
176
|
const loadOpts = availableModelIds !== undefined ? { availableModelIds } : undefined;
|
|
129
177
|
const prefs = loadEffectiveGSDPreferences(basePath, loadOpts)?.preferences;
|
|
130
178
|
if (!prefs)
|
|
@@ -383,12 +431,15 @@ export function resolveDynamicRoutingConfig() {
|
|
|
383
431
|
export function resolveAutoSupervisorConfig() {
|
|
384
432
|
const prefs = loadEffectiveGSDPreferences();
|
|
385
433
|
const configured = prefs?.preferences.auto_supervisor ?? {};
|
|
434
|
+
const modelConfig = normalizeModelFieldConfig(configured.model);
|
|
386
435
|
return {
|
|
387
436
|
soft_timeout_minutes: configured.soft_timeout_minutes ?? 20,
|
|
388
437
|
idle_timeout_minutes: configured.idle_timeout_minutes ?? 10,
|
|
389
438
|
hard_timeout_minutes: configured.hard_timeout_minutes ?? 30,
|
|
390
439
|
stalled_tool_timeout_minutes: configured.stalled_tool_timeout_minutes ?? 5,
|
|
391
|
-
...(
|
|
440
|
+
...(modelConfig
|
|
441
|
+
? { model: modelConfig.primary, modelFallbacks: modelConfig.fallbacks }
|
|
442
|
+
: {}),
|
|
392
443
|
};
|
|
393
444
|
}
|
|
394
445
|
// ─── Token Profile Resolution ─────────────────────────────────────────────
|
|
@@ -4,35 +4,29 @@
|
|
|
4
4
|
* Contains all logic for resolving skill references from preferences
|
|
5
5
|
* to absolute filesystem paths, plus skill discovery and staleness config.
|
|
6
6
|
*/
|
|
7
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
7
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
8
8
|
import { homedir } from "node:os";
|
|
9
9
|
import { isAbsolute, join } from "node:path";
|
|
10
|
+
import { getSkillDirectories } from "@gsd/pi-coding-agent";
|
|
10
11
|
import { gsdHome } from "./gsd-home.js";
|
|
11
|
-
import { statSync } from "node:fs";
|
|
12
12
|
import { validatePreferences } from "./preferences-validation.js";
|
|
13
13
|
/**
|
|
14
14
|
* Known skill directories for **preference reference resolution** (bare skill names).
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* 4. ~/.claude/skills/ and .claude/skills/ (Claude Code compatibility)
|
|
16
|
+
* Sourced from the shared taxonomy (`@gsd/pi-coding-agent` `getSkillDirectories`)
|
|
17
|
+
* so preference resolution, mid-session discovery, and the PackageManager
|
|
18
|
+
* catalog all agree on which directories exist. The `method` is derived from
|
|
19
|
+
* each entry's scope.
|
|
21
20
|
*
|
|
22
21
|
* Note: the ResourceLoader catalog uses PackageManager precedence instead —
|
|
23
22
|
* project `.gsd/skills` and `.agents/skills` can override bundled GSD skills
|
|
24
23
|
* on name collision. See docs/dev/what-is-pi/09-the-customization-stack.md.
|
|
25
24
|
*/
|
|
26
25
|
export function getSkillSearchDirs(cwd) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// Claude Code official skill directories
|
|
32
|
-
{ dir: join(homedir(), ".claude", "skills"), method: "user-skill" },
|
|
33
|
-
{ dir: join(cwd, ".claude", "skills"), method: "project-skill" },
|
|
34
|
-
];
|
|
35
|
-
return dirs;
|
|
26
|
+
return getSkillDirectories({ cwd, gsdHome: gsdHome() }).map((entry) => ({
|
|
27
|
+
dir: entry.path,
|
|
28
|
+
method: entry.scope === "project" ? "project-skill" : "user-skill",
|
|
29
|
+
}));
|
|
36
30
|
}
|
|
37
31
|
/**
|
|
38
32
|
* Resolve a single skill reference to an absolute path.
|
|
@@ -25,6 +25,57 @@ const VALID_UOK_TURN_ACTIONS = new Set([
|
|
|
25
25
|
"snapshot",
|
|
26
26
|
"status-only",
|
|
27
27
|
]);
|
|
28
|
+
/**
|
|
29
|
+
* Sanitize a single model field that accepts either a bare model ID or the
|
|
30
|
+
* extended `{ model, provider?, fallbacks? }` object form used by phase buckets
|
|
31
|
+
* (#1229). Returns the sanitized value, or undefined when unset/invalid (in
|
|
32
|
+
* which case an error describing `label` is pushed onto `errors`).
|
|
33
|
+
*/
|
|
34
|
+
function sanitizeModelField(raw, label, errors, warnings) {
|
|
35
|
+
if (raw === undefined)
|
|
36
|
+
return undefined;
|
|
37
|
+
if (typeof raw === "string") {
|
|
38
|
+
const trimmed = raw.trim();
|
|
39
|
+
if (!trimmed) {
|
|
40
|
+
errors.push(`${label} must not be an empty string`);
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
return trimmed;
|
|
44
|
+
}
|
|
45
|
+
if (raw && typeof raw === "object") {
|
|
46
|
+
const obj = raw;
|
|
47
|
+
const model = typeof obj.model === "string" ? obj.model.trim() : "";
|
|
48
|
+
if (!model) {
|
|
49
|
+
errors.push(`${label} object form requires a non-empty "model"`);
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const sanitized = { model };
|
|
53
|
+
if (typeof obj.provider === "string" && obj.provider.trim()) {
|
|
54
|
+
sanitized.provider = obj.provider.trim();
|
|
55
|
+
}
|
|
56
|
+
if (obj.fallbacks !== undefined) {
|
|
57
|
+
const fallbacks = normalizeStringArray(obj.fallbacks);
|
|
58
|
+
if (fallbacks.length > 0)
|
|
59
|
+
sanitized.fallbacks = fallbacks;
|
|
60
|
+
}
|
|
61
|
+
// Preserve the object form's `thinking` sub-field so the dispatch site can
|
|
62
|
+
// pin the hook/supervisor/subagent reasoning level (#1269). An illegal level
|
|
63
|
+
// is warned-and-stripped, mirroring inline per-phase thinking, so a typo can't
|
|
64
|
+
// reach the resolver and be treated as explicit configuration.
|
|
65
|
+
if (obj.thinking !== undefined) {
|
|
66
|
+
if (VALID_THINKING_LEVELS.has(obj.thinking)) {
|
|
67
|
+
sanitized.thinking = obj.thinking;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
warnings?.push(`${label} thinking "${String(obj.thinking)}" is not a valid thinking level ` +
|
|
71
|
+
`(off, minimal, low, medium, high, xhigh) — ignored`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return sanitized;
|
|
75
|
+
}
|
|
76
|
+
errors.push(`${label} must be a string or an object with a "model" field`);
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
28
79
|
const VALID_POST_UNIT_HOOK_CRITICALITIES = new Set(["advisory", "blocking"]);
|
|
29
80
|
const VALID_POST_UNIT_HOOK_ON_BLOCK_ACTIONS = new Set([
|
|
30
81
|
"retry-unit",
|
|
@@ -452,7 +503,15 @@ export function validatePreferences(preferences) {
|
|
|
452
503
|
// ─── Auto Supervisor ────────────────────────────────────────────────
|
|
453
504
|
if (preferences.auto_supervisor !== undefined) {
|
|
454
505
|
if (preferences.auto_supervisor && typeof preferences.auto_supervisor === "object") {
|
|
455
|
-
|
|
506
|
+
// Validate `model` through the shared sanitizer so the
|
|
507
|
+
// `{ model, provider?, fallbacks? }` object form is rejected on the same
|
|
508
|
+
// terms as its post_unit_hooks / reactive_execution siblings (#1229).
|
|
509
|
+
// Other supervisor fields pass through unchanged.
|
|
510
|
+
const supervisor = { ...preferences.auto_supervisor };
|
|
511
|
+
if (supervisor.model !== undefined) {
|
|
512
|
+
supervisor.model = sanitizeModelField(supervisor.model, "auto_supervisor.model", errors, warnings);
|
|
513
|
+
}
|
|
514
|
+
validated.auto_supervisor = supervisor;
|
|
456
515
|
}
|
|
457
516
|
else {
|
|
458
517
|
errors.push("auto_supervisor must be an object");
|
|
@@ -548,8 +607,9 @@ export function validatePreferences(preferences) {
|
|
|
548
607
|
const mc = typeof hook.max_cycles === "number" ? hook.max_cycles : Number(hook.max_cycles);
|
|
549
608
|
validHook.max_cycles = Number.isFinite(mc) ? Math.max(1, Math.min(10, Math.round(mc))) : 1;
|
|
550
609
|
}
|
|
551
|
-
|
|
552
|
-
|
|
610
|
+
const hookModel = sanitizeModelField(hook.model, `post_unit_hooks "${name}" model`, errors, warnings);
|
|
611
|
+
if (hookModel !== undefined) {
|
|
612
|
+
validHook.model = hookModel;
|
|
553
613
|
}
|
|
554
614
|
if (typeof hook.artifact === "string" && hook.artifact.trim()) {
|
|
555
615
|
validHook.artifact = hook.artifact.trim();
|
|
@@ -801,6 +861,88 @@ export function validatePreferences(preferences) {
|
|
|
801
861
|
errors.push("context_management must be an object");
|
|
802
862
|
}
|
|
803
863
|
}
|
|
864
|
+
// ─── Tool-call loop guard (#1198) ────────────────────────────────────────
|
|
865
|
+
if (preferences.tool_call_loop_guard !== undefined) {
|
|
866
|
+
if (typeof preferences.tool_call_loop_guard === "object" && preferences.tool_call_loop_guard !== null) {
|
|
867
|
+
const g = preferences.tool_call_loop_guard;
|
|
868
|
+
const validGuard = {};
|
|
869
|
+
if (g.enabled !== undefined) {
|
|
870
|
+
if (typeof g.enabled === "boolean")
|
|
871
|
+
validGuard.enabled = g.enabled;
|
|
872
|
+
else
|
|
873
|
+
errors.push("tool_call_loop_guard.enabled must be a boolean");
|
|
874
|
+
}
|
|
875
|
+
if (g.identical_args !== undefined) {
|
|
876
|
+
if (typeof g.identical_args === "object" && g.identical_args !== null) {
|
|
877
|
+
const ia = g.identical_args;
|
|
878
|
+
const validIa = {};
|
|
879
|
+
if (ia.enabled !== undefined) {
|
|
880
|
+
if (typeof ia.enabled === "boolean")
|
|
881
|
+
validIa.enabled = ia.enabled;
|
|
882
|
+
else
|
|
883
|
+
errors.push("tool_call_loop_guard.identical_args.enabled must be a boolean");
|
|
884
|
+
}
|
|
885
|
+
if (ia.max_consecutive_calls !== undefined) {
|
|
886
|
+
const n = ia.max_consecutive_calls;
|
|
887
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1)
|
|
888
|
+
validIa.max_consecutive_calls = n;
|
|
889
|
+
else
|
|
890
|
+
errors.push("tool_call_loop_guard.identical_args.max_consecutive_calls must be an integer >= 1");
|
|
891
|
+
}
|
|
892
|
+
if (Object.keys(validIa).length > 0)
|
|
893
|
+
validGuard.identical_args = validIa;
|
|
894
|
+
}
|
|
895
|
+
else {
|
|
896
|
+
errors.push("tool_call_loop_guard.identical_args must be an object");
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
if (g.repeated_tool !== undefined) {
|
|
900
|
+
if (typeof g.repeated_tool === "object" && g.repeated_tool !== null) {
|
|
901
|
+
const rt = g.repeated_tool;
|
|
902
|
+
const validRt = {};
|
|
903
|
+
if (rt.enabled !== undefined) {
|
|
904
|
+
if (typeof rt.enabled === "boolean")
|
|
905
|
+
validRt.enabled = rt.enabled;
|
|
906
|
+
else
|
|
907
|
+
errors.push("tool_call_loop_guard.repeated_tool.enabled must be a boolean");
|
|
908
|
+
}
|
|
909
|
+
if (rt.default_cap !== undefined) {
|
|
910
|
+
const n = rt.default_cap;
|
|
911
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1)
|
|
912
|
+
validRt.default_cap = n;
|
|
913
|
+
else
|
|
914
|
+
errors.push("tool_call_loop_guard.repeated_tool.default_cap must be an integer >= 1");
|
|
915
|
+
}
|
|
916
|
+
if (rt.repeatable_cap !== undefined) {
|
|
917
|
+
const n = rt.repeatable_cap;
|
|
918
|
+
if (typeof n === "number" && Number.isInteger(n) && n >= 1)
|
|
919
|
+
validRt.repeatable_cap = n;
|
|
920
|
+
else
|
|
921
|
+
errors.push("tool_call_loop_guard.repeated_tool.repeatable_cap must be an integer >= 1");
|
|
922
|
+
}
|
|
923
|
+
if (rt.exempt_tools !== undefined) {
|
|
924
|
+
if (Array.isArray(rt.exempt_tools) && rt.exempt_tools.every((t) => typeof t === "string")) {
|
|
925
|
+
validRt.exempt_tools = rt.exempt_tools;
|
|
926
|
+
}
|
|
927
|
+
else {
|
|
928
|
+
errors.push("tool_call_loop_guard.repeated_tool.exempt_tools must be an array of strings");
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
if (Object.keys(validRt).length > 0)
|
|
932
|
+
validGuard.repeated_tool = validRt;
|
|
933
|
+
}
|
|
934
|
+
else {
|
|
935
|
+
errors.push("tool_call_loop_guard.repeated_tool must be an object");
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
if (Object.keys(validGuard).length > 0) {
|
|
939
|
+
validated.tool_call_loop_guard = validGuard;
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
else {
|
|
943
|
+
errors.push("tool_call_loop_guard must be an object");
|
|
944
|
+
}
|
|
945
|
+
}
|
|
804
946
|
// ─── Context Mode (gsd_exec sandbox) ────────────────────────────────────
|
|
805
947
|
if (preferences.context_mode !== undefined) {
|
|
806
948
|
if (typeof preferences.context_mode === "object" && preferences.context_mode !== null) {
|
|
@@ -968,13 +1110,9 @@ export function validatePreferences(preferences) {
|
|
|
968
1110
|
errors.push('reactive_execution.isolation_mode must be "same-tree"');
|
|
969
1111
|
}
|
|
970
1112
|
}
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
}
|
|
975
|
-
else {
|
|
976
|
-
errors.push("reactive_execution.subagent_model must be a non-empty string");
|
|
977
|
-
}
|
|
1113
|
+
const subagentModel = sanitizeModelField(re.subagent_model, "reactive_execution.subagent_model", errors, warnings);
|
|
1114
|
+
if (subagentModel !== undefined) {
|
|
1115
|
+
validRe.subagent_model = subagentModel;
|
|
978
1116
|
}
|
|
979
1117
|
const knownReKeys = new Set(["enabled", "max_parallel", "isolation_mode", "subagent_model"]);
|
|
980
1118
|
for (const key of Object.keys(re)) {
|
|
@@ -822,6 +822,26 @@ export function renderPreferencesForSystemPrompt(preferences, resolutions, optio
|
|
|
822
822
|
}
|
|
823
823
|
return lines.join("\n");
|
|
824
824
|
}
|
|
825
|
+
/**
|
|
826
|
+
* Render a compact response-language directive for injection into dispatched
|
|
827
|
+
* prompt *content* (discuss/QA and auto-execution unit prompts).
|
|
828
|
+
*
|
|
829
|
+
* The main session's system prompt already carries the full GSD Skill
|
|
830
|
+
* Preferences block (including language) via `before_agent_start`, but
|
|
831
|
+
* discuss/QA turns and auto-execution units are dispatched as separate
|
|
832
|
+
* turns/sessions whose prompts are assembled here — without that block — so the
|
|
833
|
+
* configured language never reaches them (#1210). Injecting this directive into
|
|
834
|
+
* the dispatched prompt content makes the `language` preference effective across
|
|
835
|
+
* both guided and auto workflows.
|
|
836
|
+
*
|
|
837
|
+
* Returns "" when no language is configured.
|
|
838
|
+
*/
|
|
839
|
+
export function renderLanguageDirectiveForPrompt(preferences) {
|
|
840
|
+
if (!preferences?.language)
|
|
841
|
+
return "";
|
|
842
|
+
const safeLang = preferences.language.replace(/[\r\n]/g, " ").slice(0, 50);
|
|
843
|
+
return `## Response Language\n\nAlways respond in ${safeLang} — questions, explanations, and summaries.`;
|
|
844
|
+
}
|
|
825
845
|
// ─── Hook Resolution ──────────────────────────────────────────────────────────
|
|
826
846
|
/**
|
|
827
847
|
* Resolve enabled post-unit hooks from effective preferences.
|
|
@@ -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
|
|
@@ -13,7 +13,7 @@ import { isAbsolute, join, relative, resolve } from "node:path";
|
|
|
13
13
|
import { QUICK_BRANCH_RE } from "./branch-patterns.js";
|
|
14
14
|
import { loadPrompt } from "./prompt-loader.js";
|
|
15
15
|
import { gsdRoot } from "./paths.js";
|
|
16
|
-
import { GitServiceImpl, runGit } from "./git-service.js";
|
|
16
|
+
import { GitServiceImpl, runGit, taskBranchArgs } from "./git-service.js";
|
|
17
17
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
18
18
|
import { nativeBranchExists, nativeDetectMainBranch, nativeDiffNumstat } from "./native-git-bridge.js";
|
|
19
19
|
import { nativeHasStagedChanges } from "./native-git-bridge.js";
|
|
@@ -317,6 +317,7 @@ export async function handleQuick(args, ctx, pi) {
|
|
|
317
317
|
const git = new GitServiceImpl(basePath, gitPrefs);
|
|
318
318
|
const branchName = `gsd/quick/${taskNum}-${slug}`;
|
|
319
319
|
let originalBranch = git.getCurrentBranch();
|
|
320
|
+
let returnBranch = originalBranch;
|
|
320
321
|
const { getIsolationMode } = await import("./preferences.js");
|
|
321
322
|
const usesBranch = getIsolationMode() !== "none" && isGitOpsEnabled();
|
|
322
323
|
let branchCreated = false;
|
|
@@ -331,7 +332,15 @@ export async function handleQuick(args, ctx, pi) {
|
|
|
331
332
|
}
|
|
332
333
|
}
|
|
333
334
|
catch { /* nothing to commit — fine */ }
|
|
334
|
-
|
|
335
|
+
const branchArgs = taskBranchArgs(basePath, branchName, current, git.getMainBranch());
|
|
336
|
+
const startPoint = branchArgs[3];
|
|
337
|
+
// When the quick branch is redirected off a stale task branch, the
|
|
338
|
+
// squash-merge on closeout must return to the same base — merging a
|
|
339
|
+
// base-branch-rooted quick branch back into the stale task branch
|
|
340
|
+
// would drag the base's newer history into it.
|
|
341
|
+
if (startPoint)
|
|
342
|
+
returnBranch = startPoint;
|
|
343
|
+
runGit(basePath, branchArgs);
|
|
335
344
|
branchCreated = true;
|
|
336
345
|
}
|
|
337
346
|
}
|
|
@@ -345,7 +354,7 @@ export async function handleQuick(args, ctx, pi) {
|
|
|
345
354
|
if (actualBranch === branchName && originalBranch !== branchName) {
|
|
346
355
|
persistPendingReturn({
|
|
347
356
|
basePath,
|
|
348
|
-
originalBranch,
|
|
357
|
+
originalBranch: returnBranch,
|
|
349
358
|
quickBranch: branchName,
|
|
350
359
|
taskNum,
|
|
351
360
|
slug,
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Persist a reopened task's failure diagnosis and inject it into the re-dispatched execute-task prompt.
|
|
3
|
+
// GSD Extension — follow-up to #1225 (#1272)
|
|
4
|
+
//
|
|
5
|
+
// When complete-slice's gate reopens a task via gsd_task_reopen, the operator
|
|
6
|
+
// supplies a `reason` explaining exactly what the full-suite gate caught and
|
|
7
|
+
// how to fix it. That reason previously only landed in the workflow event log
|
|
8
|
+
// (audit trail) and never reached the re-dispatched executor, so the executor
|
|
9
|
+
// re-ran the original (green) verify and re-completed the task without touching
|
|
10
|
+
// the regression. This module is the "inject unresolved context into the next
|
|
11
|
+
// dispatch" mechanism for reopen reasons — a lightweight, file-based sibling of
|
|
12
|
+
// escalation.js#claimOverrideForInjection, keyed by (milestone, slice, task).
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { legacyMilestonesDir, resolveSlicePath, resolveTasksDir } from "./paths.js";
|
|
16
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
17
|
+
import { logWarning } from "./workflow-logger.js";
|
|
18
|
+
/**
|
|
19
|
+
* Canonical reopen-reason artifact path, parallel to T##-SUMMARY.md and
|
|
20
|
+
* T##-ESCALATION.json:
|
|
21
|
+
* .gsd/milestones/{M}/slices/{S}/tasks/{T}-REOPEN.json
|
|
22
|
+
* Flat-phase: the artifact sits directly in the phase dir. Legacy layouts
|
|
23
|
+
* without a tasks/ subdir return null (caller degrades gracefully).
|
|
24
|
+
*/
|
|
25
|
+
export function reopenReasonArtifactPath(basePath, milestoneId, sliceId, taskId) {
|
|
26
|
+
const tDir = resolveTasksDir(basePath, milestoneId, sliceId);
|
|
27
|
+
if (tDir)
|
|
28
|
+
return join(tDir, `${taskId}-REOPEN.json`);
|
|
29
|
+
if (existsSync(legacyMilestonesDir(basePath)))
|
|
30
|
+
return null;
|
|
31
|
+
const phaseDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
32
|
+
if (!phaseDir)
|
|
33
|
+
return null;
|
|
34
|
+
return join(phaseDir, `${taskId}-REOPEN.json`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Persist the reopen reason so the next execute-task dispatch can surface it.
|
|
38
|
+
* A no-op when the reason is empty or the artifact path cannot be resolved —
|
|
39
|
+
* reopen itself must still succeed even if we cannot attach context.
|
|
40
|
+
*/
|
|
41
|
+
export function writeReopenReason(basePath, milestoneId, sliceId, taskId, reason) {
|
|
42
|
+
const trimmed = reason.trim();
|
|
43
|
+
if (!trimmed)
|
|
44
|
+
return;
|
|
45
|
+
const path = reopenReasonArtifactPath(basePath, milestoneId, sliceId, taskId);
|
|
46
|
+
if (!path) {
|
|
47
|
+
logWarning("tool", `reopen-reason: cannot resolve artifact path for ${milestoneId}/${sliceId}/${taskId}; reopen reason not attached to next dispatch`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const artifact = {
|
|
51
|
+
version: 1,
|
|
52
|
+
milestoneId, sliceId, taskId,
|
|
53
|
+
reason: trimmed,
|
|
54
|
+
createdAt: new Date().toISOString(),
|
|
55
|
+
};
|
|
56
|
+
mkdirSync(join(path, ".."), { recursive: true });
|
|
57
|
+
atomicWriteSync(path, JSON.stringify(artifact, null, 2));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* If a reopen reason is pending for this task, claim it (one-shot: the artifact
|
|
61
|
+
* is deleted on read) and return the markdown block to prepend to the executor's
|
|
62
|
+
* prompt. Returns null when nothing is pending or the artifact is malformed.
|
|
63
|
+
*/
|
|
64
|
+
export function claimReopenReasonForInjection(basePath, milestoneId, sliceId, taskId) {
|
|
65
|
+
const path = reopenReasonArtifactPath(basePath, milestoneId, sliceId, taskId);
|
|
66
|
+
if (!path || !existsSync(path))
|
|
67
|
+
return null;
|
|
68
|
+
let art = null;
|
|
69
|
+
try {
|
|
70
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
71
|
+
if (parsed && parsed.version === 1 && typeof parsed.reason === "string" && parsed.reason.trim()) {
|
|
72
|
+
art = parsed;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
art = null;
|
|
77
|
+
}
|
|
78
|
+
// Claim (delete) regardless of validity so a malformed artifact doesn't
|
|
79
|
+
// wedge every future dispatch of this task.
|
|
80
|
+
try {
|
|
81
|
+
unlinkSync(path);
|
|
82
|
+
}
|
|
83
|
+
catch { /* already gone */ }
|
|
84
|
+
if (!art)
|
|
85
|
+
return null;
|
|
86
|
+
return { injectionBlock: formatReopenReasonBlock(art) };
|
|
87
|
+
}
|
|
88
|
+
function formatReopenReasonBlock(art) {
|
|
89
|
+
return [
|
|
90
|
+
`## Reopened — Reason (from ${art.taskId})`,
|
|
91
|
+
"",
|
|
92
|
+
"This task was previously marked complete but a downstream gate (e.g. complete-slice's full-suite run) reopened it. The verify command in your task plan passed in isolation — it did **not** catch the regression below. Do **not** call `gsd_task_complete` until you have reproduced and fixed exactly what this diagnosis describes, then re-run the specific failing command it names (not just the original scoped verify).",
|
|
93
|
+
"",
|
|
94
|
+
"**Diagnosis / fix instructions from the gate:**",
|
|
95
|
+
"",
|
|
96
|
+
art.reason.trim(),
|
|
97
|
+
].join("\n");
|
|
98
|
+
}
|