@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.fb12b103
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/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
- package/dist/resources/extensions/gsd/auto/orchestrator.js +40 -9
- package/dist/resources/extensions/gsd/auto/phases.js +6 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +12 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +19 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +15 -10
- package/dist/resources/extensions/gsd/auto-start.js +21 -21
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +7 -16
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +8 -20
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +151 -20
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +30 -4
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +372 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-db.js +171 -2048
- package/dist/resources/extensions/gsd/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +51 -5
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +1 -20
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/uat-policy.js +2 -1
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +96 -5
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -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 +10 -10
- 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/react-loadable-manifest.json +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.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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/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 +10 -10
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- 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/middleware-react-loadable-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/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- 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 +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +46 -21
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +478 -484
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +500 -533
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +46 -10
- package/src/resources/extensions/gsd/auto/phases.ts +10 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +12 -0
- package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +25 -7
- package/src/resources/extensions/gsd/auto-prompts.ts +40 -26
- package/src/resources/extensions/gsd/auto-start.ts +21 -22
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +10 -17
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +20 -24
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +180 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +29 -3
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +453 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-db.ts +173 -2373
- package/src/resources/extensions/gsd/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +50 -5
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +4 -21
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +16 -19
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/uat-policy.ts +2 -1
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +10 -1
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +119 -5
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → mU4QIDlpVHDdjDpeEKh5W}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → mU4QIDlpVHDdjDpeEKh5W}/_ssgManifest.js +0 -0
|
@@ -11,8 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { existsSync, readFileSync } from "node:fs";
|
|
13
13
|
import { join } from "node:path";
|
|
14
|
-
import {
|
|
15
|
-
import { transaction, insertMilestone, insertSlice, getSlice, getSliceTasks, getMilestone, updateSliceStatus, setSliceSummaryMd, saveGateResult, getPendingGatesForTurn, getMilestoneSlices, updateMilestoneStatus, } from "../gsd-db.js";
|
|
14
|
+
import { completeSliceCascade, setSliceSummaryMd, saveGateResult, getPendingGatesForTurn, } from "../gsd-db.js";
|
|
16
15
|
import { getGatesForTurn } from "../gate-registry.js";
|
|
17
16
|
import { gsdProjectionRoot, clearPathCache, resolveMilestoneFile } from "../paths.js";
|
|
18
17
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
@@ -295,52 +294,34 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
295
294
|
error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but declares "UAT mode: artifact-driven", which only runs static/file checks and would defer the browser work to a human. Use a mode that actually verifies the UI: "browser-executable" (interactive browser tools), "runtime-executable" (a browser test command such as playwright), or a browser-inclusive "mixed"/"live-runtime". Re-author the UAT Type section and complete the slice again.`,
|
|
296
295
|
};
|
|
297
296
|
}
|
|
298
|
-
// ──
|
|
297
|
+
// ── Atomic completion cascade (guards + writes in one transaction) ───────
|
|
299
298
|
const completedAt = new Date().toISOString();
|
|
300
299
|
let guardError = null;
|
|
301
300
|
let existingSummaryMd = "";
|
|
302
301
|
let duplicateComplete = false;
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
// Only block if they exist and are closed.
|
|
307
|
-
const milestone = getMilestone(params.milestoneId);
|
|
308
|
-
if (milestone && isClosedStatus(milestone.status)) {
|
|
309
|
-
guardError = `cannot complete slice in a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
const slice = getSlice(params.milestoneId, params.sliceId);
|
|
313
|
-
existingSummaryMd = slice?.full_summary_md?.trim() ?? "";
|
|
314
|
-
if (slice && isClosedStatus(slice.status)) {
|
|
315
|
-
duplicateComplete = true;
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
// Verify all tasks are complete
|
|
319
|
-
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
320
|
-
if (tasks.length === 0) {
|
|
321
|
-
guardError = `no tasks found for slice ${params.sliceId} in milestone ${params.milestoneId}`;
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
const incompleteTasks = tasks.filter(t => !isClosedStatus(t.status));
|
|
325
|
-
if (incompleteTasks.length > 0) {
|
|
326
|
-
const incompleteIds = incompleteTasks.map(t => `${t.id} (status: ${t.status})`).join(", ");
|
|
327
|
-
guardError = `incomplete tasks: ${incompleteIds}`;
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
// All guards passed — perform writes. Preserve existing planning metadata:
|
|
331
|
-
// completion should not overwrite title/risk/depends/demo/sequence.
|
|
332
|
-
insertMilestone({ id: params.milestoneId, title: params.milestoneId });
|
|
333
|
-
if (!slice) {
|
|
334
|
-
insertSlice({ id: params.sliceId, milestoneId: params.milestoneId, title: params.sliceTitle || params.sliceId });
|
|
335
|
-
}
|
|
336
|
-
updateSliceStatus(params.milestoneId, params.sliceId, "complete", completedAt);
|
|
337
|
-
const updatedSlices = getMilestoneSlices(params.milestoneId);
|
|
338
|
-
if (milestone?.status === "planned" &&
|
|
339
|
-
updatedSlices.length > 0 &&
|
|
340
|
-
updatedSlices.every((s) => isClosedStatus(s.status))) {
|
|
341
|
-
updateMilestoneStatus(params.milestoneId, "active");
|
|
342
|
-
}
|
|
302
|
+
const outcome = completeSliceCascade(params.milestoneId, params.sliceId, {
|
|
303
|
+
sliceTitle: params.sliceTitle,
|
|
304
|
+
completedAt,
|
|
343
305
|
});
|
|
306
|
+
if (outcome.ok) {
|
|
307
|
+
existingSummaryMd = outcome.existingSummaryMd;
|
|
308
|
+
duplicateComplete = outcome.duplicate;
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
switch (outcome.reason) {
|
|
312
|
+
case "milestone-closed":
|
|
313
|
+
guardError = `cannot complete slice in a closed milestone: ${params.milestoneId} (status: ${outcome.status})`;
|
|
314
|
+
break;
|
|
315
|
+
case "no-tasks":
|
|
316
|
+
guardError = `no tasks found for slice ${params.sliceId} in milestone ${params.milestoneId}`;
|
|
317
|
+
break;
|
|
318
|
+
case "incomplete-tasks": {
|
|
319
|
+
const incompleteIds = outcome.incomplete.map((t) => `${t.id} (status: ${t.status})`).join(", ");
|
|
320
|
+
guardError = `incomplete tasks: ${incompleteIds}`;
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
344
325
|
if (duplicateComplete) {
|
|
345
326
|
const staleSummaryPath = sliceSummaryPath(artifactBasePath, params.milestoneId, params.sliceId);
|
|
346
327
|
const duplicateIsStale = isStaleWrite("complete-slice");
|
|
@@ -4,6 +4,7 @@ import { EXEC_DEFAULTS, runExecSandbox, } from "../exec-sandbox.js";
|
|
|
4
4
|
import { realpathSync } from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { isContextModeEnabled } from "../preferences-types.js";
|
|
7
|
+
import { projectRootFromWorktreePath } from "../worktree-root.js";
|
|
7
8
|
import { contextModeDisabledResult } from "./context-mode-tool-result.js";
|
|
8
9
|
const UAT_EXEC_INTENTS = [
|
|
9
10
|
"uat-artifact-check",
|
|
@@ -141,14 +142,10 @@ function normalizeScanPath(value) {
|
|
|
141
142
|
}
|
|
142
143
|
function parseWorktreeBase(baseDir) {
|
|
143
144
|
const normalizedBase = normalizeScanPath(baseDir);
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
if (markerIndex <= 0)
|
|
145
|
+
const originalRoot = projectRootFromWorktreePath(normalizedBase);
|
|
146
|
+
if (!originalRoot)
|
|
147
147
|
return null;
|
|
148
|
-
return {
|
|
149
|
-
originalRoot: normalizedBase.slice(0, markerIndex),
|
|
150
|
-
worktreeRoot: normalizedBase,
|
|
151
|
-
};
|
|
148
|
+
return { originalRoot, worktreeRoot: normalizedBase };
|
|
152
149
|
}
|
|
153
150
|
function pathInside(parent, target) {
|
|
154
151
|
const parentWithSep = parent.endsWith("/") ? parent : `${parent}/`;
|
|
@@ -234,7 +231,7 @@ function scriptReferencesOriginalRootFromWorktree(script, baseDir) {
|
|
|
234
231
|
return false;
|
|
235
232
|
const normalizedScript = script.replace(/\\/g, "/");
|
|
236
233
|
return comparablePathVariants(parsed.originalRoot).some((originalRoot) => {
|
|
237
|
-
const originalRootPattern = new RegExp(`${escapeRegExp(originalRoot)}(?=$|[\\s'"\\\`;)&|<>]|/(?!\\.gsd
|
|
234
|
+
const originalRootPattern = new RegExp(`${escapeRegExp(originalRoot)}(?=$|[\\s'"\\\`;)&|<>]|/(?!\\.gsd(?:-worktrees|/worktrees)(?:/|$)))`);
|
|
238
235
|
return originalRootPattern.test(normalizedScript);
|
|
239
236
|
});
|
|
240
237
|
}
|
|
@@ -345,6 +342,7 @@ function formatResult(result) {
|
|
|
345
342
|
exit_code: result.exit_code,
|
|
346
343
|
signal: result.signal,
|
|
347
344
|
timed_out: result.timed_out,
|
|
345
|
+
force_resolved: result.force_resolved,
|
|
348
346
|
duration_ms: result.duration_ms,
|
|
349
347
|
stdout_bytes: result.stdout_bytes,
|
|
350
348
|
stderr_bytes: result.stderr_bytes,
|
|
@@ -358,6 +356,10 @@ function formatResult(result) {
|
|
|
358
356
|
};
|
|
359
357
|
}
|
|
360
358
|
function formatExit(result) {
|
|
359
|
+
// force_resolved means a non-closing (D-state) child was force-resolved past its
|
|
360
|
+
// hard deadline rather than observed exiting; distinguish it from a clean timeout.
|
|
361
|
+
if (result.force_resolved)
|
|
362
|
+
return "timeout(force-killed)";
|
|
361
363
|
if (result.timed_out)
|
|
362
364
|
return "timeout";
|
|
363
365
|
if (result.signal)
|
|
@@ -12,7 +12,8 @@ import { writeManifest } from "../workflow-manifest.js";
|
|
|
12
12
|
import { appendEvent } from "../workflow-events.js";
|
|
13
13
|
import { logWarning } from "../workflow-logger.js";
|
|
14
14
|
import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
|
|
15
|
-
import {
|
|
15
|
+
import { runTaskPathChecks } from "../pre-execution-checks.js";
|
|
16
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
16
17
|
import { buildTaskFileName, gsdProjectionRoot } from "../paths.js";
|
|
17
18
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
18
19
|
import { createRepositoryRegistryFromPreferences, defaultRepositoryTargets } from "../repository-registry.js";
|
|
@@ -193,11 +194,16 @@ function validateTaskPathsBeforePersist(params, basePath, defaultTargets, allowe
|
|
|
193
194
|
const additionalRoots = allowedRoots
|
|
194
195
|
.map((root) => resolve(root))
|
|
195
196
|
.filter((root) => root !== baseRoot);
|
|
196
|
-
const
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
197
|
+
const resolvedCanonicalRoot = resolve(resolveWorktreeProjectRoot(basePath));
|
|
198
|
+
const canonicalProjectRoot = resolvedCanonicalRoot !== baseRoot ? resolvedCanonicalRoot : undefined;
|
|
199
|
+
const hasContext = additionalRoots.length > 0 || canonicalProjectRoot !== undefined;
|
|
200
|
+
const context = hasContext
|
|
201
|
+
? {
|
|
202
|
+
...(additionalRoots.length > 0 ? { additionalRoots } : {}),
|
|
203
|
+
...(canonicalProjectRoot !== undefined ? { canonicalProjectRoot } : {}),
|
|
204
|
+
}
|
|
205
|
+
: undefined;
|
|
206
|
+
const checks = runTaskPathChecks(taskRows, basePath, context);
|
|
201
207
|
const blocking = checks.filter((check) => !check.passed && check.blocking);
|
|
202
208
|
if (blocking.length === 0)
|
|
203
209
|
return null;
|
|
@@ -7,9 +7,8 @@
|
|
|
7
7
|
* artifacts so the DB-filesystem reconciler does not auto-correct
|
|
8
8
|
* entities back to "complete".
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { getMilestoneSlices, getSliceTasks, reopenMilestoneCascade, } from "../gsd-db.js";
|
|
11
11
|
import { invalidateStateCache } from "../state.js";
|
|
12
|
-
import { isClosedStatus } from "../status-guards.js";
|
|
13
12
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
14
13
|
import { writeManifest } from "../workflow-manifest.js";
|
|
15
14
|
import { appendEvent } from "../workflow-events.js";
|
|
@@ -23,35 +22,18 @@ export async function handleReopenMilestone(params, basePath) {
|
|
|
23
22
|
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
24
23
|
return { error: "milestoneId is required and must be a non-empty string" };
|
|
25
24
|
}
|
|
26
|
-
// ──
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return;
|
|
25
|
+
// ── Atomic reopen cascade (guards + writes in one transaction) ───────────
|
|
26
|
+
const outcome = reopenMilestoneCascade(params.milestoneId);
|
|
27
|
+
if (!outcome.ok) {
|
|
28
|
+
switch (outcome.reason) {
|
|
29
|
+
case "milestone-not-found":
|
|
30
|
+
return { error: `milestone not found: ${params.milestoneId}` };
|
|
31
|
+
case "milestone-not-closed":
|
|
32
|
+
return { error: `milestone ${params.milestoneId} is not closed (status: ${outcome.status}) — nothing to reopen` };
|
|
35
33
|
}
|
|
36
|
-
if (!isClosedStatus(milestone.status)) {
|
|
37
|
-
guardError = `milestone ${params.milestoneId} is not closed (status: ${milestone.status}) — nothing to reopen`;
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
reopenMilestoneStatus(params.milestoneId);
|
|
41
|
-
const slices = getMilestoneSlices(params.milestoneId);
|
|
42
|
-
slicesResetCount = slices.length;
|
|
43
|
-
for (const slice of slices) {
|
|
44
|
-
updateSliceStatus(params.milestoneId, slice.id, "in_progress");
|
|
45
|
-
const tasks = getSliceTasks(params.milestoneId, slice.id);
|
|
46
|
-
tasksResetCount += tasks.length;
|
|
47
|
-
for (const task of tasks) {
|
|
48
|
-
updateTaskStatus(params.milestoneId, slice.id, task.id, "pending");
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
if (guardError) {
|
|
53
|
-
return { error: guardError };
|
|
54
34
|
}
|
|
35
|
+
const slicesResetCount = outcome.slicesReset;
|
|
36
|
+
const tasksResetCount = outcome.tasksReset;
|
|
55
37
|
// ── Invalidate caches ────────────────────────────────────────────────────
|
|
56
38
|
invalidateStateCache();
|
|
57
39
|
// ── Clean up stale filesystem artifacts (M12 fix) ────────────────────────
|
|
@@ -9,9 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
// GSD — reopen-slice tool handler
|
|
11
11
|
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
12
|
-
import {
|
|
12
|
+
import { getSliceTasks, reopenSliceCascade, } from "../gsd-db.js";
|
|
13
13
|
import { invalidateStateCache } from "../state.js";
|
|
14
|
-
import { isClosedStatus } from "../status-guards.js";
|
|
15
14
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
16
15
|
import { writeManifest } from "../workflow-manifest.js";
|
|
17
16
|
import { appendEvent } from "../workflow-events.js";
|
|
@@ -27,39 +26,21 @@ export async function handleReopenSlice(params, basePath) {
|
|
|
27
26
|
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
28
27
|
return { error: "milestoneId is required and must be a non-empty string" };
|
|
29
28
|
}
|
|
30
|
-
// ──
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
// ── Atomic reopen cascade (guards + writes in one transaction) ───────────
|
|
30
|
+
const outcome = reopenSliceCascade(params.milestoneId, params.sliceId);
|
|
31
|
+
if (!outcome.ok) {
|
|
32
|
+
switch (outcome.reason) {
|
|
33
|
+
case "milestone-not-found":
|
|
34
|
+
return { error: `milestone not found: ${params.milestoneId}` };
|
|
35
|
+
case "milestone-closed":
|
|
36
|
+
return { error: `cannot reopen slice in a closed milestone: ${params.milestoneId} (status: ${outcome.status})` };
|
|
37
|
+
case "slice-not-found":
|
|
38
|
+
return { error: `slice not found: ${params.milestoneId}/${params.sliceId}` };
|
|
39
|
+
case "slice-not-complete":
|
|
40
|
+
return { error: `slice ${params.sliceId} is not complete (status: ${outcome.status}) — nothing to reopen` };
|
|
38
41
|
}
|
|
39
|
-
if (isClosedStatus(milestone.status)) {
|
|
40
|
-
guardError = `cannot reopen slice in a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const slice = getSlice(params.milestoneId, params.sliceId);
|
|
44
|
-
if (!slice) {
|
|
45
|
-
guardError = `slice not found: ${params.milestoneId}/${params.sliceId}`;
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (!isClosedStatus(slice.status)) {
|
|
49
|
-
guardError = `slice ${params.sliceId} is not complete (status: ${slice.status}) — nothing to reopen`;
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
// Fetch tasks inside txn so the list is consistent with the slice status check
|
|
53
|
-
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
54
|
-
tasksResetCount = tasks.length;
|
|
55
|
-
updateSliceStatus(params.milestoneId, params.sliceId, "in_progress");
|
|
56
|
-
for (const task of tasks) {
|
|
57
|
-
updateTaskStatus(params.milestoneId, params.sliceId, task.id, "pending");
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
if (guardError) {
|
|
61
|
-
return { error: guardError };
|
|
62
42
|
}
|
|
43
|
+
const tasksResetCount = outcome.tasksReset;
|
|
63
44
|
// ── Invalidate caches ────────────────────────────────────────────────────
|
|
64
45
|
invalidateStateCache();
|
|
65
46
|
// ── Clean up stale filesystem artifacts (M12 fix) ────────────────────────
|
|
@@ -9,8 +9,7 @@
|
|
|
9
9
|
* This function performs DB writes only. The MCP wrapper in
|
|
10
10
|
* bootstrap/db-tools.ts handles state-cache invalidation and STATE.md rebuild.
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
13
|
-
import { isClosedStatus } from "../status-guards.js";
|
|
12
|
+
import { isDbAvailable, skipSliceCascade, } from "../gsd-db.js";
|
|
14
13
|
/**
|
|
15
14
|
* Mark a slice as "skipped" and cascade the skip to every non-closed task in
|
|
16
15
|
* that slice. Runs as a single transaction so slice status and task statuses
|
|
@@ -39,40 +38,23 @@ export function handleSkipSlice(params) {
|
|
|
39
38
|
if (!isDbAvailable()) {
|
|
40
39
|
throw new Error("handleSkipSlice: GSD database is not available");
|
|
41
40
|
}
|
|
42
|
-
// ──
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
41
|
+
// ── Atomic skip cascade (guards + writes in one transaction) ────────────
|
|
42
|
+
const outcome = skipSliceCascade(params.milestoneId, params.sliceId);
|
|
43
|
+
if (!outcome.ok) {
|
|
44
|
+
switch (outcome.reason) {
|
|
45
|
+
case "slice-not-found":
|
|
46
|
+
return {
|
|
47
|
+
...base,
|
|
48
|
+
error: `Slice ${params.sliceId} not found in milestone ${params.milestoneId}`,
|
|
49
|
+
errorCode: "slice_not_found",
|
|
50
|
+
};
|
|
51
|
+
case "slice-already-complete":
|
|
52
|
+
return {
|
|
53
|
+
...base,
|
|
54
|
+
error: `Slice ${params.sliceId} is already complete — cannot skip.`,
|
|
55
|
+
errorCode: "already_complete",
|
|
56
|
+
};
|
|
53
57
|
}
|
|
54
|
-
if (slice.status === "complete" || slice.status === "done") {
|
|
55
|
-
guardError = `Slice ${params.sliceId} is already complete — cannot skip.`;
|
|
56
|
-
guardCode = "already_complete";
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
wasAlreadySkipped = slice.status === "skipped";
|
|
60
|
-
if (!wasAlreadySkipped) {
|
|
61
|
-
updateSliceStatus(params.milestoneId, params.sliceId, "skipped");
|
|
62
|
-
}
|
|
63
|
-
// Cascade: mark every non-closed task as skipped so milestone completion
|
|
64
|
-
// doesn't trip the deep-task guard (#4375). Closed tasks (complete/done/
|
|
65
|
-
// skipped) are left untouched — we never downgrade.
|
|
66
|
-
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
67
|
-
for (const task of tasks) {
|
|
68
|
-
if (!isClosedStatus(task.status)) {
|
|
69
|
-
updateTaskStatus(params.milestoneId, params.sliceId, task.id, "skipped");
|
|
70
|
-
tasksSkipped++;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
if (guardError) {
|
|
75
|
-
return { ...base, error: guardError, errorCode: guardCode ?? undefined };
|
|
76
58
|
}
|
|
77
|
-
return { ...base, tasksSkipped, wasAlreadySkipped };
|
|
59
|
+
return { ...base, tasksSkipped: outcome.tasksSkipped, wasAlreadySkipped: outcome.wasAlreadySkipped };
|
|
78
60
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Central UAT mode policy for dispatch, tool presentation, and result validation.
|
|
3
|
+
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
3
4
|
import { extractUatType } from "./files.js";
|
|
4
5
|
import { hasBrowserRequiredText } from "./browser-evidence.js";
|
|
5
6
|
import { parseMcpToolName } from "./mcp-tool-name.js";
|
|
@@ -84,7 +85,7 @@ export function uatTypeIncludesBrowser(uatType) {
|
|
|
84
85
|
export function isUatBrowserToolName(toolName) {
|
|
85
86
|
const parsed = parseMcpToolName(toolName);
|
|
86
87
|
const canonicalName = parsed?.toolName ?? toolName;
|
|
87
|
-
if (canonicalName
|
|
88
|
+
if (hasBrowserContractPrefix(canonicalName))
|
|
88
89
|
return true;
|
|
89
90
|
return parsed?.toolName === "*" && parsed.serverName.toLowerCase().includes("browser");
|
|
90
91
|
}
|
|
@@ -11,7 +11,7 @@ import { deriveState } from "./state.js";
|
|
|
11
11
|
import { invalidateAllCaches } from "./cache.js";
|
|
12
12
|
import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
|
|
13
13
|
import { sendDesktopNotification } from "./notifications.js";
|
|
14
|
-
import { getTask, getSlice, getSliceTasks, updateTaskStatus,
|
|
14
|
+
import { getTask, getSlice, getSliceTasks, updateTaskStatus, resetSliceCascade } from "./gsd-db.js";
|
|
15
15
|
import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
|
|
16
16
|
/**
|
|
17
17
|
* Undo the last completed unit: revert git commits,
|
|
@@ -275,20 +275,21 @@ export async function handleResetSlice(args, ctx, _pi, basePath) {
|
|
|
275
275
|
`Run /gsd reset-slice ${rawId} --force to confirm.`, "warning");
|
|
276
276
|
return;
|
|
277
277
|
}
|
|
278
|
-
// Reset all
|
|
279
|
-
|
|
278
|
+
// Reset all task statuses to "pending" and the slice to "active" in one
|
|
279
|
+
// atomic commit (DB is source of truth). Previously a per-task updateTaskStatus
|
|
280
|
+
// loop + a separate updateSliceStatus, which could leave a partial reset if
|
|
281
|
+
// interrupted mid-loop.
|
|
282
|
+
resetSliceCascade(mid, sid);
|
|
283
|
+
// Delete task summary files — projection cleanup, separate from the DB reset.
|
|
284
|
+
const tasksReset = tasks.length;
|
|
280
285
|
let summariesDeleted = 0;
|
|
281
286
|
for (const t of tasks) {
|
|
282
|
-
updateTaskStatus(mid, sid, t.id, "pending");
|
|
283
|
-
tasksReset++;
|
|
284
287
|
const summaryPath = resolveTaskFile(basePath, mid, sid, t.id, "SUMMARY");
|
|
285
288
|
if (summaryPath && existsSync(summaryPath)) {
|
|
286
289
|
unlinkSync(summaryPath);
|
|
287
290
|
summariesDeleted++;
|
|
288
291
|
}
|
|
289
292
|
}
|
|
290
|
-
// Reset slice status
|
|
291
|
-
updateSliceStatus(mid, sid, "active");
|
|
292
293
|
// Delete slice summary and UAT files
|
|
293
294
|
let sliceFilesDeleted = 0;
|
|
294
295
|
const slicePath = resolveSlicePath(basePath, mid, sid);
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Unit Closeout module — durable completion pipeline behind one seam (ADR-032).
|
|
3
|
+
//
|
|
4
|
+
// `closeUnit` owns what makes a Unit's completion durable. This pass ships the
|
|
5
|
+
// **Interactive Closeout adapter** path: commit the work and compute the
|
|
6
|
+
// Closeout Git Verdict, failing closed (loudly) instead of silently when a
|
|
7
|
+
// non-`none` `git.isolation` preference was never honoured by the session.
|
|
8
|
+
// Motivating failure (2026-06-10): an interactive session under
|
|
9
|
+
// `git.isolation: worktree` completed a milestone with every source file
|
|
10
|
+
// untracked on the integration branch — no commit, no merge, no warning.
|
|
11
|
+
//
|
|
12
|
+
// The interactive adapter only fires on milestone boundaries — the durability
|
|
13
|
+
// gap is the milestone close, and committing at every task/slice would sweep a
|
|
14
|
+
// developer's unrelated working-tree changes. `closeUnit` itself stays general
|
|
15
|
+
// over all boundaries for the pending Auto Closeout adapter re-seat.
|
|
16
|
+
//
|
|
17
|
+
// The auto loop keeps its existing closeout pipeline for now (the Auto
|
|
18
|
+
// Closeout adapter re-seat is the documented next step in ADR-032); the
|
|
19
|
+
// interactive trigger in bootstrap/register-hooks.ts is a no-op while
|
|
20
|
+
// `isAutoActive()`, so auto-mode behaviour is untouched.
|
|
21
|
+
//
|
|
22
|
+
// Re-entrancy is naturally safe: a re-fired completion commits an already-clean
|
|
23
|
+
// tree, which yields `nothing-to-commit`, and `appendNotification` carries its
|
|
24
|
+
// own dedup window — so `closeUnit` keeps no result cache of its own.
|
|
25
|
+
import { appendNotification } from "./notification-store.js";
|
|
26
|
+
import { readStringField } from "./auto-unit-tool-scope.js";
|
|
27
|
+
import { MILESTONE_BRANCH_PREFIX } from "./branch-patterns.js";
|
|
28
|
+
import { nativeGetCurrentBranch } from "./native-git-bridge.js";
|
|
29
|
+
import { getIsolationMode } from "./preferences.js";
|
|
30
|
+
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
31
|
+
import { logWarning } from "./workflow-logger.js";
|
|
32
|
+
const defaultDeps = {
|
|
33
|
+
isolationMode: (basePath) => getIsolationMode(basePath),
|
|
34
|
+
currentBranch: (basePath) => {
|
|
35
|
+
try {
|
|
36
|
+
return nativeGetCurrentBranch(basePath);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
commit: (basePath, unitType, unitId) => autoCommitCurrentBranch(basePath, unitType, unitId),
|
|
43
|
+
notify: (message, severity) => appendNotification(message, severity),
|
|
44
|
+
};
|
|
45
|
+
export function closeUnit(request, deps = defaultDeps) {
|
|
46
|
+
let commitMessage = null;
|
|
47
|
+
let gitVerdict;
|
|
48
|
+
let notice;
|
|
49
|
+
try {
|
|
50
|
+
commitMessage = deps.commit(request.basePath, request.unitType, request.unitId);
|
|
51
|
+
gitVerdict = commitMessage === null ? "nothing-to-commit" : "committed";
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
gitVerdict = "commit-failed";
|
|
55
|
+
notice = `Unit closeout commit failed for ${request.unitId}: ${err instanceof Error ? err.message : String(err)}`;
|
|
56
|
+
logWarning("engine", notice);
|
|
57
|
+
deps.notify(notice, "error");
|
|
58
|
+
}
|
|
59
|
+
if (request.boundary === "milestone" && gitVerdict !== "commit-failed") {
|
|
60
|
+
const isolation = deps.isolationMode(request.basePath);
|
|
61
|
+
if (isolation !== "none") {
|
|
62
|
+
const branch = deps.currentBranch(request.basePath);
|
|
63
|
+
if (branch?.startsWith(MILESTONE_BRANCH_PREFIX)) {
|
|
64
|
+
gitVerdict = "milestone-branch";
|
|
65
|
+
notice =
|
|
66
|
+
`Milestone ${request.unitId} completed on ${branch}. ` +
|
|
67
|
+
`Merge it to the integration branch with the worktree tooling (/gsd worktree merge).`;
|
|
68
|
+
deps.notify(notice, "info");
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
gitVerdict = "isolation-bypassed";
|
|
72
|
+
notice =
|
|
73
|
+
`Needs attention: milestone ${request.unitId} completed outside a milestone worktree/branch ` +
|
|
74
|
+
`while git.isolation is "${isolation}" — the isolation preference was not honoured this session. ` +
|
|
75
|
+
(commitMessage
|
|
76
|
+
? `Work was committed directly on "${branch ?? "the current branch"}".`
|
|
77
|
+
: `The working tree had nothing left to commit on "${branch ?? "the current branch"}".`);
|
|
78
|
+
logWarning("engine", notice);
|
|
79
|
+
deps.notify(notice, "warning");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { gitVerdict, commitMessage, notice };
|
|
84
|
+
}
|
|
85
|
+
// ─── Interactive Closeout adapter (tool-observation trigger) ─────────────
|
|
86
|
+
// Canonical closeout tool → boundary. Aliases are canonicalized by the hook.
|
|
87
|
+
// Only the milestone boundary is wired interactively: it is the durability gap
|
|
88
|
+
// that motivated ADR-032, and committing at every task/slice would sweep a
|
|
89
|
+
// developer's unrelated working-tree changes. `closeUnit` still handles every
|
|
90
|
+
// boundary for the pending Auto Closeout adapter re-seat.
|
|
91
|
+
const CLOSEOUT_TOOL_BOUNDARIES = {
|
|
92
|
+
gsd_complete_milestone: "milestone",
|
|
93
|
+
};
|
|
94
|
+
// Commit attribution uses the canonical unit types so interactive closeout
|
|
95
|
+
// commits carry the same GSD-Unit evidence trailers the verification prompts
|
|
96
|
+
// look for.
|
|
97
|
+
const BOUNDARY_UNIT_TYPES = {
|
|
98
|
+
task: "execute-task",
|
|
99
|
+
slice: "complete-slice",
|
|
100
|
+
milestone: "complete-milestone",
|
|
101
|
+
};
|
|
102
|
+
export function isUnitCloseoutTool(canonicalToolName) {
|
|
103
|
+
return canonicalToolName in CLOSEOUT_TOOL_BOUNDARIES;
|
|
104
|
+
}
|
|
105
|
+
function readId(input, camel, snake) {
|
|
106
|
+
const value = readStringField(input, camel, snake);
|
|
107
|
+
return value && value.length > 0 ? value : undefined;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Interactive Closeout adapter entry, called from the host's tool-observation
|
|
111
|
+
* hook for successful closeout tool calls when auto-mode is NOT active.
|
|
112
|
+
* Returns null when the tool input doesn't identify a unit.
|
|
113
|
+
*/
|
|
114
|
+
export function runInteractiveUnitCloseout(args, deps = defaultDeps) {
|
|
115
|
+
const boundary = CLOSEOUT_TOOL_BOUNDARIES[args.canonicalToolName];
|
|
116
|
+
if (!boundary)
|
|
117
|
+
return null;
|
|
118
|
+
const milestoneId = readId(args.input, "milestoneId", "milestone_id");
|
|
119
|
+
if (!milestoneId)
|
|
120
|
+
return null;
|
|
121
|
+
const sliceId = readId(args.input, "sliceId", "slice_id");
|
|
122
|
+
const taskId = readId(args.input, "taskId", "task_id");
|
|
123
|
+
let unitId = milestoneId;
|
|
124
|
+
if (boundary !== "milestone") {
|
|
125
|
+
if (!sliceId)
|
|
126
|
+
return null;
|
|
127
|
+
unitId = boundary === "slice" ? `${milestoneId}/${sliceId}` : `${milestoneId}/${sliceId}/${taskId ?? ""}`;
|
|
128
|
+
if (boundary === "task" && !taskId)
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return closeUnit({
|
|
132
|
+
basePath: args.basePath,
|
|
133
|
+
unitType: BOUNDARY_UNIT_TYPES[boundary],
|
|
134
|
+
unitId,
|
|
135
|
+
boundary,
|
|
136
|
+
outcome: "complete",
|
|
137
|
+
}, deps);
|
|
138
|
+
}
|