@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.0b870afa
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 +14 -34
- package/dist/help-text.js +5 -0
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/project-sessions.js +4 -2
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- 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 +139 -243
- 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/contracts.js +8 -1
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +77 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +860 -96
- package/dist/resources/extensions/gsd/auto/phases.js +81 -8
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
- package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
- package/dist/resources/extensions/gsd/auto-prompts.js +271 -27
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
- package/dist/resources/extensions/gsd/auto-start.js +36 -49
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +55 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -37
- package/dist/resources/extensions/gsd/auto-verification.js +30 -37
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +67 -375
- package/dist/resources/extensions/gsd/auto.js +112 -486
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +43 -49
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- 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 +319 -161
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -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/closeout-wizard.js +92 -0
- 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/context.js +16 -2
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
- 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/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -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/debug-logger.js +10 -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/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- 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 +6 -21
- package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
- 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/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- 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-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +184 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +91 -476
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +43 -33
- package/dist/resources/extensions/gsd/mcp-filter.js +10 -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 +97 -28
- 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-reopen-events.js +3 -5
- 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/native-git-bridge.js +45 -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/parsers-legacy.js +16 -4
- 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 +14 -48
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -3
- package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -3
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +3 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +3 -3
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +6 -3
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -4
- 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/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- 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/schemas/parsers.js +6 -1
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +19 -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 +66 -11
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
- 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-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +41 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- 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/tools/workflow-tool-executors.js +236 -22
- package/dist/resources/extensions/gsd/uat-policy.js +57 -25
- 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 +114 -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/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
- 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 +12 -3
- 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 +116 -6
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -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 -0
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +40 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- 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 +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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/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 +5 -5
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
- package/dist/web/standalone/.next/server/chunks/5942.js +2 -0
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- 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.e0bdc932325d7e03.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-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- 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 +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- 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 +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- 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 +17 -11
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- 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 +5 -0
- 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 +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.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 +113 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.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/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +9 -1
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- 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 +12 -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 +147 -60
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +183 -110
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +205 -158
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +29 -15
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +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/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.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/scripts/install/deps.js +10 -0
- package/scripts/link-workspace-packages.cjs +7 -40
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- 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/gsd-browser-launch-config.test.mjs +40 -1
- 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 +166 -293
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +270 -2
- 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 +40 -121
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +86 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +1023 -98
- package/src/resources/extensions/gsd/auto/phases.ts +108 -28
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
- package/src/resources/extensions/gsd/auto-prompts.ts +338 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
- package/src/resources/extensions/gsd/auto-start.ts +41 -49
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +59 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +43 -38
- package/src/resources/extensions/gsd/auto-verification.ts +33 -36
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -391
- package/src/resources/extensions/gsd/auto.ts +151 -524
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +43 -49
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- 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 +379 -177
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -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/closeout-wizard.ts +102 -0
- 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/context.ts +16 -2
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
- 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/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -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/debug-logger.ts +11 -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/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- 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 +5 -22
- package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
- 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/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- 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-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +188 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +118 -589
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +51 -20
- package/src/resources/extensions/gsd/mcp-filter.ts +11 -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 +121 -28
- 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-reopen-events.ts +3 -6
- 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/native-git-bridge.ts +48 -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/parsers-legacy.ts +16 -4
- 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 +12 -47
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -3
- package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -3
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +3 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +3 -3
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +6 -3
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -4
- 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/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- 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/schemas/parsers.ts +6 -1
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +24 -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/artifact-db-drift-memo.test.ts +66 -0
- 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-dispatch-baseline-harness.test.ts +53 -0
- 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-model-selection.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +894 -858
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +41 -11
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- 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/blocked-models.test.ts +19 -0
- 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/browser-daemon-auto-prep.test.ts +144 -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/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
- 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/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- 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/integration/merge-strategy-regular.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- 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 +120 -4
- 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/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- 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 +75 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- 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/research-milestone-composer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +44 -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 +21 -6
- 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 +114 -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/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- 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 +27 -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-planning-unit.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +188 -1
- package/src/resources/extensions/gsd/tool-contract.ts +124 -11
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
- 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-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +45 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- 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/tools/workflow-tool-executors.ts +264 -23
- package/src/resources/extensions/gsd/uat-policy.ts +80 -25
- 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 +196 -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/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
- 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 +20 -25
- 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 +141 -6
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -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/resources/extensions/gsd/user-input-boundary.js +0 -157
- package/dist/web/standalone/.next/server/chunks/678.js +0 -2
- 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/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
- package/scripts/ensure-workspace-builds.cjs +0 -129
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -26
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -166
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → T-LTxEw5wir5Lm5T3qEVd}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → T-LTxEw5wir5Lm5T3qEVd}/_ssgManifest.js +0 -0
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
// gsd-pi - Write gate runtime persistence and policy guards.
|
|
2
|
-
import { copyFileSync, existsSync, lstatSync, mkdirSync,
|
|
2
|
+
import { copyFileSync, existsSync, lstatSync, mkdirSync, readlinkSync, realpathSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
4
|
|
|
5
5
|
import { minimatch } from "minimatch";
|
|
6
6
|
|
|
7
7
|
import { GSD_PHASE_SCOPE_DISPLAY_REASON, shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
|
|
8
|
+
import { canonicalToolName } from "../engine-hook-contract.js";
|
|
9
|
+
import { loadJsonFileOrNull } from "../json-persistence.js";
|
|
8
10
|
import { getIsolationMode } from "../preferences.js";
|
|
9
11
|
import { compileSubagentPermissionContract, type ToolsPolicy } from "../unit-context-manifest.js";
|
|
10
12
|
import { logWarning } from "../workflow-logger.js";
|
|
11
13
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
14
|
+
import { worktreesDirs } from "../worktree-placement.js";
|
|
15
|
+
import { evaluateGateAnswer } from "../consent-verdict.js";
|
|
12
16
|
|
|
13
17
|
/**
|
|
14
18
|
* Regex matching milestone CONTEXT.md file names in both legacy M001
|
|
@@ -122,17 +126,20 @@ const GATE_SAFE_TOOLS = new Set([
|
|
|
122
126
|
"ask_user_questions",
|
|
123
127
|
]);
|
|
124
128
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Which process wrote a snapshot. Two processes share the snapshot file:
|
|
131
|
+
* the extension host ("host") and the workflow MCP child ("child"), which
|
|
132
|
+
* dynamically imports this same compiled module in its own process.
|
|
133
|
+
*/
|
|
134
|
+
export type WriteGateWriter = "host" | "child";
|
|
130
135
|
|
|
131
136
|
export interface WriteGateSnapshot {
|
|
132
137
|
verifiedDepthMilestones: string[];
|
|
133
138
|
verifiedApprovalGates?: string[];
|
|
134
139
|
activeQueuePhase: boolean;
|
|
135
140
|
pendingGateId: string | null;
|
|
141
|
+
/** Tag of the process that produced this snapshot (diagnostic only). */
|
|
142
|
+
writer?: WriteGateWriter;
|
|
136
143
|
}
|
|
137
144
|
|
|
138
145
|
/**
|
|
@@ -176,12 +183,11 @@ function currentWriteGateSnapshot(basePath: string = process.cwd()): WriteGateSn
|
|
|
176
183
|
};
|
|
177
184
|
}
|
|
178
185
|
|
|
179
|
-
function
|
|
180
|
-
if (!shouldPersistWriteGateSnapshot()) return;
|
|
186
|
+
function writeSnapshotFileAtomic(basePath: string, snapshot: WriteGateSnapshot): void {
|
|
181
187
|
const path = writeGateSnapshotPath(basePath);
|
|
182
188
|
ensureWriteGateSnapshotDirectory(basePath);
|
|
183
189
|
const tempPath = `${path}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
184
|
-
writeFileSync(tempPath, JSON.stringify(
|
|
190
|
+
writeFileSync(tempPath, JSON.stringify(snapshot, null, 2), "utf-8");
|
|
185
191
|
try {
|
|
186
192
|
renameSync(tempPath, path);
|
|
187
193
|
} catch (err: unknown) {
|
|
@@ -196,6 +202,18 @@ function persistWriteGateSnapshot(basePath: string): void {
|
|
|
196
202
|
}
|
|
197
203
|
}
|
|
198
204
|
|
|
205
|
+
/**
|
|
206
|
+
* Persist the current in-memory state for `basePath`, stamped with the
|
|
207
|
+
* writer provenance tag. Callers (mutateWriteGateState / childMutate) are
|
|
208
|
+
* responsible for first reconciling in-memory content against the disk
|
|
209
|
+
* snapshot — the read-merge-write sequence is synchronous, so a concurrent
|
|
210
|
+
* writer's update is folded in by that unconditional pre-persist read.
|
|
211
|
+
*/
|
|
212
|
+
function persistWriteGateSnapshot(basePath: string, writer: WriteGateWriter): void {
|
|
213
|
+
if (!shouldPersistWriteGateSnapshot()) return;
|
|
214
|
+
writeSnapshotFileAtomic(basePath, { ...currentWriteGateSnapshot(basePath), writer });
|
|
215
|
+
}
|
|
216
|
+
|
|
199
217
|
function clearPersistedWriteGateSnapshot(basePath: string): void {
|
|
200
218
|
if (!shouldPersistWriteGateSnapshot()) return;
|
|
201
219
|
const path = writeGateSnapshotPath(basePath);
|
|
@@ -219,6 +237,7 @@ function normalizeWriteGateSnapshot(value: unknown): WriteGateSnapshot {
|
|
|
219
237
|
verifiedApprovalGates: [...new Set(verifiedGates)].sort(),
|
|
220
238
|
activeQueuePhase: record.activeQueuePhase === true,
|
|
221
239
|
pendingGateId: typeof record.pendingGateId === "string" ? record.pendingGateId : null,
|
|
240
|
+
...(record.writer === "host" || record.writer === "child" ? { writer: record.writer } : {}),
|
|
222
241
|
};
|
|
223
242
|
}
|
|
224
243
|
|
|
@@ -229,6 +248,18 @@ const EMPTY_SNAPSHOT: WriteGateSnapshot = {
|
|
|
229
248
|
pendingGateId: null,
|
|
230
249
|
};
|
|
231
250
|
|
|
251
|
+
/**
|
|
252
|
+
* Read the snapshot file as it exists on disk. Returns null when the file
|
|
253
|
+
* is missing or unparseable (no in-memory fallback — callers decide).
|
|
254
|
+
*/
|
|
255
|
+
function readDiskSnapshot(basePath: string): WriteGateSnapshot | null {
|
|
256
|
+
const raw = loadJsonFileOrNull(
|
|
257
|
+
writeGateSnapshotPath(basePath),
|
|
258
|
+
(data): data is Record<string, unknown> => typeof data === "object" && data !== null,
|
|
259
|
+
);
|
|
260
|
+
return raw === null ? null : normalizeWriteGateSnapshot(raw);
|
|
261
|
+
}
|
|
262
|
+
|
|
232
263
|
export function loadWriteGateSnapshot(basePath: string): WriteGateSnapshot {
|
|
233
264
|
const path = writeGateSnapshotPath(basePath);
|
|
234
265
|
if (!existsSync(path)) {
|
|
@@ -238,13 +269,118 @@ export function loadWriteGateSnapshot(basePath: string): WriteGateSnapshot {
|
|
|
238
269
|
if (shouldPersistWriteGateSnapshot()) return EMPTY_SNAPSHOT;
|
|
239
270
|
return currentWriteGateSnapshot(basePath);
|
|
240
271
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
272
|
+
const disk = readDiskSnapshot(basePath);
|
|
273
|
+
return disk ?? currentWriteGateSnapshot(basePath);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Reconcile a disk snapshot into the in-memory state. This is THE merge
|
|
278
|
+
* rule for the two-process seam:
|
|
279
|
+
*
|
|
280
|
+
* - verifications are a grow-only union: a milestone/gate verified by
|
|
281
|
+
* either process is never lost to a stale write from the other;
|
|
282
|
+
* - activeQueuePhase and pendingGateId take the disk value (last writer
|
|
283
|
+
* wins — matches the long-standing refresh semantics, and keeps
|
|
284
|
+
* "delete the snapshot file to clear the HARD BLOCK" working);
|
|
285
|
+
* - verified wins over pending: if the merged verified sets already cover
|
|
286
|
+
* the pending gate (gate id verified, or its depth milestone verified),
|
|
287
|
+
* the pending re-arm is dropped. This generalizes the ad-hoc re-arm
|
|
288
|
+
* guard that previously protected only the tool_execution_start window.
|
|
289
|
+
*/
|
|
290
|
+
function mergeSnapshotIntoState(state: InMemoryWriteGateState, disk: WriteGateSnapshot): void {
|
|
291
|
+
for (const milestone of disk.verifiedDepthMilestones) state.verifiedDepthMilestones.add(milestone);
|
|
292
|
+
for (const gate of disk.verifiedApprovalGates ?? []) state.verifiedApprovalGates.add(gate);
|
|
293
|
+
state.activeQueuePhase = disk.activeQueuePhase;
|
|
294
|
+
state.pendingGateId = disk.pendingGateId;
|
|
295
|
+
dropVerifiedPendingGate(state);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/** Verified-on-disk wins over a pending re-arm (see mergeSnapshotIntoState). */
|
|
299
|
+
function dropVerifiedPendingGate(state: InMemoryWriteGateState): void {
|
|
300
|
+
const pending = state.pendingGateId;
|
|
301
|
+
if (!pending) return;
|
|
302
|
+
const milestoneId = extractDepthVerificationMilestoneId(pending);
|
|
303
|
+
if (
|
|
304
|
+
state.verifiedApprovalGates.has(pending) ||
|
|
305
|
+
(milestoneId !== null && state.verifiedDepthMilestones.has(milestoneId))
|
|
306
|
+
) {
|
|
307
|
+
state.pendingGateId = null;
|
|
245
308
|
}
|
|
246
309
|
}
|
|
247
310
|
|
|
311
|
+
function replaceStateFromSnapshot(state: InMemoryWriteGateState, snapshot: WriteGateSnapshot): void {
|
|
312
|
+
state.pendingGateId = snapshot.pendingGateId;
|
|
313
|
+
state.activeQueuePhase = snapshot.activeQueuePhase;
|
|
314
|
+
state.verifiedDepthMilestones = new Set(snapshot.verifiedDepthMilestones);
|
|
315
|
+
state.verifiedApprovalGates = new Set(snapshot.verifiedApprovalGates ?? []);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Reconcile the persisted write-gate snapshot into the in-process Map entry.
|
|
320
|
+
* The workflow MCP server runs in a child process and records depth
|
|
321
|
+
* verification there; without this refresh the extension host keeps stale
|
|
322
|
+
* pending-gate memory and `activateDeferredApprovalGate` can re-arm a gate
|
|
323
|
+
* that the subprocess already cleared on disk.
|
|
324
|
+
*
|
|
325
|
+
* Uses the union merge rule (mergeSnapshotIntoState) when a readable
|
|
326
|
+
* snapshot file exists; a missing or unparseable file is a full reset
|
|
327
|
+
* (replace with empty) so deleting the file still clears all gate state,
|
|
328
|
+
* and a corrupt file does not leave stale `pendingGateId` in memory for
|
|
329
|
+
* the next mutation to persist back.
|
|
330
|
+
*
|
|
331
|
+
* Returns the reconciled snapshot so callers that need to inspect it
|
|
332
|
+
* (e.g. re-arm guards) avoid a second disk read.
|
|
333
|
+
*/
|
|
334
|
+
export function refreshWriteGateStateFromDisk(basePath: string): WriteGateSnapshot {
|
|
335
|
+
if (!shouldPersistWriteGateSnapshot()) return currentWriteGateSnapshot(basePath);
|
|
336
|
+
const state = getWriteGateState(basePath);
|
|
337
|
+
const disk = readDiskSnapshot(basePath);
|
|
338
|
+
if (disk) {
|
|
339
|
+
mergeSnapshotIntoState(state, disk);
|
|
340
|
+
} else {
|
|
341
|
+
replaceStateFromSnapshot(state, EMPTY_SNAPSHOT);
|
|
342
|
+
}
|
|
343
|
+
return currentWriteGateSnapshot(basePath);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Read-modify-write primitive for gate mutations. Reconciles the disk
|
|
348
|
+
* snapshot into memory (union merge), applies the mutation on top, then
|
|
349
|
+
* persists. The whole sequence is synchronous, so the reconcile read
|
|
350
|
+
* doubles as the pre-persist merge of concurrent writes — there is no
|
|
351
|
+
* version field; the read-merge-write is simply unconditional.
|
|
352
|
+
*
|
|
353
|
+
* The mutate callback sees the already-reconciled state, so policy checks
|
|
354
|
+
* (e.g. host setPending's verified-on-disk-wins guard) can live inside it
|
|
355
|
+
* without a second disk read. Returning `false` from the callback aborts:
|
|
356
|
+
* nothing is persisted and this function returns false.
|
|
357
|
+
*
|
|
358
|
+
* `reconcile: false` skips the disk merge — used for intentional full
|
|
359
|
+
* resets where re-unioning disk verifications would defeat the reset.
|
|
360
|
+
*/
|
|
361
|
+
function mutateWriteGateState(
|
|
362
|
+
basePath: string,
|
|
363
|
+
mutate: (state: InMemoryWriteGateState) => void | false,
|
|
364
|
+
opts?: { writer?: WriteGateWriter; reconcile?: boolean },
|
|
365
|
+
): boolean {
|
|
366
|
+
const state = getWriteGateState(basePath);
|
|
367
|
+
if (shouldPersistWriteGateSnapshot() && (opts?.reconcile ?? true)) {
|
|
368
|
+
const disk = readDiskSnapshot(basePath);
|
|
369
|
+
if (disk) {
|
|
370
|
+
mergeSnapshotIntoState(state, disk);
|
|
371
|
+
} else {
|
|
372
|
+
// Missing OR unparseable on disk: treat as a full reset. Keeping
|
|
373
|
+
// stale in-memory state across a corrupt snapshot would persist it
|
|
374
|
+
// back on this very mutation and defeat the documented
|
|
375
|
+
// "delete the file to clear the HARD BLOCK gate" escape hatch.
|
|
376
|
+
replaceStateFromSnapshot(state, EMPTY_SNAPSHOT);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (mutate(state) === false) return false;
|
|
380
|
+
persistWriteGateSnapshot(basePath, opts?.writer ?? defaultWriteGateWriter());
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
|
|
248
384
|
export function isDepthVerified(basePath: string = process.cwd()): boolean {
|
|
249
385
|
return getWriteGateState(basePath).verifiedDepthMilestones.size > 0;
|
|
250
386
|
}
|
|
@@ -257,6 +393,7 @@ export function isMilestoneDepthVerified(
|
|
|
257
393
|
basePath: string = process.cwd(),
|
|
258
394
|
): boolean {
|
|
259
395
|
if (!milestoneId) return false;
|
|
396
|
+
refreshWriteGateStateFromDisk(basePath);
|
|
260
397
|
return getWriteGateState(basePath).verifiedDepthMilestones.has(milestoneId);
|
|
261
398
|
}
|
|
262
399
|
|
|
@@ -273,16 +410,17 @@ export function isQueuePhaseActive(basePath: string = process.cwd()): boolean {
|
|
|
273
410
|
}
|
|
274
411
|
|
|
275
412
|
export function setQueuePhaseActive(active: boolean, basePath: string): void {
|
|
276
|
-
|
|
277
|
-
|
|
413
|
+
mutateWriteGateState(basePath, (state) => {
|
|
414
|
+
state.activeQueuePhase = active;
|
|
415
|
+
});
|
|
278
416
|
}
|
|
279
417
|
|
|
280
418
|
export function resetWriteGateState(basePath: string): void {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
419
|
+
mutateWriteGateState(basePath, (state) => {
|
|
420
|
+
state.verifiedDepthMilestones.clear();
|
|
421
|
+
state.verifiedApprovalGates.clear();
|
|
422
|
+
state.pendingGateId = null;
|
|
423
|
+
}, { reconcile: false });
|
|
286
424
|
}
|
|
287
425
|
|
|
288
426
|
export function clearDiscussionFlowState(basePath: string): void {
|
|
@@ -290,16 +428,20 @@ export function clearDiscussionFlowState(basePath: string): void {
|
|
|
290
428
|
clearPersistedWriteGateSnapshot(basePath);
|
|
291
429
|
}
|
|
292
430
|
|
|
431
|
+
/**
|
|
432
|
+
* Ambient (env-sniffed) export, reserved for the child's dynamic-import
|
|
433
|
+
* surface (packages/mcp-server) and module-internal use. Host-owned modules
|
|
434
|
+
* (register-hooks, auto-dispatch, …) must call
|
|
435
|
+
* hostWriteGateAdapter.markDepthVerified explicitly so a leaked
|
|
436
|
+
* GSD_WORKFLOW_* env variable cannot silently flip them to child semantics.
|
|
437
|
+
*/
|
|
293
438
|
export function markDepthVerified(milestoneId?: string | null, basePath: string = process.cwd()): void {
|
|
294
|
-
|
|
295
|
-
getWriteGateState(basePath).verifiedDepthMilestones.add(milestoneId);
|
|
296
|
-
persistWriteGateSnapshot(basePath);
|
|
439
|
+
defaultWriteGateAdapter().markDepthVerified(milestoneId, basePath);
|
|
297
440
|
}
|
|
298
441
|
|
|
442
|
+
/** Ambient export for the child's dynamic-import surface — see markDepthVerified. */
|
|
299
443
|
export function markApprovalGateVerified(gateId?: string | null, basePath: string = process.cwd()): void {
|
|
300
|
-
|
|
301
|
-
getWriteGateState(basePath).verifiedApprovalGates.add(gateId);
|
|
302
|
-
persistWriteGateSnapshot(basePath);
|
|
444
|
+
defaultWriteGateAdapter().markApprovalGateVerified(gateId, basePath);
|
|
303
445
|
}
|
|
304
446
|
|
|
305
447
|
export function isApprovalGateVerifiedInSnapshot(
|
|
@@ -335,30 +477,174 @@ function extractContextMilestoneId(inputPath: string): string | null {
|
|
|
335
477
|
}
|
|
336
478
|
|
|
337
479
|
/**
|
|
338
|
-
* Mark a gate as pending (called when ask_user_questions is invoked with a
|
|
480
|
+
* Mark a gate as pending (called when ask_user_questions is invoked with a
|
|
481
|
+
* gate ID). Delegates to the process's default adapter: in the workflow MCP
|
|
482
|
+
* child the arm is unconditional (a fresh question intentionally revokes
|
|
483
|
+
* prior verification); in the host the adapter's verified-on-disk-wins
|
|
484
|
+
* guard applies and a suppressed arm returns false.
|
|
485
|
+
*
|
|
486
|
+
* Ambient (env-sniffed) export, reserved for the child's dynamic-import
|
|
487
|
+
* surface (packages/mcp-server). Host-owned modules must call
|
|
488
|
+
* hostWriteGateAdapter.setPending explicitly.
|
|
339
489
|
*/
|
|
340
|
-
export function setPendingGate(gateId: string, basePath: string):
|
|
341
|
-
|
|
490
|
+
export function setPendingGate(gateId: string, basePath: string): boolean {
|
|
491
|
+
return defaultWriteGateAdapter().setPending(gateId, basePath);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/** Arm `gateId` on a reconciled state, revoking its prior verification. */
|
|
495
|
+
function armPendingGate(state: InMemoryWriteGateState, gateId: string): void {
|
|
342
496
|
state.pendingGateId = gateId;
|
|
343
497
|
state.verifiedApprovalGates.delete(gateId);
|
|
344
498
|
const milestoneId = extractDepthVerificationMilestoneId(gateId);
|
|
345
499
|
if (milestoneId) state.verifiedDepthMilestones.delete(milestoneId);
|
|
346
|
-
persistWriteGateSnapshot(basePath);
|
|
347
500
|
}
|
|
348
501
|
|
|
349
502
|
/**
|
|
350
503
|
* Clear the pending gate (called when the user confirms).
|
|
504
|
+
* Ambient export for the child's dynamic-import surface — host-owned
|
|
505
|
+
* modules must call hostWriteGateAdapter.clearPending explicitly.
|
|
351
506
|
*/
|
|
352
507
|
export function clearPendingGate(basePath: string): void {
|
|
353
|
-
|
|
354
|
-
persistWriteGateSnapshot(basePath);
|
|
508
|
+
defaultWriteGateAdapter().clearPending(basePath);
|
|
355
509
|
}
|
|
356
510
|
|
|
357
511
|
/**
|
|
358
512
|
* Get the currently pending gate, if any.
|
|
513
|
+
* Ambient export for the child's dynamic-import surface — host-owned
|
|
514
|
+
* modules should prefer hostWriteGateAdapter.readState.
|
|
359
515
|
*/
|
|
360
516
|
export function getPendingGate(basePath: string = process.cwd()): string | null {
|
|
361
|
-
return
|
|
517
|
+
return defaultWriteGateAdapter().readState(basePath).pendingGateId;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// ─── Write-gate two-process seam ─────────────────────────────────────────────
|
|
521
|
+
//
|
|
522
|
+
// Two processes write .gsd/runtime/write-gate-state.json: the extension host
|
|
523
|
+
// and the workflow MCP child (which dynamically imports this same compiled
|
|
524
|
+
// module — see GSD_WORKFLOW_WRITE_GATE_MODULE in workflow-mcp.ts and
|
|
525
|
+
// packages/mcp-server/src/server.ts). The adapters below name that seam:
|
|
526
|
+
// every cross-process interleaving reduces to "host adapter op vs child
|
|
527
|
+
// adapter op", which is deterministic given the merge rule documented on
|
|
528
|
+
// mergeSnapshotIntoState plus the unconditional read-merge-write persist.
|
|
529
|
+
|
|
530
|
+
export interface WriteGateStateAdapter {
|
|
531
|
+
readonly writer: WriteGateWriter;
|
|
532
|
+
/** Fresh (child) or disk-reconciled (host) view of gate state. */
|
|
533
|
+
readState(basePath: string): WriteGateSnapshot;
|
|
534
|
+
markDepthVerified(milestoneId: string | null | undefined, basePath: string): void;
|
|
535
|
+
markApprovalGateVerified(gateId: string | null | undefined, basePath: string): void;
|
|
536
|
+
/**
|
|
537
|
+
* Arm a pending gate. Returns false when the adapter's policy suppressed
|
|
538
|
+
* the arm (host: gate already verified on disk — verified wins over a
|
|
539
|
+
* stale re-arm). Child adapter always arms (a fresh question intentionally
|
|
540
|
+
* revokes prior verification).
|
|
541
|
+
*/
|
|
542
|
+
setPending(gateId: string, basePath: string): boolean;
|
|
543
|
+
clearPending(basePath: string): void;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* HOST adapter: in-memory state + reconcile-on-read. Disk verifications are
|
|
548
|
+
* never lost (union merge), and a gate verified on disk wins over an
|
|
549
|
+
* in-memory pending re-arm — setPending refuses to clobber a verification
|
|
550
|
+
* the child already recorded. This generalizes the ad-hoc re-arm guard that
|
|
551
|
+
* previously protected only the tool_execution_start window in
|
|
552
|
+
* register-hooks.ts.
|
|
553
|
+
*/
|
|
554
|
+
export const hostWriteGateAdapter: WriteGateStateAdapter = {
|
|
555
|
+
writer: "host",
|
|
556
|
+
readState(basePath: string): WriteGateSnapshot {
|
|
557
|
+
return refreshWriteGateStateFromDisk(basePath);
|
|
558
|
+
},
|
|
559
|
+
markDepthVerified(milestoneId, basePath): void {
|
|
560
|
+
if (!milestoneId) return;
|
|
561
|
+
mutateWriteGateState(basePath, (state) => {
|
|
562
|
+
state.verifiedDepthMilestones.add(milestoneId);
|
|
563
|
+
}, { writer: "host" });
|
|
564
|
+
},
|
|
565
|
+
markApprovalGateVerified(gateId, basePath): void {
|
|
566
|
+
if (!gateId) return;
|
|
567
|
+
mutateWriteGateState(basePath, (state) => {
|
|
568
|
+
state.verifiedApprovalGates.add(gateId);
|
|
569
|
+
}, { writer: "host" });
|
|
570
|
+
},
|
|
571
|
+
setPending(gateId: string, basePath: string): boolean {
|
|
572
|
+
// The verified-check runs inside the mutate callback so the single
|
|
573
|
+
// reconcile read in mutateWriteGateState serves both the guard and the
|
|
574
|
+
// pre-persist merge. A suppressed arm aborts without persisting.
|
|
575
|
+
return mutateWriteGateState(basePath, (state) => {
|
|
576
|
+
if (state.verifiedApprovalGates.has(gateId)) return false;
|
|
577
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId);
|
|
578
|
+
if (milestoneId && state.verifiedDepthMilestones.has(milestoneId)) return false;
|
|
579
|
+
armPendingGate(state, gateId);
|
|
580
|
+
}, { writer: "host" });
|
|
581
|
+
},
|
|
582
|
+
clearPending(basePath: string): void {
|
|
583
|
+
mutateWriteGateState(basePath, (state) => {
|
|
584
|
+
state.pendingGateId = null;
|
|
585
|
+
}, { writer: "host" });
|
|
586
|
+
},
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* CHILD adapter: write-through with always-fresh reads — load the disk
|
|
591
|
+
* snapshot, mutate, persist. No cross-turn in-memory state is trusted: the
|
|
592
|
+
* in-process Map entry is replaced from disk before every mutation so a
|
|
593
|
+
* long-lived MCP child never resurrects state the host has since changed.
|
|
594
|
+
*/
|
|
595
|
+
export const childWriteGateAdapter: WriteGateStateAdapter = {
|
|
596
|
+
writer: "child",
|
|
597
|
+
readState(basePath: string): WriteGateSnapshot {
|
|
598
|
+
return loadWriteGateSnapshot(basePath);
|
|
599
|
+
},
|
|
600
|
+
markDepthVerified(milestoneId, basePath): void {
|
|
601
|
+
if (!milestoneId) return;
|
|
602
|
+
childMutate(basePath, (state) => {
|
|
603
|
+
state.verifiedDepthMilestones.add(milestoneId);
|
|
604
|
+
});
|
|
605
|
+
},
|
|
606
|
+
markApprovalGateVerified(gateId, basePath): void {
|
|
607
|
+
if (!gateId) return;
|
|
608
|
+
childMutate(basePath, (state) => {
|
|
609
|
+
state.verifiedApprovalGates.add(gateId);
|
|
610
|
+
});
|
|
611
|
+
},
|
|
612
|
+
setPending(gateId: string, basePath: string): boolean {
|
|
613
|
+
childMutate(basePath, (state) => armPendingGate(state, gateId));
|
|
614
|
+
return true;
|
|
615
|
+
},
|
|
616
|
+
clearPending(basePath: string): void {
|
|
617
|
+
childMutate(basePath, (state) => {
|
|
618
|
+
state.pendingGateId = null;
|
|
619
|
+
});
|
|
620
|
+
},
|
|
621
|
+
};
|
|
622
|
+
|
|
623
|
+
function childMutate(basePath: string, mutate: (state: InMemoryWriteGateState) => void): void {
|
|
624
|
+
const state = getWriteGateState(basePath);
|
|
625
|
+
if (shouldPersistWriteGateSnapshot()) {
|
|
626
|
+
// Always-fresh: disk is the only truth for the child; discard any
|
|
627
|
+
// cross-turn in-memory residue before mutating.
|
|
628
|
+
replaceStateFromSnapshot(state, readDiskSnapshot(basePath) ?? EMPTY_SNAPSHOT);
|
|
629
|
+
}
|
|
630
|
+
mutate(state);
|
|
631
|
+
persistWriteGateSnapshot(basePath, "child");
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Which adapter the module-level convenience exports (markDepthVerified,
|
|
636
|
+
* setPendingGate, …) delegate to. The workflow MCP child is spawned with
|
|
637
|
+
* GSD_WORKFLOW_WRITE_GATE_MODULE / GSD_WORKFLOW_PROJECT_ROOT in its
|
|
638
|
+
* environment (workflow-mcp.ts), so when this module is dynamically imported
|
|
639
|
+
* inside that process the child adapter is selected automatically; the
|
|
640
|
+
* extension host process has neither variable and stays on the host adapter.
|
|
641
|
+
*/
|
|
642
|
+
export function defaultWriteGateWriter(env: NodeJS.ProcessEnv = process.env): WriteGateWriter {
|
|
643
|
+
return env.GSD_WORKFLOW_WRITE_GATE_MODULE || env.GSD_WORKFLOW_PROJECT_ROOT ? "child" : "host";
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
function defaultWriteGateAdapter(): WriteGateStateAdapter {
|
|
647
|
+
return defaultWriteGateWriter() === "child" ? childWriteGateAdapter : hostWriteGateAdapter;
|
|
362
648
|
}
|
|
363
649
|
|
|
364
650
|
/**
|
|
@@ -433,33 +719,139 @@ export function shouldBlockPendingGateBashInSnapshot(
|
|
|
433
719
|
};
|
|
434
720
|
}
|
|
435
721
|
|
|
722
|
+
// The structural depth-confirmation validator lives in the consent-verdict
|
|
723
|
+
// leaf (../consent-verdict.ts) so the write gate and the Consent Question
|
|
724
|
+
// module share one verdict engine without an import cycle. Re-exported here
|
|
725
|
+
// because the workflow MCP child loads this module by dist path and validates
|
|
726
|
+
// the function is present (packages/mcp-server/src/server.ts).
|
|
727
|
+
export { isDepthConfirmationAnswer } from "../consent-verdict.js";
|
|
728
|
+
|
|
729
|
+
export interface AskUserQuestionsGateQuestion {
|
|
730
|
+
id?: unknown;
|
|
731
|
+
options?: Array<{ label?: string }>;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
export interface AskUserQuestionsGateDetails {
|
|
735
|
+
cancelled?: boolean;
|
|
736
|
+
interrupted?: boolean;
|
|
737
|
+
response?: {
|
|
738
|
+
answers?: Record<string, { selected?: unknown } | undefined>;
|
|
739
|
+
} | null;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
export type AskUserQuestionsGateResult =
|
|
743
|
+
| { status: "not-gate" }
|
|
744
|
+
| { status: "waiting"; pendingGateId: string; interrupted: boolean }
|
|
745
|
+
| { status: "verified"; gateId: string; milestoneId: string | null }
|
|
746
|
+
| { status: "declined"; gateId: string };
|
|
747
|
+
|
|
748
|
+
function findGateQuestion(
|
|
749
|
+
questions: AskUserQuestionsGateQuestion[],
|
|
750
|
+
gateId: string,
|
|
751
|
+
): AskUserQuestionsGateQuestion | undefined {
|
|
752
|
+
return questions.find((question) => question?.id === gateId);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
function verifyAnsweredGate(
|
|
756
|
+
basePath: string,
|
|
757
|
+
question: AskUserQuestionsGateQuestion,
|
|
758
|
+
fallbackMilestoneId?: string | null,
|
|
759
|
+
): AskUserQuestionsGateResult {
|
|
760
|
+
const gateId = typeof question.id === "string" ? question.id : "";
|
|
761
|
+
const milestoneId = extractDepthVerificationMilestoneId(gateId) ?? fallbackMilestoneId ?? null;
|
|
762
|
+
markApprovalGateVerified(gateId, basePath);
|
|
763
|
+
markDepthVerified(milestoneId, basePath);
|
|
764
|
+
clearPendingGate(basePath);
|
|
765
|
+
return { status: "verified", gateId, milestoneId };
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
/** Map an unresolved (non-verified) gate verdict to the caller-facing result. */
|
|
769
|
+
function unresolvedGateResult(
|
|
770
|
+
verdict: "declined" | "waiting" | "cancelled",
|
|
771
|
+
gateId: string,
|
|
772
|
+
details: AskUserQuestionsGateDetails,
|
|
773
|
+
): AskUserQuestionsGateResult {
|
|
774
|
+
if (verdict === "declined") return { status: "declined", gateId };
|
|
775
|
+
// "waiting" (and the unreachable post-cancel case): an empty selection is
|
|
776
|
+
// not an answer — keep the gate pending and make the caller pause.
|
|
777
|
+
return {
|
|
778
|
+
status: "waiting",
|
|
779
|
+
pendingGateId: gateId,
|
|
780
|
+
interrupted: details.interrupted === true,
|
|
781
|
+
};
|
|
782
|
+
}
|
|
783
|
+
|
|
436
784
|
/**
|
|
437
|
-
*
|
|
438
|
-
*
|
|
439
|
-
*
|
|
440
|
-
*
|
|
441
|
-
* coupling to any specific label substring.
|
|
785
|
+
* Apply an ask_user_questions round to durable gate state. The per-question
|
|
786
|
+
* VERDICT comes from the consent-verdict leaf (evaluateGateAnswer) — the same
|
|
787
|
+
* engine the Consent Question module uses — so write-gate only owns the
|
|
788
|
+
* persistence/arming side effects:
|
|
442
789
|
*
|
|
443
|
-
*
|
|
444
|
-
*
|
|
790
|
+
* - "verified" verdict → markApprovalGateVerified/markDepthVerified/clearPendingGate.
|
|
791
|
+
* - "declined" verdict → no state change; the gate (if armed) stays pending.
|
|
792
|
+
* - "waiting" verdict (empty/missing selection) → no state change; reported as
|
|
793
|
+
* "waiting" so callers pause instead of proceeding (fail-closed; an empty
|
|
794
|
+
* answer is never an answer).
|
|
445
795
|
*/
|
|
446
|
-
export function
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
796
|
+
export function applyAskUserQuestionsGateResult(options: {
|
|
797
|
+
basePath: string;
|
|
798
|
+
questions: AskUserQuestionsGateQuestion[];
|
|
799
|
+
details: AskUserQuestionsGateDetails;
|
|
800
|
+
fallbackMilestoneId?: string | null;
|
|
801
|
+
}): AskUserQuestionsGateResult {
|
|
802
|
+
const { basePath, questions, details, fallbackMilestoneId } = options;
|
|
803
|
+
const currentPendingGate = getPendingGate(basePath);
|
|
804
|
+
if (currentPendingGate) {
|
|
805
|
+
if (details.cancelled || !details.response) {
|
|
806
|
+
return {
|
|
807
|
+
status: "waiting",
|
|
808
|
+
pendingGateId: currentPendingGate,
|
|
809
|
+
interrupted: details.interrupted === true,
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
const pendingQuestion = findGateQuestion(questions, currentPendingGate);
|
|
814
|
+
if (pendingQuestion) {
|
|
815
|
+
const verdict = evaluateGateAnswer(pendingQuestion, details);
|
|
816
|
+
if (verdict === "verified") {
|
|
817
|
+
return verifyAnsweredGate(basePath, pendingQuestion, fallbackMilestoneId);
|
|
818
|
+
}
|
|
819
|
+
return unresolvedGateResult(verdict, currentPendingGate, details);
|
|
820
|
+
}
|
|
458
821
|
}
|
|
459
822
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
823
|
+
if (details.cancelled || !details.response) return { status: "not-gate" };
|
|
824
|
+
|
|
825
|
+
for (const question of questions) {
|
|
826
|
+
if (typeof question.id !== "string" || !isGateQuestionId(question.id)) continue;
|
|
827
|
+
const verdict = evaluateGateAnswer(question, details);
|
|
828
|
+
if (verdict !== "verified") {
|
|
829
|
+
return unresolvedGateResult(verdict, question.id, details);
|
|
830
|
+
}
|
|
831
|
+
if (currentPendingGate && question.id !== currentPendingGate) {
|
|
832
|
+
// A different gate than the armed one was confirmed — the armed gate is
|
|
833
|
+
// still unresolved, so do not verify and let discussion continue.
|
|
834
|
+
return { status: "declined", gateId: currentPendingGate };
|
|
835
|
+
}
|
|
836
|
+
return verifyAnsweredGate(basePath, question, fallbackMilestoneId);
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
return { status: "not-gate" };
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
export function formatPendingAskUserQuestionsGateMessage(
|
|
843
|
+
pendingGateId: string,
|
|
844
|
+
interrupted: boolean,
|
|
845
|
+
): string {
|
|
846
|
+
return [
|
|
847
|
+
`Waiting for depth confirmation on gate "${pendingGateId}".`,
|
|
848
|
+
interrupted
|
|
849
|
+
? "The confirmation question was interrupted before a response was recorded."
|
|
850
|
+
: "No user response was received for the confirmation question.",
|
|
851
|
+
"Do not infer approval from earlier or prior messages.",
|
|
852
|
+
"Do not proceed, write files, save artifacts, or call other tools.",
|
|
853
|
+
`Re-call ask_user_questions with the same gate question id ("${pendingGateId}") and wait for the user's response.`,
|
|
854
|
+
].join(" ");
|
|
463
855
|
}
|
|
464
856
|
|
|
465
857
|
export function shouldBlockContextWrite(
|
|
@@ -1034,10 +1426,12 @@ export function shouldBlockWorktreeWrite(
|
|
|
1034
1426
|
const realTarget = realpathOrResolve(absTarget);
|
|
1035
1427
|
const realRoot = realpathOrResolve(projectRoot);
|
|
1036
1428
|
const realGsd = realpathOrResolve(join(projectRoot, ".gsd"));
|
|
1037
|
-
const realWorktreesDir = realpathOrResolve(join(projectRoot, ".gsd", "worktrees"));
|
|
1038
1429
|
|
|
1039
|
-
// Allow writes inside
|
|
1040
|
-
|
|
1430
|
+
// Allow writes inside a legitimate worktrees subtree (canonical
|
|
1431
|
+
// .gsd-worktrees/ or legacy .gsd/worktrees/).
|
|
1432
|
+
for (const container of worktreesDirs(projectRoot)) {
|
|
1433
|
+
if (isPathContained(realTarget, realpathOrResolve(container))) return { block: false };
|
|
1434
|
+
}
|
|
1041
1435
|
|
|
1042
1436
|
// Allow writes to .gsd/ planning artifacts, but reject siblings whose name
|
|
1043
1437
|
// starts with "worktrees" (the worktrees-extra prefix trick — case 4).
|
|
@@ -14,3 +14,6 @@ export const QUICK_BRANCH_RE = /^gsd\/quick\//;
|
|
|
14
14
|
|
|
15
15
|
/** Matches GSD-generated workflow template branches, not arbitrary user gsd/* branches. */
|
|
16
16
|
export const WORKFLOW_BRANCH_RE = /^gsd\/(?:hotfix|bugfix|small-feature|refactor|spike|security-audit|dep-upgrade|full-project)\//;
|
|
17
|
+
|
|
18
|
+
/** Auto-mode milestone branch prefix: milestone/<MID>. */
|
|
19
|
+
export const MILESTONE_BRANCH_PREFIX = "milestone/";
|