@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.955e4da0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/help-text.js +5 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/bg-shell/utilities.js +2 -2
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +92 -230
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
- package/dist/resources/extensions/gsd/auto/phases.js +34 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +12 -9
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +20 -36
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +32 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +4 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +34 -289
- package/dist/resources/extensions/gsd/auto.js +15 -14
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +131 -140
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +89 -8
- package/dist/resources/extensions/gsd/captures.js +5 -13
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +372 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +8 -10
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +9 -2
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
- package/dist/resources/extensions/gsd/guided-flow.js +68 -471
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -1
- package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/migrate/safety.js +19 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +7 -5
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/paths.js +10 -24
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +12 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +13 -5
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -5
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/uat-policy.js +16 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
- package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +287 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +17 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -10
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-cmd.js +20 -0
- 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 +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-status-banner.js +7 -3
- package/package.json +2 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +32 -22
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +295 -98
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +309 -154
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/bg-shell/utilities.ts +2 -2
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +114 -281
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
- package/src/resources/extensions/gsd/auto/phases.ts +45 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +16 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +107 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +25 -34
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +35 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +9 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +53 -306
- package/src/resources/extensions/gsd/auto.ts +27 -17
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +147 -153
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +132 -6
- package/src/resources/extensions/gsd/captures.ts +5 -14
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +453 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +8 -11
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -3
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
- package/src/resources/extensions/gsd/guided-flow.ts +81 -561
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -1
- package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/migrate/safety.ts +17 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/paths.ts +9 -22
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +14 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +15 -5
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +185 -1
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -5
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/uat-policy.ts +19 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
- package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +308 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +17 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +12 -10
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → C24pqUd-aru-l0Dp0gLZP}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → C24pqUd-aru-l0Dp0gLZP}/_ssgManifest.js +0 -0
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared DB-backed guard for milestone closeout finalization.
|
|
3
3
|
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
|
|
4
6
|
import {
|
|
5
|
-
getDbPath,
|
|
6
7
|
getLatestAssessmentByScope,
|
|
7
8
|
getMilestone,
|
|
8
9
|
getMilestoneSlices,
|
|
9
10
|
getPendingGates,
|
|
10
11
|
getSliceTasks,
|
|
11
12
|
isDbAvailable,
|
|
12
|
-
refreshOpenDatabaseFromDisk,
|
|
13
13
|
} from "./gsd-db.js";
|
|
14
|
+
import {
|
|
15
|
+
getWorkflowDatabasePath,
|
|
16
|
+
refreshWorkflowDatabaseFromDisk,
|
|
17
|
+
} from "./db-workspace.js";
|
|
14
18
|
import { isClosedStatus } from "./status-guards.js";
|
|
19
|
+
import { closeQualityGatesFromEvidence } from "./quality-gate-closure.js";
|
|
15
20
|
|
|
16
21
|
export const CLOSEOUT_CONSISTENCY_BLOCKED_REASON = "closeout-consistency-blocked";
|
|
17
22
|
|
|
@@ -37,6 +42,8 @@ export type CloseoutConsistencyResult =
|
|
|
37
42
|
|
|
38
43
|
export interface CloseoutConsistencyOptions {
|
|
39
44
|
refreshFromDisk?: boolean;
|
|
45
|
+
allowOpenMilestone?: boolean;
|
|
46
|
+
artifactBasePath?: string;
|
|
40
47
|
}
|
|
41
48
|
|
|
42
49
|
function blocked(reason: CloseoutConsistencyFailureReason, message: string): CloseoutConsistencyResult {
|
|
@@ -52,6 +59,12 @@ function isFileBackedDbPath(path: string | null): boolean {
|
|
|
52
59
|
return Boolean(path && path !== ":memory:");
|
|
53
60
|
}
|
|
54
61
|
|
|
62
|
+
function artifactBasePathFromDb(): string | undefined {
|
|
63
|
+
const dbPath = getWorkflowDatabasePath();
|
|
64
|
+
if (!isFileBackedDbPath(dbPath)) return undefined;
|
|
65
|
+
return dirname(dirname(dbPath!));
|
|
66
|
+
}
|
|
67
|
+
|
|
55
68
|
export function checkCloseoutConsistencyGate(
|
|
56
69
|
milestoneId: string,
|
|
57
70
|
options: CloseoutConsistencyOptions = {},
|
|
@@ -63,7 +76,7 @@ export function checkCloseoutConsistencyGate(
|
|
|
63
76
|
);
|
|
64
77
|
}
|
|
65
78
|
|
|
66
|
-
if (options.refreshFromDisk && isFileBackedDbPath(
|
|
79
|
+
if (options.refreshFromDisk && isFileBackedDbPath(getWorkflowDatabasePath()) && !refreshWorkflowDatabaseFromDisk()) {
|
|
67
80
|
return blocked(
|
|
68
81
|
"db-refresh-failed",
|
|
69
82
|
`Closeout consistency blocked for ${milestoneId}: canonical DB refresh failed.`,
|
|
@@ -77,15 +90,17 @@ export function checkCloseoutConsistencyGate(
|
|
|
77
90
|
`Closeout consistency blocked for ${milestoneId}: milestone is missing from canonical DB.`,
|
|
78
91
|
);
|
|
79
92
|
}
|
|
80
|
-
if (!isClosedStatus(milestone.status)) {
|
|
93
|
+
if (!isClosedStatus(milestone.status) && !options.allowOpenMilestone) {
|
|
81
94
|
return blocked(
|
|
82
95
|
"milestone-open",
|
|
83
96
|
`Closeout consistency blocked for ${milestoneId}: canonical DB milestone status is "${milestone.status}".`,
|
|
84
97
|
);
|
|
85
98
|
}
|
|
86
99
|
|
|
100
|
+
const validation = milestone.status === "skipped"
|
|
101
|
+
? null
|
|
102
|
+
: getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
87
103
|
if (milestone.status !== "skipped") {
|
|
88
|
-
const validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
89
104
|
if (validation?.status !== "pass") {
|
|
90
105
|
return blocked(
|
|
91
106
|
"validation-not-pass",
|
|
@@ -102,6 +117,13 @@ export function checkCloseoutConsistencyGate(
|
|
|
102
117
|
);
|
|
103
118
|
}
|
|
104
119
|
|
|
120
|
+
if (milestone.status !== "skipped") {
|
|
121
|
+
closeQualityGatesFromEvidence(milestoneId, {
|
|
122
|
+
artifactBasePath: options.artifactBasePath ?? artifactBasePathFromDb(),
|
|
123
|
+
milestoneValidationPassed: validation?.status === "pass",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
105
127
|
for (const slice of slices) {
|
|
106
128
|
if (!isClosedStatus(slice.status)) {
|
|
107
129
|
return blocked(
|
|
@@ -10,6 +10,7 @@ import { runTurnGitAction, type TurnGitActionMode, type TurnGitActionResult } fr
|
|
|
10
10
|
import { _getAdapter, upsertTurnGitTransaction } from "./gsd-db.js";
|
|
11
11
|
import { probeGitConflictState } from "./git-conflict-state.js";
|
|
12
12
|
import { parseUnitId } from "./unit-id.js";
|
|
13
|
+
import { worktreePathFor } from "./worktree-placement.js";
|
|
13
14
|
|
|
14
15
|
export interface CloseoutFailureRecord {
|
|
15
16
|
traceId: string;
|
|
@@ -156,7 +157,7 @@ export function resolveCloseoutRecoveryBasePath(projectRoot: string, record: Clo
|
|
|
156
157
|
const parsed = parseUnitId(record.unitId);
|
|
157
158
|
const milestoneId = parsed.milestone ?? (/^M\d+(?:-[a-z0-9]{6})?/.exec(record.unitId)?.[0] ?? "");
|
|
158
159
|
if (milestoneId) {
|
|
159
|
-
const worktreePath = existingRealPath(
|
|
160
|
+
const worktreePath = existingRealPath(worktreePathFor(projectRoot, milestoneId));
|
|
160
161
|
if (worktreePath) return worktreePath;
|
|
161
162
|
}
|
|
162
163
|
|
|
@@ -472,17 +472,21 @@ export function ensureCodebaseMapFresh(
|
|
|
472
472
|
const force = ensureOptions?.force === true;
|
|
473
473
|
const now = Date.now();
|
|
474
474
|
|
|
475
|
+
// Enumerate files and compute fingerprint before the TTL check so that
|
|
476
|
+
// file changes are always detected, even within the TTL window.
|
|
477
|
+
const existing = readCodebaseMap(basePath);
|
|
478
|
+
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
479
|
+
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
480
|
+
|
|
481
|
+
// TTL short-circuit: only bypass regeneration when the fingerprint matches,
|
|
482
|
+
// confirming that no tracked files changed since the last check.
|
|
475
483
|
if (!force && ttlMs > 0) {
|
|
476
484
|
const cached = freshnessCache.get(cacheKey);
|
|
477
|
-
if (cached && now - cached.checkedAt < ttlMs) {
|
|
485
|
+
if (cached && now - cached.checkedAt < ttlMs && cached.result.fingerprint === fingerprint) {
|
|
478
486
|
return cached.result;
|
|
479
487
|
}
|
|
480
488
|
}
|
|
481
489
|
|
|
482
|
-
const existing = readCodebaseMap(basePath);
|
|
483
|
-
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
484
|
-
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
485
|
-
|
|
486
490
|
const cacheAndReturn = (result: EnsureCodebaseMapResult): EnsureCodebaseMapResult => {
|
|
487
491
|
freshnessCache.set(cacheKey, { checkedAt: now, result });
|
|
488
492
|
return result;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
2
|
-
import { join
|
|
2
|
+
import { join } from "node:path";
|
|
3
3
|
|
|
4
4
|
import { loadRegistry } from "../workflow-templates.js";
|
|
5
5
|
import { gsdHome } from "../gsd-home.js";
|
|
6
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
6
7
|
import { VISUAL_BRIEF_MODES } from "../../visual-brief/prompts.js";
|
|
7
8
|
|
|
8
9
|
|
|
@@ -396,75 +397,12 @@ function getExtensionCompletions(prefix: string, action: string) {
|
|
|
396
397
|
}
|
|
397
398
|
}
|
|
398
399
|
|
|
399
|
-
function normalizePathForCompare(path: string): string {
|
|
400
|
-
return path.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
function findWorktreeSegment(normalizedPath: string): { gsdIdx: number; afterWorktrees: number } | null {
|
|
404
|
-
const directMarker = "/.gsd/worktrees/";
|
|
405
|
-
const directIdx = normalizedPath.indexOf(directMarker);
|
|
406
|
-
if (directIdx !== -1) {
|
|
407
|
-
return { gsdIdx: directIdx, afterWorktrees: directIdx + directMarker.length };
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
const symlinkMatch = normalizedPath.match(/\/\.gsd\/projects\/[a-f0-9]+\/worktrees\//);
|
|
411
|
-
if (symlinkMatch?.index !== undefined) {
|
|
412
|
-
return { gsdIdx: symlinkMatch.index, afterWorktrees: symlinkMatch.index + symlinkMatch[0].length };
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
return null;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
function resolveProjectRootFromGitFile(worktreePath: string): string | null {
|
|
419
|
-
try {
|
|
420
|
-
let dir = worktreePath;
|
|
421
|
-
for (let i = 0; i < 30; i++) {
|
|
422
|
-
const gitPath = join(dir, ".git");
|
|
423
|
-
if (existsSync(gitPath)) {
|
|
424
|
-
const content = readFileSync(gitPath, "utf8").trim();
|
|
425
|
-
if (content.startsWith("gitdir: ")) {
|
|
426
|
-
const gitDir = resolve(dir, content.slice(8));
|
|
427
|
-
const dotGitDir = resolve(gitDir, "..", "..");
|
|
428
|
-
if (dotGitDir.endsWith(".git") || dotGitDir.endsWith(".git/") || dotGitDir.endsWith(".git\\")) {
|
|
429
|
-
return resolve(dotGitDir, "..");
|
|
430
|
-
}
|
|
431
|
-
const commonDirPath = join(gitDir, "commondir");
|
|
432
|
-
if (existsSync(commonDirPath)) {
|
|
433
|
-
const commonDir = readFileSync(commonDirPath, "utf8").trim();
|
|
434
|
-
return resolve(resolve(gitDir, commonDir), "..");
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
break;
|
|
438
|
-
}
|
|
439
|
-
const parent = resolve(dir, "..");
|
|
440
|
-
if (parent === dir) break;
|
|
441
|
-
dir = parent;
|
|
442
|
-
}
|
|
443
|
-
} catch {
|
|
444
|
-
// Completion must stay best-effort.
|
|
445
|
-
}
|
|
446
|
-
return null;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
400
|
function resolveProjectRootForCompletion(basePath: string): string {
|
|
401
|
+
// Completion honors GSD_PROJECT_ROOT unconditionally (worker processes may
|
|
402
|
+
// complete from any cwd); resolveWorktreeProjectRoot only honors it for
|
|
403
|
+
// worktree paths.
|
|
450
404
|
if (process.env.GSD_PROJECT_ROOT) return process.env.GSD_PROJECT_ROOT;
|
|
451
|
-
|
|
452
|
-
const normalizedPath = normalizePathForCompare(basePath);
|
|
453
|
-
const segment = findWorktreeSegment(normalizedPath);
|
|
454
|
-
if (!segment) return basePath;
|
|
455
|
-
|
|
456
|
-
const separator = basePath.includes("\\") ? "\\" : "/";
|
|
457
|
-
const gsdMarker = `${separator}.gsd${separator}`;
|
|
458
|
-
const gsdIdx = basePath.indexOf(gsdMarker);
|
|
459
|
-
const candidate = gsdIdx !== -1 ? basePath.slice(0, gsdIdx) : basePath.slice(0, segment.gsdIdx);
|
|
460
|
-
|
|
461
|
-
const normalizedGsdHome = normalizePathForCompare(gsdHome());
|
|
462
|
-
const candidateGsdPath = normalizePathForCompare(join(candidate, ".gsd"));
|
|
463
|
-
if (candidateGsdPath === normalizedGsdHome || candidateGsdPath.startsWith(`${normalizedGsdHome}/`)) {
|
|
464
|
-
return resolveProjectRootFromGitFile(basePath) ?? basePath;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
return candidate;
|
|
405
|
+
return resolveWorktreeProjectRoot(basePath);
|
|
468
406
|
}
|
|
469
407
|
|
|
470
408
|
export function getGsdArgumentCompletions(prefix: string) {
|
|
@@ -6,6 +6,7 @@ import { resolve } from "node:path";
|
|
|
6
6
|
import { enableDebug } from "../../debug-logger.js";
|
|
7
7
|
import { getAutoDashboardData, isAutoActive, isAutoPaused, pauseAuto, startAutoDetached, stopAuto, stopAutoRemote } from "../../auto.js";
|
|
8
8
|
import { handleRate } from "../../commands-rate.js";
|
|
9
|
+
import { notifyPreferenceDiagnostics } from "../../preferences-diagnostics.js";
|
|
9
10
|
import { setSessionModelOverride } from "../../session-model-override.js";
|
|
10
11
|
import { guardRemoteSession, projectRoot } from "../context.js";
|
|
11
12
|
import { findMilestoneIds } from "../../milestone-id-utils.js";
|
|
@@ -91,6 +92,7 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
|
|
|
91
92
|
if (!(await guardRemoteSession(ctx, pi))) return true;
|
|
92
93
|
const basePath = projectRoot();
|
|
93
94
|
if (await hasUnresolvedCloseoutBlocker(ctx, basePath)) return true;
|
|
95
|
+
notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
|
|
94
96
|
|
|
95
97
|
// Validate the milestone target exists and is not already complete.
|
|
96
98
|
if (milestoneId) {
|
|
@@ -118,6 +120,7 @@ export async function handleAutoCommand(trimmed: string, ctx: ExtensionCommandCo
|
|
|
118
120
|
if (!(await guardRemoteSession(ctx, pi))) return true;
|
|
119
121
|
const basePath = projectRoot();
|
|
120
122
|
if (await hasUnresolvedCloseoutBlocker(ctx, basePath)) return true;
|
|
123
|
+
notifyPreferenceDiagnostics(ctx, basePath, { surface: "auto-preflight" });
|
|
121
124
|
|
|
122
125
|
// Validate the milestone target exists and is not already complete.
|
|
123
126
|
if (milestoneId) {
|
|
@@ -28,6 +28,7 @@ import { isAutoActive, checkRemoteAutoSession } from "./auto.js";
|
|
|
28
28
|
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
29
29
|
import { currentDirectoryRoot, projectRoot } from "./commands/context.js";
|
|
30
30
|
import { loadPrompt } from "./prompt-loader.js";
|
|
31
|
+
import { buildClaudeRuntimeFloorAdvisory } from "../../shared/claude-runtime-floor.js";
|
|
31
32
|
import { isPnpmInstall } from "../../shared/package-manager-detection.js";
|
|
32
33
|
import {
|
|
33
34
|
buildDoctorHealIssuePayload,
|
|
@@ -67,6 +68,21 @@ function resolveInstallCommand(pkg: string): string {
|
|
|
67
68
|
return `npm install -g ${pkg}`;
|
|
68
69
|
}
|
|
69
70
|
|
|
71
|
+
function notifyClaudeRuntimeFloorAdvisory(ctx: ExtensionCommandContext): void {
|
|
72
|
+
let advisory: string | null = null;
|
|
73
|
+
try {
|
|
74
|
+
advisory = buildClaudeRuntimeFloorAdvisory({
|
|
75
|
+
agentDir: join(gsdHome(), "agent"),
|
|
76
|
+
cwd: process.cwd(),
|
|
77
|
+
});
|
|
78
|
+
} catch {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (advisory) {
|
|
82
|
+
ctx.ui.notify(advisory, "warning");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
70
86
|
async function fetchLatestVersionForCommand(registryUrl: string = UPDATE_REGISTRY_URL): Promise<string | null> {
|
|
71
87
|
const controller = new AbortController();
|
|
72
88
|
const timeout = setTimeout(() => controller.abort(), UPDATE_FETCH_TIMEOUT_MS);
|
|
@@ -549,6 +565,7 @@ export async function handleUpdate(ctx: ExtensionCommandContext, args = ""): Pro
|
|
|
549
565
|
|
|
550
566
|
if (current && compareSemverLocal(latest, current) <= 0) {
|
|
551
567
|
ctx.ui.notify(`Already up to date (${formatCommandVersion(current)}).`, "info");
|
|
568
|
+
if (!browserUpdate) notifyClaudeRuntimeFloorAdvisory(ctx);
|
|
552
569
|
return;
|
|
553
570
|
}
|
|
554
571
|
|
|
@@ -568,6 +585,7 @@ export async function handleUpdate(ctx: ExtensionCommandContext, args = ""): Pro
|
|
|
568
585
|
: `Updated to v${latest}. Restart your GSD session to use the new version.`,
|
|
569
586
|
"info",
|
|
570
587
|
);
|
|
588
|
+
if (!browserUpdate) notifyClaudeRuntimeFloorAdvisory(ctx);
|
|
571
589
|
} catch {
|
|
572
590
|
ctx.ui.notify(
|
|
573
591
|
`Update failed. Try manually: ${installCmd}`,
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
import {
|
|
9
|
+
isWorkflowDatabaseOpen,
|
|
10
|
+
openExistingWorkflowDatabase,
|
|
11
|
+
} from "./db-workspace.js";
|
|
11
12
|
import { logWarning } from "./workflow-logger.js";
|
|
12
13
|
import { getErrorMessage } from "./error-utils.js";
|
|
13
14
|
|
|
@@ -48,12 +49,10 @@ export function formatInspectOutput(data: InspectData): string {
|
|
|
48
49
|
|
|
49
50
|
export async function handleInspect(ctx: ExtensionCommandContext): Promise<void> {
|
|
50
51
|
try {
|
|
51
|
-
const {
|
|
52
|
+
const { _getAdapter } = await import("./gsd-db.js");
|
|
52
53
|
|
|
53
|
-
if (!
|
|
54
|
-
|
|
55
|
-
const dbPath = join(gsdDir, "gsd.db");
|
|
56
|
-
if (!existsSync(gsdDir) || !existsSync(dbPath) || !openDatabase(dbPath)) {
|
|
54
|
+
if (!isWorkflowDatabaseOpen()) {
|
|
55
|
+
if (!openExistingWorkflowDatabase(process.cwd()).ok) {
|
|
57
56
|
ctx.ui.notify("No GSD database available. Run /gsd auto to create one.", "info");
|
|
58
57
|
return;
|
|
59
58
|
}
|
|
@@ -11,6 +11,7 @@ import { deriveState } from "./state.js";
|
|
|
11
11
|
import { gsdProjectionRoot, gsdRoot } from "./paths.js";
|
|
12
12
|
import { nativeBranchList, nativeDetectMainBranch, nativeBranchListMerged, nativeBranchDelete, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
|
|
13
13
|
import { logWarning } from "./workflow-logger.js";
|
|
14
|
+
import { backupWorkflowDatabaseSnapshot, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
14
15
|
|
|
15
16
|
export async function handleCleanupBranches(ctx: ExtensionCommandContext, basePath: string): Promise<void> {
|
|
16
17
|
let branches: string[];
|
|
@@ -581,7 +582,7 @@ async function confirmRecover(
|
|
|
581
582
|
* Prints counts of recovered items and the resulting project phase.
|
|
582
583
|
*/
|
|
583
584
|
export async function handleRecover(ctx: ExtensionCommandContext, basePath: string, args = ""): Promise<void> {
|
|
584
|
-
const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction
|
|
585
|
+
const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction } = await import("./gsd-db.js");
|
|
585
586
|
const { migrateHierarchyToDb } = await import("./md-importer.js");
|
|
586
587
|
const { invalidateStateCache } = await import("./state.js");
|
|
587
588
|
const { countDbHierarchy, countMarkdownHierarchy, recoverWouldDeleteDbRows } = await import("./migration-auto-check.js");
|
|
@@ -604,7 +605,7 @@ export async function handleRecover(ctx: ExtensionCommandContext, basePath: stri
|
|
|
604
605
|
|
|
605
606
|
try {
|
|
606
607
|
// 0. Snapshot the DB before the destructive clear so recover is reversible.
|
|
607
|
-
const backupPath =
|
|
608
|
+
const backupPath = backupWorkflowDatabaseSnapshot("pre-recover");
|
|
608
609
|
|
|
609
610
|
// 1. Delete + re-populate inside a single transaction for atomicity.
|
|
610
611
|
// clearEngineHierarchy() uses transaction() internally but transaction()
|
|
@@ -749,6 +750,62 @@ function parseRebuildTarget(args: string): RebuildTarget {
|
|
|
749
750
|
return "usage";
|
|
750
751
|
}
|
|
751
752
|
|
|
753
|
+
export interface RebuildMarkdownProjectionsResult {
|
|
754
|
+
rendered: number;
|
|
755
|
+
skipped: number;
|
|
756
|
+
errors: string[];
|
|
757
|
+
quarantined: number;
|
|
758
|
+
quarantinedPaths: string[];
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
/**
|
|
762
|
+
* Re-render markdown planning projections from the authoritative DB.
|
|
763
|
+
*
|
|
764
|
+
* Quarantines open-unit SUMMARY files that contradict DB status before
|
|
765
|
+
* rendering. Safe to call after milestone merge/transition or during startup
|
|
766
|
+
* self-heal when the DB holds rows markdown lacks.
|
|
767
|
+
*/
|
|
768
|
+
export async function rebuildMarkdownProjectionsFromDb(
|
|
769
|
+
basePath: string,
|
|
770
|
+
): Promise<RebuildMarkdownProjectionsResult> {
|
|
771
|
+
const { deleteArtifactByPath } = await import("./gsd-db.js");
|
|
772
|
+
const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
|
|
773
|
+
const { renderAllFromDb } = await import("./markdown-renderer.js");
|
|
774
|
+
const { invalidateStateCache } = await import("./state.js");
|
|
775
|
+
|
|
776
|
+
invalidateStateCache();
|
|
777
|
+
refreshWorkflowDatabaseFromDisk();
|
|
778
|
+
|
|
779
|
+
const state = await deriveState(basePath);
|
|
780
|
+
const drifts = detectArtifactDbDrift(state, { basePath, state });
|
|
781
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
782
|
+
const quarantined: string[] = [];
|
|
783
|
+
const seen = new Set<string>();
|
|
784
|
+
|
|
785
|
+
for (const drift of drifts) {
|
|
786
|
+
if (drift.kind !== "artifact-db-status-divergence") continue;
|
|
787
|
+
if (drift.artifactType !== "SUMMARY" || !drift.artifactPath) continue;
|
|
788
|
+
const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
|
|
789
|
+
if (seen.has(absPath) || !existsSync(absPath)) continue;
|
|
790
|
+
seen.add(absPath);
|
|
791
|
+
const artifactDbPath = artifactPathForDb(basePath, absPath);
|
|
792
|
+
const target = quarantineProjectionFile(basePath, absPath, stamp);
|
|
793
|
+
deleteArtifactByPath(artifactDbPath);
|
|
794
|
+
quarantined.push(target);
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
const rendered = await renderAllFromDb(basePath);
|
|
798
|
+
invalidateStateCache();
|
|
799
|
+
|
|
800
|
+
return {
|
|
801
|
+
rendered: rendered.rendered,
|
|
802
|
+
skipped: rendered.skipped,
|
|
803
|
+
errors: rendered.errors,
|
|
804
|
+
quarantined: quarantined.length,
|
|
805
|
+
quarantinedPaths: quarantined,
|
|
806
|
+
};
|
|
807
|
+
}
|
|
808
|
+
|
|
752
809
|
/**
|
|
753
810
|
* `gsd rebuild markdown` — Re-render markdown projections from the authoritative DB.
|
|
754
811
|
*
|
|
@@ -757,10 +814,7 @@ function parseRebuildTarget(args: string): RebuildTarget {
|
|
|
757
814
|
* under `.gsd/quarantine/projections/` before DB projections are rendered.
|
|
758
815
|
*/
|
|
759
816
|
export async function handleRebuild(ctx: ExtensionCommandContext, basePath: string, args = ""): Promise<void> {
|
|
760
|
-
const { isDbAvailable: dbAvailable
|
|
761
|
-
const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
|
|
762
|
-
const { renderAllFromDb } = await import("./markdown-renderer.js");
|
|
763
|
-
const { invalidateStateCache } = await import("./state.js");
|
|
817
|
+
const { isDbAvailable: dbAvailable } = await import("./gsd-db.js");
|
|
764
818
|
|
|
765
819
|
const target = parseRebuildTarget(args);
|
|
766
820
|
if (target === "usage") {
|
|
@@ -794,54 +848,34 @@ export async function handleRebuild(ctx: ExtensionCommandContext, basePath: stri
|
|
|
794
848
|
}
|
|
795
849
|
|
|
796
850
|
try {
|
|
797
|
-
|
|
798
|
-
const state = await deriveState(basePath);
|
|
799
|
-
const drifts = detectArtifactDbDrift(state, { basePath, state });
|
|
800
|
-
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
801
|
-
const quarantined: string[] = [];
|
|
802
|
-
const seen = new Set<string>();
|
|
803
|
-
|
|
804
|
-
for (const drift of drifts) {
|
|
805
|
-
if (drift.kind !== "artifact-db-status-divergence") continue;
|
|
806
|
-
if (drift.artifactType !== "SUMMARY" || !drift.artifactPath) continue;
|
|
807
|
-
const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
|
|
808
|
-
if (seen.has(absPath) || !existsSync(absPath)) continue;
|
|
809
|
-
seen.add(absPath);
|
|
810
|
-
const artifactDbPath = artifactPathForDb(basePath, absPath);
|
|
811
|
-
const target = quarantineProjectionFile(basePath, absPath, stamp);
|
|
812
|
-
deleteArtifactByPath(artifactDbPath);
|
|
813
|
-
quarantined.push(target);
|
|
814
|
-
}
|
|
815
|
-
|
|
816
|
-
const rendered = await renderAllFromDb(basePath);
|
|
817
|
-
invalidateStateCache();
|
|
851
|
+
const result = await rebuildMarkdownProjectionsFromDb(basePath);
|
|
818
852
|
|
|
819
853
|
const lines = [
|
|
820
854
|
"gsd rebuild markdown: rebuilt markdown projections from the canonical DB",
|
|
821
|
-
` Rendered: ${
|
|
822
|
-
` Skipped: ${
|
|
823
|
-
` Quarantined: ${quarantined
|
|
855
|
+
` Rendered: ${result.rendered}`,
|
|
856
|
+
` Skipped: ${result.skipped}`,
|
|
857
|
+
` Quarantined: ${result.quarantined}`,
|
|
824
858
|
];
|
|
825
|
-
if (
|
|
826
|
-
lines.push(` Errors: ${
|
|
827
|
-
for (const err of
|
|
859
|
+
if (result.errors.length > 0) {
|
|
860
|
+
lines.push(` Errors: ${result.errors.length}`);
|
|
861
|
+
for (const err of result.errors.slice(0, 5)) {
|
|
828
862
|
lines.push(` - ${err}`);
|
|
829
863
|
}
|
|
830
|
-
if (
|
|
831
|
-
lines.push(` - ${
|
|
864
|
+
if (result.errors.length > 5) {
|
|
865
|
+
lines.push(` - ${result.errors.length - 5} more`);
|
|
832
866
|
}
|
|
833
867
|
}
|
|
834
|
-
if (quarantined
|
|
868
|
+
if (result.quarantined > 0) {
|
|
835
869
|
lines.push("", " Quarantine:");
|
|
836
|
-
for (const target of
|
|
870
|
+
for (const target of result.quarantinedPaths.slice(0, 5)) {
|
|
837
871
|
lines.push(` - ${target}`);
|
|
838
872
|
}
|
|
839
|
-
if (quarantined
|
|
840
|
-
lines.push(` - ${quarantined
|
|
873
|
+
if (result.quarantined > 5) {
|
|
874
|
+
lines.push(` - ${result.quarantined - 5} more`);
|
|
841
875
|
}
|
|
842
876
|
}
|
|
843
877
|
|
|
844
|
-
ctx.ui.notify(lines.join("\n"),
|
|
878
|
+
ctx.ui.notify(lines.join("\n"), result.errors.length > 0 ? "warning" : "success");
|
|
845
879
|
} catch (err) {
|
|
846
880
|
const msg = err instanceof Error ? err.message : String(err);
|
|
847
881
|
logWarning("command", `rebuild failed: ${msg}`);
|
|
@@ -21,7 +21,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
|
|
|
21
21
|
import { formatDuration } from "../shared/format-utils.js";
|
|
22
22
|
import { parseEvalReviewFrontmatter, type Verdict } from "./eval-review-schema.js";
|
|
23
23
|
import { currentDirectoryRoot } from "./commands/context.js";
|
|
24
|
-
import {
|
|
24
|
+
import { buildPullRequestEvidence } from "./pull-request-process.js";
|
|
25
25
|
|
|
26
26
|
function git(basePath: string, args: readonly string[]): string {
|
|
27
27
|
return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
|
|
@@ -178,7 +178,7 @@ function generatePRContent(basePath: string, milestoneId: string, milestoneTitle
|
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
return
|
|
181
|
+
return buildPullRequestEvidence({
|
|
182
182
|
milestoneId,
|
|
183
183
|
milestoneTitle,
|
|
184
184
|
changeType: "feat",
|
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
5
5
|
|
|
6
6
|
import { loadFile } from "./files.js";
|
|
7
|
-
import { resolveMilestoneFile } from "./paths.js";
|
|
7
|
+
import { gsdProjectionRoot, resolveMilestoneFile } from "./paths.js";
|
|
8
|
+
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
9
|
+
import { join } from "node:path";
|
|
8
10
|
import { deriveState } from "./state.js";
|
|
9
11
|
import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
|
|
10
12
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
11
13
|
import { getLatestAssessmentByScope } from "./gsd-db.js";
|
|
14
|
+
import { checkpointWorkflowDatabase } from "./db-workspace.js";
|
|
12
15
|
import {
|
|
13
16
|
VALIDATION_VERDICTS,
|
|
14
17
|
extractVerdict,
|
|
@@ -122,8 +125,20 @@ async function loadExistingValidation(
|
|
|
122
125
|
basePath: string,
|
|
123
126
|
milestoneId: string,
|
|
124
127
|
): Promise<ExistingValidation | null> {
|
|
128
|
+
const canonicalBase = resolveCanonicalMilestoneRoot(basePath, milestoneId);
|
|
129
|
+
const canonicalValidationPath = join(
|
|
130
|
+
gsdProjectionRoot(canonicalBase),
|
|
131
|
+
"milestones",
|
|
132
|
+
milestoneId,
|
|
133
|
+
`${milestoneId}-VALIDATION.md`,
|
|
134
|
+
);
|
|
135
|
+
const canonicalContent = await loadFile(canonicalValidationPath);
|
|
136
|
+
if (canonicalContent) {
|
|
137
|
+
return { content: canonicalContent, source: canonicalValidationPath };
|
|
138
|
+
}
|
|
139
|
+
|
|
125
140
|
const validationPath = resolveMilestoneFile(basePath, milestoneId, "VALIDATION");
|
|
126
|
-
if (validationPath) {
|
|
141
|
+
if (validationPath && validationPath !== canonicalValidationPath) {
|
|
127
142
|
const content = await loadFile(validationPath);
|
|
128
143
|
if (content) return { content, source: validationPath };
|
|
129
144
|
}
|
|
@@ -222,6 +237,8 @@ export async function handleVerdict(
|
|
|
222
237
|
return;
|
|
223
238
|
}
|
|
224
239
|
|
|
240
|
+
checkpointWorkflowDatabase();
|
|
241
|
+
|
|
225
242
|
const prevVerdict = current.verdict ?? "unknown";
|
|
226
243
|
const effectiveVerdict = extractEffectiveVerdict(result.details, parsed.verdict);
|
|
227
244
|
if (effectiveVerdict !== parsed.verdict) {
|