@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.84c56d87
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-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/help-text.js +5 -0
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- 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 +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +122 -234
- 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 +23 -11
- package/dist/resources/extensions/gsd/auto-prompts.js +84 -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 +24 -37
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +11 -45
- 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 +53 -368
- package/dist/resources/extensions/gsd/auto.js +19 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- 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-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +209 -149
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- 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/crash-recovery.js +4 -12
- 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 +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +10 -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/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +83 -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 +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -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/notification-store.js +11 -4
- 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 +11 -7
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +12 -46
- 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 +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -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 +41 -87
- 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 +14 -25
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- 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-readiness.js +56 -0
- 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 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- 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 +17 -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-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +49 -21
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- 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 +117 -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 +293 -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 +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- 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/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +72 -4
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- 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 +6 -6
- 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 +6 -6
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- 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/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +2 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- 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/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- 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 +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +48 -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 +455 -546
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +481 -599
- 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/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.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 +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +148 -285
- 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 +29 -10
- package/src/resources/extensions/gsd/auto-prompts.ts +110 -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 +29 -35
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +19 -47
- 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 +68 -384
- package/src/resources/extensions/gsd/auto.ts +35 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- 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-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -161
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- 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/crash-recovery.ts +3 -9
- 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 +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +12 -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/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +95 -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 +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -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/notification-store.ts +26 -3
- 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 +10 -7
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +10 -46
- 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 +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -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 +47 -88
- 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 +19 -26
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- 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/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -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 +46 -8
- 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 +89 -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/extension-bootstrap-isolation.test.ts +35 -1
- 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/guidance.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- 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/notification-store.test.ts +32 -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/pre-execution-checks.test.ts +193 -1
- 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-error-guidance.test.ts +3 -3
- 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/publication.test.ts +120 -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 +342 -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 +26 -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/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -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 +193 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- 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-readiness.ts +76 -0
- 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 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- 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 +20 -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-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +97 -21
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- 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 +144 -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 +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -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 +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- 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/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +88 -4
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- 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 → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Workspace-facing Interface for opening and maintaining the workflow database.
|
|
3
|
+
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import { dirname } from "node:path";
|
|
6
|
+
|
|
7
|
+
import type { GsdWorkspace, MilestoneScope } from "./workspace.js";
|
|
8
|
+
import {
|
|
9
|
+
backupDatabaseSnapshot,
|
|
10
|
+
checkpointDatabase,
|
|
11
|
+
closeAllDatabases,
|
|
12
|
+
closeDatabase,
|
|
13
|
+
closeDatabaseByWorkspace,
|
|
14
|
+
getDbPath,
|
|
15
|
+
getDbStatus,
|
|
16
|
+
getDbProvider,
|
|
17
|
+
isDbAvailable,
|
|
18
|
+
openDatabase,
|
|
19
|
+
openDatabaseByScope,
|
|
20
|
+
openDatabaseByWorkspace,
|
|
21
|
+
refreshOpenDatabaseFromDisk,
|
|
22
|
+
vacuumDatabase,
|
|
23
|
+
wasDbOpenAttempted,
|
|
24
|
+
} from "./gsd-db.js";
|
|
25
|
+
import { resolveGsdPathContract } from "./paths.js";
|
|
26
|
+
import { setLogBasePath } from "./workflow-logger.js";
|
|
27
|
+
|
|
28
|
+
export interface WorkflowDatabaseLocation {
|
|
29
|
+
projectRoot: string;
|
|
30
|
+
projectGsd: string;
|
|
31
|
+
projectDb: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type WorkflowDatabaseOpenReason =
|
|
35
|
+
| "opened-existing"
|
|
36
|
+
| "created-empty"
|
|
37
|
+
| "missing-database"
|
|
38
|
+
| "missing-gsd-dir"
|
|
39
|
+
| "open-failed";
|
|
40
|
+
|
|
41
|
+
export type WorkflowDatabaseOpenResult =
|
|
42
|
+
| {
|
|
43
|
+
ok: true;
|
|
44
|
+
reason: "opened-existing" | "created-empty";
|
|
45
|
+
location: WorkflowDatabaseLocation;
|
|
46
|
+
}
|
|
47
|
+
| {
|
|
48
|
+
ok: false;
|
|
49
|
+
reason: "missing-database" | "missing-gsd-dir" | "open-failed";
|
|
50
|
+
location: WorkflowDatabaseLocation;
|
|
51
|
+
error?: Error;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export type WorkflowDatabaseStatus = ReturnType<typeof getDbStatus>;
|
|
55
|
+
export type WorkflowDatabaseProvider = ReturnType<typeof getDbProvider>;
|
|
56
|
+
|
|
57
|
+
export function resolveWorkflowDatabaseLocation(basePath: string): WorkflowDatabaseLocation {
|
|
58
|
+
const contract = resolveGsdPathContract(basePath);
|
|
59
|
+
return {
|
|
60
|
+
projectRoot: dirname(dirname(contract.projectDb)),
|
|
61
|
+
projectGsd: contract.projectGsd,
|
|
62
|
+
projectDb: contract.projectDb,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Resolve the correct DB path for the current working directory.
|
|
68
|
+
* If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
|
|
69
|
+
* the project root's `.gsd/gsd.db` (shared WAL — R012). Otherwise returns
|
|
70
|
+
* `<basePath>/.gsd/gsd.db`.
|
|
71
|
+
*/
|
|
72
|
+
export function resolveProjectRootDbPath(basePath: string): string {
|
|
73
|
+
return resolveWorkflowDatabaseLocation(basePath).projectDb;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function openWorkflowDatabase(basePath: string): WorkflowDatabaseOpenResult {
|
|
77
|
+
const location = resolveWorkflowDatabaseLocation(basePath);
|
|
78
|
+
if (!existsSync(location.projectGsd)) {
|
|
79
|
+
return { ok: false, reason: "missing-gsd-dir", location };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const existed = existsSync(location.projectDb);
|
|
83
|
+
try {
|
|
84
|
+
const opened = openDatabase(location.projectDb);
|
|
85
|
+
if (!opened) {
|
|
86
|
+
return { ok: false, reason: "open-failed", location };
|
|
87
|
+
}
|
|
88
|
+
setLogBasePath(location.projectRoot);
|
|
89
|
+
return {
|
|
90
|
+
ok: true,
|
|
91
|
+
reason: existed ? "opened-existing" : "created-empty",
|
|
92
|
+
location,
|
|
93
|
+
};
|
|
94
|
+
} catch (err) {
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
reason: "open-failed",
|
|
98
|
+
location,
|
|
99
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function openExistingWorkflowDatabase(basePath: string): WorkflowDatabaseOpenResult {
|
|
105
|
+
const location = resolveWorkflowDatabaseLocation(basePath);
|
|
106
|
+
if (!existsSync(location.projectDb)) {
|
|
107
|
+
return { ok: false, reason: "missing-database", location };
|
|
108
|
+
}
|
|
109
|
+
return openWorkflowDatabase(basePath);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function openWorkflowDatabasePath(path: string): boolean {
|
|
113
|
+
return openDatabase(path);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function openWorkflowDatabaseByWorkspace(workspace: GsdWorkspace): boolean {
|
|
117
|
+
return openDatabaseByWorkspace(workspace);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function openWorkflowDatabaseByScope(scope: MilestoneScope): boolean {
|
|
121
|
+
return openDatabaseByScope(scope);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function closeWorkflowDatabase(): void {
|
|
125
|
+
closeDatabase();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function closeWorkflowDatabaseByWorkspace(workspace: GsdWorkspace): void {
|
|
129
|
+
closeDatabaseByWorkspace(workspace);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function closeAllWorkflowDatabases(): void {
|
|
133
|
+
closeAllDatabases();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function isWorkflowDatabaseOpen(): boolean {
|
|
137
|
+
return isDbAvailable();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function wasWorkflowDatabaseOpenAttempted(): boolean {
|
|
141
|
+
return wasDbOpenAttempted();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function getWorkflowDatabaseStatus(): WorkflowDatabaseStatus {
|
|
145
|
+
return getDbStatus();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function getWorkflowDatabaseProvider(): WorkflowDatabaseProvider {
|
|
149
|
+
return getDbProvider();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function getWorkflowDatabasePath(): string | null {
|
|
153
|
+
return getDbPath();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function refreshWorkflowDatabaseFromDisk(): boolean {
|
|
157
|
+
return refreshOpenDatabaseFromDisk();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function checkpointWorkflowDatabase(): void {
|
|
161
|
+
checkpointDatabase();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function vacuumWorkflowDatabase(): void {
|
|
165
|
+
vacuumDatabase();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function backupWorkflowDatabaseSnapshot(label: string): string | null {
|
|
169
|
+
return backupDatabaseSnapshot(label);
|
|
170
|
+
}
|
|
@@ -35,6 +35,8 @@
|
|
|
35
35
|
// existing entry is the place to lift any of these out of default-deny
|
|
36
36
|
// when the analysis has been done.
|
|
37
37
|
|
|
38
|
+
import { canonicalWorkflowSurfaceToolName } from "./workflow-tool-surface.js";
|
|
39
|
+
|
|
38
40
|
export type BackgroundabilityVerdict = "good" | "risky" | "no";
|
|
39
41
|
|
|
40
42
|
export interface DelegationPolicyEntry {
|
|
@@ -123,18 +125,8 @@ const POLICY: Record<string, DelegationPolicyEntry> = {
|
|
|
123
125
|
},
|
|
124
126
|
};
|
|
125
127
|
|
|
126
|
-
// Alias map keyed on the secondary name; resolves to the canonical entry above.
|
|
127
|
-
// Sourced from packages/mcp-server/src/workflow-tools.ts alias registrations
|
|
128
|
-
// (gsd_milestone_validate, gsd_roadmap_reassess, gsd_slice_replan, gsd_task_plan).
|
|
129
|
-
const ALIASES: Record<string, string> = {
|
|
130
|
-
gsd_milestone_validate: "gsd_validate_milestone",
|
|
131
|
-
gsd_roadmap_reassess: "gsd_reassess_roadmap",
|
|
132
|
-
gsd_slice_replan: "gsd_replan_slice",
|
|
133
|
-
gsd_task_plan: "gsd_plan_task",
|
|
134
|
-
};
|
|
135
|
-
|
|
136
128
|
function resolveCanonical(name: string): string {
|
|
137
|
-
return
|
|
129
|
+
return canonicalWorkflowSurfaceToolName(name);
|
|
138
130
|
}
|
|
139
131
|
|
|
140
132
|
export function getDelegationVerdict(toolName: string): DelegationPolicyEntry | null {
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Owns the guided-discuss to auto-mode handoff.
|
|
3
|
+
|
|
4
|
+
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
5
|
+
import { existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { startAutoDetached } from "./auto.js";
|
|
8
|
+
import { extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
|
|
9
|
+
import { getMilestone, insertMilestone, isDbAvailable } from "./gsd-db.js";
|
|
10
|
+
import {
|
|
11
|
+
assessMilestoneHandoffReadiness,
|
|
12
|
+
formatAcceptedDiscussHandoffMessage,
|
|
13
|
+
} from "./milestone-readiness.js";
|
|
14
|
+
import { gsdRoot, resolveGsdRootFile, resolveMilestoneFile } from "./paths.js";
|
|
15
|
+
import { _getPendingAutoStart, deletePendingAutoStart, type PendingAutoStartEntry } from "./pending-auto-start.js";
|
|
16
|
+
import { logWarning } from "./workflow-logger.js";
|
|
17
|
+
import { readManifest } from "./workflow-manifest.js";
|
|
18
|
+
|
|
19
|
+
type AutoStartOptions = Parameters<typeof startAutoDetached>[4];
|
|
20
|
+
type AutoStartLauncher = typeof startAutoDetached;
|
|
21
|
+
|
|
22
|
+
// Cap failed in-flight DB row repair attempts before escalating to the user.
|
|
23
|
+
const MAX_DB_ROW_RECOVERIES = 3;
|
|
24
|
+
const PROJECT_DEPTH_GATE_IDS = new Set([
|
|
25
|
+
"depth_verification_project_confirm",
|
|
26
|
+
"depth_verification_requirements_confirm",
|
|
27
|
+
"depth_verification_research_decision_confirm",
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
export function scheduleAutoStartAfterIdle(
|
|
31
|
+
ctx: ExtensionCommandContext,
|
|
32
|
+
pi: ExtensionAPI,
|
|
33
|
+
basePath: string,
|
|
34
|
+
verboseMode: boolean,
|
|
35
|
+
options?: AutoStartOptions,
|
|
36
|
+
launch: AutoStartLauncher = startAutoDetached,
|
|
37
|
+
): void {
|
|
38
|
+
const waitForIdle =
|
|
39
|
+
typeof (ctx as { waitForIdle?: unknown }).waitForIdle === "function"
|
|
40
|
+
? ctx.waitForIdle.bind(ctx)
|
|
41
|
+
: async () => {};
|
|
42
|
+
void waitForIdle()
|
|
43
|
+
.then(() => {
|
|
44
|
+
setTimeout(() => launch(ctx, pi, basePath, verboseMode, options), 0);
|
|
45
|
+
})
|
|
46
|
+
.catch((err) => {
|
|
47
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
48
|
+
ctx.ui.notify(`Auto-start failed while waiting for the prior turn to settle: ${message}`, "error");
|
|
49
|
+
logWarning("guided", `auto-start idle wait failed: ${message}`);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function manifestContainsMilestone(basePath: string, milestoneId: string): boolean {
|
|
54
|
+
try {
|
|
55
|
+
const manifest = readManifest(basePath);
|
|
56
|
+
return (
|
|
57
|
+
Array.isArray(manifest?.milestones) &&
|
|
58
|
+
manifest.milestones.some(m => m.id === milestoneId)
|
|
59
|
+
);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
logWarning("guided", `R3b: failed to read state manifest: ${(e as Error).message}`);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function notifyDbRowRecoveryFailed(entry: PendingAutoStartEntry): void {
|
|
67
|
+
entry.ctx.ui.notify(
|
|
68
|
+
`Milestone ${entry.milestoneId}: DB row recovery failed ${entry.r3bRecoveryCount} times. ` +
|
|
69
|
+
`Re-run /gsd to reset the recovery counter, or run /gsd-debug to diagnose without resetting.`,
|
|
70
|
+
"error",
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function noteDbRowRecoveryMiss(entry: PendingAutoStartEntry): void {
|
|
75
|
+
entry.r3bRecoveryCount += 1;
|
|
76
|
+
if (entry.r3bRecoveryCount >= MAX_DB_ROW_RECOVERIES) {
|
|
77
|
+
notifyDbRowRecoveryFailed(entry);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function ensureMilestoneRowForAcceptedHandoff(
|
|
82
|
+
entry: PendingAutoStartEntry,
|
|
83
|
+
contextFile: string | null,
|
|
84
|
+
): boolean {
|
|
85
|
+
if (!isDbAvailable()) return true;
|
|
86
|
+
|
|
87
|
+
const { basePath, milestoneId } = entry;
|
|
88
|
+
const milestoneRow = getMilestone(milestoneId);
|
|
89
|
+
if (milestoneRow) return true;
|
|
90
|
+
|
|
91
|
+
if (manifestContainsMilestone(basePath, milestoneId)) {
|
|
92
|
+
logWarning(
|
|
93
|
+
"guided",
|
|
94
|
+
`R3b: getMilestone(${milestoneId}) returned null but manifest has the row — treating as stale read`,
|
|
95
|
+
);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!contextFile) {
|
|
100
|
+
entry.ctx.ui.notify(
|
|
101
|
+
`Milestone ${milestoneId}: discuss artifacts on disk but no DB row exists. ` +
|
|
102
|
+
`PROJECT.md may have failed to register milestones. ` +
|
|
103
|
+
`Re-save PROJECT.md with canonical "- [ ] M001: Title — One-liner" lines, ` +
|
|
104
|
+
`then re-run /gsd to recover.`,
|
|
105
|
+
"error",
|
|
106
|
+
);
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (entry.r3bRecoveryCount >= MAX_DB_ROW_RECOVERIES) {
|
|
111
|
+
logWarning(
|
|
112
|
+
"guided",
|
|
113
|
+
`R3b: milestone ${milestoneId} DB-row recovery limit reached ` +
|
|
114
|
+
`(${entry.r3bRecoveryCount}/${MAX_DB_ROW_RECOVERIES}); user already notified`,
|
|
115
|
+
);
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
logWarning(
|
|
120
|
+
"guided",
|
|
121
|
+
`R3b: ${milestoneId} has CONTEXT.md but no DB row — inserting placeholder "queued" row ` +
|
|
122
|
+
`(attempt ${entry.r3bRecoveryCount + 1}/${MAX_DB_ROW_RECOVERIES})`,
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
insertMilestone({ id: milestoneId, title: milestoneId, status: "queued" });
|
|
127
|
+
} catch (e) {
|
|
128
|
+
logWarning("guided", `R3b: insertMilestone failed: ${(e as Error).message}`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (getMilestone(milestoneId)) return true;
|
|
132
|
+
|
|
133
|
+
noteDbRowRecoveryMiss(entry);
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Extract milestone IDs from PROJECT.md milestone sequence table.
|
|
139
|
+
* Looks for rows like "| M001 | Name | Status |" and extracts the ID column.
|
|
140
|
+
*/
|
|
141
|
+
function parseMilestoneSequenceFromProject(content: string): string[] {
|
|
142
|
+
const ids: string[] = [];
|
|
143
|
+
const lines = content.split(/\r?\n/);
|
|
144
|
+
for (const line of lines) {
|
|
145
|
+
const match = line.match(/^\|\s*(M\d{3}[A-Z0-9-]*)\s*\|/);
|
|
146
|
+
if (match) ids.push(match[1]);
|
|
147
|
+
}
|
|
148
|
+
return ids;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function hasBlockingDepthGate(entry: PendingAutoStartEntry): boolean {
|
|
152
|
+
const basePathForGate = entry.scope.workspace.projectRoot;
|
|
153
|
+
const pendingGateId = getPendingGate(basePathForGate);
|
|
154
|
+
if (!pendingGateId) return false;
|
|
155
|
+
|
|
156
|
+
const pendingMilestoneId = extractDepthVerificationMilestoneId(pendingGateId);
|
|
157
|
+
return pendingMilestoneId === entry.milestoneId || PROJECT_DEPTH_GATE_IDS.has(pendingGateId);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function discussionManifestPath(entry: PendingAutoStartEntry): string {
|
|
161
|
+
return join(entry.scope.workspace.contract.projectGsd, "DISCUSSION-MANIFEST.json");
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function warnForMissingProjectMilestones(entry: PendingAutoStartEntry): string[] {
|
|
165
|
+
const { ctx, basePath } = entry;
|
|
166
|
+
const projectFile = resolveGsdRootFile(basePath, "PROJECT");
|
|
167
|
+
if (!projectFile) return [];
|
|
168
|
+
|
|
169
|
+
try {
|
|
170
|
+
const projectContent = readFileSync(projectFile, "utf-8");
|
|
171
|
+
const projectIds = parseMilestoneSequenceFromProject(projectContent);
|
|
172
|
+
if (projectIds.length <= 1) return projectIds;
|
|
173
|
+
|
|
174
|
+
const missing = projectIds.filter(id => {
|
|
175
|
+
const hasContext = !!resolveMilestoneFile(basePath, id, "CONTEXT");
|
|
176
|
+
const hasDraft = !!resolveMilestoneFile(basePath, id, "CONTEXT-DRAFT");
|
|
177
|
+
const hasDir = existsSync(join(gsdRoot(basePath), "milestones", id));
|
|
178
|
+
return !hasContext && !hasDraft && !hasDir;
|
|
179
|
+
});
|
|
180
|
+
if (missing.length > 0) {
|
|
181
|
+
ctx.ui.notify(
|
|
182
|
+
`Multi-milestone validation: ${missing.join(", ")} not found in filesystem. ` +
|
|
183
|
+
`Discussion may not have completed all readiness gates.`,
|
|
184
|
+
"warning",
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
return projectIds;
|
|
188
|
+
} catch (e) {
|
|
189
|
+
logWarning("guided", `PROJECT.md parsing failed: ${(e as Error).message}`);
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function discussionManifestIsComplete(entry: PendingAutoStartEntry, projectIds: string[]): boolean {
|
|
195
|
+
const manifestPath = discussionManifestPath(entry);
|
|
196
|
+
if (!existsSync(manifestPath)) return true;
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
200
|
+
const total = typeof manifest.total === "number" ? manifest.total : 0;
|
|
201
|
+
const completed = typeof manifest.gates_completed === "number" ? manifest.gates_completed : 0;
|
|
202
|
+
|
|
203
|
+
if (total > 1 && completed < total) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (projectIds.length > 0) {
|
|
208
|
+
const manifestIds = Object.keys(manifest.milestones ?? {});
|
|
209
|
+
const untracked = projectIds.filter(id => !manifestIds.includes(id));
|
|
210
|
+
if (untracked.length > 0) {
|
|
211
|
+
entry.ctx.ui.notify(
|
|
212
|
+
`Discussion manifest missing gates for: ${untracked.join(", ")}`,
|
|
213
|
+
"warning",
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
} catch (e) {
|
|
218
|
+
logWarning("guided", `discussion manifest verification failed: ${(e as Error).message}`);
|
|
219
|
+
}
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function cleanupAcceptedHandoffArtifacts(entry: PendingAutoStartEntry): void {
|
|
224
|
+
const { basePath, milestoneId } = entry;
|
|
225
|
+
try {
|
|
226
|
+
const draftFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT-DRAFT");
|
|
227
|
+
if (draftFile) unlinkSync(draftFile);
|
|
228
|
+
} catch (e) {
|
|
229
|
+
logWarning("guided", `CONTEXT-DRAFT.md unlink failed: ${(e as Error).message}`);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const manifestPath = discussionManifestPath(entry);
|
|
233
|
+
if (existsSync(manifestPath)) {
|
|
234
|
+
try {
|
|
235
|
+
unlinkSync(manifestPath);
|
|
236
|
+
} catch (e) {
|
|
237
|
+
logWarning("guided", `manifest unlink failed: ${(e as Error).message}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** Called from agent_end to check if auto-mode should start after discuss. */
|
|
243
|
+
export function checkAutoStartAfterDiscuss(lookupBasePath?: string): boolean {
|
|
244
|
+
const entry = _getPendingAutoStart(lookupBasePath);
|
|
245
|
+
if (!entry) return false;
|
|
246
|
+
|
|
247
|
+
const { ctx, pi, basePath, milestoneId, step } = entry;
|
|
248
|
+
const contextFilePath = entry.scope.contextFile();
|
|
249
|
+
const roadmapFilePath = entry.scope.roadmapFile();
|
|
250
|
+
const contextFile = existsSync(contextFilePath) ? contextFilePath : null;
|
|
251
|
+
const roadmapFile = existsSync(roadmapFilePath) ? roadmapFilePath : null;
|
|
252
|
+
if (!contextFile && !roadmapFile) return false;
|
|
253
|
+
|
|
254
|
+
if (hasBlockingDepthGate(entry)) return false;
|
|
255
|
+
if (!ensureMilestoneRowForAcceptedHandoff(entry, contextFile)) return false;
|
|
256
|
+
|
|
257
|
+
const projectIds = warnForMissingProjectMilestones(entry);
|
|
258
|
+
if (!discussionManifestIsComplete(entry, projectIds)) return false;
|
|
259
|
+
|
|
260
|
+
cleanupAcceptedHandoffArtifacts(entry);
|
|
261
|
+
deletePendingAutoStart(basePath);
|
|
262
|
+
|
|
263
|
+
const readiness = assessMilestoneHandoffReadiness({
|
|
264
|
+
milestoneId,
|
|
265
|
+
contextFile,
|
|
266
|
+
roadmapFile,
|
|
267
|
+
});
|
|
268
|
+
ctx.ui.notify(
|
|
269
|
+
formatAcceptedDiscussHandoffMessage(milestoneId, readiness),
|
|
270
|
+
"success",
|
|
271
|
+
);
|
|
272
|
+
if (entry.startAuto !== false) {
|
|
273
|
+
scheduleAutoStartAfterIdle(ctx, pi, basePath, false, { step: step ?? true });
|
|
274
|
+
}
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
@@ -73,6 +73,15 @@ These are **separate concerns**:
|
|
|
73
73
|
|
|
74
74
|
Setting `prefer_skills: []` does **not** disable skill discovery — it just means you have no preference overrides. Use `skill_discovery: off` to disable discovery entirely.
|
|
75
75
|
|
|
76
|
+
### Parse & Validation Diagnostics
|
|
77
|
+
|
|
78
|
+
Preference loading never throws. When a file is malformed or contains invalid settings, GSD falls back to safe defaults but attaches structured diagnostics (see `collectPreferenceDiagnostics()` in `preferences-diagnostics.ts`) so the problem is reported instead of silently ignored:
|
|
79
|
+
|
|
80
|
+
- **Parse failures** (missing closing `---` delimiter, YAML syntax error, or an unrecognized file format) cause the whole file to be ignored. Loading continues to the next candidate — a valid global or legacy preferences file is still used, and a malformed project file never becomes the effective wrapper or blocks fallback.
|
|
81
|
+
- **Validation problems** (unknown keys, type mismatches) are sanitized or dropped per-field; the remaining valid settings in the file still apply.
|
|
82
|
+
|
|
83
|
+
Diagnostics record the file path, scope (global/project), severity (error/warning), kind (parse/validation), and — for YAML parse errors — the line and column. They surface through session-start notifications, `/gsd doctor`, and auto-mode preflight, with each surface deduping repeated diagnostics.
|
|
84
|
+
|
|
76
85
|
---
|
|
77
86
|
|
|
78
87
|
## Field Guide
|
|
@@ -15,6 +15,7 @@ import { join } from "node:path";
|
|
|
15
15
|
|
|
16
16
|
import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
|
|
17
17
|
import { detectPythonExecutable } from "./python-resolver.js";
|
|
18
|
+
import { projectRootFromWorktreePath } from "./worktree-root.js";
|
|
18
19
|
|
|
19
20
|
// ── Types ──────────────────────────────────────────────────────────────────
|
|
20
21
|
|
|
@@ -38,27 +39,18 @@ const CMD_TIMEOUT = 5_000;
|
|
|
38
39
|
|
|
39
40
|
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
40
41
|
|
|
41
|
-
/** Worktree sentinel — path segment that marks an auto-worktree directory. */
|
|
42
|
-
const WORKTREE_PATH_SEGMENT = `${join(".gsd", "worktrees")}/`;
|
|
43
|
-
|
|
44
42
|
/**
|
|
45
|
-
* Resolve the project root when running inside a
|
|
46
|
-
*
|
|
43
|
+
* Resolve the project root when running inside a GSD auto-worktree.
|
|
44
|
+
* Returns `null` if not in a worktree.
|
|
47
45
|
*
|
|
48
46
|
* Detection order:
|
|
49
47
|
* 1. `GSD_WORKTREE` env var (set by the worktree launcher)
|
|
50
|
-
* 2.
|
|
48
|
+
* 2. worktree segment in basePath (via worktree-root's layout matching)
|
|
51
49
|
*/
|
|
52
50
|
function resolveWorktreeProjectRoot(basePath: string): string | null {
|
|
53
51
|
const envRoot = process.env.GSD_WORKTREE;
|
|
54
52
|
if (envRoot) return envRoot;
|
|
55
|
-
|
|
56
|
-
const normalised = basePath.replace(/\\/g, "/");
|
|
57
|
-
const idx = normalised.indexOf(WORKTREE_PATH_SEGMENT.replace(/\\/g, "/"));
|
|
58
|
-
if (idx === -1) return null;
|
|
59
|
-
|
|
60
|
-
// Everything before `.gsd/worktrees/` is the project root
|
|
61
|
-
return basePath.slice(0, idx);
|
|
53
|
+
return projectRootFromWorktreePath(basePath);
|
|
62
54
|
}
|
|
63
55
|
|
|
64
56
|
function tryExec(cmd: string, cwd: string): string | null {
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type { DoctorIssue, DoctorIssueCode, DoctorReport, DoctorSummary } from "./doctor-types.js";
|
|
1
|
+
import type { DoctorIssue, DoctorIssueCode, DoctorReport, DoctorSummary, DoctorSeverity } from "./doctor-types.js";
|
|
2
|
+
import { doctorFixHint } from "./guidance.js";
|
|
3
|
+
|
|
4
|
+
function severityTag(severity: DoctorSeverity): string {
|
|
5
|
+
return severity === "error" ? "ERROR" : severity === "warning" ? "WARN" : "INFO";
|
|
6
|
+
}
|
|
2
7
|
|
|
3
8
|
function matchesScope(unitId: string, scope?: string): boolean {
|
|
4
9
|
if (!scope) return true;
|
|
@@ -53,8 +58,9 @@ export function formatDoctorReport(
|
|
|
53
58
|
if (scopedIssues.length > 0) {
|
|
54
59
|
lines.push("Priority issues:");
|
|
55
60
|
for (const issue of scopedIssues.slice(0, maxIssues)) {
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
lines.push(`- [${severityTag(issue.severity)}] ${issue.unitId}: ${issue.message}${issue.file ? ` (${issue.file})` : ""}`);
|
|
62
|
+
const hint = doctorFixHint(issue.code);
|
|
63
|
+
if (hint && issue.severity !== "info") lines.push(` Fix: ${hint}`);
|
|
58
64
|
}
|
|
59
65
|
if (scopedIssues.length > maxIssues) {
|
|
60
66
|
lines.push(`- ...and ${scopedIssues.length - maxIssues} more in scope`);
|
|
@@ -72,10 +78,9 @@ export function formatDoctorReport(
|
|
|
72
78
|
|
|
73
79
|
export function formatDoctorIssuesForPrompt(issues: DoctorIssue[]): string {
|
|
74
80
|
if (issues.length === 0) return "- No remaining issues in scope.";
|
|
75
|
-
return issues.map(issue =>
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}).join("\n");
|
|
81
|
+
return issues.map(issue =>
|
|
82
|
+
`- [${severityTag(issue.severity)}] ${issue.unitId} | ${issue.code} | ${issue.message}${issue.file ? ` | file: ${issue.file}` : ""} | fixable: ${issue.fixable ? "yes" : "no"}`
|
|
83
|
+
).join("\n");
|
|
79
84
|
}
|
|
80
85
|
|
|
81
86
|
/**
|
|
@@ -9,7 +9,7 @@ import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
|
9
9
|
import { isDbAvailable, getMilestone } from "./gsd-db.js";
|
|
10
10
|
import { resolveMilestoneFile } from "./paths.js";
|
|
11
11
|
import { deriveState, isMilestoneComplete } from "./state.js";
|
|
12
|
-
import { createWorktree, listWorktrees, resolveGitDir
|
|
12
|
+
import { allWorktreesDirs, createWorktree, listWorktrees, resolveGitDir } from "./worktree-manager.js";
|
|
13
13
|
import { abortAndReset } from "./git-self-heal.js";
|
|
14
14
|
import { RUNTIME_EXCLUSION_PATHS, resolveMilestoneIntegrationBranch, writeIntegrationBranch } from "./git-service.js";
|
|
15
15
|
import { nativeIsRepo, nativeWorktreeList, nativeWorktreeRemove, nativeBranchList, nativeBranchDelete, nativeLsFiles, nativeRmCached, nativeHasChanges, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeAddTracked, nativeCommit } from "./native-git-bridge.js";
|
|
@@ -496,8 +496,8 @@ export async function checkGitHealth(
|
|
|
496
496
|
// that is no longer registered with git. These orphaned dirs cause
|
|
497
497
|
// "already exists" errors when re-creating the same worktree name.
|
|
498
498
|
try {
|
|
499
|
-
const wtDir
|
|
500
|
-
|
|
499
|
+
for (const wtDir of allWorktreesDirs(basePath)) {
|
|
500
|
+
if (!existsSync(wtDir)) continue;
|
|
501
501
|
// Resolve symlinks and normalize separators so that symlinked .gsd
|
|
502
502
|
// paths (e.g. ~/.gsd/projects/<hash>/worktrees/…) match the paths
|
|
503
503
|
// returned by `git worktree list`.
|
|
@@ -414,26 +414,31 @@ export async function checkRuntimeHealth(
|
|
|
414
414
|
".gsd/event-log.jsonl",
|
|
415
415
|
];
|
|
416
416
|
|
|
417
|
-
// If blanket .gsd/ or .gsd is present, all patterns are covered
|
|
417
|
+
// If blanket .gsd/ or .gsd is present, all .gsd/* patterns are covered —
|
|
418
|
+
// but NOT the .gsd-worktrees/ sibling, which always needs its own entry.
|
|
418
419
|
const hasBlanketIgnore = existingLines.has(".gsd/") || existingLines.has(".gsd");
|
|
419
|
-
|
|
420
|
+
const missing: string[] = [];
|
|
421
|
+
if (!existingLines.has(".gsd-worktrees/") && !existingLines.has(".gsd-worktrees")) {
|
|
422
|
+
missing.push(".gsd-worktrees/");
|
|
423
|
+
}
|
|
420
424
|
if (!hasBlanketIgnore) {
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
issues.push({
|
|
424
|
-
severity: "warning",
|
|
425
|
-
code: "gitignore_missing_patterns",
|
|
426
|
-
scope: "project",
|
|
427
|
-
unitId: "project",
|
|
428
|
-
message: `${missing.length} critical GSD runtime pattern(s) missing from .gitignore: ${missing.join(", ")}`,
|
|
429
|
-
file: ".gitignore",
|
|
430
|
-
fixable: true,
|
|
431
|
-
});
|
|
425
|
+
missing.push(...criticalPatterns.filter(p => !existingLines.has(p)));
|
|
426
|
+
}
|
|
432
427
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
428
|
+
if (missing.length > 0) {
|
|
429
|
+
issues.push({
|
|
430
|
+
severity: "warning",
|
|
431
|
+
code: "gitignore_missing_patterns",
|
|
432
|
+
scope: "project",
|
|
433
|
+
unitId: "project",
|
|
434
|
+
message: `${missing.length} critical GSD runtime pattern(s) missing from .gitignore: ${missing.join(", ")}`,
|
|
435
|
+
file: ".gitignore",
|
|
436
|
+
fixable: true,
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
if (shouldFix("gitignore_missing_patterns")) {
|
|
440
|
+
ensureGitignore(basePath, { manageGitignore });
|
|
441
|
+
fixesApplied.push("added missing GSD runtime patterns to .gitignore");
|
|
437
442
|
}
|
|
438
443
|
}
|
|
439
444
|
}
|