@opengsd/gsd-pi 1.5.0 → 1.6.0
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 +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +29 -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 +106 -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/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/rule-registry.js +106 -10
- 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 +13 -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 +29 -0
- 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 +9 -9
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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.nft.json +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/resize/route.js.nft.json +1 -1
- 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/captures/route.js.nft.json +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/doctor/route.js.nft.json +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/files/route.js.nft.json +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/git/route.js.nft.json +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/hooks/route.js.nft.json +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/knowledge/route.js.nft.json +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/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +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/projects/route.js.nft.json +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/session/browser/route.js.nft.json +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/events/route.js.nft.json +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/settings-data/route.js.nft.json +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/skill-health/route.js.nft.json +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/switch-root/route.js.nft.json +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/stream/route.js.nft.json +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/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- 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/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +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/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 +4 -4
- 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/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 +25 -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 +4 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +53 -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 +114 -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/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/rule-registry.ts +111 -9
- 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/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-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/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 +13 -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 +29 -0
- 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/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{bCg3aYrFN1DKZr2dqgE7L → 6xYMOzxVhsQgryneJ5KRc}/_ssgManifest.js +0 -0
|
@@ -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,
|
|
@@ -8,21 +8,53 @@
|
|
|
8
8
|
import { logWarning } from "./workflow-logger.js";
|
|
9
9
|
import { resolvePostUnitHooks, resolvePreDispatchHooks } from "./preferences.js";
|
|
10
10
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
11
|
+
import { dirname, join } from "node:path";
|
|
12
12
|
import { parseUnitId } from "./unit-id.js";
|
|
13
|
+
import { resolveMilestonePath } from "./paths.js";
|
|
13
14
|
import { queryJournal } from "./journal.js";
|
|
14
15
|
import { readUnitRuntimeRecord } from "./unit-runtime.js";
|
|
15
16
|
import { extractFrontmatterVerdict } from "./verdict-parser.js";
|
|
16
17
|
// ─── Artifact Path Resolution ──────────────────────────────────────────────
|
|
17
18
|
export function resolveHookArtifactPath(basePath, unitId, artifactName) {
|
|
18
19
|
const { milestone, slice, task } = parseUnitId(unitId);
|
|
20
|
+
// Prefer the active phase directory (flat-phase layout: .gsd/phases/<NN>-.../).
|
|
21
|
+
// Configured gate artifacts are canonical phase-level files (e.g.
|
|
22
|
+
// BROWSER-RUNTIME-EVIDENCE.md), so resolve the exact declared name first,
|
|
23
|
+
// then a task-prefixed variant for retry sentinels / rework briefs.
|
|
24
|
+
const candidates = [];
|
|
25
|
+
const phaseDir = resolveMilestonePath(basePath, milestone);
|
|
26
|
+
const isFlatPhaseDir = phaseDir !== null
|
|
27
|
+
&& !(dirname(phaseDir).endsWith("/milestones") || dirname(phaseDir).endsWith("\\milestones"));
|
|
28
|
+
if (isFlatPhaseDir) {
|
|
29
|
+
candidates.push(join(phaseDir, artifactName));
|
|
30
|
+
if (task !== undefined) {
|
|
31
|
+
candidates.push(join(phaseDir, `${task}-${artifactName}`));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Legacy nested layout fallbacks (.gsd/milestones/<M>/slices/<S>/tasks/...).
|
|
35
|
+
const legacyBase = join(basePath, ".gsd", "milestones", milestone);
|
|
36
|
+
let legacyDefault;
|
|
19
37
|
if (task !== undefined && slice !== undefined) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
38
|
+
legacyDefault = join(legacyBase, "slices", slice, "tasks", `${task}-${artifactName}`);
|
|
39
|
+
candidates.push(legacyDefault);
|
|
40
|
+
candidates.push(join(legacyBase, "slices", slice, "tasks", artifactName));
|
|
41
|
+
candidates.push(join(legacyBase, "slices", slice, artifactName));
|
|
42
|
+
}
|
|
43
|
+
else if (slice !== undefined) {
|
|
44
|
+
legacyDefault = join(legacyBase, "slices", slice, artifactName);
|
|
45
|
+
candidates.push(legacyDefault);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
legacyDefault = join(legacyBase, artifactName);
|
|
49
|
+
}
|
|
50
|
+
candidates.push(join(legacyBase, artifactName));
|
|
51
|
+
const existing = candidates.find((candidate) => existsSync(candidate));
|
|
52
|
+
if (existing)
|
|
53
|
+
return existing;
|
|
54
|
+
// Nothing on disk yet: prefer the active phase path when the phase dir is
|
|
55
|
+
// known, otherwise fall back to the legacy default (preserves pre-flat-phase
|
|
56
|
+
// behavior for missing-artifact diagnostics).
|
|
57
|
+
return isFlatPhaseDir ? join(phaseDir, artifactName) : legacyDefault;
|
|
26
58
|
}
|
|
27
59
|
// ─── Dispatch Rule Conversion ──────────────────────────────────────────────
|
|
28
60
|
/**
|
|
@@ -70,6 +102,13 @@ export class RuleRegistry {
|
|
|
70
102
|
activeHook = null;
|
|
71
103
|
hookQueue = [];
|
|
72
104
|
cycleCounts = new Map();
|
|
105
|
+
/**
|
|
106
|
+
* Cycle keys that have already been granted a one-shot re-dispatch after a
|
|
107
|
+
* lost/interrupted dispatch (hook charged a cycle but never produced its own
|
|
108
|
+
* unit-end). Bounds the dispatch-cycle refund to exactly one per gate so a
|
|
109
|
+
* hook that repeatedly fails to complete cannot loop forever.
|
|
110
|
+
*/
|
|
111
|
+
redispatchedGateKeys = new Set();
|
|
73
112
|
retryPending = false;
|
|
74
113
|
retryTrigger = null;
|
|
75
114
|
hookFailure = null;
|
|
@@ -269,6 +308,10 @@ export class RuleRegistry {
|
|
|
269
308
|
cycle: currentCycle,
|
|
270
309
|
pendingRetry: false,
|
|
271
310
|
};
|
|
311
|
+
return this._buildHookDispatch(config, triggerUnitId);
|
|
312
|
+
}
|
|
313
|
+
/** Construct the sidecar dispatch for a hook without mutating registry state. */
|
|
314
|
+
_buildHookDispatch(config, triggerUnitId) {
|
|
272
315
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(triggerUnitId);
|
|
273
316
|
let prompt = config.prompt
|
|
274
317
|
.replace(/\{milestoneId\}/g, mid ?? "")
|
|
@@ -278,11 +321,27 @@ export class RuleRegistry {
|
|
|
278
321
|
return {
|
|
279
322
|
hookName: config.name,
|
|
280
323
|
prompt,
|
|
281
|
-
|
|
324
|
+
// Model selection (including fallbacks[]) is handled by
|
|
325
|
+
// resolveModelWithFallbacksForUnit for the `hook/<name>` unit type (#1229).
|
|
282
326
|
unitType: `hook/${config.name}`,
|
|
283
327
|
unitId: triggerUnitId,
|
|
284
328
|
};
|
|
285
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* Reconstruct the in-flight hook's dispatch from the restored `activeHook`
|
|
332
|
+
* state, without mutating the registry. Used to reconcile a persisted
|
|
333
|
+
* `activeHook` whose session-local dispatch was lost across a pause/resume
|
|
334
|
+
* or crash-recovery, so the hook actually runs instead of being charged
|
|
335
|
+
* against the next unrelated unit's close-out (#1246).
|
|
336
|
+
*/
|
|
337
|
+
getPendingHookDispatch(basePath) {
|
|
338
|
+
if (!this.activeHook)
|
|
339
|
+
return null;
|
|
340
|
+
const config = resolvePostUnitHooks(basePath).find(h => h.name === this.activeHook.hookName);
|
|
341
|
+
if (!config)
|
|
342
|
+
return null;
|
|
343
|
+
return this._buildHookDispatch(config, this.activeHook.triggerUnitId);
|
|
344
|
+
}
|
|
286
345
|
_assessHookCompletion(basePath, hook) {
|
|
287
346
|
return this._assessConfiguredHookCompletion(basePath, hook.hookName, hook.triggerUnitId);
|
|
288
347
|
}
|
|
@@ -368,6 +427,30 @@ export class RuleRegistry {
|
|
|
368
427
|
}
|
|
369
428
|
_handleBlockingGateCompletion(config, hook, basePath, observedCleanExecution) {
|
|
370
429
|
if (!observedCleanExecution) {
|
|
430
|
+
// The hook was charged a cycle at dispatch but never produced its own
|
|
431
|
+
// unit-end — its dispatch was lost/interrupted (pause/resume, crash
|
|
432
|
+
// recovery). Refund that dispatch-consumed cycle exactly once so the gate
|
|
433
|
+
// is re-dispatched at least once instead of hard-blocking on a hook that
|
|
434
|
+
// never actually ran.
|
|
435
|
+
//
|
|
436
|
+
// This refund is intentionally UNCONDITIONAL on the first lost dispatch —
|
|
437
|
+
// it must NOT be gated on `currentCycle >= max_cycles`. A lost dispatch is
|
|
438
|
+
// a non-run: charging its cycle at dispatch time must not consume the
|
|
439
|
+
// hook's real-run budget. Gating the refund on "budget already exhausted"
|
|
440
|
+
// lets a lost dispatch below max_cycles silently eat a genuine cycle, so
|
|
441
|
+
// the hook gets one fewer real run than configured — reintroducing #1244
|
|
442
|
+
// for max_cycles >= 2 (see the "does not steal a real-run cycle" test).
|
|
443
|
+
// The redispatchedGateKeys flag bounds this to a single refund per gate,
|
|
444
|
+
// so repeated lost dispatches still terminate (total dispatches never
|
|
445
|
+
// exceed max_cycles + 1) and a hook that keeps failing blocks normally.
|
|
446
|
+
const cycleKey = hookCycleKey(config, hook);
|
|
447
|
+
if (!this.redispatchedGateKeys.has(cycleKey)) {
|
|
448
|
+
this.redispatchedGateKeys.add(cycleKey);
|
|
449
|
+
const currentCycle = this.cycleCounts.get(cycleKey);
|
|
450
|
+
if (typeof currentCycle === "number" && currentCycle > 0) {
|
|
451
|
+
this.cycleCounts.set(cycleKey, currentCycle - 1);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
371
454
|
return this._rerunGateOrBlock(config, hook, basePath, {
|
|
372
455
|
reason: `hook/${config.name} did not complete cleanly before the trigger unit resumed`,
|
|
373
456
|
});
|
|
@@ -639,6 +722,7 @@ export class RuleRegistry {
|
|
|
639
722
|
this.activeHook = null;
|
|
640
723
|
this.hookQueue = [];
|
|
641
724
|
this.cycleCounts.clear();
|
|
725
|
+
this.redispatchedGateKeys.clear();
|
|
642
726
|
this.retryPending = false;
|
|
643
727
|
this.retryTrigger = null;
|
|
644
728
|
this.hookFailure = null;
|
|
@@ -652,6 +736,7 @@ export class RuleRegistry {
|
|
|
652
736
|
persistState(basePath) {
|
|
653
737
|
const state = {
|
|
654
738
|
cycleCounts: Object.fromEntries(this.cycleCounts),
|
|
739
|
+
redispatchedGateKeys: Array.from(this.redispatchedGateKeys),
|
|
655
740
|
activeHook: this.activeHook ? { ...this.activeHook } : null,
|
|
656
741
|
hookQueue: this.hookQueue.map(entry => ({
|
|
657
742
|
hookName: entry.config.name,
|
|
@@ -687,6 +772,14 @@ export class RuleRegistry {
|
|
|
687
772
|
}
|
|
688
773
|
}
|
|
689
774
|
}
|
|
775
|
+
this.redispatchedGateKeys.clear();
|
|
776
|
+
if (Array.isArray(state.redispatchedGateKeys)) {
|
|
777
|
+
for (const key of state.redispatchedGateKeys) {
|
|
778
|
+
if (typeof key === "string") {
|
|
779
|
+
this.redispatchedGateKeys.add(key);
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
690
783
|
this.activeHook = state.activeHook && typeof state.activeHook === "object"
|
|
691
784
|
? { ...state.activeHook }
|
|
692
785
|
: null;
|
|
@@ -715,7 +808,7 @@ export class RuleRegistry {
|
|
|
715
808
|
try {
|
|
716
809
|
const filePath = this._hookStatePath(basePath);
|
|
717
810
|
if (existsSync(filePath)) {
|
|
718
|
-
writeFileSync(filePath, JSON.stringify({ cycleCounts: {}, activeHook: null, hookQueue: [], savedAt: new Date().toISOString() }, null, 2), "utf-8");
|
|
811
|
+
writeFileSync(filePath, JSON.stringify({ cycleCounts: {}, redispatchedGateKeys: [], activeHook: null, hookQueue: [], savedAt: new Date().toISOString() }, null, 2), "utf-8");
|
|
719
812
|
}
|
|
720
813
|
}
|
|
721
814
|
catch (e) {
|
|
@@ -793,7 +886,10 @@ export class RuleRegistry {
|
|
|
793
886
|
return {
|
|
794
887
|
hookName: hook.name,
|
|
795
888
|
prompt,
|
|
796
|
-
|
|
889
|
+
// Model selection (including fallbacks[]) is resolved by dispatchHookUnit
|
|
890
|
+
// via resolveModelWithFallbacksForUnit for the `hook/<name>` unit type,
|
|
891
|
+
// matching the auto-mode path. Emitting the primary-only model here would
|
|
892
|
+
// discard the configured fallback chain (#1229).
|
|
797
893
|
unitType: `hook/${hook.name}`,
|
|
798
894
|
unitId,
|
|
799
895
|
};
|
|
@@ -8,41 +8,49 @@
|
|
|
8
8
|
* prompt block when reload fails before the next agent turn.
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
11
|
-
import { homedir } from "node:os";
|
|
12
11
|
import { join } from "node:path";
|
|
12
|
+
import { getSkillDirectories } from "@gsd/pi-coding-agent";
|
|
13
13
|
import { gsdHome } from "./gsd-home.js";
|
|
14
14
|
import { getInstalledSkills, normalizeSkillName } from "./skills.js";
|
|
15
|
-
|
|
16
|
-
let baselineSkills = null;
|
|
15
|
+
let snapshot = null;
|
|
17
16
|
/**
|
|
18
17
|
* Snapshot the current installed skill catalog. Call at auto-mode start.
|
|
18
|
+
* `cwd` is the project base path; skills dropped into `<cwd>/.agents/skills/`,
|
|
19
|
+
* `<cwd>/.claude/skills/`, or `<cwd>/.gsd/skills/` mid-session are detected.
|
|
19
20
|
*/
|
|
20
|
-
export function snapshotSkills() {
|
|
21
|
-
|
|
21
|
+
export function snapshotSkills(options) {
|
|
22
|
+
const searchDirs = getSkillDirectories({
|
|
23
|
+
cwd: options?.cwd ?? process.cwd(),
|
|
24
|
+
gsdHome: gsdHome(),
|
|
25
|
+
}).map((entry) => entry.path);
|
|
26
|
+
snapshot = {
|
|
27
|
+
baselineNames: snapshotCurrentSkillNames(searchDirs),
|
|
28
|
+
searchDirs,
|
|
29
|
+
};
|
|
22
30
|
}
|
|
23
31
|
/**
|
|
24
32
|
* Clear the snapshot. Call when auto-mode stops.
|
|
25
33
|
*/
|
|
26
34
|
export function clearSkillSnapshot() {
|
|
27
|
-
|
|
35
|
+
snapshot = null;
|
|
28
36
|
}
|
|
29
37
|
/**
|
|
30
38
|
* Check if a snapshot is active (auto-mode is running with discovery).
|
|
31
39
|
*/
|
|
32
40
|
export function hasSkillSnapshot() {
|
|
33
|
-
return
|
|
41
|
+
return snapshot !== null;
|
|
34
42
|
}
|
|
35
43
|
/**
|
|
36
44
|
* Detect skills installed since the snapshot was taken.
|
|
37
45
|
* Returns skill metadata for any new skills found in the loader catalog or on disk.
|
|
38
46
|
*/
|
|
39
47
|
export function detectNewSkills() {
|
|
40
|
-
if (!
|
|
48
|
+
if (!snapshot)
|
|
41
49
|
return [];
|
|
42
50
|
const newSkills = [];
|
|
43
|
-
for (const skill of getCurrentSkillsForDiscovery()) {
|
|
51
|
+
for (const skill of getCurrentSkillsForDiscovery(snapshot.searchDirs)) {
|
|
44
52
|
const normalized = normalizeSkillName(skill.name);
|
|
45
|
-
if (
|
|
53
|
+
if (snapshot.baselineNames.has(normalized))
|
|
46
54
|
continue;
|
|
47
55
|
newSkills.push(skill);
|
|
48
56
|
}
|
|
@@ -68,7 +76,13 @@ export async function refreshCatalogForNewSkills(options) {
|
|
|
68
76
|
return newSkills;
|
|
69
77
|
}
|
|
70
78
|
}
|
|
71
|
-
|
|
79
|
+
// Re-snapshot, preserving the search dirs captured at auto-mode start.
|
|
80
|
+
if (snapshot) {
|
|
81
|
+
snapshot = {
|
|
82
|
+
baselineNames: snapshotCurrentSkillNames(),
|
|
83
|
+
searchDirs: snapshot.searchDirs,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
72
86
|
const names = newSkills.map((skill) => skill.name).join(", ");
|
|
73
87
|
options?.notify?.(`GSD: loaded new skills: ${names}`, "info");
|
|
74
88
|
return newSkills;
|
|
@@ -103,17 +117,16 @@ function escapeXml(value) {
|
|
|
103
117
|
}
|
|
104
118
|
});
|
|
105
119
|
}
|
|
106
|
-
function
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
];
|
|
120
|
+
function snapshotCurrentSkillNames(searchDirsOverride) {
|
|
121
|
+
// Uses explicit dirs, the snapshot's search dirs when active, or user-only dirs
|
|
122
|
+
// (no project context) when called before a snapshot is taken.
|
|
123
|
+
const searchDirs = searchDirsOverride ?? snapshot?.searchDirs ?? defaultSearchDirs();
|
|
124
|
+
return new Set(getCurrentSkillsForDiscovery(searchDirs).map(skill => normalizeSkillName(skill.name)));
|
|
112
125
|
}
|
|
113
|
-
function
|
|
114
|
-
return
|
|
126
|
+
function defaultSearchDirs() {
|
|
127
|
+
return getSkillDirectories({ cwd: process.cwd(), gsdHome: gsdHome() }).map((entry) => entry.path);
|
|
115
128
|
}
|
|
116
|
-
function getCurrentSkillsForDiscovery() {
|
|
129
|
+
function getCurrentSkillsForDiscovery(searchDirs) {
|
|
117
130
|
const skills = new Map();
|
|
118
131
|
for (const skill of getInstalledSkills()) {
|
|
119
132
|
const normalized = normalizeSkillName(skill.name);
|
|
@@ -123,16 +136,16 @@ function getCurrentSkillsForDiscovery() {
|
|
|
123
136
|
location: skill.filePath,
|
|
124
137
|
});
|
|
125
138
|
}
|
|
126
|
-
for (const skill of getDiskSkills()) {
|
|
139
|
+
for (const skill of getDiskSkills(searchDirs)) {
|
|
127
140
|
const normalized = normalizeSkillName(skill.name);
|
|
128
141
|
if (!skills.has(normalized))
|
|
129
142
|
skills.set(normalized, skill);
|
|
130
143
|
}
|
|
131
144
|
return [...skills.values()];
|
|
132
145
|
}
|
|
133
|
-
function getDiskSkills() {
|
|
146
|
+
function getDiskSkills(searchDirs) {
|
|
134
147
|
const skills = new Map();
|
|
135
|
-
for (const dir of
|
|
148
|
+
for (const dir of searchDirs) {
|
|
136
149
|
if (!existsSync(dir))
|
|
137
150
|
continue;
|
|
138
151
|
let entries;
|
|
@@ -19,7 +19,8 @@ import { isAbsolute, join, dirname, resolve } from "node:path";
|
|
|
19
19
|
import { fileURLToPath } from "node:url";
|
|
20
20
|
import { gsdRoot } from "./paths.js";
|
|
21
21
|
import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager.js";
|
|
22
|
-
import {
|
|
22
|
+
import { syncGsdStateToWorktreeByScope } from "./auto-worktree-sync.js";
|
|
23
|
+
import { runWorktreePostCreateHook } from "./worktree-post-create-hook.js";
|
|
23
24
|
import { createWorkspace, scopeMilestone } from "./workspace.js";
|
|
24
25
|
import { writeSessionStatus, } from "./session-status-io.js";
|
|
25
26
|
import { hasFileConflict } from "./slice-parallel-conflict.js";
|