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
|
@@ -14,7 +14,7 @@ import type { GSDPreferences } from "./preferences.js";
|
|
|
14
14
|
import type { UatType } from "./files.js";
|
|
15
15
|
import type { MinimalModelRegistry } from "./context-budget.js";
|
|
16
16
|
import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
|
|
17
|
-
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone
|
|
17
|
+
import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone } from "./gsd-db.js";
|
|
18
18
|
import { isClosedStatus } from "./status-guards.js";
|
|
19
19
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
20
20
|
|
|
@@ -35,7 +35,6 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from "
|
|
|
35
35
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
36
36
|
import { join } from "node:path";
|
|
37
37
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
38
|
-
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
39
38
|
import {
|
|
40
39
|
buildDiscussMilestonePrompt,
|
|
41
40
|
buildDiscussProjectPrompt,
|
|
@@ -78,6 +77,7 @@ import {
|
|
|
78
77
|
resolveDeepProjectSetupState,
|
|
79
78
|
type DeepProjectSetupStage,
|
|
80
79
|
} from "./deep-project-setup-policy.js";
|
|
80
|
+
import { annotateBackgroundable } from "./delegation-policy.js";
|
|
81
81
|
|
|
82
82
|
// ─── Types ────────────────────────────────────────────────────────────────
|
|
83
83
|
|
|
@@ -90,6 +90,12 @@ export type DispatchAction =
|
|
|
90
90
|
pauseAfterDispatch?: boolean;
|
|
91
91
|
/** Name of the matched dispatch rule from the unified registry (journal provenance). */
|
|
92
92
|
matchedRule?: string;
|
|
93
|
+
/**
|
|
94
|
+
* True when the matched unit type has a `good` verdict in delegation-policy.ts.
|
|
95
|
+
* Annotated in `resolveDispatch`. Consumers may use this to fork the prompt
|
|
96
|
+
* to a background sub-agent; default behavior is unchanged (synchronous).
|
|
97
|
+
*/
|
|
98
|
+
backgroundable?: boolean;
|
|
93
99
|
}
|
|
94
100
|
| { action: "stop"; reason: string; level: "info" | "warning" | "error"; matchedRule?: string }
|
|
95
101
|
| { action: "skip"; matchedRule?: string };
|
|
@@ -854,13 +860,9 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
854
860
|
// while a slice is still `is_sketch=1`, fall through to a standard
|
|
855
861
|
// plan-slice so the loop doesn't dead-end.
|
|
856
862
|
//
|
|
857
|
-
// Note on the flag-OFF downgrade:
|
|
858
|
-
//
|
|
859
|
-
//
|
|
860
|
-
// next iteration. That implicit coupling is the sole mechanism that
|
|
861
|
-
// reconciles `is_sketch=1` on the plan-slice path — do not remove the
|
|
862
|
-
// auto-heal without either adding an explicit `setSliceSketchFlag(..., false)`
|
|
863
|
-
// call here or doing so inside the plan-slice tool handler.
|
|
863
|
+
// Note on the flag-OFF downgrade: DB slice metadata is authoritative.
|
|
864
|
+
// PLAN.md is only a projection, so plan-slice/refine-slice handlers must
|
|
865
|
+
// explicitly clear `is_sketch` when a sketch becomes a full plan.
|
|
864
866
|
name: "refining → refine-slice",
|
|
865
867
|
match: async ({ state, mid, midTitle, basePath, prefs, sessionContextWindow, modelRegistry, sessionProvider }) => {
|
|
866
868
|
if (state.phase !== "refining") return null;
|
|
@@ -1239,15 +1241,6 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1239
1241
|
}
|
|
1240
1242
|
}
|
|
1241
1243
|
|
|
1242
|
-
const existingSummary = resolveMilestoneFile(basePath, mid, "SUMMARY");
|
|
1243
|
-
let summaryOutcome: "success" | "failure" | "unknown" = "unknown";
|
|
1244
|
-
if (existingSummary) {
|
|
1245
|
-
const summaryContent = await loadFile(existingSummary);
|
|
1246
|
-
if (summaryContent) {
|
|
1247
|
-
summaryOutcome = classifyMilestoneSummaryContent(summaryContent);
|
|
1248
|
-
}
|
|
1249
|
-
}
|
|
1250
|
-
|
|
1251
1244
|
// Safety guard (#2675): block completion when VALIDATION verdict is
|
|
1252
1245
|
// needs-remediation. The state machine treats needs-remediation as
|
|
1253
1246
|
// terminal (to prevent validate-milestone loops per #832), but
|
|
@@ -1330,48 +1323,6 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1330
1323
|
logWarning("dispatch", `verification class check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1331
1324
|
}
|
|
1332
1325
|
|
|
1333
|
-
// Disk/DB mismatch handling (#4658): SUMMARY presence alone is not enough.
|
|
1334
|
-
// Apply post-gate policy:
|
|
1335
|
-
// - success summary: reconcile DB and skip re-dispatch
|
|
1336
|
-
// - failure summary: pause/fail-closed
|
|
1337
|
-
// - unknown summary: pause/fail-closed
|
|
1338
|
-
if (existingSummary) {
|
|
1339
|
-
const milestone = isDbAvailable() ? getMilestone(mid) : null;
|
|
1340
|
-
const status = milestone?.status ?? (isDbAvailable() ? "missing" : "unavailable");
|
|
1341
|
-
|
|
1342
|
-
if (summaryOutcome === "success") {
|
|
1343
|
-
if (!isDbAvailable()) {
|
|
1344
|
-
logWarning("dispatch", `Milestone ${mid} SUMMARY indicates completion while DB is unavailable — skipping duplicate complete-milestone dispatch`);
|
|
1345
|
-
return { action: "skip" };
|
|
1346
|
-
}
|
|
1347
|
-
try {
|
|
1348
|
-
updateMilestoneStatus(mid, "complete", new Date().toISOString());
|
|
1349
|
-
logWarning("dispatch", `Milestone ${mid} SUMMARY indicates completion while DB status was "${status}" — reconciled DB to complete (#4658)`);
|
|
1350
|
-
return { action: "skip" };
|
|
1351
|
-
} catch (err) {
|
|
1352
|
-
return {
|
|
1353
|
-
action: "stop",
|
|
1354
|
-
level: "warning",
|
|
1355
|
-
reason: `Milestone ${mid} SUMMARY indicates completion but DB reconciliation failed (${err instanceof Error ? err.message : String(err)}). Auto-mode paused for manual review.`,
|
|
1356
|
-
};
|
|
1357
|
-
}
|
|
1358
|
-
}
|
|
1359
|
-
|
|
1360
|
-
if (summaryOutcome === "failure") {
|
|
1361
|
-
return {
|
|
1362
|
-
action: "stop",
|
|
1363
|
-
level: "warning",
|
|
1364
|
-
reason: `Milestone ${mid} has a failure-path SUMMARY while DB status is "${status}". Auto-mode will not promote completion from failure artifacts. Re-run complete-milestone only after blockers are resolved and verification passes.`,
|
|
1365
|
-
};
|
|
1366
|
-
}
|
|
1367
|
-
|
|
1368
|
-
return {
|
|
1369
|
-
action: "stop",
|
|
1370
|
-
level: "warning",
|
|
1371
|
-
reason: `Milestone ${mid} has an ambiguous SUMMARY while DB status is "${status}". Auto-mode paused instead of promoting completion from file presence alone.`,
|
|
1372
|
-
};
|
|
1373
|
-
}
|
|
1374
|
-
|
|
1375
1326
|
return {
|
|
1376
1327
|
action: "dispatch",
|
|
1377
1328
|
unitType: "complete-milestone",
|
|
@@ -1422,7 +1373,7 @@ export async function resolveDispatch(
|
|
|
1422
1373
|
// Delegate to registry when available
|
|
1423
1374
|
try {
|
|
1424
1375
|
const registry = getRegistry();
|
|
1425
|
-
return await registry.evaluateDispatch(ctx);
|
|
1376
|
+
return annotateBackgroundable(await registry.evaluateDispatch(ctx));
|
|
1426
1377
|
} catch (err) {
|
|
1427
1378
|
// Registry not initialized — fall back to inline loop
|
|
1428
1379
|
logWarning("dispatch", `registry dispatch failed, falling back to inline rules: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1432,7 +1383,7 @@ export async function resolveDispatch(
|
|
|
1432
1383
|
const result = await rule.match(ctx);
|
|
1433
1384
|
if (result) {
|
|
1434
1385
|
if (result.action !== "skip") result.matchedRule = rule.name;
|
|
1435
|
-
return result;
|
|
1386
|
+
return annotateBackgroundable(result);
|
|
1436
1387
|
}
|
|
1437
1388
|
}
|
|
1438
1389
|
|
|
@@ -1448,6 +1399,7 @@ export async function resolveDispatch(
|
|
|
1448
1399
|
};
|
|
1449
1400
|
}
|
|
1450
1401
|
|
|
1402
|
+
|
|
1451
1403
|
/** Exposed for testing — returns the rule names in evaluation order. */
|
|
1452
1404
|
export function getDispatchRuleNames(): string[] {
|
|
1453
1405
|
return DISPATCH_RULES.map((r) => r.name);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Post-unit processing for auto-loop — auto-commit, doctor run,
|
|
3
|
-
* state rebuild,
|
|
3
|
+
* state rebuild, projection checks, DB tool closeout, hooks, triage, and
|
|
4
4
|
* quick-task dispatch.
|
|
5
5
|
*
|
|
6
6
|
* Split into two functions called sequentially by auto-loop with
|
|
@@ -42,7 +42,8 @@ import {
|
|
|
42
42
|
} from "./auto-recovery.js";
|
|
43
43
|
import { regenerateIfMissing } from "./workflow-projections.js";
|
|
44
44
|
import { syncStateToProjectRoot } from "./auto-worktree.js";
|
|
45
|
-
import {
|
|
45
|
+
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
46
|
+
import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter } from "./gsd-db.js";
|
|
46
47
|
import { renderPlanCheckboxes } from "./markdown-renderer.js";
|
|
47
48
|
import { consumeSignal } from "./session-status-io.js";
|
|
48
49
|
import {
|
|
@@ -80,6 +81,12 @@ import {
|
|
|
80
81
|
} from "./project-research-policy.js";
|
|
81
82
|
import { validateArtifact } from "./schemas/validate.js";
|
|
82
83
|
|
|
84
|
+
// ─── Path Comparison Helper ───────────────────────────────────────────────
|
|
85
|
+
/** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
|
|
86
|
+
function isSamePathLocal(a: string, b: string): boolean {
|
|
87
|
+
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
88
|
+
}
|
|
89
|
+
|
|
83
90
|
/** Maximum verification retry attempts before escalating to blocker placeholder (#2653). */
|
|
84
91
|
const MAX_VERIFICATION_RETRIES = 3;
|
|
85
92
|
/** Keep failure toasts short while still showing concrete examples. */
|
|
@@ -160,9 +167,8 @@ export interface RogueFileWrite {
|
|
|
160
167
|
* the completion tool. A "rogue" file is one that exists on disk but has
|
|
161
168
|
* no corresponding DB row with status "complete".
|
|
162
169
|
*
|
|
163
|
-
* This is a safety-net diagnostic (D003).
|
|
164
|
-
*
|
|
165
|
-
* detection provides immediate diagnostics so operators know the prompt failed.
|
|
170
|
+
* This is a safety-net diagnostic (D003). Runtime detection never imports
|
|
171
|
+
* markdown into the DB; explicit migration/import/recovery commands own that.
|
|
166
172
|
*/
|
|
167
173
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
168
174
|
function hasNonEmptyFields(row: Record<string, any> | null, fields: string[]): boolean {
|
|
@@ -201,14 +207,7 @@ export function detectRogueFileWrites(
|
|
|
201
207
|
|
|
202
208
|
const dbRow = getSlice(mid, sid);
|
|
203
209
|
if (!dbRow || dbRow.status !== "complete") {
|
|
204
|
-
|
|
205
|
-
// match filesystem instead of reporting as rogue (#3633).
|
|
206
|
-
try {
|
|
207
|
-
updateSliceStatus(mid, sid, "complete", new Date().toISOString());
|
|
208
|
-
} catch {
|
|
209
|
-
// If DB update fails, fall back to rogue detection so the issue is visible
|
|
210
|
-
rogues.push({ path: summaryPath, unitType, unitId });
|
|
211
|
-
}
|
|
210
|
+
rogues.push({ path: summaryPath, unitType, unitId });
|
|
212
211
|
}
|
|
213
212
|
} else if (unitType === "plan-milestone") {
|
|
214
213
|
if (!mid) return [];
|
|
@@ -625,7 +624,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
625
624
|
});
|
|
626
625
|
|
|
627
626
|
// Sync worktree state back to project root (skipped for lightweight sidecars)
|
|
628
|
-
if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath
|
|
627
|
+
if (!opts?.skipWorktreeSync && s.originalBasePath && !isSamePathLocal(s.originalBasePath, s.basePath)) {
|
|
629
628
|
await runSafely("postUnit", "worktree-sync", () => {
|
|
630
629
|
syncStateToProjectRoot(s.basePath, s.originalBasePath!, s.currentMilestoneId);
|
|
631
630
|
});
|
|
@@ -738,7 +737,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
738
737
|
"error",
|
|
739
738
|
);
|
|
740
739
|
// Stop auto AND signal the outer postUnit flow to exit early.
|
|
741
|
-
// Without the flag, subsequent hooks (triage,
|
|
740
|
+
// Without the flag, subsequent hooks (triage,
|
|
742
741
|
// DB writes) would keep running against a conflicted main
|
|
743
742
|
// checkout after the loop was already told to stop.
|
|
744
743
|
const { stopAuto } = await import("./auto.js");
|
|
@@ -758,7 +757,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
758
757
|
}
|
|
759
758
|
});
|
|
760
759
|
// Exit early after stopAuto so the rest of post-unit processing
|
|
761
|
-
// (triage,
|
|
760
|
+
// (triage, hook dispatch, DB writes) doesn't run
|
|
762
761
|
// against a conflicted main checkout. Return "dispatched" to match
|
|
763
762
|
// the convention used by other stop/pauseAuto paths in this function
|
|
764
763
|
// (see signal handling earlier: stop/pause also return "dispatched").
|
|
@@ -813,17 +812,6 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
813
812
|
}
|
|
814
813
|
}
|
|
815
814
|
|
|
816
|
-
// Rogue file detection — safety net for LLM bypassing completion tools (D003)
|
|
817
|
-
try {
|
|
818
|
-
const rogueFiles = detectRogueFileWrites(s.currentUnit.type, s.currentUnit.id, s.basePath);
|
|
819
|
-
for (const rogue of rogueFiles) {
|
|
820
|
-
logWarning("engine", "rogue file write detected", { path: rogue.path, unitId: rogue.unitId });
|
|
821
|
-
ctx.ui.notify(`Rogue file write detected: ${rogue.path}`, "warning");
|
|
822
|
-
}
|
|
823
|
-
} catch (e) {
|
|
824
|
-
debugLog("postUnit", { phase: "rogue-detection", error: String(e) });
|
|
825
|
-
}
|
|
826
|
-
|
|
827
815
|
// ── Safety harness: post-unit validation ──
|
|
828
816
|
try {
|
|
829
817
|
const { loadEffectiveGSDPreferences } = await import("./preferences.js");
|
|
@@ -855,18 +855,11 @@ export async function bootstrapAutoSession(
|
|
|
855
855
|
const gsdDbPath = resolveProjectRootDbPath(s.basePath);
|
|
856
856
|
const gsdDirPath = join(s.basePath, ".gsd");
|
|
857
857
|
if (existsSync(gsdDirPath) && !existsSync(gsdDbPath)) {
|
|
858
|
-
const hasDecisions = existsSync(join(gsdDirPath, "DECISIONS.md"));
|
|
859
|
-
const hasRequirements = existsSync(join(gsdDirPath, "REQUIREMENTS.md"));
|
|
860
|
-
const hasMilestones = existsSync(join(gsdDirPath, "milestones"));
|
|
861
858
|
try {
|
|
862
859
|
const { openDatabase: openDb } = await import("./gsd-db.js");
|
|
863
860
|
openDb(gsdDbPath);
|
|
864
|
-
if (hasDecisions || hasRequirements || hasMilestones) {
|
|
865
|
-
const { migrateFromMarkdown } = await import("./md-importer.js");
|
|
866
|
-
migrateFromMarkdown(s.basePath);
|
|
867
|
-
}
|
|
868
861
|
} catch (err) {
|
|
869
|
-
logError("engine", `
|
|
862
|
+
logError("engine", `failed to initialize project database: ${(err as Error).message}`);
|
|
870
863
|
}
|
|
871
864
|
}
|
|
872
865
|
if (existsSync(gsdDbPath) && !isDbAvailable()) {
|