@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,117 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Web-app detection and browser-UAT guidance for planning and slice closeout.
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { resolveAmbientBrowserEngineResolution } from "../browser-tools/engine/selection.js";
|
|
6
|
+
import { detectWebApp } from "../browser-tools/web-app-detect.js";
|
|
7
|
+
import { UAT_MODE_POLICIES } from "./uat-policy.js";
|
|
8
|
+
export { detectWebApp };
|
|
9
|
+
function readPackageJson(projectRoot) {
|
|
10
|
+
const packageJsonPath = resolve(projectRoot, "package.json");
|
|
11
|
+
if (!existsSync(packageJsonPath))
|
|
12
|
+
return null;
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
15
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function hasPlaywrightTestDependency(projectRoot) {
|
|
22
|
+
const pkg = readPackageJson(projectRoot);
|
|
23
|
+
if (!pkg)
|
|
24
|
+
return false;
|
|
25
|
+
const names = [
|
|
26
|
+
...Object.keys(pkg.dependencies ?? {}),
|
|
27
|
+
...Object.keys(pkg.devDependencies ?? {}),
|
|
28
|
+
];
|
|
29
|
+
return names.some((name) => name === "playwright" || name === "@playwright/test");
|
|
30
|
+
}
|
|
31
|
+
export function findPlaywrightTestScript(projectRoot) {
|
|
32
|
+
const pkg = readPackageJson(projectRoot);
|
|
33
|
+
if (!pkg?.scripts)
|
|
34
|
+
return null;
|
|
35
|
+
for (const [name, value] of Object.entries(pkg.scripts)) {
|
|
36
|
+
if (typeof value !== "string")
|
|
37
|
+
continue;
|
|
38
|
+
if (/\bplaywright\s+test\b/.test(value)) {
|
|
39
|
+
return `npm run ${name}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
function describeBrowserToolBacking(engineResolution) {
|
|
45
|
+
switch (engineResolution.engine) {
|
|
46
|
+
case "gsd-browser":
|
|
47
|
+
return "This project looks browser-facing. GSD exposes `browser_*` tools backed by the managed gsd-browser engine for run-uat.";
|
|
48
|
+
case "legacy":
|
|
49
|
+
return "This project looks browser-facing. GSD exposes Playwright-backed `browser_*` tools for run-uat.";
|
|
50
|
+
case "off":
|
|
51
|
+
return "This project looks browser-facing, but Pi browser tools are disabled (GSD_BROWSER_ENGINE=off) — prefer `runtime-executable` UAT with automated browser test commands.";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// One bullet per recommended UAT mode; `mode` keys into UAT_MODE_POLICIES so
|
|
55
|
+
// modes that require browser tools drop out of the guidance when the resolved
|
|
56
|
+
// engine provides none (mixed/live-runtime share one bullet and one policy bit).
|
|
57
|
+
const UAT_MODE_GUIDANCE = [
|
|
58
|
+
{
|
|
59
|
+
mode: "browser-executable",
|
|
60
|
+
bullet: "- `browser-executable` — navigate to `http://localhost:…`, click, screenshot, assert via `browser_*` tools during run-uat",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
mode: "runtime-executable",
|
|
64
|
+
bullet: "- `runtime-executable` — run an automated browser test command via `gsd_uat_exec` (for example `npx playwright test`)",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
mode: "mixed",
|
|
68
|
+
bullet: "- `mixed` / `live-runtime` — combine runtime startup checks with interactive browser verification",
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
/**
|
|
72
|
+
* Markdown block injected into plan/complete-slice prompts when the project
|
|
73
|
+
* looks browser-facing. Returns null for CLI/library-only repos. Guidance is
|
|
74
|
+
* composed from the resolved Browser Automation Engine so prompts never claim
|
|
75
|
+
* an engine the runtime is not using; `engineResolution` is injectable for
|
|
76
|
+
* tests and defaults to the ambient resolution.
|
|
77
|
+
*/
|
|
78
|
+
export function buildWebAppUatGuidanceBlock(projectRoot, engineResolution) {
|
|
79
|
+
if (!detectWebApp(projectRoot))
|
|
80
|
+
return null;
|
|
81
|
+
const resolvedEngine = engineResolution ?? resolveAmbientBrowserEngineResolution(projectRoot);
|
|
82
|
+
const browserToolsAvailable = resolvedEngine.engine !== "off";
|
|
83
|
+
const playwrightScript = findPlaywrightTestScript(projectRoot);
|
|
84
|
+
const hasPlaywright = hasPlaywrightTestDependency(projectRoot) || playwrightScript !== null;
|
|
85
|
+
const lines = [
|
|
86
|
+
"### Web App UAT (detected)",
|
|
87
|
+
"",
|
|
88
|
+
describeBrowserToolBacking(resolvedEngine),
|
|
89
|
+
"",
|
|
90
|
+
"**UAT modes (pick one per slice — do not use `artifact-driven` for browser steps):**",
|
|
91
|
+
...UAT_MODE_GUIDANCE
|
|
92
|
+
.filter(({ mode }) => browserToolsAvailable || !UAT_MODE_POLICIES[mode].browserTools)
|
|
93
|
+
.map(({ bullet }) => bullet),
|
|
94
|
+
"",
|
|
95
|
+
"**Planning / closeout rules:**",
|
|
96
|
+
"- Preconditions must name the dev-server command and URL (for example `npm run dev` → `http://localhost:3000`)",
|
|
97
|
+
"- Slice Verification and UAT test cases must not say \"open in browser\" under `artifact-driven` — complete-slice rejects that",
|
|
98
|
+
"- Milestone `Verification Classes` → UAT row must describe browser-observable acceptance, not \"manual spot check\" alone",
|
|
99
|
+
];
|
|
100
|
+
if (hasPlaywright) {
|
|
101
|
+
lines.push("", "**Playwright:** dependency detected.");
|
|
102
|
+
if (playwrightScript) {
|
|
103
|
+
lines.push(`- Prefer slice verification and runtime-executable UAT referencing \`${playwrightScript}\` or a focused \`npx playwright test <spec>\` command`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
lines.push("- Prefer runtime-executable UAT with `npx playwright test` (or a focused spec path) when UI behavior is covered by specs");
|
|
107
|
+
}
|
|
108
|
+
lines.push("- Name concrete spec paths in slice Verification (for example `e2e/smoke.spec.ts`)");
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
lines.push("", "**Playwright scaffolding (first UI slice):** no `playwright` / `@playwright/test` dependency yet.", "- Add a planning task that installs Playwright, adds `playwright.config.ts`, and creates a minimal smoke spec (for example `e2e/smoke.spec.ts`)", "- Task `verify` should run `npx playwright test` (or the focused spec) with a safe, simple command");
|
|
112
|
+
if (browserToolsAvailable) {
|
|
113
|
+
lines.push("- Until specs exist, use `browser-executable` UAT with localhost preconditions and interactive `browser_*` checks at slice closeout");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return lines.join("\n");
|
|
117
|
+
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import { existsSync, realpathSync } from "node:fs";
|
|
3
|
-
import { dirname, resolve, sep } from "node:path";
|
|
3
|
+
import { basename, dirname, resolve, sep } from "node:path";
|
|
4
4
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
5
|
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
6
|
+
import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
|
|
7
|
+
import { supportsStructuredQuestions, usesWorkflowMcpTransport, } from "./question-transport.js";
|
|
8
|
+
import { WORKFLOW_TOOL_SURFACE_NAMES, isWorkflowToolSurfaceName, } from "./workflow-tool-surface.js";
|
|
9
|
+
export { supportsStructuredQuestions, usesWorkflowMcpTransport };
|
|
6
10
|
/** Session cwd may be a milestone worktree; MCP config and server discovery use the project root. */
|
|
7
11
|
export function resolveWorkflowMcpProjectRoot(sessionCwd) {
|
|
8
12
|
let resolved;
|
|
@@ -19,72 +23,9 @@ export function resolveWorkflowMcpProjectRoot(sessionCwd) {
|
|
|
19
23
|
}
|
|
20
24
|
return resolved;
|
|
21
25
|
}
|
|
22
|
-
const MCP_WORKFLOW_TOOL_SURFACE = new Set([
|
|
23
|
-
"gsd_cancel",
|
|
24
|
-
"gsd_captures",
|
|
25
|
-
"ask_user_questions",
|
|
26
|
-
"gsd_capture_thought",
|
|
27
|
-
"gsd_doctor",
|
|
28
|
-
"gsd_execute",
|
|
29
|
-
"gsd_memory_query",
|
|
30
|
-
"gsd_memory_graph",
|
|
31
|
-
"gsd_decision_save",
|
|
32
|
-
"gsd_exec",
|
|
33
|
-
"gsd_exec_search",
|
|
34
|
-
"gsd_graph",
|
|
35
|
-
"gsd_history",
|
|
36
|
-
"gsd_knowledge",
|
|
37
|
-
"gsd_progress",
|
|
38
|
-
"gsd_query",
|
|
39
|
-
"gsd_resume",
|
|
40
|
-
"gsd_result",
|
|
41
|
-
"gsd_resolve_blocker",
|
|
42
|
-
"gsd_roadmap",
|
|
43
|
-
"gsd_status",
|
|
44
|
-
"gsd_complete_milestone",
|
|
45
|
-
"gsd_complete_task",
|
|
46
|
-
"gsd_complete_slice",
|
|
47
|
-
"gsd_generate_milestone_id",
|
|
48
|
-
"gsd_journal_query",
|
|
49
|
-
"gsd_milestone_complete",
|
|
50
|
-
"gsd_milestone_generate_id",
|
|
51
|
-
"gsd_milestone_reopen",
|
|
52
|
-
"gsd_checkpoint_db",
|
|
53
|
-
"gsd_milestone_plan",
|
|
54
|
-
"gsd_milestone_status",
|
|
55
|
-
"gsd_milestone_validate",
|
|
56
|
-
"gsd_plan_task",
|
|
57
|
-
"gsd_plan_milestone",
|
|
58
|
-
"gsd_plan_slice",
|
|
59
|
-
"gsd_replan_slice",
|
|
60
|
-
"gsd_reassess_roadmap",
|
|
61
|
-
"gsd_reopen_milestone",
|
|
62
|
-
"gsd_reopen_slice",
|
|
63
|
-
"gsd_reopen_task",
|
|
64
|
-
"gsd_requirement_save",
|
|
65
|
-
"gsd_requirement_update",
|
|
66
|
-
"gsd_roadmap_reassess",
|
|
67
|
-
"gsd_save_decision",
|
|
68
|
-
"gsd_save_gate_result",
|
|
69
|
-
"gsd_save_requirement",
|
|
70
|
-
"gsd_save_summary",
|
|
71
|
-
"gsd_skip_slice",
|
|
72
|
-
"gsd_slice_plan",
|
|
73
|
-
"gsd_slice_replan",
|
|
74
|
-
"gsd_slice_complete",
|
|
75
|
-
"gsd_slice_reopen",
|
|
76
|
-
"gsd_summary_save",
|
|
77
|
-
"gsd_task_plan",
|
|
78
|
-
"gsd_task_complete",
|
|
79
|
-
"gsd_task_reopen",
|
|
80
|
-
"gsd_update_requirement",
|
|
81
|
-
"gsd_uat_exec",
|
|
82
|
-
"gsd_uat_result_save",
|
|
83
|
-
"gsd_validate_milestone",
|
|
84
|
-
]);
|
|
85
26
|
/** Workflow MCP tools are validated by transport compatibility, not pi tool-compat profiles. */
|
|
86
27
|
export function isWorkflowMcpSurfaceTool(toolName) {
|
|
87
|
-
return
|
|
28
|
+
return isWorkflowToolSurfaceName(toolName);
|
|
88
29
|
}
|
|
89
30
|
function parseLookupOutput(output) {
|
|
90
31
|
return output
|
|
@@ -239,8 +180,12 @@ function getBundledWorkflowWriteGateModulePath() {
|
|
|
239
180
|
}
|
|
240
181
|
function getResolveTsHookPath() {
|
|
241
182
|
const repoRoot = findGsdPiRepoRoot(dirname(fileURLToPath(import.meta.url)));
|
|
183
|
+
const sourceRepoRoot = repoRoot && basename(repoRoot) === "dist-test" ? dirname(repoRoot) : repoRoot;
|
|
242
184
|
return firstExistingPath([
|
|
243
|
-
...(
|
|
185
|
+
...(sourceRepoRoot
|
|
186
|
+
? [resolve(sourceRepoRoot, "src", "resources", "extensions", "gsd", "tests", "resolve-ts.mjs")]
|
|
187
|
+
: []),
|
|
188
|
+
...(repoRoot && repoRoot !== sourceRepoRoot
|
|
244
189
|
? [resolve(repoRoot, "src", "resources", "extensions", "gsd", "tests", "resolve-ts.mjs")]
|
|
245
190
|
: []),
|
|
246
191
|
resolve(fileURLToPath(new URL("./tests/resolve-ts.mjs", import.meta.url))),
|
|
@@ -355,45 +300,13 @@ export function getRequiredWorkflowToolsForGuidedUnit(unitType) {
|
|
|
355
300
|
export function getRequiredWorkflowToolsForAutoUnit(unitType) {
|
|
356
301
|
return getRequiredWorkflowToolsForUnit(unitType);
|
|
357
302
|
}
|
|
358
|
-
export function usesWorkflowMcpTransport(authMode, baseUrl) {
|
|
359
|
-
return authMode === "externalCli" && typeof baseUrl === "string" && baseUrl.startsWith("local://");
|
|
360
|
-
}
|
|
361
|
-
function hasAskUserQuestionsTool(activeTools) {
|
|
362
|
-
return activeTools.some((toolName) => {
|
|
363
|
-
if (toolName === "ask_user_questions")
|
|
364
|
-
return true;
|
|
365
|
-
if (!toolName.startsWith("mcp__"))
|
|
366
|
-
return false;
|
|
367
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
368
|
-
return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === "ask_user_questions";
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
303
|
function hasRequiredTool(requiredTool, activeTools) {
|
|
372
304
|
return activeTools.some((toolName) => {
|
|
373
305
|
if (toolName === requiredTool)
|
|
374
306
|
return true;
|
|
375
|
-
|
|
376
|
-
return false;
|
|
377
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
378
|
-
return toolSeparator >= 0 && toolName.slice(toolSeparator + 2) === requiredTool;
|
|
307
|
+
return mcpToolMatchesBaseName(toolName, requiredTool);
|
|
379
308
|
});
|
|
380
309
|
}
|
|
381
|
-
function workflowMcpStructuredQuestionsOptIn(env = process.env) {
|
|
382
|
-
const value = env.GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS;
|
|
383
|
-
return value === "1" || value === "true";
|
|
384
|
-
}
|
|
385
|
-
export function supportsStructuredQuestions(activeTools, options = {}) {
|
|
386
|
-
if (!hasAskUserQuestionsTool(activeTools))
|
|
387
|
-
return false;
|
|
388
|
-
if (usesWorkflowMcpTransport(options.authMode, options.baseUrl)) {
|
|
389
|
-
// Claude Code local workflow-MCP exposes ask_user_questions, but form
|
|
390
|
-
// elicitation can return an immediate cancel outside GSD's chat turn. Keep
|
|
391
|
-
// checkpoints in plain chat unless a caller deliberately opts into testing
|
|
392
|
-
// that transport.
|
|
393
|
-
return workflowMcpStructuredQuestionsOptIn(options.env);
|
|
394
|
-
}
|
|
395
|
-
return true;
|
|
396
|
-
}
|
|
397
310
|
export function getWorkflowTransportSupportError(provider, requiredTools, options = {}) {
|
|
398
311
|
if (!provider || requiredTools.length === 0)
|
|
399
312
|
return null;
|
|
@@ -410,12 +323,12 @@ export function getWorkflowTransportSupportError(provider, requiredTools, option
|
|
|
410
323
|
}
|
|
411
324
|
const uniqueRequired = [...new Set(requiredTools)];
|
|
412
325
|
const missing = (options.activeTools && options.activeTools.length > 0)
|
|
413
|
-
? uniqueRequired.filter((tool) => !hasRequiredTool(tool, options.activeTools))
|
|
414
|
-
: uniqueRequired.filter((tool) => !
|
|
326
|
+
? uniqueRequired.filter((tool) => !isWorkflowToolSurfaceName(tool) && !hasRequiredTool(tool, options.activeTools))
|
|
327
|
+
: uniqueRequired.filter((tool) => !isWorkflowToolSurfaceName(tool));
|
|
415
328
|
if (missing.length === 0)
|
|
416
329
|
return null;
|
|
417
330
|
if (options.activeTools && options.activeTools.length > 0) {
|
|
418
331
|
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the active runtime toolset currently exposes only ${options.activeTools.slice().sort().join(", ")}.`;
|
|
419
332
|
}
|
|
420
|
-
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${
|
|
333
|
+
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${[...WORKFLOW_TOOL_SURFACE_NAMES].sort().join(", ")}.`;
|
|
421
334
|
}
|
|
@@ -2,7 +2,8 @@ import { join } from "node:path";
|
|
|
2
2
|
import { mkdirSync, existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
3
3
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
4
4
|
import { readEvents, findForkPoint, getSessionId } from "./workflow-events.js";
|
|
5
|
-
import { transaction, updateTaskStatus, updateSliceStatus, updateMilestoneStatus, getSliceTasks, insertMilestone, getMilestoneSlices, insertVerificationEvidence, upsertDecision,
|
|
5
|
+
import { transaction, updateTaskStatus, updateSliceStatus, updateMilestoneStatus, getSliceTasks, insertMilestone, getMilestoneSlices, insertVerificationEvidence, upsertDecision, setTaskBlockerDiscovered, insertOrIgnoreSlice, insertOrIgnoreTask, } from "./gsd-db.js";
|
|
6
|
+
import { openWorkflowDatabasePath } from "./db-workspace.js";
|
|
6
7
|
import { isClosedStatus } from "./status-guards.js";
|
|
7
8
|
import { invalidateStateCache } from "./state.js";
|
|
8
9
|
import { clearPathCache, resolveGsdPathContract } from "./paths.js";
|
|
@@ -415,7 +416,7 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
|
|
|
415
416
|
mkdirSync(join(mainBasePath, ".gsd"), { recursive: true });
|
|
416
417
|
atomicWriteSync(join(mainBasePath, ".gsd", "event-log.jsonl"), logContent);
|
|
417
418
|
// Step 8: Replay into DB (wrapped in a transaction by replayEvents)
|
|
418
|
-
|
|
419
|
+
openWorkflowDatabasePath(resolveGsdPathContract(mainBasePath).projectDb);
|
|
419
420
|
replayEvents(merged);
|
|
420
421
|
// Step 9: Write manifest
|
|
421
422
|
try {
|
|
@@ -548,7 +549,7 @@ pick) {
|
|
|
548
549
|
const targetBaseEvents = pick === "main" ? wtBaseEvents : mainBaseEvents;
|
|
549
550
|
writeEventLog(targetBasePath, targetBaseEvents.concat(rewrittenTargetEvents));
|
|
550
551
|
// Replay resolved events through the DB (updates DB state)
|
|
551
|
-
|
|
552
|
+
openWorkflowDatabasePath(resolveGsdPathContract(basePath).projectDb);
|
|
552
553
|
replayEvents(eventsToReplay);
|
|
553
554
|
invalidateStateCache();
|
|
554
555
|
clearPathCache();
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Adapts shared workflow tool contracts into the extension runtime surface.
|
|
3
|
+
import { CANONICAL_WORKFLOW_TOOL_NAMES as CONTRACT_CANONICAL_WORKFLOW_TOOL_NAMES, WORKFLOW_TOOL_ALIAS_NAMES as CONTRACT_WORKFLOW_TOOL_ALIAS_NAMES, WORKFLOW_TOOL_CONTRACTS as CONTRACT_WORKFLOW_TOOL_CONTRACTS, WORKFLOW_TOOL_NAMES as CONTRACT_WORKFLOW_TOOL_NAMES, } from "@opengsd/contracts";
|
|
4
|
+
import { stripMcpToolPrefix } from "./mcp-tool-name.js";
|
|
5
|
+
export const WORKFLOW_TOOL_CONTRACTS = CONTRACT_WORKFLOW_TOOL_CONTRACTS;
|
|
6
|
+
export const CANONICAL_WORKFLOW_TOOL_NAMES = CONTRACT_CANONICAL_WORKFLOW_TOOL_NAMES;
|
|
7
|
+
export const WORKFLOW_TOOL_ALIAS_NAMES = CONTRACT_WORKFLOW_TOOL_ALIAS_NAMES;
|
|
8
|
+
export const DB_WORKFLOW_TOOL_NAMES = CONTRACT_WORKFLOW_TOOL_NAMES;
|
|
9
|
+
export const WORKFLOW_TOOL_ALIAS_PAIRS = WORKFLOW_TOOL_CONTRACTS.flatMap((tool) => tool.aliases.map((alias) => ({ canonical: tool.canonicalName, alias })));
|
|
10
|
+
export const WORKFLOW_TOOL_ALIAS_TO_CANONICAL = Object.fromEntries(WORKFLOW_TOOL_ALIAS_PAIRS.map(({ alias, canonical }) => [alias, canonical]));
|
|
11
|
+
export const WORKFLOW_MCP_ADAPTER_TOOL_NAMES = [
|
|
12
|
+
"gsd_cancel",
|
|
13
|
+
"gsd_captures",
|
|
14
|
+
"ask_user_questions",
|
|
15
|
+
"gsd_doctor",
|
|
16
|
+
"gsd_execute",
|
|
17
|
+
"gsd_graph",
|
|
18
|
+
"gsd_history",
|
|
19
|
+
"gsd_knowledge",
|
|
20
|
+
"gsd_progress",
|
|
21
|
+
"gsd_query",
|
|
22
|
+
"gsd_result",
|
|
23
|
+
"gsd_resolve_blocker",
|
|
24
|
+
"gsd_roadmap",
|
|
25
|
+
"gsd_status",
|
|
26
|
+
];
|
|
27
|
+
export const WORKFLOW_TOOL_SURFACE_NAMES = [
|
|
28
|
+
...WORKFLOW_MCP_ADAPTER_TOOL_NAMES,
|
|
29
|
+
...DB_WORKFLOW_TOOL_NAMES,
|
|
30
|
+
];
|
|
31
|
+
const WORKFLOW_TOOL_SURFACE_NAME_SET = new Set(WORKFLOW_TOOL_SURFACE_NAMES);
|
|
32
|
+
export { stripMcpToolPrefix } from "./mcp-tool-name.js";
|
|
33
|
+
export function canonicalWorkflowSurfaceToolName(toolName) {
|
|
34
|
+
const baseName = stripMcpToolPrefix(toolName);
|
|
35
|
+
return WORKFLOW_TOOL_ALIAS_TO_CANONICAL[baseName] ?? baseName;
|
|
36
|
+
}
|
|
37
|
+
export function isWorkflowSurfaceAliasTool(toolName) {
|
|
38
|
+
const baseName = stripMcpToolPrefix(toolName);
|
|
39
|
+
return WORKFLOW_TOOL_ALIAS_TO_CANONICAL[baseName] !== undefined;
|
|
40
|
+
}
|
|
41
|
+
export function isWorkflowToolSurfaceName(toolName) {
|
|
42
|
+
return WORKFLOW_TOOL_SURFACE_NAME_SET.has(stripMcpToolPrefix(toolName));
|
|
43
|
+
}
|
|
44
|
+
export function aliasesForWorkflowTool(canonicalName) {
|
|
45
|
+
return WORKFLOW_TOOL_CONTRACTS.find((tool) => tool.canonicalName === canonicalName)?.aliases ?? [];
|
|
46
|
+
}
|
|
@@ -12,6 +12,8 @@ export function isWorkspaceGitAllowedCommand(trimmed) {
|
|
|
12
12
|
const [name, subcommand] = command.split(/\s+/, 2);
|
|
13
13
|
if (name === "doctor")
|
|
14
14
|
return true;
|
|
15
|
+
if (name === "forensics")
|
|
16
|
+
return true;
|
|
15
17
|
if (name === "closeout" || command.startsWith("closeout"))
|
|
16
18
|
return true;
|
|
17
19
|
if (name === "dispatch") {
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Git checkout/stash/merge-state recovery primitives for worktree operations.
|
|
3
|
+
/**
|
|
4
|
+
* Worktree Git Recovery — the recurring-bug hot spot, in one place.
|
|
5
|
+
*
|
|
6
|
+
* Owns the verbs that recover a repository from interrupted or conflicting
|
|
7
|
+
* git operations during worktree transitions:
|
|
8
|
+
*
|
|
9
|
+
* - `checkoutBranchWithStashGuard` — branch switch with stash protection,
|
|
10
|
+
* including the stash-pop EEXIST collision recovery for untracked files
|
|
11
|
+
* (force-checkout + targeted stash drop; #645 broadened it beyond `.gsd/`,
|
|
12
|
+
* guarded by "no non-.gsd unmerged entries remain").
|
|
13
|
+
* - `removeMergeStateFiles` — clears SQUASH_MSG / MERGE_HEAD / etc. left by
|
|
14
|
+
* a failed merge so subsequent merges don't fail on stale state.
|
|
15
|
+
* - `cleanupConflictState` — merge-abort + index reset + state-file cleanup
|
|
16
|
+
* after a conflicted (including squash) merge.
|
|
17
|
+
* - stash helpers (`popStashByRef`, `stashRefFromError`,
|
|
18
|
+
* `stashAlreadyExistsFilesFromError`, `gsdJsonlFilesWithConflictMarkers`)
|
|
19
|
+
* used by the merge pipeline in auto-worktree.ts.
|
|
20
|
+
*
|
|
21
|
+
* Extracted from auto-worktree.ts so recovery fixes land here instead of as
|
|
22
|
+
* embedded special cases in a 2,600-line orchestration module, and so the
|
|
23
|
+
* rules can be tested against scripted git states.
|
|
24
|
+
*
|
|
25
|
+
* The State Reconciliation drift repair (`state-reconciliation/drift/
|
|
26
|
+
* merge-state.ts`) keeps its own merge-state primitive by design — drift
|
|
27
|
+
* repairs own their raw primitives (see CONTEXT.md, Drift repair).
|
|
28
|
+
*/
|
|
29
|
+
import { execFileSync } from "node:child_process";
|
|
30
|
+
import { existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
31
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
32
|
+
import { debugLog } from "./debug-logger.js";
|
|
33
|
+
import { logError, logWarning } from "./workflow-logger.js";
|
|
34
|
+
import { nativeAddPaths, nativeCheckoutBranch, nativeConflictFiles, nativeLsFiles, nativeMergeAbort, nativeWorkingTreeStatus, } from "./native-git-bridge.js";
|
|
35
|
+
import { resolveGitDir } from "./worktree-manager.js";
|
|
36
|
+
/**
|
|
37
|
+
* Pop the stash entry created with `stashMarker` in its subject, resolving it
|
|
38
|
+
* to a concrete `stash@{n}` ref first so a concurrent stash push cannot make
|
|
39
|
+
* `git stash pop` grab the wrong entry.
|
|
40
|
+
*
|
|
41
|
+
* If `stashMarker` is null or no longer present in the stash list (e.g. a
|
|
42
|
+
* concurrent process popped/dropped it), leaves the stash list untouched and
|
|
43
|
+
* returns null.
|
|
44
|
+
*
|
|
45
|
+
* Throws on pop failure so callers can handle conflict cases the same way
|
|
46
|
+
* they would with the prior `git stash pop` form. When throwing after a
|
|
47
|
+
* targeted pop attempt, the error is annotated with the targeted stash ref.
|
|
48
|
+
*
|
|
49
|
+
* (Issue #4980 HIGH-6)
|
|
50
|
+
*/
|
|
51
|
+
export function popStashByRef(basePath, stashMarker) {
|
|
52
|
+
let popArg = null;
|
|
53
|
+
if (stashMarker) {
|
|
54
|
+
try {
|
|
55
|
+
const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
|
|
56
|
+
cwd: basePath,
|
|
57
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
58
|
+
encoding: "utf-8",
|
|
59
|
+
}).trim().split("\n").filter(Boolean);
|
|
60
|
+
for (const entry of list) {
|
|
61
|
+
const [ref, subject] = entry.split("\0");
|
|
62
|
+
if (ref && subject?.includes(stashMarker)) {
|
|
63
|
+
popArg = ref;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!popArg) {
|
|
73
|
+
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
execFileSync("git", ["stash", "pop", popArg], {
|
|
78
|
+
cwd: basePath,
|
|
79
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
80
|
+
encoding: "utf-8",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
if (err && typeof err === "object") {
|
|
85
|
+
err.stashRef = popArg;
|
|
86
|
+
}
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
return popArg;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract a stash ref annotation injected by popStashByRef() when git stash
|
|
93
|
+
* pop fails and we need to conditionally drop the exact stash entry later.
|
|
94
|
+
*/
|
|
95
|
+
export function stashRefFromError(err) {
|
|
96
|
+
if (!err || typeof err !== "object")
|
|
97
|
+
return null;
|
|
98
|
+
const stashRef = err.stashRef;
|
|
99
|
+
return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
|
|
100
|
+
}
|
|
101
|
+
export function stashAlreadyExistsFilesFromError(err) {
|
|
102
|
+
if (!err || typeof err !== "object")
|
|
103
|
+
return [];
|
|
104
|
+
const stderr = err.stderr;
|
|
105
|
+
const stderrText = typeof stderr === "string"
|
|
106
|
+
? stderr
|
|
107
|
+
: stderr instanceof Uint8Array
|
|
108
|
+
? Buffer.from(stderr).toString("utf-8")
|
|
109
|
+
: "";
|
|
110
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
111
|
+
const text = `${stderrText}\n${message}`;
|
|
112
|
+
const files = new Set();
|
|
113
|
+
for (const line of text.split("\n")) {
|
|
114
|
+
const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
|
|
115
|
+
if (!m)
|
|
116
|
+
continue;
|
|
117
|
+
const filePath = m[1]?.trim();
|
|
118
|
+
if (filePath)
|
|
119
|
+
files.add(filePath);
|
|
120
|
+
}
|
|
121
|
+
return [...files];
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Detect whether an on-disk file still contains unresolved merge conflict
|
|
125
|
+
* markers from a failed stash-pop or merge attempt.
|
|
126
|
+
*
|
|
127
|
+
* Returns false when the file cannot be read.
|
|
128
|
+
*/
|
|
129
|
+
export function hasConflictMarkers(filePath) {
|
|
130
|
+
try {
|
|
131
|
+
const content = readFileSync(filePath, "utf-8");
|
|
132
|
+
return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export function gsdJsonlFilesWithConflictMarkers(basePath) {
|
|
139
|
+
return nativeLsFiles(basePath, ".gsd/*.jsonl").filter((f) => hasConflictMarkers(join(basePath, f)));
|
|
140
|
+
}
|
|
141
|
+
export function removeMergeStateFiles(basePath, contextLabel) {
|
|
142
|
+
try {
|
|
143
|
+
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
|
|
144
|
+
const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
|
|
145
|
+
cwd: basePath,
|
|
146
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
147
|
+
encoding: "utf-8",
|
|
148
|
+
}).trim();
|
|
149
|
+
const p = rawPath.length > 0
|
|
150
|
+
? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
|
|
151
|
+
: join(resolveGitDir(basePath), f);
|
|
152
|
+
if (existsSync(p))
|
|
153
|
+
unlinkSync(p);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
export function cleanupConflictState(basePath) {
|
|
161
|
+
// Merge conflicts can leave unmerged index entries; merge-abort alone is not
|
|
162
|
+
// enough for squash merges (MERGE_HEAD is never written). Reset the merge
|
|
163
|
+
// index, then remove merge message files that native/libgit2 paths may have
|
|
164
|
+
// created.
|
|
165
|
+
try {
|
|
166
|
+
nativeMergeAbort(basePath);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
// MERGE_HEAD absent (squash merge path) — abort is a no-op, which is fine.
|
|
170
|
+
debugLog("conflict-cleanup:merge-abort-skipped", {
|
|
171
|
+
error: err instanceof Error ? err.message : String(err),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
execFileSync("git", ["reset", "--merge"], {
|
|
176
|
+
cwd: basePath,
|
|
177
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
178
|
+
encoding: "utf-8",
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
logError("worktree", `git reset --merge failed after merge conflict: ${err instanceof Error ? err.message : String(err)}`);
|
|
183
|
+
}
|
|
184
|
+
removeMergeStateFiles(basePath, "conflict");
|
|
185
|
+
}
|
|
186
|
+
export function checkoutBranchWithStashGuard(basePath, branch, reason) {
|
|
187
|
+
let stashMarker = null;
|
|
188
|
+
let stashed = false;
|
|
189
|
+
const status = nativeWorkingTreeStatus(basePath).trim();
|
|
190
|
+
if (status.length > 0) {
|
|
191
|
+
stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
192
|
+
const stashListBefore = execFileSync("git", ["stash", "list"], {
|
|
193
|
+
cwd: basePath,
|
|
194
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
195
|
+
encoding: "utf-8",
|
|
196
|
+
});
|
|
197
|
+
execFileSync("git", ["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`], {
|
|
198
|
+
cwd: basePath,
|
|
199
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
200
|
+
encoding: "utf-8",
|
|
201
|
+
});
|
|
202
|
+
const stashListAfter = execFileSync("git", ["stash", "list"], {
|
|
203
|
+
cwd: basePath,
|
|
204
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
205
|
+
encoding: "utf-8",
|
|
206
|
+
});
|
|
207
|
+
stashed = stashListAfter !== stashListBefore;
|
|
208
|
+
}
|
|
209
|
+
// Checkout and stash-restore are split so we can distinguish two failure
|
|
210
|
+
// modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
|
|
211
|
+
// (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
|
|
212
|
+
// the working-tree changes remain in the stash list. We surface a distinct
|
|
213
|
+
// error in case (b) so callers don't assume the branch switch was rolled back.
|
|
214
|
+
try {
|
|
215
|
+
nativeCheckoutBranch(basePath, branch);
|
|
216
|
+
}
|
|
217
|
+
catch (checkoutErr) {
|
|
218
|
+
if (stashed) {
|
|
219
|
+
try {
|
|
220
|
+
popStashByRef(basePath, stashMarker);
|
|
221
|
+
}
|
|
222
|
+
catch (restoreErr) {
|
|
223
|
+
logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
throw checkoutErr;
|
|
227
|
+
}
|
|
228
|
+
if (stashed) {
|
|
229
|
+
try {
|
|
230
|
+
popStashByRef(basePath, stashMarker);
|
|
231
|
+
}
|
|
232
|
+
catch (popErr) {
|
|
233
|
+
const msg = popErr instanceof Error ? popErr.message : String(popErr);
|
|
234
|
+
const stderr = popErr && typeof popErr === "object"
|
|
235
|
+
? popErr.stderr
|
|
236
|
+
: undefined;
|
|
237
|
+
const stderrText = typeof stderr === "string"
|
|
238
|
+
? stderr
|
|
239
|
+
: stderr instanceof Uint8Array
|
|
240
|
+
? Buffer.from(stderr).toString("utf-8")
|
|
241
|
+
: "";
|
|
242
|
+
const stashPopMessage = `${stderrText}\n${msg}`.trim();
|
|
243
|
+
const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
|
|
244
|
+
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
245
|
+
const stashRefForDrop = stashRefFromError(popErr);
|
|
246
|
+
const allConflictFiles = nativeConflictFiles(basePath);
|
|
247
|
+
const nonGsdUnmerged = allConflictFiles.filter((f) => !f.startsWith(".gsd/"));
|
|
248
|
+
const gsdUnmerged = allConflictFiles.filter((f) => f.startsWith(".gsd/"));
|
|
249
|
+
const gsdContentConflicts = isUntrackedRestoreFailure
|
|
250
|
+
? gsdJsonlFilesWithConflictMarkers(basePath)
|
|
251
|
+
: [];
|
|
252
|
+
// Resolve ALL untracked-collision files by accepting HEAD — files in
|
|
253
|
+
// alreadyExists were untracked on the source branch by definition of the
|
|
254
|
+
// "already exists, no checkout" failure, so target HEAD is authoritative.
|
|
255
|
+
// gsdUnmerged: .gsd/ index conflicts left by the partial stash pop are
|
|
256
|
+
// also resolved via HEAD — .gsd/ runtime state is always authoritative
|
|
257
|
+
// on the target branch, so accepting HEAD is safe here too.
|
|
258
|
+
const resolvable = [...new Set([...alreadyExists, ...gsdContentConflicts, ...gsdUnmerged])];
|
|
259
|
+
if (isUntrackedRestoreFailure &&
|
|
260
|
+
resolvable.length > 0 &&
|
|
261
|
+
nonGsdUnmerged.length === 0) {
|
|
262
|
+
for (const f of resolvable) {
|
|
263
|
+
execFileSync("git", ["checkout", "HEAD", "--", f], {
|
|
264
|
+
cwd: basePath,
|
|
265
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
266
|
+
encoding: "utf-8",
|
|
267
|
+
});
|
|
268
|
+
nativeAddPaths(basePath, [f]);
|
|
269
|
+
}
|
|
270
|
+
if (stashRefForDrop) {
|
|
271
|
+
try {
|
|
272
|
+
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
273
|
+
cwd: basePath,
|
|
274
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
275
|
+
encoding: "utf-8",
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch (err) { /* stash may already be consumed */
|
|
279
|
+
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
|
|
284
|
+
}
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const wrapped = new Error(`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`);
|
|
288
|
+
if (stashRefForDrop)
|
|
289
|
+
wrapped.stashRef = stashRefForDrop;
|
|
290
|
+
throw wrapped;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|