gsd-pi 2.78.1-dev.b0759e59b → 2.78.1-dev.d8826a445
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 +8 -5
- package/dist/headless-recover.d.ts +23 -0
- package/dist/headless-recover.js +93 -0
- package/dist/headless.js +9 -0
- package/dist/help-text.js +1 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/tools/intent.js +8 -1
- package/dist/resources/extensions/gsd/auto/phases.js +7 -2
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +7 -58
- package/dist/resources/extensions/gsd/auto-post-unit.js +14 -28
- package/dist/resources/extensions/gsd/auto-start.js +1 -8
- package/dist/resources/extensions/gsd/auto-worktree.js +244 -216
- package/dist/resources/extensions/gsd/auto.js +86 -7
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +9 -77
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -16
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -55
- package/dist/resources/extensions/gsd/commands-codebase.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +5 -5
- package/dist/resources/extensions/gsd/commands-logs.js +2 -2
- package/dist/resources/extensions/gsd/commands-scan.js +2 -2
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +5 -5
- package/dist/resources/extensions/gsd/db-writer.js +106 -95
- package/dist/resources/extensions/gsd/delegation-policy.js +155 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +6 -10
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +2 -2
- package/dist/resources/extensions/gsd/gsd-db.js +268 -8
- package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
- package/dist/resources/extensions/gsd/guided-flow.js +141 -32
- package/dist/resources/extensions/gsd/markdown-renderer.js +14 -51
- package/dist/resources/extensions/gsd/metrics.js +287 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -13
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +5 -2
- package/dist/resources/extensions/gsd/paths.js +114 -9
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +8 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +22 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +6 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -0
- package/dist/resources/extensions/gsd/queue-order.js +6 -1
- package/dist/resources/extensions/gsd/rethink.js +2 -2
- package/dist/resources/extensions/gsd/state.js +91 -372
- package/dist/resources/extensions/gsd/templates/project.md +10 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -5
- package/dist/resources/extensions/gsd/tools/complete-slice.js +7 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +19 -31
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -5
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -1
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -21
- package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
- package/dist/resources/extensions/gsd/workflow-reconcile.js +3 -3
- package/dist/resources/extensions/gsd/workspace.js +59 -0
- package/dist/resources/extensions/gsd/worktree-command.js +4 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +15 -2
- package/dist/resources/extensions/gsd/write-intercept.js +3 -3
- 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 +12 -12
- 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/required-server-files.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/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/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 +12 -12
- package/dist/web/standalone/.next/server/chunks/6336.js +1 -0
- package/dist/web/standalone/.next/server/chunks/6897.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/server.js +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/README.md +2 -11
- package/packages/mcp-server/dist/remote-questions.d.ts +27 -0
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
- package/packages/mcp-server/dist/remote-questions.js +28 -0
- package/packages/mcp-server/dist/remote-questions.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +28 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +94 -4
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +6 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +56 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/mcp-server.test.ts +226 -0
- package/packages/mcp-server/src/parse-workflow-args.test.ts +80 -0
- package/packages/mcp-server/src/remote-questions.test.ts +103 -0
- package/packages/mcp-server/src/remote-questions.ts +35 -0
- package/packages/mcp-server/src/server.ts +129 -6
- package/packages/mcp-server/src/workflow-tools.ts +62 -3
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/browser-tools/tools/intent.ts +13 -2
- package/src/resources/extensions/gsd/auto/phases.ts +8 -2
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +14 -62
- package/src/resources/extensions/gsd/auto-post-unit.ts +15 -27
- package/src/resources/extensions/gsd/auto-start.ts +1 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +286 -251
- package/src/resources/extensions/gsd/auto.ts +102 -7
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +9 -84
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -17
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +103 -0
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +80 -55
- package/src/resources/extensions/gsd/commands-codebase.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +5 -5
- package/src/resources/extensions/gsd/commands-logs.ts +2 -2
- package/src/resources/extensions/gsd/commands-scan.ts +2 -2
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +5 -5
- package/src/resources/extensions/gsd/db-writer.ts +123 -94
- package/src/resources/extensions/gsd/delegation-policy.ts +197 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +6 -11
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +2 -2
- package/src/resources/extensions/gsd/gsd-db.ts +269 -8
- package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
- package/src/resources/extensions/gsd/guided-flow.ts +181 -32
- package/src/resources/extensions/gsd/markdown-renderer.ts +13 -64
- package/src/resources/extensions/gsd/metrics.ts +321 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +14 -13
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +5 -2
- package/src/resources/extensions/gsd/paths.ts +122 -9
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +8 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +22 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +6 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -0
- package/src/resources/extensions/gsd/queue-order.ts +6 -1
- package/src/resources/extensions/gsd/rethink.ts +2 -2
- package/src/resources/extensions/gsd/state.ts +91 -389
- package/src/resources/extensions/gsd/templates/project.md +10 -0
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +14 -14
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +21 -34
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +331 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +6 -7
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +12 -27
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +18 -5
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +221 -0
- package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/delegation-policy.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +10 -38
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +136 -56
- package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +119 -61
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/dispatch-backgroundable-annotation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +6 -20
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +14 -15
- package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +3 -23
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +11 -16
- package/src/resources/extensions/gsd/tests/escalation.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +246 -0
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +226 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +68 -5
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +15 -36
- package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/handler-worktree-write-isolation.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +15 -15
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +15 -5
- package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +371 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +14 -8
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +400 -0
- package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +141 -0
- package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +329 -0
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/paths-cache.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +25 -16
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +150 -7
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +184 -0
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +28 -16
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/resolve-ts.mjs +4 -0
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +10 -56
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +15 -16
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +23 -27
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +13 -14
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +10 -33
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -15
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +12 -7
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +26 -3
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +9 -15
- package/src/resources/extensions/gsd/tests/workspace.test.ts +190 -0
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +65 -71
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +26 -151
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +35 -35
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -52
- package/src/resources/extensions/gsd/tests/write-intercept.test.ts +1 -1
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -5
- package/src/resources/extensions/gsd/tools/complete-slice.ts +7 -14
- package/src/resources/extensions/gsd/tools/complete-task.ts +19 -34
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +7 -5
- package/src/resources/extensions/gsd/workflow-manifest.ts +4 -1
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -18
- package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workspace.ts +95 -0
- package/src/resources/extensions/gsd/worktree-command.ts +4 -3
- package/src/resources/extensions/gsd/worktree-resolver.ts +16 -2
- package/src/resources/extensions/gsd/write-intercept.ts +3 -3
- package/dist/web/standalone/.next/server/chunks/8527.js +0 -1
- /package/dist/web/standalone/.next/static/{rk1EN3FQTE6Z1yalkW_GE → AT5qi39nKXkdmQIOIoh0f}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{rk1EN3FQTE6Z1yalkW_GE → AT5qi39nKXkdmQIOIoh0f}/_ssgManifest.js +0 -0
|
@@ -15,7 +15,7 @@ test("shouldAutoPrepareWorkflowMcp enables prep for externalCli local transport"
|
|
|
15
15
|
assert.equal(result, true);
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
-
test("shouldAutoPrepareWorkflowMcp
|
|
18
|
+
test("shouldAutoPrepareWorkflowMcp stays disabled for non-Claude active provider even when claude-code is ready", () => {
|
|
19
19
|
const result = shouldAutoPrepareWorkflowMcp({
|
|
20
20
|
model: { provider: "openai", baseUrl: "https://api.openai.com" },
|
|
21
21
|
modelRegistry: {
|
|
@@ -24,10 +24,10 @@ test("shouldAutoPrepareWorkflowMcp enables prep when claude-code provider is rea
|
|
|
24
24
|
},
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
assert.equal(result,
|
|
27
|
+
assert.equal(result, false);
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
-
test("shouldAutoPrepareWorkflowMcp
|
|
30
|
+
test("shouldAutoPrepareWorkflowMcp stays disabled for non-Claude active provider even when claude-code is registered", () => {
|
|
31
31
|
const result = shouldAutoPrepareWorkflowMcp({
|
|
32
32
|
model: { provider: "openai", baseUrl: "https://api.openai.com" },
|
|
33
33
|
modelRegistry: {
|
|
@@ -36,7 +36,7 @@ test("shouldAutoPrepareWorkflowMcp enables prep when claude-code provider is reg
|
|
|
36
36
|
},
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
-
assert.equal(result,
|
|
39
|
+
assert.equal(result, false);
|
|
40
40
|
});
|
|
41
41
|
|
|
42
42
|
test("shouldAutoPrepareWorkflowMcp stays disabled when neither transport nor provider readiness match", () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { existsSync, mkdtempSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
@@ -30,6 +30,17 @@ function readSrc(file: string): string {
|
|
|
30
30
|
return readFileSync(join(gsdDir, file), "utf-8");
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
function listTsFiles(dir: string): string[] {
|
|
34
|
+
const out: string[] = [];
|
|
35
|
+
for (const entry of readdirSync(dir)) {
|
|
36
|
+
const full = join(dir, entry);
|
|
37
|
+
const stat = statSync(full);
|
|
38
|
+
if (stat.isDirectory()) out.push(...listTsFiles(full));
|
|
39
|
+
else if (entry.endsWith(".ts")) out.push(full);
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
|
|
33
44
|
function extractElicitPayload(request: unknown): ElicitPayload {
|
|
34
45
|
const payload = (request as { params?: unknown }).params ?? request;
|
|
35
46
|
return payload as ElicitPayload;
|
|
@@ -39,8 +50,8 @@ test("guided execute-task requires canonical task completion tool", () => {
|
|
|
39
50
|
assert.deepEqual(getRequiredWorkflowToolsForGuidedUnit("execute-task"), ["gsd_task_complete"]);
|
|
40
51
|
});
|
|
41
52
|
|
|
42
|
-
test("auto execute-task requires
|
|
43
|
-
assert.deepEqual(getRequiredWorkflowToolsForAutoUnit("execute-task"), ["
|
|
53
|
+
test("auto execute-task requires canonical task completion tool", () => {
|
|
54
|
+
assert.deepEqual(getRequiredWorkflowToolsForAutoUnit("execute-task"), ["gsd_task_complete"]);
|
|
44
55
|
});
|
|
45
56
|
|
|
46
57
|
test("deep project setup units declare required workflow MCP tools", () => {
|
|
@@ -772,3 +783,15 @@ test("workflow transport error guidance includes /gsd mcp init hint", () => {
|
|
|
772
783
|
const src = readSrc("workflow-mcp.ts");
|
|
773
784
|
assert.match(src, /Please run \/gsd mcp init \./);
|
|
774
785
|
});
|
|
786
|
+
|
|
787
|
+
test("buildWorkflowMcpServers is only imported by tests or Claude Code MCP boundary code", () => {
|
|
788
|
+
const offenders: string[] = [];
|
|
789
|
+
for (const file of listTsFiles(gsdDir)) {
|
|
790
|
+
const rel = file.slice(gsdDir.length + 1).replace(/\\/g, "/");
|
|
791
|
+
if (rel === "workflow-mcp.ts" || rel.startsWith("tests/")) continue;
|
|
792
|
+
const src = readFileSync(file, "utf-8");
|
|
793
|
+
if (/\bimport\b[\s\S]*\bbuildWorkflowMcpServers\b/.test(src)) offenders.push(rel);
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
assert.deepEqual(offenders, []);
|
|
797
|
+
});
|
|
@@ -677,7 +677,7 @@ test("executeSummarySave removes sibling CONTEXT-DRAFT when writing milestone CO
|
|
|
677
677
|
"CONTEXT-DRAFT.md should be removed after final CONTEXT.md is written",
|
|
678
678
|
);
|
|
679
679
|
} finally {
|
|
680
|
-
clearDiscussionFlowState();
|
|
680
|
+
clearDiscussionFlowState(base);
|
|
681
681
|
closeDatabase();
|
|
682
682
|
cleanup(base);
|
|
683
683
|
}
|
|
@@ -741,9 +741,7 @@ test("executeSummarySave blocks final root artifacts while approval gate is pend
|
|
|
741
741
|
const base = makeTmpBase();
|
|
742
742
|
try {
|
|
743
743
|
openTestDb(base);
|
|
744
|
-
|
|
745
|
-
setPendingGate("depth_verification_requirements_confirm");
|
|
746
|
-
});
|
|
744
|
+
setPendingGate("depth_verification_requirements_confirm", base);
|
|
747
745
|
|
|
748
746
|
const result = await inProjectDir(base, () => executeSummarySave({
|
|
749
747
|
artifact_type: "REQUIREMENTS",
|
|
@@ -762,7 +760,7 @@ test("executeSummarySave blocks final root artifacts while approval gate is pend
|
|
|
762
760
|
assert.equal(draft.isError, undefined);
|
|
763
761
|
assert.ok(existsSync(join(base, ".gsd", "REQUIREMENTS-DRAFT.md")));
|
|
764
762
|
} finally {
|
|
765
|
-
clearDiscussionFlowState();
|
|
763
|
+
clearDiscussionFlowState(base);
|
|
766
764
|
closeDatabase();
|
|
767
765
|
cleanup(base);
|
|
768
766
|
}
|
|
@@ -784,9 +782,7 @@ test("executeSummarySave requires verified root approval in deep mode", async ()
|
|
|
784
782
|
assert.match(blocked.content[0].text, /fail-closed/);
|
|
785
783
|
assert.equal(existsSync(join(base, ".gsd", "PROJECT.md")), false);
|
|
786
784
|
|
|
787
|
-
|
|
788
|
-
markApprovalGateVerified("depth_verification_project_confirm", base);
|
|
789
|
-
});
|
|
785
|
+
markApprovalGateVerified("depth_verification_project_confirm", base);
|
|
790
786
|
|
|
791
787
|
const unblocked = await inProjectDir(base, () => executeSummarySave({
|
|
792
788
|
artifact_type: "PROJECT",
|
|
@@ -797,7 +793,7 @@ test("executeSummarySave requires verified root approval in deep mode", async ()
|
|
|
797
793
|
assert.equal(unblocked.details.path, "PROJECT.md");
|
|
798
794
|
assert.ok(existsSync(join(base, ".gsd", "PROJECT.md")));
|
|
799
795
|
} finally {
|
|
800
|
-
clearDiscussionFlowState();
|
|
796
|
+
clearDiscussionFlowState(base);
|
|
801
797
|
closeDatabase();
|
|
802
798
|
cleanup(base);
|
|
803
799
|
}
|
|
@@ -807,9 +803,7 @@ test("executeSummarySave renders final REQUIREMENTS from the DB source of truth"
|
|
|
807
803
|
const base = makeTmpBase();
|
|
808
804
|
try {
|
|
809
805
|
openTestDb(base);
|
|
810
|
-
|
|
811
|
-
markApprovalGateVerified("depth_verification_requirements_confirm", base);
|
|
812
|
-
});
|
|
806
|
+
markApprovalGateVerified("depth_verification_requirements_confirm", base);
|
|
813
807
|
|
|
814
808
|
upsertRequirement({
|
|
815
809
|
id: "R001",
|
|
@@ -882,7 +876,7 @@ test("executeSummarySave renders final REQUIREMENTS from the DB source of truth"
|
|
|
882
876
|
.get("REQUIREMENTS.md") as Record<string, unknown>;
|
|
883
877
|
assert.equal(artifact.full_content, content);
|
|
884
878
|
} finally {
|
|
885
|
-
clearDiscussionFlowState();
|
|
879
|
+
clearDiscussionFlowState(base);
|
|
886
880
|
closeDatabase();
|
|
887
881
|
cleanup(base);
|
|
888
882
|
}
|
|
@@ -992,7 +986,7 @@ test("executeSummarySave CONTEXT HARD BLOCK clears after write-gate state file i
|
|
|
992
986
|
process.env.GSD_PERSIST_WRITE_GATE_STATE = "1";
|
|
993
987
|
try {
|
|
994
988
|
openTestDb(base);
|
|
995
|
-
clearDiscussionFlowState();
|
|
989
|
+
clearDiscussionFlowState(base);
|
|
996
990
|
|
|
997
991
|
// First call: CONTEXT artifact without depth verification → HARD BLOCK
|
|
998
992
|
const blocked = await inProjectDir(base, () => executeSummarySave({
|
|
@@ -1043,7 +1037,7 @@ test("executeSummarySave CONTEXT HARD BLOCK clears after write-gate state file i
|
|
|
1043
1037
|
} else {
|
|
1044
1038
|
process.env.GSD_PERSIST_WRITE_GATE_STATE = originalEnv;
|
|
1045
1039
|
}
|
|
1046
|
-
clearDiscussionFlowState();
|
|
1040
|
+
clearDiscussionFlowState(base);
|
|
1047
1041
|
closeDatabase();
|
|
1048
1042
|
cleanup(base);
|
|
1049
1043
|
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// GSD-2 + Workspace handle tests: createWorkspace and scopeMilestone
|
|
2
|
+
|
|
3
|
+
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import {
|
|
6
|
+
mkdtempSync,
|
|
7
|
+
mkdirSync,
|
|
8
|
+
rmSync,
|
|
9
|
+
realpathSync,
|
|
10
|
+
symlinkSync,
|
|
11
|
+
} from "node:fs";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
|
|
15
|
+
import { createWorkspace, scopeMilestone } from "../workspace.ts";
|
|
16
|
+
|
|
17
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
function makeProjectDir(): string {
|
|
20
|
+
const dir = realpathSync(mkdtempSync(join(tmpdir(), "gsd-ws-test-")));
|
|
21
|
+
mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
|
|
22
|
+
return dir;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ─── Tests ──────────────────────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
describe("createWorkspace", () => {
|
|
28
|
+
let projectDir: string;
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
projectDir = makeProjectDir();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("from a project root produces mode=project and worktreeRoot=null", () => {
|
|
39
|
+
const ws = createWorkspace(projectDir);
|
|
40
|
+
assert.equal(ws.mode, "project");
|
|
41
|
+
assert.equal(ws.worktreeRoot, null);
|
|
42
|
+
assert.equal(ws.projectRoot, realpathSync(projectDir));
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("from a worktree path produces mode=worktree, worktreeRoot=realpath, projectRoot=realpath of project", () => {
|
|
46
|
+
// Construct a worktree path: <projectDir>/.gsd/worktrees/M001
|
|
47
|
+
const worktreePath = join(projectDir, ".gsd", "worktrees", "M001");
|
|
48
|
+
mkdirSync(worktreePath, { recursive: true });
|
|
49
|
+
|
|
50
|
+
const ws = createWorkspace(worktreePath);
|
|
51
|
+
assert.equal(ws.mode, "worktree");
|
|
52
|
+
assert.equal(ws.worktreeRoot, realpathSync(worktreePath));
|
|
53
|
+
assert.equal(ws.projectRoot, realpathSync(projectDir));
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test("normalizes /foo and /foo/ to identical identityKey", () => {
|
|
57
|
+
const wsTrailing = createWorkspace(projectDir + "/");
|
|
58
|
+
const wsNoTrailing = createWorkspace(projectDir);
|
|
59
|
+
assert.equal(wsTrailing.identityKey, wsNoTrailing.identityKey);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("follows symlinks — identityKey matches realpath of target", (t) => {
|
|
63
|
+
const linkPath = join(tmpdir(), `gsd-ws-link-${Date.now()}`);
|
|
64
|
+
symlinkSync(projectDir, linkPath);
|
|
65
|
+
t.after(() => {
|
|
66
|
+
try { rmSync(linkPath); } catch { /* ignore */ }
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const ws = createWorkspace(linkPath);
|
|
70
|
+
assert.equal(ws.identityKey, realpathSync(projectDir));
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe("GsdWorkspace and MilestoneScope are frozen", () => {
|
|
75
|
+
let projectDir: string;
|
|
76
|
+
|
|
77
|
+
beforeEach(() => {
|
|
78
|
+
projectDir = makeProjectDir();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
afterEach(() => {
|
|
82
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("workspace is frozen", () => {
|
|
86
|
+
const ws = createWorkspace(projectDir);
|
|
87
|
+
assert.ok(Object.isFrozen(ws), "workspace should be frozen");
|
|
88
|
+
assert.throws(() => {
|
|
89
|
+
(ws as { mode: string }).mode = "worktree";
|
|
90
|
+
}, /Cannot assign/);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("scope is frozen", () => {
|
|
94
|
+
const ws = createWorkspace(projectDir);
|
|
95
|
+
const scope = scopeMilestone(ws, "M001");
|
|
96
|
+
assert.ok(Object.isFrozen(scope), "scope should be frozen");
|
|
97
|
+
assert.throws(() => {
|
|
98
|
+
(scope as { milestoneId: string }).milestoneId = "M999";
|
|
99
|
+
}, /Cannot assign/);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("contract inside workspace is frozen", () => {
|
|
103
|
+
const ws = createWorkspace(projectDir);
|
|
104
|
+
assert.ok(Object.isFrozen(ws.contract), "contract should be frozen");
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
describe("scopeMilestone path methods", () => {
|
|
109
|
+
let projectDir: string;
|
|
110
|
+
const MID = "M001";
|
|
111
|
+
|
|
112
|
+
beforeEach(() => {
|
|
113
|
+
projectDir = makeProjectDir();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
afterEach(() => {
|
|
117
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("produces correct paths for a known milestone ID", () => {
|
|
121
|
+
const ws = createWorkspace(projectDir);
|
|
122
|
+
const scope = scopeMilestone(ws, MID);
|
|
123
|
+
const gsd = ws.contract.projectGsd;
|
|
124
|
+
|
|
125
|
+
assert.equal(scope.milestoneId, MID);
|
|
126
|
+
assert.equal(scope.contextFile(), join(gsd, "milestones", MID, `${MID}-CONTEXT.md`));
|
|
127
|
+
assert.equal(scope.roadmapFile(), join(gsd, "milestones", MID, `${MID}-ROADMAP.md`));
|
|
128
|
+
assert.equal(scope.stateFile(), join(gsd, "STATE.md"));
|
|
129
|
+
assert.equal(scope.dbPath(), ws.contract.projectDb);
|
|
130
|
+
assert.equal(scope.milestoneDir(), join(gsd, "milestones", MID));
|
|
131
|
+
assert.equal(scope.metaJson(), join(gsd, `${MID}-META.json`));
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("two scopes from same workspace + same MID produce identical paths", () => {
|
|
135
|
+
const ws = createWorkspace(projectDir);
|
|
136
|
+
const scope1 = scopeMilestone(ws, MID);
|
|
137
|
+
const scope2 = scopeMilestone(ws, MID);
|
|
138
|
+
|
|
139
|
+
assert.equal(scope1.contextFile(), scope2.contextFile());
|
|
140
|
+
assert.equal(scope1.roadmapFile(), scope2.roadmapFile());
|
|
141
|
+
assert.equal(scope1.stateFile(), scope2.stateFile());
|
|
142
|
+
assert.equal(scope1.dbPath(), scope2.dbPath());
|
|
143
|
+
assert.equal(scope1.milestoneDir(), scope2.milestoneDir());
|
|
144
|
+
assert.equal(scope1.metaJson(), scope2.metaJson());
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe("createWorkspace: contract.projectGsd is realpath-canonicalized when basePath is a symlink", () => {
|
|
149
|
+
let projectDir: string;
|
|
150
|
+
let linkPath: string;
|
|
151
|
+
|
|
152
|
+
beforeEach(() => {
|
|
153
|
+
projectDir = makeProjectDir();
|
|
154
|
+
linkPath = join(tmpdir(), `gsd-ws-symlink-${Date.now()}`);
|
|
155
|
+
symlinkSync(projectDir, linkPath);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
afterEach(() => {
|
|
159
|
+
try { rmSync(linkPath); } catch { /* ignore */ }
|
|
160
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test("contract.projectGsd matches realpath of projectRoot when workspace is created via symlink", () => {
|
|
164
|
+
const ws = createWorkspace(linkPath);
|
|
165
|
+
|
|
166
|
+
const canonicalProjectRoot = realpathSync(projectDir);
|
|
167
|
+
|
|
168
|
+
// identityKey must be the realpath of the canonical project root
|
|
169
|
+
assert.equal(ws.identityKey, canonicalProjectRoot);
|
|
170
|
+
assert.equal(ws.projectRoot, canonicalProjectRoot);
|
|
171
|
+
|
|
172
|
+
// contract.projectGsd must start with the canonical project root —
|
|
173
|
+
// not with the symlink path. If the bug is present, contract.projectGsd
|
|
174
|
+
// would be linkPath + "/.gsd" instead of canonicalProjectRoot + "/.gsd".
|
|
175
|
+
assert.ok(
|
|
176
|
+
ws.contract.projectGsd.startsWith(canonicalProjectRoot),
|
|
177
|
+
`contract.projectGsd ("${ws.contract.projectGsd}") must be under the realpath'd projectRoot ("${canonicalProjectRoot}"), not the symlink path`,
|
|
178
|
+
);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test("contract.projectDb matches realpath of projectRoot when workspace is created via symlink", () => {
|
|
182
|
+
const ws = createWorkspace(linkPath);
|
|
183
|
+
const canonicalProjectRoot = realpathSync(projectDir);
|
|
184
|
+
|
|
185
|
+
assert.ok(
|
|
186
|
+
ws.contract.projectDb.startsWith(canonicalProjectRoot),
|
|
187
|
+
`contract.projectDb ("${ws.contract.projectDb}") must be under the realpath'd projectRoot ("${canonicalProjectRoot}")`,
|
|
188
|
+
);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
existsSync,
|
|
16
16
|
mkdirSync,
|
|
17
17
|
mkdtempSync,
|
|
18
|
+
readFileSync,
|
|
18
19
|
rmSync,
|
|
19
20
|
symlinkSync,
|
|
20
21
|
writeFileSync,
|
|
@@ -157,6 +158,18 @@ describe("#2823: reconcileWorktreeDb same-file guard", () => {
|
|
|
157
158
|
});
|
|
158
159
|
});
|
|
159
160
|
|
|
161
|
+
test("merge-time DB reconciliation only runs when legacy worktree DB exists", () => {
|
|
162
|
+
const src = readFileSync(join(import.meta.dirname, "..", "auto-worktree.ts"), "utf-8");
|
|
163
|
+
const reconcileIdx = src.indexOf("reconcileWorktreeDb(mainDbPath, worktreeDbPath)");
|
|
164
|
+
assert.ok(reconcileIdx !== -1, "merge-time reconcile call exists");
|
|
165
|
+
const guardWindow = src.slice(Math.max(0, reconcileIdx - 240), reconcileIdx);
|
|
166
|
+
|
|
167
|
+
assert.ok(
|
|
168
|
+
guardWindow.includes("existsSync(worktreeDbPath)") && guardWindow.includes("!isSamePath(worktreeDbPath, mainDbPath)"),
|
|
169
|
+
"merge-time reconcile requires a real legacy worktree DB and distinct DB paths",
|
|
170
|
+
);
|
|
171
|
+
});
|
|
172
|
+
|
|
160
173
|
// ─── Fix 3: infrastructure error classification ─────────────────────
|
|
161
174
|
|
|
162
175
|
describe("#2823: malformed DB classified as infrastructure error", () => {
|