@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
|
@@ -0,0 +1,109 @@
|
|
|
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
|
+
|
|
14
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
|
|
17
|
+
import { legacyMilestonesDir, resolveSlicePath, resolveTasksDir } from "./paths.js";
|
|
18
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
19
|
+
import { logWarning } from "./workflow-logger.js";
|
|
20
|
+
|
|
21
|
+
interface ReopenReasonArtifact {
|
|
22
|
+
version: 1;
|
|
23
|
+
milestoneId: string;
|
|
24
|
+
sliceId: string;
|
|
25
|
+
taskId: string;
|
|
26
|
+
reason: string;
|
|
27
|
+
createdAt: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Canonical reopen-reason artifact path, parallel to T##-SUMMARY.md and
|
|
32
|
+
* T##-ESCALATION.json:
|
|
33
|
+
* .gsd/milestones/{M}/slices/{S}/tasks/{T}-REOPEN.json
|
|
34
|
+
* Flat-phase: the artifact sits directly in the phase dir. Legacy layouts
|
|
35
|
+
* without a tasks/ subdir return null (caller degrades gracefully).
|
|
36
|
+
*/
|
|
37
|
+
export function reopenReasonArtifactPath(
|
|
38
|
+
basePath: string, milestoneId: string, sliceId: string, taskId: string,
|
|
39
|
+
): string | null {
|
|
40
|
+
const tDir = resolveTasksDir(basePath, milestoneId, sliceId);
|
|
41
|
+
if (tDir) return join(tDir, `${taskId}-REOPEN.json`);
|
|
42
|
+
if (existsSync(legacyMilestonesDir(basePath))) return null;
|
|
43
|
+
const phaseDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
44
|
+
if (!phaseDir) return null;
|
|
45
|
+
return join(phaseDir, `${taskId}-REOPEN.json`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Persist the reopen reason so the next execute-task dispatch can surface it.
|
|
50
|
+
* A no-op when the reason is empty or the artifact path cannot be resolved —
|
|
51
|
+
* reopen itself must still succeed even if we cannot attach context.
|
|
52
|
+
*/
|
|
53
|
+
export function writeReopenReason(
|
|
54
|
+
basePath: string, milestoneId: string, sliceId: string, taskId: string, reason: string,
|
|
55
|
+
): void {
|
|
56
|
+
const trimmed = reason.trim();
|
|
57
|
+
if (!trimmed) return;
|
|
58
|
+
const path = reopenReasonArtifactPath(basePath, milestoneId, sliceId, taskId);
|
|
59
|
+
if (!path) {
|
|
60
|
+
logWarning("tool", `reopen-reason: cannot resolve artifact path for ${milestoneId}/${sliceId}/${taskId}; reopen reason not attached to next dispatch`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const artifact: ReopenReasonArtifact = {
|
|
64
|
+
version: 1,
|
|
65
|
+
milestoneId, sliceId, taskId,
|
|
66
|
+
reason: trimmed,
|
|
67
|
+
createdAt: new Date().toISOString(),
|
|
68
|
+
};
|
|
69
|
+
mkdirSync(join(path, ".."), { recursive: true });
|
|
70
|
+
atomicWriteSync(path, JSON.stringify(artifact, null, 2));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* If a reopen reason is pending for this task, claim it (one-shot: the artifact
|
|
75
|
+
* is deleted on read) and return the markdown block to prepend to the executor's
|
|
76
|
+
* prompt. Returns null when nothing is pending or the artifact is malformed.
|
|
77
|
+
*/
|
|
78
|
+
export function claimReopenReasonForInjection(
|
|
79
|
+
basePath: string, milestoneId: string, sliceId: string, taskId: string,
|
|
80
|
+
): { injectionBlock: string } | null {
|
|
81
|
+
const path = reopenReasonArtifactPath(basePath, milestoneId, sliceId, taskId);
|
|
82
|
+
if (!path || !existsSync(path)) return null;
|
|
83
|
+
let art: ReopenReasonArtifact | null = null;
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8")) as Partial<ReopenReasonArtifact>;
|
|
86
|
+
if (parsed && parsed.version === 1 && typeof parsed.reason === "string" && parsed.reason.trim()) {
|
|
87
|
+
art = parsed as ReopenReasonArtifact;
|
|
88
|
+
}
|
|
89
|
+
} catch {
|
|
90
|
+
art = null;
|
|
91
|
+
}
|
|
92
|
+
// Claim (delete) regardless of validity so a malformed artifact doesn't
|
|
93
|
+
// wedge every future dispatch of this task.
|
|
94
|
+
try { unlinkSync(path); } catch { /* already gone */ }
|
|
95
|
+
if (!art) return null;
|
|
96
|
+
return { injectionBlock: formatReopenReasonBlock(art) };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function formatReopenReasonBlock(art: ReopenReasonArtifact): string {
|
|
100
|
+
return [
|
|
101
|
+
`## Reopened — Reason (from ${art.taskId})`,
|
|
102
|
+
"",
|
|
103
|
+
"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).",
|
|
104
|
+
"",
|
|
105
|
+
"**Diagnosis / fix instructions from the gate:**",
|
|
106
|
+
"",
|
|
107
|
+
art.reason.trim(),
|
|
108
|
+
].join("\n");
|
|
109
|
+
}
|
|
@@ -22,8 +22,9 @@ import type {
|
|
|
22
22
|
} from "./types.js";
|
|
23
23
|
import { resolvePostUnitHooks, resolvePreDispatchHooks } from "./preferences.js";
|
|
24
24
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
25
|
-
import { join } from "node:path";
|
|
25
|
+
import { dirname, join } from "node:path";
|
|
26
26
|
import { parseUnitId } from "./unit-id.js";
|
|
27
|
+
import { resolveMilestonePath } from "./paths.js";
|
|
27
28
|
import { queryJournal, type JournalEntry } from "./journal.js";
|
|
28
29
|
import { readUnitRuntimeRecord, type UnitRuntimePhase } from "./unit-runtime.js";
|
|
29
30
|
import { extractFrontmatterVerdict } from "./verdict-parser.js";
|
|
@@ -32,13 +33,45 @@ import { extractFrontmatterVerdict } from "./verdict-parser.js";
|
|
|
32
33
|
|
|
33
34
|
export function resolveHookArtifactPath(basePath: string, unitId: string, artifactName: string): string {
|
|
34
35
|
const { milestone, slice, task } = parseUnitId(unitId);
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
|
|
37
|
+
// Prefer the active phase directory (flat-phase layout: .gsd/phases/<NN>-.../).
|
|
38
|
+
// Configured gate artifacts are canonical phase-level files (e.g.
|
|
39
|
+
// BROWSER-RUNTIME-EVIDENCE.md), so resolve the exact declared name first,
|
|
40
|
+
// then a task-prefixed variant for retry sentinels / rework briefs.
|
|
41
|
+
const candidates: string[] = [];
|
|
42
|
+
const phaseDir = resolveMilestonePath(basePath, milestone);
|
|
43
|
+
const isFlatPhaseDir = phaseDir !== null
|
|
44
|
+
&& !(dirname(phaseDir).endsWith("/milestones") || dirname(phaseDir).endsWith("\\milestones"));
|
|
45
|
+
if (isFlatPhaseDir) {
|
|
46
|
+
candidates.push(join(phaseDir, artifactName));
|
|
47
|
+
if (task !== undefined) {
|
|
48
|
+
candidates.push(join(phaseDir, `${task}-${artifactName}`));
|
|
49
|
+
}
|
|
37
50
|
}
|
|
38
|
-
|
|
39
|
-
|
|
51
|
+
|
|
52
|
+
// Legacy nested layout fallbacks (.gsd/milestones/<M>/slices/<S>/tasks/...).
|
|
53
|
+
const legacyBase = join(basePath, ".gsd", "milestones", milestone);
|
|
54
|
+
let legacyDefault: string;
|
|
55
|
+
if (task !== undefined && slice !== undefined) {
|
|
56
|
+
legacyDefault = join(legacyBase, "slices", slice, "tasks", `${task}-${artifactName}`);
|
|
57
|
+
candidates.push(legacyDefault);
|
|
58
|
+
candidates.push(join(legacyBase, "slices", slice, "tasks", artifactName));
|
|
59
|
+
candidates.push(join(legacyBase, "slices", slice, artifactName));
|
|
60
|
+
} else if (slice !== undefined) {
|
|
61
|
+
legacyDefault = join(legacyBase, "slices", slice, artifactName);
|
|
62
|
+
candidates.push(legacyDefault);
|
|
63
|
+
} else {
|
|
64
|
+
legacyDefault = join(legacyBase, artifactName);
|
|
40
65
|
}
|
|
41
|
-
|
|
66
|
+
candidates.push(join(legacyBase, artifactName));
|
|
67
|
+
|
|
68
|
+
const existing = candidates.find((candidate) => existsSync(candidate));
|
|
69
|
+
if (existing) return existing;
|
|
70
|
+
|
|
71
|
+
// Nothing on disk yet: prefer the active phase path when the phase dir is
|
|
72
|
+
// known, otherwise fall back to the legacy default (preserves pre-flat-phase
|
|
73
|
+
// behavior for missing-artifact diagnostics).
|
|
74
|
+
return isFlatPhaseDir ? join(phaseDir!, artifactName) : legacyDefault;
|
|
42
75
|
}
|
|
43
76
|
|
|
44
77
|
// ─── Dispatch Rule Conversion ──────────────────────────────────────────────
|
|
@@ -126,6 +159,13 @@ export class RuleRegistry {
|
|
|
126
159
|
forceRun?: boolean;
|
|
127
160
|
}> = [];
|
|
128
161
|
cycleCounts: Map<string, number> = new Map();
|
|
162
|
+
/**
|
|
163
|
+
* Cycle keys that have already been granted a one-shot re-dispatch after a
|
|
164
|
+
* lost/interrupted dispatch (hook charged a cycle but never produced its own
|
|
165
|
+
* unit-end). Bounds the dispatch-cycle refund to exactly one per gate so a
|
|
166
|
+
* hook that repeatedly fails to complete cannot loop forever.
|
|
167
|
+
*/
|
|
168
|
+
redispatchedGateKeys: Set<string> = new Set();
|
|
129
169
|
retryPending: boolean = false;
|
|
130
170
|
retryTrigger: { unitType: string; unitId: string; retryArtifact?: string } | null = null;
|
|
131
171
|
hookFailure: HookFailureState | null = null;
|
|
@@ -364,6 +404,14 @@ export class RuleRegistry {
|
|
|
364
404
|
pendingRetry: false,
|
|
365
405
|
};
|
|
366
406
|
|
|
407
|
+
return this._buildHookDispatch(config, triggerUnitId);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** Construct the sidecar dispatch for a hook without mutating registry state. */
|
|
411
|
+
private _buildHookDispatch(
|
|
412
|
+
config: PostUnitHookConfig,
|
|
413
|
+
triggerUnitId: string,
|
|
414
|
+
): HookDispatchResult {
|
|
367
415
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(triggerUnitId);
|
|
368
416
|
let prompt = config.prompt
|
|
369
417
|
.replace(/\{milestoneId\}/g, mid ?? "")
|
|
@@ -375,12 +423,29 @@ export class RuleRegistry {
|
|
|
375
423
|
return {
|
|
376
424
|
hookName: config.name,
|
|
377
425
|
prompt,
|
|
378
|
-
|
|
426
|
+
// Model selection (including fallbacks[]) is handled by
|
|
427
|
+
// resolveModelWithFallbacksForUnit for the `hook/<name>` unit type (#1229).
|
|
379
428
|
unitType: `hook/${config.name}`,
|
|
380
429
|
unitId: triggerUnitId,
|
|
381
430
|
};
|
|
382
431
|
}
|
|
383
432
|
|
|
433
|
+
/**
|
|
434
|
+
* Reconstruct the in-flight hook's dispatch from the restored `activeHook`
|
|
435
|
+
* state, without mutating the registry. Used to reconcile a persisted
|
|
436
|
+
* `activeHook` whose session-local dispatch was lost across a pause/resume
|
|
437
|
+
* or crash-recovery, so the hook actually runs instead of being charged
|
|
438
|
+
* against the next unrelated unit's close-out (#1246).
|
|
439
|
+
*/
|
|
440
|
+
getPendingHookDispatch(basePath: string): HookDispatchResult | null {
|
|
441
|
+
if (!this.activeHook) return null;
|
|
442
|
+
const config = resolvePostUnitHooks(basePath).find(
|
|
443
|
+
h => h.name === this.activeHook!.hookName,
|
|
444
|
+
);
|
|
445
|
+
if (!config) return null;
|
|
446
|
+
return this._buildHookDispatch(config, this.activeHook.triggerUnitId);
|
|
447
|
+
}
|
|
448
|
+
|
|
384
449
|
private _assessHookCompletion(
|
|
385
450
|
basePath: string,
|
|
386
451
|
hook: HookExecutionState,
|
|
@@ -503,6 +568,30 @@ export class RuleRegistry {
|
|
|
503
568
|
observedCleanExecution: boolean,
|
|
504
569
|
): HookDispatchResult | null {
|
|
505
570
|
if (!observedCleanExecution) {
|
|
571
|
+
// The hook was charged a cycle at dispatch but never produced its own
|
|
572
|
+
// unit-end — its dispatch was lost/interrupted (pause/resume, crash
|
|
573
|
+
// recovery). Refund that dispatch-consumed cycle exactly once so the gate
|
|
574
|
+
// is re-dispatched at least once instead of hard-blocking on a hook that
|
|
575
|
+
// never actually ran.
|
|
576
|
+
//
|
|
577
|
+
// This refund is intentionally UNCONDITIONAL on the first lost dispatch —
|
|
578
|
+
// it must NOT be gated on `currentCycle >= max_cycles`. A lost dispatch is
|
|
579
|
+
// a non-run: charging its cycle at dispatch time must not consume the
|
|
580
|
+
// hook's real-run budget. Gating the refund on "budget already exhausted"
|
|
581
|
+
// lets a lost dispatch below max_cycles silently eat a genuine cycle, so
|
|
582
|
+
// the hook gets one fewer real run than configured — reintroducing #1244
|
|
583
|
+
// for max_cycles >= 2 (see the "does not steal a real-run cycle" test).
|
|
584
|
+
// The redispatchedGateKeys flag bounds this to a single refund per gate,
|
|
585
|
+
// so repeated lost dispatches still terminate (total dispatches never
|
|
586
|
+
// exceed max_cycles + 1) and a hook that keeps failing blocks normally.
|
|
587
|
+
const cycleKey = hookCycleKey(config, hook);
|
|
588
|
+
if (!this.redispatchedGateKeys.has(cycleKey)) {
|
|
589
|
+
this.redispatchedGateKeys.add(cycleKey);
|
|
590
|
+
const currentCycle = this.cycleCounts.get(cycleKey);
|
|
591
|
+
if (typeof currentCycle === "number" && currentCycle > 0) {
|
|
592
|
+
this.cycleCounts.set(cycleKey, currentCycle - 1);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
506
595
|
return this._rerunGateOrBlock(config, hook, basePath, {
|
|
507
596
|
reason: `hook/${config.name} did not complete cleanly before the trigger unit resumed`,
|
|
508
597
|
});
|
|
@@ -839,6 +928,7 @@ export class RuleRegistry {
|
|
|
839
928
|
this.activeHook = null;
|
|
840
929
|
this.hookQueue = [];
|
|
841
930
|
this.cycleCounts.clear();
|
|
931
|
+
this.redispatchedGateKeys.clear();
|
|
842
932
|
this.retryPending = false;
|
|
843
933
|
this.retryTrigger = null;
|
|
844
934
|
this.hookFailure = null;
|
|
@@ -855,6 +945,7 @@ export class RuleRegistry {
|
|
|
855
945
|
persistState(basePath: string): void {
|
|
856
946
|
const state: PersistedHookState = {
|
|
857
947
|
cycleCounts: Object.fromEntries(this.cycleCounts),
|
|
948
|
+
redispatchedGateKeys: Array.from(this.redispatchedGateKeys),
|
|
858
949
|
activeHook: this.activeHook ? { ...this.activeHook } : null,
|
|
859
950
|
hookQueue: this.hookQueue.map(entry => ({
|
|
860
951
|
hookName: entry.config.name,
|
|
@@ -888,6 +979,14 @@ export class RuleRegistry {
|
|
|
888
979
|
}
|
|
889
980
|
}
|
|
890
981
|
}
|
|
982
|
+
this.redispatchedGateKeys.clear();
|
|
983
|
+
if (Array.isArray(state.redispatchedGateKeys)) {
|
|
984
|
+
for (const key of state.redispatchedGateKeys) {
|
|
985
|
+
if (typeof key === "string") {
|
|
986
|
+
this.redispatchedGateKeys.add(key);
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
}
|
|
891
990
|
this.activeHook = state.activeHook && typeof state.activeHook === "object"
|
|
892
991
|
? { ...state.activeHook }
|
|
893
992
|
: null;
|
|
@@ -918,7 +1017,7 @@ export class RuleRegistry {
|
|
|
918
1017
|
if (existsSync(filePath)) {
|
|
919
1018
|
writeFileSync(
|
|
920
1019
|
filePath,
|
|
921
|
-
JSON.stringify({ cycleCounts: {}, activeHook: null, hookQueue: [], savedAt: new Date().toISOString() }, null, 2),
|
|
1020
|
+
JSON.stringify({ cycleCounts: {}, redispatchedGateKeys: [], activeHook: null, hookQueue: [], savedAt: new Date().toISOString() }, null, 2),
|
|
922
1021
|
"utf-8",
|
|
923
1022
|
);
|
|
924
1023
|
}
|
|
@@ -1014,7 +1113,10 @@ export class RuleRegistry {
|
|
|
1014
1113
|
return {
|
|
1015
1114
|
hookName: hook.name,
|
|
1016
1115
|
prompt,
|
|
1017
|
-
|
|
1116
|
+
// Model selection (including fallbacks[]) is resolved by dispatchHookUnit
|
|
1117
|
+
// via resolveModelWithFallbacksForUnit for the `hook/<name>` unit type,
|
|
1118
|
+
// matching the auto-mode path. Emitting the primary-only model here would
|
|
1119
|
+
// discard the configured fallback chain (#1229).
|
|
1018
1120
|
unitType: `hook/${hook.name}`,
|
|
1019
1121
|
unitId,
|
|
1020
1122
|
};
|
|
@@ -48,6 +48,11 @@ const PARALLEL_DIR = "parallel";
|
|
|
48
48
|
const STATUS_SUFFIX = ".status.json";
|
|
49
49
|
const SIGNAL_SUFFIX = ".signal.json";
|
|
50
50
|
const DEFAULT_STALE_TIMEOUT_MS = 30_000;
|
|
51
|
+
// How long a paused worker waits for the coordinator to lift the pause before
|
|
52
|
+
// it degrades to in-process serialization (#1273). Kept below the stale
|
|
53
|
+
// timeout so the wait never races the coordinator's liveness detection.
|
|
54
|
+
const DEFAULT_RESUME_WAIT_MS = 10_000;
|
|
55
|
+
const DEFAULT_RESUME_POLL_MS = 250;
|
|
51
56
|
|
|
52
57
|
function isSessionStatus(data: unknown): data is SessionStatus {
|
|
53
58
|
return data !== null && typeof data === "object" && "milestoneId" in data && "pid" in data;
|
|
@@ -143,6 +148,35 @@ export function consumeSignal(basePath: string, milestoneId: string): SignalMess
|
|
|
143
148
|
return msg;
|
|
144
149
|
}
|
|
145
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Wait for a coordinator to lift a `pause` on a worker by sending `resume`
|
|
153
|
+
* (or `stop`). Polls the signal file until one of those arrives or the timeout
|
|
154
|
+
* elapses. Intervening `pause`/`rebase` signals are consumed and ignored so a
|
|
155
|
+
* repeated pause doesn't reset the wait.
|
|
156
|
+
*
|
|
157
|
+
* A worker's `pause` is only ever lifted by the interactive/dashboard resumer;
|
|
158
|
+
* unattended `gsd headless auto` owns no resumer, so callers use the `"timeout"`
|
|
159
|
+
* result to degrade to in-process serialization instead of stranding the worker
|
|
160
|
+
* at a terminal pause it cannot resume (#1273).
|
|
161
|
+
*/
|
|
162
|
+
export async function awaitWorkerResume(
|
|
163
|
+
basePath: string,
|
|
164
|
+
milestoneId: string,
|
|
165
|
+
opts: { timeoutMs?: number; pollMs?: number } = {},
|
|
166
|
+
): Promise<"resume" | "stop" | "timeout"> {
|
|
167
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_RESUME_WAIT_MS;
|
|
168
|
+
const pollMs = opts.pollMs ?? DEFAULT_RESUME_POLL_MS;
|
|
169
|
+
const deadline = Date.now() + timeoutMs;
|
|
170
|
+
|
|
171
|
+
for (;;) {
|
|
172
|
+
const msg = consumeSignal(basePath, milestoneId);
|
|
173
|
+
if (msg?.signal === "resume") return "resume";
|
|
174
|
+
if (msg?.signal === "stop") return "stop";
|
|
175
|
+
if (Date.now() >= deadline) return "timeout";
|
|
176
|
+
await new Promise((resolve) => setTimeout(resolve, pollMs));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
146
180
|
// ─── Stale Detection ───────────────────────────────────────────────────────
|
|
147
181
|
|
|
148
182
|
/** Check whether a session is stale (PID dead or heartbeat timed out). */
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { existsSync, readdirSync, readFileSync, type Dirent } from "node:fs";
|
|
12
|
-
import { homedir } from "node:os";
|
|
13
12
|
import { join } from "node:path";
|
|
13
|
+
import { getSkillDirectories } from "@gsd/pi-coding-agent";
|
|
14
14
|
import { gsdHome } from "./gsd-home.js";
|
|
15
15
|
import { getInstalledSkills, normalizeSkillName } from "./skills.js";
|
|
16
16
|
|
|
@@ -20,28 +20,47 @@ export interface DiscoveredSkill {
|
|
|
20
20
|
location: string;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
/**
|
|
24
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Snapshot state. `searchDirs` is captured at snapshot time so every detection
|
|
25
|
+
* pass during the session scans the same project + user dirs (the bug fix:
|
|
26
|
+
* previously only user dirs were scanned, so skills installed into the project
|
|
27
|
+
* mid-session were silently missed).
|
|
28
|
+
*/
|
|
29
|
+
interface SkillSnapshotState {
|
|
30
|
+
baselineNames: Set<string>;
|
|
31
|
+
searchDirs: string[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let snapshot: SkillSnapshotState | null = null;
|
|
25
35
|
|
|
26
36
|
/**
|
|
27
37
|
* Snapshot the current installed skill catalog. Call at auto-mode start.
|
|
38
|
+
* `cwd` is the project base path; skills dropped into `<cwd>/.agents/skills/`,
|
|
39
|
+
* `<cwd>/.claude/skills/`, or `<cwd>/.gsd/skills/` mid-session are detected.
|
|
28
40
|
*/
|
|
29
|
-
export function snapshotSkills(): void {
|
|
30
|
-
|
|
41
|
+
export function snapshotSkills(options?: { cwd?: string }): void {
|
|
42
|
+
const searchDirs = getSkillDirectories({
|
|
43
|
+
cwd: options?.cwd ?? process.cwd(),
|
|
44
|
+
gsdHome: gsdHome(),
|
|
45
|
+
}).map((entry) => entry.path);
|
|
46
|
+
snapshot = {
|
|
47
|
+
baselineNames: snapshotCurrentSkillNames(searchDirs),
|
|
48
|
+
searchDirs,
|
|
49
|
+
};
|
|
31
50
|
}
|
|
32
51
|
|
|
33
52
|
/**
|
|
34
53
|
* Clear the snapshot. Call when auto-mode stops.
|
|
35
54
|
*/
|
|
36
55
|
export function clearSkillSnapshot(): void {
|
|
37
|
-
|
|
56
|
+
snapshot = null;
|
|
38
57
|
}
|
|
39
58
|
|
|
40
59
|
/**
|
|
41
60
|
* Check if a snapshot is active (auto-mode is running with discovery).
|
|
42
61
|
*/
|
|
43
62
|
export function hasSkillSnapshot(): boolean {
|
|
44
|
-
return
|
|
63
|
+
return snapshot !== null;
|
|
45
64
|
}
|
|
46
65
|
|
|
47
66
|
/**
|
|
@@ -49,12 +68,12 @@ export function hasSkillSnapshot(): boolean {
|
|
|
49
68
|
* Returns skill metadata for any new skills found in the loader catalog or on disk.
|
|
50
69
|
*/
|
|
51
70
|
export function detectNewSkills(): DiscoveredSkill[] {
|
|
52
|
-
if (!
|
|
71
|
+
if (!snapshot) return [];
|
|
53
72
|
|
|
54
73
|
const newSkills: DiscoveredSkill[] = [];
|
|
55
|
-
for (const skill of getCurrentSkillsForDiscovery()) {
|
|
74
|
+
for (const skill of getCurrentSkillsForDiscovery(snapshot.searchDirs)) {
|
|
56
75
|
const normalized = normalizeSkillName(skill.name);
|
|
57
|
-
if (
|
|
76
|
+
if (snapshot.baselineNames.has(normalized)) continue;
|
|
58
77
|
newSkills.push(skill);
|
|
59
78
|
}
|
|
60
79
|
|
|
@@ -84,7 +103,13 @@ export async function refreshCatalogForNewSkills(options?: {
|
|
|
84
103
|
}
|
|
85
104
|
}
|
|
86
105
|
|
|
87
|
-
|
|
106
|
+
// Re-snapshot, preserving the search dirs captured at auto-mode start.
|
|
107
|
+
if (snapshot) {
|
|
108
|
+
snapshot = {
|
|
109
|
+
baselineNames: snapshotCurrentSkillNames(),
|
|
110
|
+
searchDirs: snapshot.searchDirs,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
88
113
|
const names = newSkills.map((skill) => skill.name).join(", ");
|
|
89
114
|
options?.notify?.(`GSD: loaded new skills: ${names}`, "info");
|
|
90
115
|
return newSkills;
|
|
@@ -132,19 +157,18 @@ function escapeXml(value: string): string {
|
|
|
132
157
|
});
|
|
133
158
|
}
|
|
134
159
|
|
|
135
|
-
function
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
];
|
|
160
|
+
function snapshotCurrentSkillNames(searchDirsOverride?: string[]): Set<string> {
|
|
161
|
+
// Uses explicit dirs, the snapshot's search dirs when active, or user-only dirs
|
|
162
|
+
// (no project context) when called before a snapshot is taken.
|
|
163
|
+
const searchDirs = searchDirsOverride ?? snapshot?.searchDirs ?? defaultSearchDirs();
|
|
164
|
+
return new Set(getCurrentSkillsForDiscovery(searchDirs).map(skill => normalizeSkillName(skill.name)));
|
|
141
165
|
}
|
|
142
166
|
|
|
143
|
-
function
|
|
144
|
-
return
|
|
167
|
+
function defaultSearchDirs(): string[] {
|
|
168
|
+
return getSkillDirectories({ cwd: process.cwd(), gsdHome: gsdHome() }).map((entry) => entry.path);
|
|
145
169
|
}
|
|
146
170
|
|
|
147
|
-
function getCurrentSkillsForDiscovery(): DiscoveredSkill[] {
|
|
171
|
+
function getCurrentSkillsForDiscovery(searchDirs: string[]): DiscoveredSkill[] {
|
|
148
172
|
const skills = new Map<string, DiscoveredSkill>();
|
|
149
173
|
for (const skill of getInstalledSkills()) {
|
|
150
174
|
const normalized = normalizeSkillName(skill.name);
|
|
@@ -155,7 +179,7 @@ function getCurrentSkillsForDiscovery(): DiscoveredSkill[] {
|
|
|
155
179
|
});
|
|
156
180
|
}
|
|
157
181
|
|
|
158
|
-
for (const skill of getDiskSkills()) {
|
|
182
|
+
for (const skill of getDiskSkills(searchDirs)) {
|
|
159
183
|
const normalized = normalizeSkillName(skill.name);
|
|
160
184
|
if (!skills.has(normalized)) skills.set(normalized, skill);
|
|
161
185
|
}
|
|
@@ -163,9 +187,9 @@ function getCurrentSkillsForDiscovery(): DiscoveredSkill[] {
|
|
|
163
187
|
return [...skills.values()];
|
|
164
188
|
}
|
|
165
189
|
|
|
166
|
-
function getDiskSkills(): DiscoveredSkill[] {
|
|
190
|
+
function getDiskSkills(searchDirs: string[]): DiscoveredSkill[] {
|
|
167
191
|
const skills = new Map<string, DiscoveredSkill>();
|
|
168
|
-
for (const dir of
|
|
192
|
+
for (const dir of searchDirs) {
|
|
169
193
|
if (!existsSync(dir)) continue;
|
|
170
194
|
let entries: Dirent[];
|
|
171
195
|
try {
|
|
@@ -30,7 +30,9 @@ import { isAbsolute, join, dirname, resolve } from "node:path";
|
|
|
30
30
|
import { fileURLToPath } from "node:url";
|
|
31
31
|
import { gsdRoot } from "./paths.js";
|
|
32
32
|
import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager.js";
|
|
33
|
-
import { autoWorktreeBranch
|
|
33
|
+
import { autoWorktreeBranch } from "./auto-worktree-branch-lifecycle.js";
|
|
34
|
+
import { syncGsdStateToWorktreeByScope } from "./auto-worktree-sync.js";
|
|
35
|
+
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
34
36
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
35
37
|
import {
|
|
36
38
|
writeSessionStatus,
|