@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
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Domain Write Operations (Hierarchy Status Cascades) for the
|
|
3
|
+
// single-writer layer. Each operation owns its own transaction() and mutates
|
|
4
|
+
// the related rows of one logical hierarchy change in a single commit, so the
|
|
5
|
+
// atomicity rule lives in one place instead of being hand-rolled (or missed)
|
|
6
|
+
// in callers. Operations own DB-row atomicity only — markdown re-projection,
|
|
7
|
+
// validation, and messaging stay in callers / db-writer.ts.
|
|
8
|
+
import { getDbOrNull, transaction } from "../engine.js";
|
|
9
|
+
import { GSDError, GSD_STALE_STATE } from "../../errors.js";
|
|
10
|
+
import { isClosedStatus } from "../../status-guards.js";
|
|
11
|
+
import { getMilestone, getSlice, getSliceTasks, getMilestoneSlices } from "../queries.js";
|
|
12
|
+
// completeSliceCascade reuses the complex hierarchy write primitives (ON CONFLICT
|
|
13
|
+
// upserts with null sentinels) rather than re-inlining their SQL. This is a
|
|
14
|
+
// back-edge to gsd-db.ts, which re-exports this module — safe because the
|
|
15
|
+
// imported bindings are hoisted function declarations only called at runtime.
|
|
16
|
+
// It dissolves when these primitives move to db/writers/hierarchy.ts.
|
|
17
|
+
import { insertMilestone, insertSlice, updateSliceStatus, updateMilestoneStatus } from "../../gsd-db.js";
|
|
18
|
+
|
|
19
|
+
function requireDb(): void {
|
|
20
|
+
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// ─── Reopen cascades ───────────────────────────────────────────────────────
|
|
24
|
+
// A reopen blocked by a structural precondition returns a discriminated reason
|
|
25
|
+
// (carrying the offending entity's status where the caller's message needs it).
|
|
26
|
+
// Structural guards run inside the transaction for TOCTOU safety; the caller
|
|
27
|
+
// owns user-facing message formatting and projection.
|
|
28
|
+
|
|
29
|
+
export type ReopenSliceOutcome =
|
|
30
|
+
| { ok: true; tasksReset: number }
|
|
31
|
+
| { ok: false; reason: "milestone-not-found" }
|
|
32
|
+
| { ok: false; reason: "milestone-closed"; status: string }
|
|
33
|
+
| { ok: false; reason: "slice-not-found" }
|
|
34
|
+
| { ok: false; reason: "slice-not-complete"; status: string };
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Reopen a completed slice: slice → "in_progress", all its tasks → "pending",
|
|
38
|
+
* completion timestamps cleared, in one commit. Folds the hand-rolled
|
|
39
|
+
* transaction-plus-cascade previously in tools/reopen-slice.ts. Guards run
|
|
40
|
+
* inside the transaction (TOCTOU-safe).
|
|
41
|
+
*/
|
|
42
|
+
export function reopenSliceCascade(milestoneId: string, sliceId: string): ReopenSliceOutcome {
|
|
43
|
+
requireDb();
|
|
44
|
+
let outcome: ReopenSliceOutcome = { ok: true, tasksReset: 0 };
|
|
45
|
+
transaction(() => {
|
|
46
|
+
const milestone = getMilestone(milestoneId);
|
|
47
|
+
if (!milestone) { outcome = { ok: false, reason: "milestone-not-found" }; return; }
|
|
48
|
+
if (isClosedStatus(milestone.status)) { outcome = { ok: false, reason: "milestone-closed", status: milestone.status }; return; }
|
|
49
|
+
const slice = getSlice(milestoneId, sliceId);
|
|
50
|
+
if (!slice) { outcome = { ok: false, reason: "slice-not-found" }; return; }
|
|
51
|
+
if (!isClosedStatus(slice.status)) { outcome = { ok: false, reason: "slice-not-complete", status: slice.status }; return; }
|
|
52
|
+
|
|
53
|
+
const tasks = getSliceTasks(milestoneId, sliceId);
|
|
54
|
+
getDbOrNull()!.prepare(
|
|
55
|
+
`UPDATE slices SET status = 'in_progress', completed_at = NULL WHERE milestone_id = :mid AND id = :sid`,
|
|
56
|
+
).run({ ":mid": milestoneId, ":sid": sliceId });
|
|
57
|
+
getDbOrNull()!.prepare(
|
|
58
|
+
`UPDATE tasks SET status = 'pending', completed_at = NULL WHERE milestone_id = :mid AND slice_id = :sid`,
|
|
59
|
+
).run({ ":mid": milestoneId, ":sid": sliceId });
|
|
60
|
+
outcome = { ok: true, tasksReset: tasks.length };
|
|
61
|
+
});
|
|
62
|
+
return outcome;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type ReopenMilestoneOutcome =
|
|
66
|
+
| { ok: true; slicesReset: number; tasksReset: number }
|
|
67
|
+
| { ok: false; reason: "milestone-not-found" }
|
|
68
|
+
| { ok: false; reason: "milestone-not-closed"; status: string };
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Reopen a closed milestone: milestone → "active", every slice → "in_progress",
|
|
72
|
+
* every task → "pending", completion timestamps cleared, in one commit. Folds
|
|
73
|
+
* the hand-rolled transaction-plus-cascade previously in tools/reopen-milestone.ts.
|
|
74
|
+
*/
|
|
75
|
+
export function reopenMilestoneCascade(milestoneId: string): ReopenMilestoneOutcome {
|
|
76
|
+
requireDb();
|
|
77
|
+
let outcome: ReopenMilestoneOutcome = { ok: true, slicesReset: 0, tasksReset: 0 };
|
|
78
|
+
transaction(() => {
|
|
79
|
+
const milestone = getMilestone(milestoneId);
|
|
80
|
+
if (!milestone) { outcome = { ok: false, reason: "milestone-not-found" }; return; }
|
|
81
|
+
if (!isClosedStatus(milestone.status)) { outcome = { ok: false, reason: "milestone-not-closed", status: milestone.status }; return; }
|
|
82
|
+
|
|
83
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
84
|
+
|
|
85
|
+
getDbOrNull()!.prepare(
|
|
86
|
+
`UPDATE milestones SET status = 'active', completed_at = NULL WHERE id = :mid`,
|
|
87
|
+
).run({ ":mid": milestoneId });
|
|
88
|
+
getDbOrNull()!.prepare(
|
|
89
|
+
`UPDATE slices SET status = 'in_progress', completed_at = NULL WHERE milestone_id = :mid`,
|
|
90
|
+
).run({ ":mid": milestoneId });
|
|
91
|
+
const tasksResult = getDbOrNull()!.prepare(
|
|
92
|
+
`UPDATE tasks SET status = 'pending', completed_at = NULL WHERE milestone_id = :mid`,
|
|
93
|
+
).run({ ":mid": milestoneId });
|
|
94
|
+
const tasksReset = (tasksResult as { changes?: number }).changes ?? 0;
|
|
95
|
+
outcome = { ok: true, slicesReset: slices.length, tasksReset };
|
|
96
|
+
});
|
|
97
|
+
return outcome;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export type CompleteSliceOutcome =
|
|
101
|
+
| { ok: true; duplicate: boolean; existingSummaryMd: string }
|
|
102
|
+
| { ok: false; reason: "milestone-closed"; status: string }
|
|
103
|
+
| { ok: false; reason: "no-tasks" }
|
|
104
|
+
| { ok: false; reason: "incomplete-tasks"; incomplete: Array<{ id: string; status: string }> };
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Complete a slice: verify preconditions, auto-create the milestone/slice rows
|
|
108
|
+
* if absent, mark the slice "complete", and activate a still-"planned"
|
|
109
|
+
* milestone once all its slices are closed — all in one transaction. Folds the
|
|
110
|
+
* hand-rolled cascade previously in tools/complete-slice.ts.
|
|
111
|
+
*
|
|
112
|
+
* Returns a discriminated outcome. The `duplicate: true` success case means the
|
|
113
|
+
* slice was already closed (no writes performed); the caller handles the stale/
|
|
114
|
+
* idempotent path. `existingSummaryMd` carries the slice's prior summary so the
|
|
115
|
+
* caller can backfill omitted requirement fields. Markdown rendering, file
|
|
116
|
+
* writes, and summary persistence stay in the caller.
|
|
117
|
+
*/
|
|
118
|
+
export function completeSliceCascade(
|
|
119
|
+
milestoneId: string,
|
|
120
|
+
sliceId: string,
|
|
121
|
+
opts: { sliceTitle?: string; completedAt: string },
|
|
122
|
+
): CompleteSliceOutcome {
|
|
123
|
+
requireDb();
|
|
124
|
+
let outcome: CompleteSliceOutcome = { ok: true, duplicate: false, existingSummaryMd: "" };
|
|
125
|
+
transaction(() => {
|
|
126
|
+
// Preconditions inside the txn for atomicity. A missing milestone/slice is
|
|
127
|
+
// fine — they are auto-created below; only a closed one blocks.
|
|
128
|
+
const milestone = getMilestone(milestoneId);
|
|
129
|
+
if (milestone && isClosedStatus(milestone.status)) {
|
|
130
|
+
outcome = { ok: false, reason: "milestone-closed", status: milestone.status };
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const slice = getSlice(milestoneId, sliceId);
|
|
135
|
+
const existingSummaryMd = slice?.full_summary_md?.trim() ?? "";
|
|
136
|
+
if (slice && isClosedStatus(slice.status)) {
|
|
137
|
+
outcome = { ok: true, duplicate: true, existingSummaryMd };
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const tasks = getSliceTasks(milestoneId, sliceId);
|
|
142
|
+
if (tasks.length === 0) {
|
|
143
|
+
outcome = { ok: false, reason: "no-tasks" };
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const incomplete = tasks
|
|
147
|
+
.filter((t) => !isClosedStatus(t.status))
|
|
148
|
+
.map((t) => ({ id: t.id, status: t.status }));
|
|
149
|
+
if (incomplete.length > 0) {
|
|
150
|
+
outcome = { ok: false, reason: "incomplete-tasks", incomplete };
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// All guards passed — perform writes. Preserve existing planning metadata:
|
|
155
|
+
// completion must not overwrite title/risk/depends/demo/sequence.
|
|
156
|
+
insertMilestone({ id: milestoneId, title: milestoneId });
|
|
157
|
+
if (!slice) {
|
|
158
|
+
insertSlice({ id: sliceId, milestoneId, title: opts.sliceTitle || sliceId });
|
|
159
|
+
}
|
|
160
|
+
updateSliceStatus(milestoneId, sliceId, "complete", opts.completedAt);
|
|
161
|
+
|
|
162
|
+
const updatedSlices = getMilestoneSlices(milestoneId);
|
|
163
|
+
if (
|
|
164
|
+
milestone?.status === "planned" &&
|
|
165
|
+
updatedSlices.length > 0 &&
|
|
166
|
+
updatedSlices.every((s) => isClosedStatus(s.status))
|
|
167
|
+
) {
|
|
168
|
+
updateMilestoneStatus(milestoneId, "active");
|
|
169
|
+
}
|
|
170
|
+
outcome = { ok: true, duplicate: false, existingSummaryMd };
|
|
171
|
+
});
|
|
172
|
+
return outcome;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export type SkipSliceOutcome =
|
|
176
|
+
| { ok: true; tasksSkipped: number; wasAlreadySkipped: boolean }
|
|
177
|
+
| { ok: false; reason: "slice-not-found" }
|
|
178
|
+
| { ok: false; reason: "slice-already-complete" };
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Skip a slice: slice → "skipped" (unless already skipped) and every non-closed
|
|
182
|
+
* task → "skipped", in one commit. Completed/done slices are rejected; closed
|
|
183
|
+
* tasks are never downgraded. Folds the hand-rolled cascade previously in
|
|
184
|
+
* tools/skip-slice.ts. Guards run inside the transaction (TOCTOU-safe).
|
|
185
|
+
*/
|
|
186
|
+
export function skipSliceCascade(milestoneId: string, sliceId: string): SkipSliceOutcome {
|
|
187
|
+
requireDb();
|
|
188
|
+
let outcome: SkipSliceOutcome = { ok: true, tasksSkipped: 0, wasAlreadySkipped: false };
|
|
189
|
+
transaction(() => {
|
|
190
|
+
const slice = getSlice(milestoneId, sliceId);
|
|
191
|
+
if (!slice) { outcome = { ok: false, reason: "slice-not-found" }; return; }
|
|
192
|
+
if (slice.status === "complete" || slice.status === "done") {
|
|
193
|
+
outcome = { ok: false, reason: "slice-already-complete" };
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const wasAlreadySkipped = slice.status === "skipped";
|
|
197
|
+
if (!wasAlreadySkipped) {
|
|
198
|
+
getDbOrNull()!.prepare(
|
|
199
|
+
`UPDATE slices SET status = 'skipped', completed_at = NULL WHERE milestone_id = :mid AND id = :sid`,
|
|
200
|
+
).run({ ":mid": milestoneId, ":sid": sliceId });
|
|
201
|
+
}
|
|
202
|
+
// Cascade: skip every non-closed task so milestone completion doesn't trip
|
|
203
|
+
// the deep-task guard (#4375). Closed tasks are left untouched.
|
|
204
|
+
const tasks = getSliceTasks(milestoneId, sliceId);
|
|
205
|
+
let tasksSkipped = 0;
|
|
206
|
+
for (const task of tasks) {
|
|
207
|
+
if (!isClosedStatus(task.status)) {
|
|
208
|
+
getDbOrNull()!.prepare(
|
|
209
|
+
`UPDATE tasks SET status = 'skipped', completed_at = NULL WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
|
|
210
|
+
).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": task.id });
|
|
211
|
+
tasksSkipped++;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
outcome = { ok: true, tasksSkipped, wasAlreadySkipped };
|
|
215
|
+
});
|
|
216
|
+
return outcome;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Reset a slice to "active" and all of its tasks to "pending" in one commit,
|
|
221
|
+
* clearing completion timestamps. Equivalent to the historical per-task
|
|
222
|
+
* updateTaskStatus loop + updateSliceStatus in undo's reset-slice, but atomic:
|
|
223
|
+
* an interruption can no longer leave some tasks reset and others not.
|
|
224
|
+
*/
|
|
225
|
+
export function resetSliceCascade(milestoneId: string, sliceId: string): void {
|
|
226
|
+
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
227
|
+
transaction(() => {
|
|
228
|
+
getDbOrNull()!.prepare(
|
|
229
|
+
`UPDATE tasks SET status = 'pending', completed_at = NULL
|
|
230
|
+
WHERE milestone_id = :mid AND slice_id = :sid`,
|
|
231
|
+
).run({ ":mid": milestoneId, ":sid": sliceId });
|
|
232
|
+
getDbOrNull()!.prepare(
|
|
233
|
+
`UPDATE slices SET status = 'active', completed_at = NULL
|
|
234
|
+
WHERE milestone_id = :mid AND id = :sid`,
|
|
235
|
+
).run({ ":mid": milestoneId, ":sid": sliceId });
|
|
236
|
+
});
|
|
237
|
+
}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Bulk import/restore writers for the single-writer layer.
|
|
3
|
+
// restoreManifest rebuilds the engine DB from a StateManifest;
|
|
4
|
+
// bulkInsertLegacyHierarchy replaces the milestone/slice/task hierarchy from
|
|
5
|
+
// markdown-parsed payloads. Both own their own transaction() and contain only
|
|
6
|
+
// write SQL, read through the shared engine handle.
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { getDbOrNull, transaction } from "../engine.js";
|
|
9
|
+
import { GSDError, GSD_STALE_STATE } from "../../errors.js";
|
|
10
|
+
import type { StateManifest } from "../../workflow-manifest.js";
|
|
11
|
+
|
|
12
|
+
export function restoreManifest(manifest: StateManifest): void {
|
|
13
|
+
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
14
|
+
const db = getDbOrNull()!;
|
|
15
|
+
|
|
16
|
+
transaction(() => {
|
|
17
|
+
const restoredMilestoneIds = new Set(manifest.milestones.map((m) => m.id));
|
|
18
|
+
const restoredSliceKeys = new Set(manifest.slices.map((s) => JSON.stringify([s.milestone_id, s.id])));
|
|
19
|
+
const preservedReplanHistory = manifest.replan_history === undefined
|
|
20
|
+
? db.prepare("SELECT * FROM replan_history ORDER BY id").all() as unknown as NonNullable<StateManifest["replan_history"]>
|
|
21
|
+
: [];
|
|
22
|
+
const preservedAssessments = manifest.assessments === undefined
|
|
23
|
+
? db.prepare("SELECT * FROM assessments ORDER BY path").all() as unknown as NonNullable<StateManifest["assessments"]>
|
|
24
|
+
: [];
|
|
25
|
+
const preservedQualityGates = manifest.quality_gates === undefined
|
|
26
|
+
? db.prepare("SELECT * FROM quality_gates ORDER BY milestone_id, slice_id, gate_id, task_id").all() as unknown as NonNullable<StateManifest["quality_gates"]>
|
|
27
|
+
: [];
|
|
28
|
+
const preservedCommitAttributions = manifest.milestone_commit_attributions === undefined
|
|
29
|
+
? db.prepare("SELECT * FROM milestone_commit_attributions ORDER BY milestone_id, commit_sha").all() as unknown as NonNullable<StateManifest["milestone_commit_attributions"]>
|
|
30
|
+
: [];
|
|
31
|
+
|
|
32
|
+
// Clear workflow tables in dependency order.
|
|
33
|
+
db.exec("DELETE FROM verification_evidence");
|
|
34
|
+
db.exec("DELETE FROM quality_gates");
|
|
35
|
+
db.exec("DELETE FROM slice_dependencies");
|
|
36
|
+
db.exec("DELETE FROM assessments");
|
|
37
|
+
db.exec("DELETE FROM replan_history");
|
|
38
|
+
db.exec("DELETE FROM milestone_commit_attributions");
|
|
39
|
+
db.exec("DELETE FROM tasks");
|
|
40
|
+
db.exec("DELETE FROM slices");
|
|
41
|
+
db.exec("DELETE FROM milestone_leases");
|
|
42
|
+
db.exec("DELETE FROM milestones");
|
|
43
|
+
db.exec("DELETE FROM decisions WHERE 1=1");
|
|
44
|
+
db.exec(`DELETE FROM memories WHERE category = 'architecture' AND structured_fields LIKE '%"sourceDecisionId":"%'`);
|
|
45
|
+
if (manifest.artifacts !== undefined) db.exec("DELETE FROM artifacts");
|
|
46
|
+
if (manifest.requirements !== undefined) db.exec("DELETE FROM requirements");
|
|
47
|
+
|
|
48
|
+
if (manifest.requirements !== undefined) {
|
|
49
|
+
const reqStmt = db.prepare(
|
|
50
|
+
`INSERT INTO requirements (
|
|
51
|
+
id, class, status, description, why, source, primary_owner,
|
|
52
|
+
supporting_slices, validation, notes, full_content, superseded_by
|
|
53
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
54
|
+
);
|
|
55
|
+
for (const r of manifest.requirements) {
|
|
56
|
+
reqStmt.run(
|
|
57
|
+
r.id, r.class, r.status, r.description, r.why, r.source, r.primary_owner,
|
|
58
|
+
r.supporting_slices, r.validation, r.notes, r.full_content, r.superseded_by,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (manifest.artifacts !== undefined) {
|
|
64
|
+
const artStmt = db.prepare(
|
|
65
|
+
`INSERT INTO artifacts (
|
|
66
|
+
path, artifact_type, milestone_id, slice_id, task_id, full_content, imported_at, content_hash
|
|
67
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
68
|
+
);
|
|
69
|
+
for (const a of manifest.artifacts) {
|
|
70
|
+
const fullContent = a.full_content ?? "";
|
|
71
|
+
artStmt.run(
|
|
72
|
+
a.path, a.artifact_type, a.milestone_id, a.slice_id, a.task_id,
|
|
73
|
+
fullContent, a.imported_at, a.content_hash ?? createHash("sha256").update(fullContent).digest("hex"),
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Restore milestones
|
|
79
|
+
const msStmt = db.prepare(
|
|
80
|
+
`INSERT INTO milestones (id, title, status, depends_on, created_at, completed_at,
|
|
81
|
+
vision, success_criteria, key_risks, proof_strategy,
|
|
82
|
+
verification_contract, verification_integration, verification_operational, verification_uat,
|
|
83
|
+
definition_of_done, requirement_coverage, boundary_map_markdown, sequence)
|
|
84
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
85
|
+
);
|
|
86
|
+
for (const m of manifest.milestones) {
|
|
87
|
+
msStmt.run(
|
|
88
|
+
m.id, m.title, m.status,
|
|
89
|
+
JSON.stringify(m.depends_on), m.created_at, m.completed_at,
|
|
90
|
+
m.vision, JSON.stringify(m.success_criteria), JSON.stringify(m.key_risks),
|
|
91
|
+
JSON.stringify(m.proof_strategy),
|
|
92
|
+
m.verification_contract, m.verification_integration, m.verification_operational, m.verification_uat,
|
|
93
|
+
JSON.stringify(m.definition_of_done), m.requirement_coverage, m.boundary_map_markdown, m.sequence ?? 0,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Restore slices (ADR-011 Phase 1: includes is_sketch + sketch_scope)
|
|
98
|
+
const slStmt = db.prepare(
|
|
99
|
+
`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
|
|
100
|
+
created_at, completed_at, full_summary_md, full_uat_md,
|
|
101
|
+
goal, success_criteria, proof_level, integration_closure, observability_impact,
|
|
102
|
+
target_repositories, sequence, replan_triggered_at, is_sketch, sketch_scope)
|
|
103
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
104
|
+
);
|
|
105
|
+
for (const s of manifest.slices) {
|
|
106
|
+
slStmt.run(
|
|
107
|
+
s.milestone_id, s.id, s.title, s.status, s.risk,
|
|
108
|
+
JSON.stringify(s.depends), s.demo,
|
|
109
|
+
s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md,
|
|
110
|
+
s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact,
|
|
111
|
+
JSON.stringify(s.target_repositories ?? []),
|
|
112
|
+
s.sequence, s.replan_triggered_at,
|
|
113
|
+
s.is_sketch ?? 0,
|
|
114
|
+
s.sketch_scope ?? "",
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const depStmt = db.prepare(
|
|
119
|
+
"INSERT OR IGNORE INTO slice_dependencies (milestone_id, slice_id, depends_on_slice_id) VALUES (?, ?, ?)",
|
|
120
|
+
);
|
|
121
|
+
for (const s of manifest.slices) {
|
|
122
|
+
for (const dep of s.depends ?? []) {
|
|
123
|
+
depStmt.run(s.milestone_id, s.id, dep);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Restore tasks (ADR-011 P2: includes blocker_source + escalation_* columns)
|
|
128
|
+
const tkStmt = db.prepare(
|
|
129
|
+
`INSERT INTO tasks (milestone_id, slice_id, id, title, status,
|
|
130
|
+
one_liner, narrative, verification_result, duration, completed_at,
|
|
131
|
+
blocker_discovered, deviations, known_issues, key_files, key_decisions,
|
|
132
|
+
full_summary_md, description, estimate, files, verify,
|
|
133
|
+
inputs, expected_output, observability_impact, full_plan_md, target_repositories, sequence,
|
|
134
|
+
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
135
|
+
escalation_artifact_path, escalation_override_applied_at)
|
|
136
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
137
|
+
);
|
|
138
|
+
for (const t of manifest.tasks) {
|
|
139
|
+
tkStmt.run(
|
|
140
|
+
t.milestone_id, t.slice_id, t.id, t.title, t.status,
|
|
141
|
+
t.one_liner, t.narrative, t.verification_result, t.duration, t.completed_at,
|
|
142
|
+
t.blocker_discovered ? 1 : 0, t.deviations, t.known_issues,
|
|
143
|
+
JSON.stringify(t.key_files), JSON.stringify(t.key_decisions),
|
|
144
|
+
t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify,
|
|
145
|
+
JSON.stringify(t.inputs), JSON.stringify(t.expected_output),
|
|
146
|
+
t.observability_impact, t.full_plan_md ?? "", JSON.stringify(t.target_repositories ?? []), t.sequence,
|
|
147
|
+
t.blocker_source ?? "",
|
|
148
|
+
t.escalation_pending ?? 0,
|
|
149
|
+
t.escalation_awaiting_review ?? 0,
|
|
150
|
+
t.escalation_artifact_path ?? null,
|
|
151
|
+
t.escalation_override_applied_at ?? null,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Restore decisions (ADR-011 P2: include source so escalation decisions survive)
|
|
156
|
+
const dcStmt = db.prepare(
|
|
157
|
+
`INSERT INTO decisions (seq, id, when_context, scope, decision, choice, rationale, revisable, made_by, source, superseded_by)
|
|
158
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
159
|
+
);
|
|
160
|
+
for (const d of manifest.decisions) {
|
|
161
|
+
dcStmt.run(d.seq, d.id, d.when_context, d.scope, d.decision, d.choice, d.rationale, d.revisable, d.made_by, d.source ?? "discussion", d.superseded_by);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const replanHistoryRows = manifest.replan_history ?? preservedReplanHistory.filter((r) => restoredMilestoneIds.has(r.milestone_id));
|
|
165
|
+
if (replanHistoryRows.length > 0) {
|
|
166
|
+
const replStmt = db.prepare(
|
|
167
|
+
`INSERT INTO replan_history (
|
|
168
|
+
id, milestone_id, slice_id, task_id, summary, previous_artifact_path, replacement_artifact_path, created_at
|
|
169
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
170
|
+
);
|
|
171
|
+
for (const r of replanHistoryRows) {
|
|
172
|
+
replStmt.run(
|
|
173
|
+
r.id, r.milestone_id, r.slice_id, r.task_id, r.summary,
|
|
174
|
+
r.previous_artifact_path, r.replacement_artifact_path, r.created_at,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const assessmentRows = manifest.assessments ?? preservedAssessments.filter((a) => restoredMilestoneIds.has(a.milestone_id));
|
|
180
|
+
if (assessmentRows.length > 0) {
|
|
181
|
+
const assessStmt = db.prepare(
|
|
182
|
+
`INSERT INTO assessments (
|
|
183
|
+
path, milestone_id, slice_id, task_id, status, scope, full_content, created_at
|
|
184
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
185
|
+
);
|
|
186
|
+
for (const a of assessmentRows) {
|
|
187
|
+
assessStmt.run(
|
|
188
|
+
a.path, a.milestone_id, a.slice_id, a.task_id,
|
|
189
|
+
a.status, a.scope, a.full_content, a.created_at,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const qualityGateRows = manifest.quality_gates ?? preservedQualityGates.filter((g) => (
|
|
195
|
+
restoredSliceKeys.has(JSON.stringify([g.milestone_id, g.slice_id]))
|
|
196
|
+
));
|
|
197
|
+
if (qualityGateRows.length > 0) {
|
|
198
|
+
const gateStmt = db.prepare(
|
|
199
|
+
`INSERT INTO quality_gates (
|
|
200
|
+
milestone_id, slice_id, gate_id, scope, task_id, status, verdict, rationale, findings, evaluated_at
|
|
201
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
202
|
+
);
|
|
203
|
+
for (const g of qualityGateRows) {
|
|
204
|
+
gateStmt.run(
|
|
205
|
+
g.milestone_id, g.slice_id, g.gate_id, g.scope, g.task_id,
|
|
206
|
+
g.status, g.verdict ?? "", g.rationale, g.findings, g.evaluated_at,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const commitAttributionRows = manifest.milestone_commit_attributions ??
|
|
212
|
+
preservedCommitAttributions.filter((a) => restoredMilestoneIds.has(a.milestone_id));
|
|
213
|
+
if (commitAttributionRows.length > 0) {
|
|
214
|
+
const attrStmt = db.prepare(
|
|
215
|
+
`INSERT OR REPLACE INTO milestone_commit_attributions (
|
|
216
|
+
commit_sha, milestone_id, slice_id, task_id, source, confidence, files_json, created_at
|
|
217
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
218
|
+
);
|
|
219
|
+
for (const a of commitAttributionRows) {
|
|
220
|
+
attrStmt.run(
|
|
221
|
+
a.commit_sha, a.milestone_id, a.slice_id, a.task_id,
|
|
222
|
+
a.source, a.confidence, a.files_json, a.created_at,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Restore verification evidence
|
|
228
|
+
const evStmt = db.prepare(
|
|
229
|
+
`INSERT INTO verification_evidence (task_id, slice_id, milestone_id, command, exit_code, verdict, duration_ms, created_at)
|
|
230
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
231
|
+
);
|
|
232
|
+
for (const e of manifest.verification_evidence) {
|
|
233
|
+
evStmt.run(e.task_id, e.slice_id, e.milestone_id, e.command, e.exit_code, e.verdict, e.duration_ms, e.created_at);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ─── Legacy markdown → DB bulk migration ─────────────────────────────────
|
|
239
|
+
|
|
240
|
+
export interface LegacyMilestoneInsert {
|
|
241
|
+
id: string;
|
|
242
|
+
title: string;
|
|
243
|
+
status: string;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export interface LegacySliceInsert {
|
|
247
|
+
id: string;
|
|
248
|
+
milestoneId: string;
|
|
249
|
+
title: string;
|
|
250
|
+
status: string;
|
|
251
|
+
risk: string;
|
|
252
|
+
sequence: number;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export interface LegacyTaskInsert {
|
|
256
|
+
id: string;
|
|
257
|
+
sliceId: string;
|
|
258
|
+
milestoneId: string;
|
|
259
|
+
title: string;
|
|
260
|
+
status: string;
|
|
261
|
+
sequence: number;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Bulk delete + insert a legacy milestone hierarchy for markdown → DB migration.
|
|
266
|
+
* Used by workflow-migration.ts to populate engine tables from parsed ROADMAP/PLAN
|
|
267
|
+
* files. All operations run inside a single transaction.
|
|
268
|
+
*/
|
|
269
|
+
export function bulkInsertLegacyHierarchy(payload: {
|
|
270
|
+
milestones: LegacyMilestoneInsert[];
|
|
271
|
+
slices: LegacySliceInsert[];
|
|
272
|
+
tasks: LegacyTaskInsert[];
|
|
273
|
+
clearMilestoneIds: string[];
|
|
274
|
+
createdAt: string;
|
|
275
|
+
}): void {
|
|
276
|
+
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
277
|
+
const db = getDbOrNull()!;
|
|
278
|
+
const { milestones, slices, tasks, clearMilestoneIds, createdAt } = payload;
|
|
279
|
+
|
|
280
|
+
if (clearMilestoneIds.length === 0) return;
|
|
281
|
+
const placeholders = clearMilestoneIds.map(() => "?").join(",");
|
|
282
|
+
|
|
283
|
+
transaction(() => {
|
|
284
|
+
db.prepare(`DELETE FROM tasks WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
|
|
285
|
+
db.prepare(`DELETE FROM slices WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
|
|
286
|
+
db.prepare(`DELETE FROM milestone_leases WHERE milestone_id IN (${placeholders})`).run(...clearMilestoneIds);
|
|
287
|
+
db.prepare(`DELETE FROM milestones WHERE id IN (${placeholders})`).run(...clearMilestoneIds);
|
|
288
|
+
|
|
289
|
+
const insertMilestone = db.prepare(
|
|
290
|
+
"INSERT INTO milestones (id, title, status, created_at) VALUES (?, ?, ?, ?)",
|
|
291
|
+
);
|
|
292
|
+
for (const m of milestones) {
|
|
293
|
+
insertMilestone.run(m.id, m.title, m.status, createdAt);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const insertSliceStmt = db.prepare(
|
|
297
|
+
"INSERT INTO slices (id, milestone_id, title, status, risk, depends, sequence, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
|
|
298
|
+
);
|
|
299
|
+
for (const s of slices) {
|
|
300
|
+
insertSliceStmt.run(s.id, s.milestoneId, s.title, s.status, s.risk, "[]", s.sequence, createdAt);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const insertTaskStmt = db.prepare(
|
|
304
|
+
"INSERT INTO tasks (id, slice_id, milestone_id, title, description, status, estimate, files, sequence) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
305
|
+
);
|
|
306
|
+
for (const t of tasks) {
|
|
307
|
+
insertTaskStmt.run(t.id, t.sliceId, t.milestoneId, t.title, "", t.status, "", "[]", t.sequence);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|