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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* complete-task handler — the core operation behind gsd_complete_task.
|
|
3
3
|
*
|
|
4
|
-
* Validates inputs, writes task row to DB in a
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Validates inputs, writes task row and rendered SUMMARY.md to DB in a
|
|
5
|
+
* transaction, then renders projections to disk and invalidates caches.
|
|
6
|
+
* Projection write failures are reported as stale projections and do not roll
|
|
7
|
+
* back committed DB state.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { join } from "node:path";
|
|
@@ -22,13 +22,12 @@ import {
|
|
|
22
22
|
getSlice,
|
|
23
23
|
getTask,
|
|
24
24
|
updateTaskStatus,
|
|
25
|
-
setTaskSummaryMd,
|
|
26
25
|
deleteVerificationEvidence,
|
|
27
26
|
saveGateResult,
|
|
28
27
|
getPendingGatesForTurn,
|
|
29
28
|
} from "../gsd-db.js";
|
|
30
29
|
import { getGatesForTurn } from "../gate-registry.js";
|
|
31
|
-
import {
|
|
30
|
+
import { resolveTasksDir, clearPathCache } from "../paths.js";
|
|
32
31
|
import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
33
32
|
import { saveFile, clearParseCache } from "../files.js";
|
|
34
33
|
import { invalidateStateCache } from "../state.js";
|
|
@@ -168,6 +167,7 @@ export async function handleCompleteTask(
|
|
|
168
167
|
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
169
168
|
const completedAt = new Date().toISOString();
|
|
170
169
|
let guardError: string | null = null;
|
|
170
|
+
let summaryMd = "";
|
|
171
171
|
|
|
172
172
|
// ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
|
|
173
173
|
// Building the artifact runs the full shape validation (2-4 options, unique
|
|
@@ -237,6 +237,9 @@ export async function handleCompleteTask(
|
|
|
237
237
|
}
|
|
238
238
|
|
|
239
239
|
// All guards passed — perform writes
|
|
240
|
+
const taskRow = paramsToTaskRow(params, completedAt);
|
|
241
|
+
summaryMd = renderSummaryContent(taskRow, params.sliceId, params.milestoneId, params.verificationEvidence ?? []);
|
|
242
|
+
|
|
240
243
|
insertMilestone({ id: params.milestoneId, title: params.milestoneId });
|
|
241
244
|
insertSlice({ id: params.sliceId, milestoneId: params.milestoneId, title: params.sliceId });
|
|
242
245
|
insertTask({
|
|
@@ -254,6 +257,7 @@ export async function handleCompleteTask(
|
|
|
254
257
|
knownIssues: params.knownIssues ?? "None.",
|
|
255
258
|
keyFiles: params.keyFiles ?? [],
|
|
256
259
|
keyDecisions: params.keyDecisions ?? [],
|
|
260
|
+
fullSummaryMd: summaryMd,
|
|
257
261
|
});
|
|
258
262
|
|
|
259
263
|
for (const evidence of (params.verificationEvidence ?? [])) {
|
|
@@ -301,13 +305,7 @@ export async function handleCompleteTask(
|
|
|
301
305
|
return { error: guardError };
|
|
302
306
|
}
|
|
303
307
|
|
|
304
|
-
|
|
305
|
-
// If disk render fails, roll back the DB status so deriveState() and
|
|
306
|
-
// verifyExpectedArtifact() stay consistent (both say "not done").
|
|
307
|
-
|
|
308
|
-
// Render summary markdown via the single source of truth (#2720)
|
|
309
|
-
const taskRow = paramsToTaskRow(params, completedAt);
|
|
310
|
-
const summaryMd = renderSummaryContent(taskRow, params.sliceId, params.milestoneId, params.verificationEvidence ?? []);
|
|
308
|
+
let projectionStale = false;
|
|
311
309
|
|
|
312
310
|
// Resolve and write summary to disk
|
|
313
311
|
let summaryPath: string;
|
|
@@ -325,30 +323,16 @@ export async function handleCompleteTask(
|
|
|
325
323
|
try {
|
|
326
324
|
await saveFile(summaryPath, summaryMd);
|
|
327
325
|
|
|
328
|
-
// Toggle plan
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
await renderPlanCheckboxes(basePath, params.milestoneId, params.sliceId);
|
|
332
|
-
} else {
|
|
333
|
-
process.stderr.write(
|
|
334
|
-
`gsd-db: complete_task — could not find plan file for ${params.sliceId}/${params.milestoneId}, skipping checkbox toggle\n`,
|
|
335
|
-
);
|
|
336
|
-
}
|
|
326
|
+
// Toggle or regenerate the plan projection from DB. Missing projection
|
|
327
|
+
// files are rebuilt by the renderer instead of being skipped.
|
|
328
|
+
await renderPlanCheckboxes(basePath, params.milestoneId, params.sliceId);
|
|
337
329
|
} catch (renderErr) {
|
|
338
|
-
|
|
339
|
-
logWarning("
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
// Without this, retries accumulate duplicate evidence rows (#2724).
|
|
343
|
-
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
344
|
-
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
|
|
345
|
-
invalidateStateCache();
|
|
346
|
-
return { error: `disk render failed: ${(renderErr as Error).message}` };
|
|
330
|
+
projectionStale = true;
|
|
331
|
+
logWarning("projection", `complete_task projection write failed for ${params.milestoneId}/${params.sliceId}/${params.taskId}; DB completion remains committed`, {
|
|
332
|
+
error: (renderErr as Error).message,
|
|
333
|
+
});
|
|
347
334
|
}
|
|
348
335
|
|
|
349
|
-
// Store rendered markdown in DB for D004 recovery
|
|
350
|
-
setTaskSummaryMd(params.milestoneId, params.sliceId, params.taskId, summaryMd);
|
|
351
|
-
|
|
352
336
|
// ── Close gates owned by execute-task (Q5/Q6/Q7) for this task ────────
|
|
353
337
|
// Each gate id maps to a specific params field via taskGateFieldForId.
|
|
354
338
|
// When the model populates the field, record `pass`; when it's empty,
|
|
@@ -471,5 +455,6 @@ export async function handleCompleteTask(
|
|
|
471
455
|
sliceId: params.sliceId,
|
|
472
456
|
milestoneId: params.milestoneId,
|
|
473
457
|
summaryPath,
|
|
458
|
+
...(projectionStale ? { stale: true } : {}),
|
|
474
459
|
};
|
|
475
460
|
}
|
|
@@ -14,7 +14,6 @@ import { join } from "node:path";
|
|
|
14
14
|
import {
|
|
15
15
|
transaction,
|
|
16
16
|
insertAssessment,
|
|
17
|
-
deleteAssessmentByScope,
|
|
18
17
|
getMilestoneSlices,
|
|
19
18
|
} from "../gsd-db.js";
|
|
20
19
|
import { resolveMilestonePath, clearPathCache } from "../paths.js";
|
|
@@ -45,6 +44,7 @@ export interface ValidateMilestoneResult {
|
|
|
45
44
|
milestoneId: string;
|
|
46
45
|
verdict: string;
|
|
47
46
|
validationPath: string;
|
|
47
|
+
stale?: boolean;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
export interface ValidateMilestoneOptions {
|
|
@@ -150,13 +150,14 @@ export async function handleValidateMilestone(
|
|
|
150
150
|
});
|
|
151
151
|
|
|
152
152
|
// ── Filesystem render (outside transaction) ────────────────────────────
|
|
153
|
-
|
|
153
|
+
let projectionStale = false;
|
|
154
154
|
try {
|
|
155
155
|
await saveFile(validationPath, validationMd);
|
|
156
156
|
} catch (renderErr) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
157
|
+
projectionStale = true;
|
|
158
|
+
logWarning("projection", `validate_milestone projection write failed for ${params.milestoneId}; DB validation remains committed`, {
|
|
159
|
+
error: (renderErr as Error).message,
|
|
160
|
+
});
|
|
160
161
|
}
|
|
161
162
|
|
|
162
163
|
invalidateStateCache();
|
|
@@ -202,5 +203,6 @@ export async function handleValidateMilestone(
|
|
|
202
203
|
milestoneId: params.milestoneId,
|
|
203
204
|
verdict: params.verdict,
|
|
204
205
|
validationPath,
|
|
206
|
+
...(projectionStale ? { stale: true } : {}),
|
|
205
207
|
};
|
|
206
208
|
}
|
|
@@ -76,7 +76,9 @@ export function snapshotState(): StateManifest {
|
|
|
76
76
|
// Wrap all reads in a deferred transaction so the snapshot is consistent
|
|
77
77
|
// (all SELECTs see the same DB state even if a concurrent write lands between them).
|
|
78
78
|
return readTransaction(() => {
|
|
79
|
-
const rawMilestones = db.prepare(
|
|
79
|
+
const rawMilestones = db.prepare(
|
|
80
|
+
"SELECT * FROM milestones ORDER BY CASE WHEN sequence > 0 THEN 0 ELSE 1 END, sequence, id",
|
|
81
|
+
).all() as Record<string, unknown>[];
|
|
80
82
|
const milestones: MilestoneRow[] = rawMilestones.map((r) => ({
|
|
81
83
|
id: r["id"] as string,
|
|
82
84
|
title: r["title"] as string,
|
|
@@ -95,6 +97,7 @@ export function snapshotState(): StateManifest {
|
|
|
95
97
|
definition_of_done: JSON.parse((r["definition_of_done"] as string) || "[]"),
|
|
96
98
|
requirement_coverage: (r["requirement_coverage"] as string) ?? "",
|
|
97
99
|
boundary_map_markdown: (r["boundary_map_markdown"] as string) ?? "",
|
|
100
|
+
sequence: Number(r["sequence"] ?? 0),
|
|
98
101
|
}));
|
|
99
102
|
|
|
100
103
|
const rawSlices = db.prepare("SELECT * FROM slices ORDER BY milestone_id, sequence, id").all() as Record<string, unknown>[];
|
|
@@ -29,29 +29,13 @@ function getAuthModeSafe(
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
function hasClaudeCodeProvider(ctx: WorkflowMcpAutoPrepContext): boolean {
|
|
33
|
-
return getAuthModeSafe(ctx, "claude-code") === "externalCli";
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function isClaudeCodeProviderReady(ctx: WorkflowMcpAutoPrepContext): boolean {
|
|
37
|
-
const readyCheck = ctx.modelRegistry?.isProviderRequestReady;
|
|
38
|
-
if (typeof readyCheck !== "function") return false;
|
|
39
|
-
try {
|
|
40
|
-
return readyCheck("claude-code");
|
|
41
|
-
} catch {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
32
|
export function shouldAutoPrepareWorkflowMcp(ctx: WorkflowMcpAutoPrepContext): boolean {
|
|
47
33
|
const provider = ctx.model?.provider;
|
|
48
34
|
const baseUrl = ctx.model?.baseUrl;
|
|
49
35
|
const authMode = getAuthModeSafe(ctx, provider);
|
|
50
36
|
|
|
51
|
-
if (
|
|
52
|
-
|
|
53
|
-
if (hasClaudeCodeProvider(ctx)) return true;
|
|
54
|
-
return isClaudeCodeProviderReady(ctx);
|
|
37
|
+
if (provider !== "claude-code") return false;
|
|
38
|
+
return usesWorkflowMcpTransport(authMode as any, baseUrl) || authMode === "externalCli";
|
|
55
39
|
}
|
|
56
40
|
|
|
57
41
|
export function prepareWorkflowMcpForProject(
|
|
@@ -349,9 +349,9 @@ export function getRequiredWorkflowToolsForAutoUnit(unitType: string): string[]
|
|
|
349
349
|
case "execute-task":
|
|
350
350
|
case "execute-task-simple":
|
|
351
351
|
case "reactive-execute":
|
|
352
|
-
return ["
|
|
352
|
+
return ["gsd_task_complete"];
|
|
353
353
|
case "complete-slice":
|
|
354
|
-
return ["
|
|
354
|
+
return ["gsd_slice_complete"];
|
|
355
355
|
case "replan-slice":
|
|
356
356
|
return ["gsd_replan_slice"];
|
|
357
357
|
case "reassess-roadmap":
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from "./gsd-db.js";
|
|
21
21
|
import { isClosedStatus } from "./status-guards.js";
|
|
22
22
|
import { invalidateStateCache } from "./state.js";
|
|
23
|
-
import { clearPathCache } from "./paths.js";
|
|
23
|
+
import { clearPathCache, resolveGsdPathContract } from "./paths.js";
|
|
24
24
|
import { clearParseCache } from "./files.js";
|
|
25
25
|
import { writeManifest } from "./workflow-manifest.js";
|
|
26
26
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
@@ -492,7 +492,7 @@ function _reconcileWorktreeLogsInner(
|
|
|
492
492
|
atomicWriteSync(join(mainBasePath, ".gsd", "event-log.jsonl"), logContent);
|
|
493
493
|
|
|
494
494
|
// Step 8: Replay into DB (wrapped in a transaction by replayEvents)
|
|
495
|
-
openDatabase(
|
|
495
|
+
openDatabase(resolveGsdPathContract(mainBasePath).projectDb);
|
|
496
496
|
replayEvents(merged);
|
|
497
497
|
|
|
498
498
|
// Step 9: Write manifest
|
|
@@ -647,7 +647,7 @@ export function resolveConflict(
|
|
|
647
647
|
writeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
|
|
648
648
|
|
|
649
649
|
// Replay resolved events through the DB (updates DB state)
|
|
650
|
-
openDatabase(
|
|
650
|
+
openDatabase(resolveGsdPathContract(basePath).projectDb);
|
|
651
651
|
replayEvents(eventsToReplay);
|
|
652
652
|
invalidateStateCache();
|
|
653
653
|
clearPathCache();
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// GSD-2 + Workspace handle: single source of truth for path resolution per milestone
|
|
2
|
+
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { type GsdPathContract, resolveGsdPathContract, normalizeRealPath } from "./paths.js";
|
|
5
|
+
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
6
|
+
|
|
7
|
+
export type GsdWorkspaceMode = "project" | "worktree";
|
|
8
|
+
|
|
9
|
+
export interface GsdWorkspace {
|
|
10
|
+
readonly projectRoot: string; // realpath-normalized absolute
|
|
11
|
+
readonly worktreeRoot: string | null; // realpath-normalized absolute, null when no worktree
|
|
12
|
+
readonly mode: GsdWorkspaceMode;
|
|
13
|
+
readonly contract: GsdPathContract; // pre-resolved, frozen
|
|
14
|
+
readonly identityKey: string; // canonical key (realpath of projectRoot) for dedup/cache
|
|
15
|
+
readonly lockRoot: string; // where auto.lock and {MID}-META.json live (always projectRoot)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface MilestoneScope {
|
|
19
|
+
readonly workspace: GsdWorkspace;
|
|
20
|
+
readonly milestoneId: string;
|
|
21
|
+
// path methods:
|
|
22
|
+
readonly contextFile: () => string;
|
|
23
|
+
readonly roadmapFile: () => string;
|
|
24
|
+
readonly stateFile: () => string;
|
|
25
|
+
readonly dbPath: () => string;
|
|
26
|
+
readonly milestoneDir: () => string;
|
|
27
|
+
readonly metaJson: () => string; // {MID}-META.json on lockRoot
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function tryRealpath(p: string): string {
|
|
31
|
+
return normalizeRealPath(p);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Create an immutable GsdWorkspace handle from a raw base path.
|
|
36
|
+
* Resolves both the project root and (when applicable) the worktree root,
|
|
37
|
+
* normalizes them via realpath, and freezes the result.
|
|
38
|
+
*/
|
|
39
|
+
export function createWorkspace(rawBasePath: string): GsdWorkspace {
|
|
40
|
+
const resolvedBase = resolve(rawBasePath);
|
|
41
|
+
const isWorktree = isGsdWorktreePath(resolvedBase);
|
|
42
|
+
|
|
43
|
+
const projectRootRaw = resolveWorktreeProjectRoot(resolvedBase);
|
|
44
|
+
const projectRoot = tryRealpath(resolve(projectRootRaw));
|
|
45
|
+
|
|
46
|
+
const worktreeRoot = isWorktree ? tryRealpath(resolvedBase) : null;
|
|
47
|
+
|
|
48
|
+
// Derive a canonical base from the already-realpath-normalized paths so that
|
|
49
|
+
// resolveGsdPathContract always receives a canonical path. Using the raw
|
|
50
|
+
// resolvedBase here can produce a non-canonical projectGsd when the input
|
|
51
|
+
// path contains symlinks, causing contract.projectGsd to diverge from the
|
|
52
|
+
// realpath-normalized projectRoot / identityKey.
|
|
53
|
+
const canonicalBase = isWorktree ? (worktreeRoot ?? resolvedBase) : projectRoot;
|
|
54
|
+
const contract = Object.freeze(resolveGsdPathContract(canonicalBase));
|
|
55
|
+
|
|
56
|
+
const identityKey = tryRealpath(projectRoot);
|
|
57
|
+
|
|
58
|
+
const mode: GsdWorkspaceMode = isWorktree ? "worktree" : "project";
|
|
59
|
+
|
|
60
|
+
const workspace: GsdWorkspace = Object.freeze({
|
|
61
|
+
projectRoot,
|
|
62
|
+
worktreeRoot,
|
|
63
|
+
mode,
|
|
64
|
+
contract,
|
|
65
|
+
identityKey,
|
|
66
|
+
lockRoot: projectRoot,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return workspace;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Bind a milestoneId to a workspace, producing an immutable MilestoneScope
|
|
74
|
+
* with path-returning closures that resolve via the authoritative projectGsd.
|
|
75
|
+
*
|
|
76
|
+
* All milestone-content paths route to contract.projectGsd (canonical),
|
|
77
|
+
* since that is the authoritative source of truth regardless of worktree mode.
|
|
78
|
+
*/
|
|
79
|
+
export function scopeMilestone(workspace: GsdWorkspace, milestoneId: string): MilestoneScope {
|
|
80
|
+
const { contract } = workspace;
|
|
81
|
+
const gsd = contract.projectGsd;
|
|
82
|
+
|
|
83
|
+
const scope: MilestoneScope = Object.freeze({
|
|
84
|
+
workspace,
|
|
85
|
+
milestoneId,
|
|
86
|
+
contextFile: () => join(gsd, "milestones", milestoneId, `${milestoneId}-CONTEXT.md`),
|
|
87
|
+
roadmapFile: () => join(gsd, "milestones", milestoneId, `${milestoneId}-ROADMAP.md`),
|
|
88
|
+
stateFile: () => join(gsd, "STATE.md"),
|
|
89
|
+
dbPath: () => contract.projectDb,
|
|
90
|
+
milestoneDir: () => join(gsd, "milestones", milestoneId),
|
|
91
|
+
metaJson: () => join(gsd, `${milestoneId}-META.json`),
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
return scope;
|
|
95
|
+
}
|
|
@@ -15,7 +15,7 @@ import { loadPrompt } from "./prompt-loader.js";
|
|
|
15
15
|
import { autoCommitCurrentBranch, getMainBranch, resolveGitHeadPath, nudgeGitBranchCache } from "./worktree.js";
|
|
16
16
|
import { runWorktreePostCreateHook } from "./auto-worktree.js";
|
|
17
17
|
import { showConfirm } from "../shared/tui.js";
|
|
18
|
-
import { gsdRoot, milestonesDir } from "./paths.js";
|
|
18
|
+
import { gsdRoot, milestonesDir, resolveGsdPathContract } from "./paths.js";
|
|
19
19
|
import {
|
|
20
20
|
createWorktree,
|
|
21
21
|
listWorktrees,
|
|
@@ -651,8 +651,9 @@ async function handleMerge(
|
|
|
651
651
|
const commitMessage = `${commitType}: merge worktree ${name}\n\nGSD-Worktree: ${name}`;
|
|
652
652
|
|
|
653
653
|
// Reconcile worktree DB into main DB before squash merge
|
|
654
|
-
const
|
|
655
|
-
const
|
|
654
|
+
const contract = resolveGsdPathContract(worktreePath(basePath, name), basePath);
|
|
655
|
+
const wtDbPath = join(contract.worktreeGsd ?? join(contract.workRoot, ".gsd"), "gsd.db");
|
|
656
|
+
const mainDbPath = contract.projectDb;
|
|
656
657
|
if (existsSync(wtDbPath) && existsSync(mainDbPath)) {
|
|
657
658
|
try {
|
|
658
659
|
const { reconcileWorktreeDb } = await import("./gsd-db.js");
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// GSD-2 — WorktreeResolver: encapsulates worktree path state and merge/exit lifecycle.
|
|
1
2
|
/**
|
|
2
3
|
* WorktreeResolver — encapsulates worktree path state and merge/exit lifecycle.
|
|
3
4
|
*
|
|
@@ -23,7 +24,20 @@ import { emitJournalEvent } from "./journal.js";
|
|
|
23
24
|
import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
|
|
24
25
|
import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain } from "./slice-cadence.js";
|
|
25
26
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
26
|
-
import { resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
27
|
+
import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
28
|
+
|
|
29
|
+
// ─── Path Comparison Helper ────────────────────────────────────────────────
|
|
30
|
+
/**
|
|
31
|
+
* Compare two paths for physical identity, tolerating trailing slashes,
|
|
32
|
+
* symlink differences, and case variations on case-insensitive volumes.
|
|
33
|
+
*
|
|
34
|
+
* Used in place of string `===` / `!==` wherever one operand may be
|
|
35
|
+
* realpath-normalised (e.g. from the workspace registry) and the other
|
|
36
|
+
* may not be (e.g. a raw caller-supplied basePath).
|
|
37
|
+
*/
|
|
38
|
+
function isSamePath(a: string, b: string): boolean {
|
|
39
|
+
return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
|
|
40
|
+
}
|
|
27
41
|
|
|
28
42
|
// ─── Dependency Interface ──────────────────────────────────────────────────
|
|
29
43
|
|
|
@@ -589,7 +603,7 @@ export class WorktreeResolver {
|
|
|
589
603
|
milestoneId,
|
|
590
604
|
"ROADMAP",
|
|
591
605
|
);
|
|
592
|
-
if (!roadmapPath && this.s.basePath
|
|
606
|
+
if (!roadmapPath && !isSamePath(this.s.basePath, originalBase)) {
|
|
593
607
|
roadmapPath = this.deps.resolveMilestoneFile(
|
|
594
608
|
this.s.basePath,
|
|
595
609
|
milestoneId,
|
|
@@ -91,9 +91,9 @@ function matchesBlockedPattern(path: string): boolean {
|
|
|
91
91
|
* Directs the agent to use engine tool calls instead.
|
|
92
92
|
*/
|
|
93
93
|
export const BLOCKED_WRITE_ERROR = `Direct writes to .gsd/STATE.md and .gsd/gsd.db are blocked. Use engine tool calls instead:
|
|
94
|
-
- To complete a task: call
|
|
95
|
-
- To complete a slice: call
|
|
96
|
-
- To save a decision: call
|
|
94
|
+
- To complete a task: call gsd_task_complete(milestone_id, slice_id, task_id, summary)
|
|
95
|
+
- To complete a slice: call gsd_slice_complete(milestone_id, slice_id, summary, uat_result)
|
|
96
|
+
- To save a decision: call gsd_decision_save(scope, decision, choice, rationale)
|
|
97
97
|
- To start a task: call gsd_start_task(milestone_id, slice_id, task_id)
|
|
98
98
|
- To record verification: call gsd_record_verification(milestone_id, slice_id, task_id, evidence)
|
|
99
99
|
- To report a blocker: call gsd_report_blocker(milestone_id, slice_id, task_id, description)`;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
exports.id=8527,exports.ids=[8527],exports.modules={18527:(a,b,c)=>{"use strict";c.d(b,{isOnboardingComplete:()=>l,readOnboardingRecord:()=>k});var d=c(73024),e=c(76760);c(77598);var f=c(16698),g=c(48161);c(31421),process.env.GSD_ENABLE_NATIVE_GSD_PARSER,Symbol("native-unavailable"),new f.AsyncLocalStorage,c(89134),Object.values({Q3:{id:"Q3",scope:"slice",ownerTurn:"gate-evaluate",question:"How can this be exploited?",guidance:"Identify abuse scenarios: parameter tampering, replay attacks, privilege escalation.\nMap data exposure risks: PII, tokens, secrets accessible through this slice.\nDefine input trust boundaries: untrusted user input reaching DB, API, or filesystem.\nIf none apply, return verdict 'omitted' with rationale explaining why.",promptSection:"Abuse Surface"},Q4:{id:"Q4",scope:"slice",ownerTurn:"gate-evaluate",question:"Which existing requirements (R-IDs) does this slice touch, and which must be re-tested?",guidance:"List the R-IDs (e.g. R001, R003) touched by this slice; see the milestone requirements artifact at .gsd/milestones/<id>/REQUIREMENTS.md.\nIdentify what must be re-tested after shipping.\nFlag decisions that should be revisited given the new scope.\nIf no existing requirements are affected, return verdict 'omitted'.",promptSection:"Broken Promises"},Q5:{id:"Q5",scope:"task",ownerTurn:"execute-task",question:"What breaks when dependencies fail?",guidance:"Enumerate the task's external dependencies (APIs, filesystem, network, subprocesses).\nDescribe the failure path for each: timeout, malformed response, connection loss.\nVerify the implementation handles each failure or explicitly bubbles the error.\nReturn verdict 'omitted' only if the task has no external dependencies.",promptSection:"Failure Modes"},Q6:{id:"Q6",scope:"task",ownerTurn:"execute-task",question:"What is the 10x load breakpoint?",guidance:"Identify the resource that saturates first at 10x the expected load.\nDescribe the protection applied (pool sizing, rate limiting, pagination, caching).\nReturn verdict 'omitted' if the task has no runtime load dimension.",promptSection:"Load Profile"},Q7:{id:"Q7",scope:"task",ownerTurn:"execute-task",question:"What negative tests protect this task?",guidance:"List malformed inputs, error paths, and boundary conditions the tests cover.\nPoint to the specific test files or cases that assert each negative scenario.\nReturn verdict 'omitted' only if the task has no meaningful negative surface.",promptSection:"Negative Tests"},Q8:{id:"Q8",scope:"slice",ownerTurn:"complete-slice",question:"How will ops know this slice is healthy or broken?",guidance:"Describe the health signal (metric, log line, dashboard) that proves the slice works.\nDescribe the failure signal that triggers an alert or paging.\nDocument the recovery procedure and any monitoring gaps.\nReturn verdict 'omitted' only for slices with no runtime behavior at all.",promptSection:"Operational Readiness"},MV01:{id:"MV01",scope:"milestone",ownerTurn:"validate-milestone",question:"Is every success criterion in the milestone roadmap satisfied?",guidance:"Walk the success-criteria checklist from the milestone roadmap.\nFor each criterion, point to the slice / assessment / verification evidence that proves it.\nReturn verdict 'flag' if any criterion is unmet or unverifiable.",promptSection:"Success Criteria Checklist"},MV02:{id:"MV02",scope:"milestone",ownerTurn:"validate-milestone",question:"Does every slice have a SUMMARY.md and a passing assessment?",guidance:"Confirm every slice listed in the roadmap has a SUMMARY.md.\nConfirm each slice has an ASSESSMENT verdict of 'pass' (or justified 'omitted').\nFlag missing artifacts and slices with outstanding follow-ups or known limitations.",promptSection:"Slice Delivery Audit"},MV03:{id:"MV03",scope:"milestone",ownerTurn:"validate-milestone",question:"Do the slices integrate end-to-end?",guidance:"Trace at least one cross-slice flow proving the pieces compose.\nFlag gaps where two slices were built in isolation with no integration evidence.",promptSection:"Cross-Slice Integration"},MV04:{id:"MV04",scope:"milestone",ownerTurn:"validate-milestone",question:"Are all touched requirements covered and still coherent?",guidance:"For each requirement advanced, validated, surfaced, or invalidated across the milestone's slices, confirm the milestone-level evidence matches.\nFlag requirements that slices claim to advance but no artifact proves.",promptSection:"Requirement Coverage"}});let h=process.env.GSD_CODING_AGENT_DIR||(0,e.join)(process.env.GSD_HOME?(0,e.resolve)(process.env.GSD_HOME):(0,e.join)((0,g.homedir)(),".gsd"),"agent"),i=(0,e.join)(h,"onboarding.json"),j={version:1,flowVersion:1,completedAt:null,completedSteps:[],skippedSteps:[],lastResumePoint:null};function k(){if(!(0,d.existsSync)(i))return{...j};try{let a=JSON.parse((0,d.readFileSync)(i,"utf-8"));return{version:"number"==typeof a.version?a.version:1,flowVersion:"number"==typeof a.flowVersion?a.flowVersion:0,completedAt:"string"==typeof a.completedAt?a.completedAt:null,completedSteps:Array.isArray(a.completedSteps)?a.completedSteps.filter(a=>"string"==typeof a):[],skippedSteps:Array.isArray(a.skippedSteps)?a.skippedSteps.filter(a=>"string"==typeof a):[],lastResumePoint:"string"==typeof a.lastResumePoint?a.lastResumePoint:null}}catch{return{...j}}}function l(){let a=k();return null!==a.completedAt&&1===a.flowVersion}},65168:a=>{function b(a){var b=Error("Cannot find module '"+a+"'");throw b.code="MODULE_NOT_FOUND",b}b.keys=()=>[],b.resolve=b,b.id=65168,a.exports=b},89134:(a,b,c)=>{"use strict";c.d(b,{DZ:()=>e,rs:()=>d});let d="GSD_GIT_ERROR";class e extends Error{constructor(a,b,c){super(b,c),this.name="GSDError",this.code=a}}}};
|
|
File without changes
|
|
File without changes
|