@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
|
@@ -9,6 +9,7 @@ import { deriveState } from "./state.js";
|
|
|
9
9
|
import { gsdProjectionRoot, gsdRoot } from "./paths.js";
|
|
10
10
|
import { nativeBranchList, nativeDetectMainBranch, nativeBranchListMerged, nativeBranchDelete, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
|
|
11
11
|
import { logWarning } from "./workflow-logger.js";
|
|
12
|
+
import { backupWorkflowDatabaseSnapshot, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
12
13
|
export async function handleCleanupBranches(ctx, basePath) {
|
|
13
14
|
let branches;
|
|
14
15
|
try {
|
|
@@ -511,7 +512,7 @@ async function confirmRecover(ctx, args, markdown, beforeDb, dataLoss) {
|
|
|
511
512
|
* Prints counts of recovered items and the resulting project phase.
|
|
512
513
|
*/
|
|
513
514
|
export async function handleRecover(ctx, basePath, args = "") {
|
|
514
|
-
const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction
|
|
515
|
+
const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction } = await import("./gsd-db.js");
|
|
515
516
|
const { migrateHierarchyToDb } = await import("./md-importer.js");
|
|
516
517
|
const { invalidateStateCache } = await import("./state.js");
|
|
517
518
|
const { countDbHierarchy, countMarkdownHierarchy, recoverWouldDeleteDbRows } = await import("./migration-auto-check.js");
|
|
@@ -531,7 +532,7 @@ export async function handleRecover(ctx, basePath, args = "") {
|
|
|
531
532
|
return;
|
|
532
533
|
try {
|
|
533
534
|
// 0. Snapshot the DB before the destructive clear so recover is reversible.
|
|
534
|
-
const backupPath =
|
|
535
|
+
const backupPath = backupWorkflowDatabaseSnapshot("pre-recover");
|
|
535
536
|
// 1. Delete + re-populate inside a single transaction for atomicity.
|
|
536
537
|
// clearEngineHierarchy() uses transaction() internally but transaction()
|
|
537
538
|
// is re-entrant, so wrapping in dbTransaction() keeps the whole
|
|
@@ -655,6 +656,49 @@ function parseRebuildTarget(args) {
|
|
|
655
656
|
return "database";
|
|
656
657
|
return "usage";
|
|
657
658
|
}
|
|
659
|
+
/**
|
|
660
|
+
* Re-render markdown planning projections from the authoritative DB.
|
|
661
|
+
*
|
|
662
|
+
* Quarantines open-unit SUMMARY files that contradict DB status before
|
|
663
|
+
* rendering. Safe to call after milestone merge/transition or during startup
|
|
664
|
+
* self-heal when the DB holds rows markdown lacks.
|
|
665
|
+
*/
|
|
666
|
+
export async function rebuildMarkdownProjectionsFromDb(basePath) {
|
|
667
|
+
const { deleteArtifactByPath } = await import("./gsd-db.js");
|
|
668
|
+
const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
|
|
669
|
+
const { renderAllFromDb } = await import("./markdown-renderer.js");
|
|
670
|
+
const { invalidateStateCache } = await import("./state.js");
|
|
671
|
+
invalidateStateCache();
|
|
672
|
+
refreshWorkflowDatabaseFromDisk();
|
|
673
|
+
const state = await deriveState(basePath);
|
|
674
|
+
const drifts = detectArtifactDbDrift(state, { basePath, state });
|
|
675
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
676
|
+
const quarantined = [];
|
|
677
|
+
const seen = new Set();
|
|
678
|
+
for (const drift of drifts) {
|
|
679
|
+
if (drift.kind !== "artifact-db-status-divergence")
|
|
680
|
+
continue;
|
|
681
|
+
if (drift.artifactType !== "SUMMARY" || !drift.artifactPath)
|
|
682
|
+
continue;
|
|
683
|
+
const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
|
|
684
|
+
if (seen.has(absPath) || !existsSync(absPath))
|
|
685
|
+
continue;
|
|
686
|
+
seen.add(absPath);
|
|
687
|
+
const artifactDbPath = artifactPathForDb(basePath, absPath);
|
|
688
|
+
const target = quarantineProjectionFile(basePath, absPath, stamp);
|
|
689
|
+
deleteArtifactByPath(artifactDbPath);
|
|
690
|
+
quarantined.push(target);
|
|
691
|
+
}
|
|
692
|
+
const rendered = await renderAllFromDb(basePath);
|
|
693
|
+
invalidateStateCache();
|
|
694
|
+
return {
|
|
695
|
+
rendered: rendered.rendered,
|
|
696
|
+
skipped: rendered.skipped,
|
|
697
|
+
errors: rendered.errors,
|
|
698
|
+
quarantined: quarantined.length,
|
|
699
|
+
quarantinedPaths: quarantined,
|
|
700
|
+
};
|
|
701
|
+
}
|
|
658
702
|
/**
|
|
659
703
|
* `gsd rebuild markdown` — Re-render markdown projections from the authoritative DB.
|
|
660
704
|
*
|
|
@@ -663,10 +707,7 @@ function parseRebuildTarget(args) {
|
|
|
663
707
|
* under `.gsd/quarantine/projections/` before DB projections are rendered.
|
|
664
708
|
*/
|
|
665
709
|
export async function handleRebuild(ctx, basePath, args = "") {
|
|
666
|
-
const { isDbAvailable: dbAvailable
|
|
667
|
-
const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
|
|
668
|
-
const { renderAllFromDb } = await import("./markdown-renderer.js");
|
|
669
|
-
const { invalidateStateCache } = await import("./state.js");
|
|
710
|
+
const { isDbAvailable: dbAvailable } = await import("./gsd-db.js");
|
|
670
711
|
const target = parseRebuildTarget(args);
|
|
671
712
|
if (target === "usage") {
|
|
672
713
|
ctx.ui.notify([
|
|
@@ -690,53 +731,32 @@ export async function handleRebuild(ctx, basePath, args = "") {
|
|
|
690
731
|
return;
|
|
691
732
|
}
|
|
692
733
|
try {
|
|
693
|
-
|
|
694
|
-
const state = await deriveState(basePath);
|
|
695
|
-
const drifts = detectArtifactDbDrift(state, { basePath, state });
|
|
696
|
-
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
697
|
-
const quarantined = [];
|
|
698
|
-
const seen = new Set();
|
|
699
|
-
for (const drift of drifts) {
|
|
700
|
-
if (drift.kind !== "artifact-db-status-divergence")
|
|
701
|
-
continue;
|
|
702
|
-
if (drift.artifactType !== "SUMMARY" || !drift.artifactPath)
|
|
703
|
-
continue;
|
|
704
|
-
const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
|
|
705
|
-
if (seen.has(absPath) || !existsSync(absPath))
|
|
706
|
-
continue;
|
|
707
|
-
seen.add(absPath);
|
|
708
|
-
const artifactDbPath = artifactPathForDb(basePath, absPath);
|
|
709
|
-
const target = quarantineProjectionFile(basePath, absPath, stamp);
|
|
710
|
-
deleteArtifactByPath(artifactDbPath);
|
|
711
|
-
quarantined.push(target);
|
|
712
|
-
}
|
|
713
|
-
const rendered = await renderAllFromDb(basePath);
|
|
714
|
-
invalidateStateCache();
|
|
734
|
+
const result = await rebuildMarkdownProjectionsFromDb(basePath);
|
|
715
735
|
const lines = [
|
|
716
736
|
"gsd rebuild markdown: rebuilt markdown projections from the canonical DB",
|
|
717
|
-
` Rendered: ${
|
|
718
|
-
` Skipped: ${
|
|
719
|
-
` Quarantined: ${quarantined
|
|
737
|
+
` Rendered: ${result.rendered}`,
|
|
738
|
+
` Skipped: ${result.skipped}`,
|
|
739
|
+
` Quarantined: ${result.quarantined}`,
|
|
720
740
|
];
|
|
721
|
-
if (
|
|
722
|
-
lines.push(` Errors: ${
|
|
723
|
-
for (const err of
|
|
741
|
+
if (result.errors.length > 0) {
|
|
742
|
+
lines.push(` Errors: ${result.errors.length}`);
|
|
743
|
+
for (const err of result.errors.slice(0, 5)) {
|
|
724
744
|
lines.push(` - ${err}`);
|
|
725
745
|
}
|
|
726
|
-
if (
|
|
727
|
-
lines.push(` - ${
|
|
746
|
+
if (result.errors.length > 5) {
|
|
747
|
+
lines.push(` - ${result.errors.length - 5} more`);
|
|
728
748
|
}
|
|
729
749
|
}
|
|
730
|
-
if (quarantined
|
|
750
|
+
if (result.quarantined > 0) {
|
|
731
751
|
lines.push("", " Quarantine:");
|
|
732
|
-
for (const target of
|
|
752
|
+
for (const target of result.quarantinedPaths.slice(0, 5)) {
|
|
733
753
|
lines.push(` - ${target}`);
|
|
734
754
|
}
|
|
735
|
-
if (quarantined
|
|
736
|
-
lines.push(` - ${quarantined
|
|
755
|
+
if (result.quarantined > 5) {
|
|
756
|
+
lines.push(` - ${result.quarantined - 5} more`);
|
|
737
757
|
}
|
|
738
758
|
}
|
|
739
|
-
ctx.ui.notify(lines.join("\n"),
|
|
759
|
+
ctx.ui.notify(lines.join("\n"), result.errors.length > 0 ? "warning" : "success");
|
|
740
760
|
}
|
|
741
761
|
catch (err) {
|
|
742
762
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -10,7 +10,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
|
|
|
10
10
|
import { formatDuration } from "../shared/format-utils.js";
|
|
11
11
|
import { parseEvalReviewFrontmatter } from "./eval-review-schema.js";
|
|
12
12
|
import { currentDirectoryRoot } from "./commands/context.js";
|
|
13
|
-
import {
|
|
13
|
+
import { buildPullRequestEvidence } from "./pull-request-process.js";
|
|
14
14
|
function git(basePath, args) {
|
|
15
15
|
return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
|
|
16
16
|
}
|
|
@@ -140,7 +140,7 @@ function generatePRContent(basePath, milestoneId, milestoneTitle) {
|
|
|
140
140
|
metrics.push(`**Models:** ${byModel.map((m) => `${m.model} (${m.units} units)`).join(", ")}`);
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
|
-
return
|
|
143
|
+
return buildPullRequestEvidence({
|
|
144
144
|
milestoneId,
|
|
145
145
|
milestoneTitle,
|
|
146
146
|
changeType: "feat",
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Handles manual milestone validation verdict overrides.
|
|
3
3
|
import { loadFile } from "./files.js";
|
|
4
|
-
import { resolveMilestoneFile } from "./paths.js";
|
|
4
|
+
import { gsdProjectionRoot, resolveMilestoneFile } from "./paths.js";
|
|
5
|
+
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
6
|
+
import { join } from "node:path";
|
|
5
7
|
import { deriveState } from "./state.js";
|
|
6
8
|
import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
|
|
7
9
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
8
10
|
import { getLatestAssessmentByScope } from "./gsd-db.js";
|
|
11
|
+
import { checkpointWorkflowDatabase } from "./db-workspace.js";
|
|
9
12
|
import { VALIDATION_VERDICTS, extractVerdict, isValidMilestoneVerdict, } from "./verdict-parser.js";
|
|
10
13
|
const USAGE = 'Usage: /gsd verdict <pass|needs-attention|needs-remediation> [--milestone Mxxx] [--rationale "..."]';
|
|
11
14
|
function tokenize(raw) {
|
|
@@ -86,8 +89,14 @@ export function parseValidationFile(content) {
|
|
|
86
89
|
};
|
|
87
90
|
}
|
|
88
91
|
async function loadExistingValidation(basePath, milestoneId) {
|
|
92
|
+
const canonicalBase = resolveCanonicalMilestoneRoot(basePath, milestoneId);
|
|
93
|
+
const canonicalValidationPath = join(gsdProjectionRoot(canonicalBase), "milestones", milestoneId, `${milestoneId}-VALIDATION.md`);
|
|
94
|
+
const canonicalContent = await loadFile(canonicalValidationPath);
|
|
95
|
+
if (canonicalContent) {
|
|
96
|
+
return { content: canonicalContent, source: canonicalValidationPath };
|
|
97
|
+
}
|
|
89
98
|
const validationPath = resolveMilestoneFile(basePath, milestoneId, "VALIDATION");
|
|
90
|
-
if (validationPath) {
|
|
99
|
+
if (validationPath && validationPath !== canonicalValidationPath) {
|
|
91
100
|
const content = await loadFile(validationPath);
|
|
92
101
|
if (content)
|
|
93
102
|
return { content, source: validationPath };
|
|
@@ -157,6 +166,7 @@ export async function handleVerdict(rawArgs, ctx, basePath) {
|
|
|
157
166
|
ctx.ui.notify(msg, "error");
|
|
158
167
|
return;
|
|
159
168
|
}
|
|
169
|
+
checkpointWorkflowDatabase();
|
|
160
170
|
const prevVerdict = current.verdict ?? "unknown";
|
|
161
171
|
const effectiveVerdict = extractEffectiveVerdict(result.details, parsed.verdict);
|
|
162
172
|
if (effectiveVerdict !== parsed.verdict) {
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent Question module — the single home for the user-question lifecycle:
|
|
3
|
+
* classification → gating → answer validation → cancellation.
|
|
4
|
+
*
|
|
5
|
+
* Every question the assistant puts to a human is classified into a kind, and
|
|
6
|
+
* the kind alone decides the fail policy:
|
|
7
|
+
*
|
|
8
|
+
* - "gate" — mechanical write gates (depth verification, destructive
|
|
9
|
+
* confirm). Fail-closed; structural answer validation is
|
|
10
|
+
* delegated to the write-gate validators.
|
|
11
|
+
* - "consent" — approval/confirmation questions ("ready to write?",
|
|
12
|
+
* "is this correct?"). Fail-closed.
|
|
13
|
+
* - "decision" — explicit user decisions (research vs skip). Fail-closed.
|
|
14
|
+
* - "informational" — anything that is not asking the user to consent or
|
|
15
|
+
* decide. Fail-open.
|
|
16
|
+
*
|
|
17
|
+
* Fail-closed means an empty/missing answer is NEVER treated as an answer —
|
|
18
|
+
* evaluateAnswer returns "waiting" so callers pause instead of proceeding.
|
|
19
|
+
* This fixes #528 (empty `selected` on a non-gate question used to pass
|
|
20
|
+
* through as a real answer) by construction.
|
|
21
|
+
*
|
|
22
|
+
* shouldPauseForQuestion replaces the old unit-type allowlist: a classified
|
|
23
|
+
* consent/decision question pauses regardless of unit type, including
|
|
24
|
+
* interactive mode where no unit is active. This fixes #682 (prose approval
|
|
25
|
+
* questions outside the 4 allowlisted discuss units rendered as un-gated
|
|
26
|
+
* prose menus) by construction.
|
|
27
|
+
*/
|
|
28
|
+
import { isGateQuestionId } from "./bootstrap/write-gate.js";
|
|
29
|
+
import { evaluateGateAnswer, hasNotesValue, hasSelectedValue, } from "./consent-verdict.js";
|
|
30
|
+
import { isDestructiveConfirmGateId } from "./safety/destructive-confirmation.js";
|
|
31
|
+
/** Fail policy is derived from the kind — there is no per-question override. */
|
|
32
|
+
export function failPolicyForKind(kind) {
|
|
33
|
+
return kind === "informational" ? "open" : "closed";
|
|
34
|
+
}
|
|
35
|
+
// ── Prose detectors (moved from user-input-boundary) ────────────────────────
|
|
36
|
+
const REMOTE_QUESTION_FAILURE_RE = /(?:Remote (?:auth failed|questions failed|channel configured but returned no result|questions timed out|questions timed out or failed)|Failed to send questions via)/i;
|
|
37
|
+
const APPROVAL_WAIT_RE = /\bwait(?:ing)?\s+for\s+(?:your\s+)?(?:confirmation|approval|input|response|answer)\b/i;
|
|
38
|
+
const APPROVAL_QUESTION_RE = /\b(?:confirm|confirmation|approve|approval|approved|captured|correct|correctly|happy\s+with|ready\s+to\s+(?:write|save|proceed|ship)|(?:want|need)\s+to\s+adjust|should\s+I\s+(?:write|save|proceed)|do\s+you\s+want\s+me\s+to\s+(?:write|save|proceed)|ship\s+it)\b/i;
|
|
39
|
+
const APPROVAL_RIGHT_QUESTION_RE = /\b(?:does|do|is|are|was|were|did)\b[^\n?]{0,120}\bright\b/i;
|
|
40
|
+
const APPROVAL_CHANGE_QUESTION_RE = /\b(?:anything\s+else|anything|something)\s+to\s+(?:adjust|add|remove|reclassify)\b/i;
|
|
41
|
+
const RESEARCH_DECISION_QUESTION_RE = /\b(?:research|skip)\b/i;
|
|
42
|
+
const ASK_USER_QUESTIONS_CANCELLED_RE = /ask_user_questions was cancelled before receiving a response/i;
|
|
43
|
+
/** Scan question-mark-terminated fragments of `text` against `patterns`. */
|
|
44
|
+
function hasQuestionMatching(text, patterns) {
|
|
45
|
+
for (let i = 0; i < text.length; i++) {
|
|
46
|
+
if (text[i] !== "?")
|
|
47
|
+
continue;
|
|
48
|
+
const previousBreak = Math.max(text.lastIndexOf("\n", i), text.lastIndexOf(".", i), text.lastIndexOf("!", i), text.lastIndexOf("?", i - 1));
|
|
49
|
+
const fragment = text.slice(previousBreak + 1, i + 1);
|
|
50
|
+
if (patterns.some((pattern) => pattern.test(fragment)))
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
export function hasApprovalQuestion(text) {
|
|
56
|
+
return hasQuestionMatching(text, [
|
|
57
|
+
APPROVAL_QUESTION_RE,
|
|
58
|
+
APPROVAL_RIGHT_QUESTION_RE,
|
|
59
|
+
APPROVAL_CHANGE_QUESTION_RE,
|
|
60
|
+
]);
|
|
61
|
+
}
|
|
62
|
+
export function hasResearchDecisionQuestion(text) {
|
|
63
|
+
return hasQuestionMatching(text, [RESEARCH_DECISION_QUESTION_RE]);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Detect a plain-text "Next steps:" menu — numbered options with an "Other"
|
|
67
|
+
* choice — emitted as prose instead of a structured ask_user_questions call.
|
|
68
|
+
* Without this, auto-mode treats the menu as informational and loops on its
|
|
69
|
+
* own turn until tokens are exhausted (#454).
|
|
70
|
+
*/
|
|
71
|
+
export function hasPlainTextNextStepsMenu(lines) {
|
|
72
|
+
const nextStepsIndex = lines.findIndex((line) => /^next steps\s*:?$/i.test(line));
|
|
73
|
+
if (nextStepsIndex < 0)
|
|
74
|
+
return false;
|
|
75
|
+
const menuLines = lines.slice(nextStepsIndex + 1);
|
|
76
|
+
const numberedOptions = menuLines.filter((line) => /^\d+[.)]\s+\S/.test(line));
|
|
77
|
+
return numberedOptions.length >= 2 && numberedOptions.some((line) => /\bother\b/i.test(line));
|
|
78
|
+
}
|
|
79
|
+
// ── Message text extraction (moved from user-input-boundary) ────────────────
|
|
80
|
+
function extractMessageText(msg, includeThinking) {
|
|
81
|
+
if (!msg || typeof msg !== "object")
|
|
82
|
+
return "";
|
|
83
|
+
const content = msg.content;
|
|
84
|
+
if (typeof content === "string")
|
|
85
|
+
return content;
|
|
86
|
+
if (!Array.isArray(content))
|
|
87
|
+
return "";
|
|
88
|
+
const parts = [];
|
|
89
|
+
for (const block of content) {
|
|
90
|
+
if (!block || typeof block !== "object")
|
|
91
|
+
continue;
|
|
92
|
+
const typed = block;
|
|
93
|
+
if (typed.type === "text" && typeof typed.text === "string") {
|
|
94
|
+
parts.push(typed.text);
|
|
95
|
+
}
|
|
96
|
+
// Thinking blocks are internal reasoning, not user-visible — included only
|
|
97
|
+
// when the caller asks for the full transcript text.
|
|
98
|
+
if (includeThinking && typed.type === "thinking" && typeof typed.thinking === "string") {
|
|
99
|
+
parts.push(typed.thinking);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return parts.join("\n");
|
|
103
|
+
}
|
|
104
|
+
function lastAssistantMessageText(messages, includeThinking) {
|
|
105
|
+
if (!Array.isArray(messages))
|
|
106
|
+
return "";
|
|
107
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
108
|
+
const msg = messages[i];
|
|
109
|
+
if (!msg || typeof msg !== "object")
|
|
110
|
+
continue;
|
|
111
|
+
if (msg.role !== "assistant")
|
|
112
|
+
continue;
|
|
113
|
+
const text = extractMessageText(msg, includeThinking).trim();
|
|
114
|
+
if (text)
|
|
115
|
+
return text;
|
|
116
|
+
}
|
|
117
|
+
return "";
|
|
118
|
+
}
|
|
119
|
+
export function lastAssistantText(messages) {
|
|
120
|
+
return lastAssistantMessageText(messages, true);
|
|
121
|
+
}
|
|
122
|
+
function lastAssistantVisibleText(messages) {
|
|
123
|
+
return lastAssistantMessageText(messages, false);
|
|
124
|
+
}
|
|
125
|
+
function anyMessageMatches(messages, patterns) {
|
|
126
|
+
if (!Array.isArray(messages))
|
|
127
|
+
return false;
|
|
128
|
+
return messages.some((msg) => {
|
|
129
|
+
if (!msg || typeof msg !== "object")
|
|
130
|
+
return false;
|
|
131
|
+
if (msg.role === "user")
|
|
132
|
+
return false;
|
|
133
|
+
const text = extractMessageText(msg, false);
|
|
134
|
+
return patterns.some((pattern) => pattern.test(text));
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// ── Classification ──────────────────────────────────────────────────────────
|
|
138
|
+
const APPROVAL_GATE_ID_RE = /^depth_verification_.+_confirm$/;
|
|
139
|
+
/**
|
|
140
|
+
* Classify a question — structured (by id) or prose (by text) — into a kind.
|
|
141
|
+
*
|
|
142
|
+
* Structured questions with a recognized gate id are gates; every other
|
|
143
|
+
* structured question is asking the user something, so it classifies as
|
|
144
|
+
* consent (fail-closed). Prose classifies by the approval/decision detectors;
|
|
145
|
+
* prose that matches neither is informational (fail-open).
|
|
146
|
+
*/
|
|
147
|
+
export function classifyQuestion(input) {
|
|
148
|
+
if (isDestructiveConfirmGateId(input.id)) {
|
|
149
|
+
return { kind: "gate", gateSubKind: "destructive-confirm" };
|
|
150
|
+
}
|
|
151
|
+
if (typeof input.id === "string" && isGateQuestionId(input.id)) {
|
|
152
|
+
return {
|
|
153
|
+
kind: "gate",
|
|
154
|
+
gateSubKind: APPROVAL_GATE_ID_RE.test(input.id) ? "approval" : "depth-verification",
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// Any other structured question is a real elicitation of the user.
|
|
158
|
+
if (typeof input.id === "string" || Array.isArray(input.options)) {
|
|
159
|
+
return { kind: "consent" };
|
|
160
|
+
}
|
|
161
|
+
const text = input.text ?? "";
|
|
162
|
+
if (input.unitType === "research-decision" && hasResearchDecisionQuestion(text)) {
|
|
163
|
+
return { kind: "decision" };
|
|
164
|
+
}
|
|
165
|
+
if (hasApprovalQuestion(text)) {
|
|
166
|
+
return { kind: "consent" };
|
|
167
|
+
}
|
|
168
|
+
return { kind: "informational" };
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* THE single policy point for whether a question's answer counts as answered.
|
|
172
|
+
*
|
|
173
|
+
* - cancelled rounds → "cancelled" for every kind.
|
|
174
|
+
* - gate: delegates to evaluateGateAnswer in the consent-verdict leaf — the
|
|
175
|
+
* same verdict engine write-gate's applyAskUserQuestionsGateResult consumes;
|
|
176
|
+
* confirm option → "verified", any other real selection → "declined",
|
|
177
|
+
* empty/missing → "waiting" (fail-closed).
|
|
178
|
+
* - consent/decision: a non-empty selection or non-empty notes → "answered";
|
|
179
|
+
* empty/missing → "waiting" (fail-closed; fixes #528).
|
|
180
|
+
* - informational: always "answered" (fail-open).
|
|
181
|
+
*/
|
|
182
|
+
export function evaluateAnswer(options) {
|
|
183
|
+
const { question, details } = options;
|
|
184
|
+
if (details.cancelled)
|
|
185
|
+
return "cancelled";
|
|
186
|
+
const { kind } = classifyQuestion({ id: question.id, options: question.options });
|
|
187
|
+
if (failPolicyForKind(kind) === "open")
|
|
188
|
+
return "answered";
|
|
189
|
+
if (kind === "gate") {
|
|
190
|
+
// Gates keep strict structural validation: only the confirmation option
|
|
191
|
+
// verifies; notes never satisfy a gate.
|
|
192
|
+
return evaluateGateAnswer(question, details);
|
|
193
|
+
}
|
|
194
|
+
const questionId = typeof question.id === "string" ? question.id : "";
|
|
195
|
+
const answer = details.response?.answers?.[questionId];
|
|
196
|
+
if (hasSelectedValue(answer?.selected))
|
|
197
|
+
return "answered";
|
|
198
|
+
// Notes-only is a real user utterance for consent/decision questions, but
|
|
199
|
+
// never for gates (handled above).
|
|
200
|
+
if (hasNotesValue(answer?.notes))
|
|
201
|
+
return "answered";
|
|
202
|
+
return "waiting";
|
|
203
|
+
}
|
|
204
|
+
const OUTCOME_PRECEDENCE = [
|
|
205
|
+
"cancelled",
|
|
206
|
+
"waiting",
|
|
207
|
+
"declined",
|
|
208
|
+
"verified",
|
|
209
|
+
"answered",
|
|
210
|
+
];
|
|
211
|
+
/**
|
|
212
|
+
* Evaluate a whole ask_user_questions round. The round outcome is the most
|
|
213
|
+
* blocking per-question outcome (cancelled > waiting > declined > verified >
|
|
214
|
+
* answered). An empty round with a response is "answered"; an empty round
|
|
215
|
+
* without a response is "waiting" only when cancelled is not set and there is
|
|
216
|
+
* nothing to validate — callers treat a missing response with no questions as
|
|
217
|
+
* a no-op, so it reports "answered" here.
|
|
218
|
+
*/
|
|
219
|
+
export function evaluateAskUserQuestionsRound(questions, details) {
|
|
220
|
+
if (details.cancelled)
|
|
221
|
+
return "cancelled";
|
|
222
|
+
let worst = "answered";
|
|
223
|
+
for (const question of questions) {
|
|
224
|
+
const outcome = evaluateAnswer({ question, details });
|
|
225
|
+
if (OUTCOME_PRECEDENCE.indexOf(outcome) < OUTCOME_PRECEDENCE.indexOf(worst)) {
|
|
226
|
+
worst = outcome;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return worst;
|
|
230
|
+
}
|
|
231
|
+
export function formatUnansweredConsentQuestionMessage(questions) {
|
|
232
|
+
const ids = questions
|
|
233
|
+
.map((question) => (typeof question.id === "string" ? question.id : null))
|
|
234
|
+
.filter((id) => Boolean(id));
|
|
235
|
+
return [
|
|
236
|
+
`ask_user_questions returned without a selection${ids.length ? ` for ${ids.join(", ")}` : ""}.`,
|
|
237
|
+
"An empty answer is not consent — do not infer approval or proceed.",
|
|
238
|
+
"Re-call ask_user_questions with the same question(s) and wait for the user's response.",
|
|
239
|
+
].join(" ");
|
|
240
|
+
}
|
|
241
|
+
// ── Pause gating (replaces the unit-type allowlist) ─────────────────────────
|
|
242
|
+
/**
|
|
243
|
+
* Shared preamble for the awaiting-input predicates: cancellation and remote
|
|
244
|
+
* delivery failures always pause (an undelivered question can never be
|
|
245
|
+
* answered, so proceeding would be fail-open), as does an explicit
|
|
246
|
+
* "waiting for your approval/input" phrase in the last assistant text.
|
|
247
|
+
*
|
|
248
|
+
* Returns `forced: true` when the boundary is unconditional, plus the last
|
|
249
|
+
* assistant visible text for the caller's own classification.
|
|
250
|
+
*/
|
|
251
|
+
function awaitingBoundary(messages) {
|
|
252
|
+
if (anyMessageMatches(messages, [ASK_USER_QUESTIONS_CANCELLED_RE, REMOTE_QUESTION_FAILURE_RE])) {
|
|
253
|
+
return { forced: true, text: "" };
|
|
254
|
+
}
|
|
255
|
+
const text = lastAssistantVisibleText(messages);
|
|
256
|
+
if (text && APPROVAL_WAIT_RE.test(text))
|
|
257
|
+
return { forced: true, text };
|
|
258
|
+
return { forced: false, text };
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Decide whether the assistant should pause for a prose user question.
|
|
262
|
+
*
|
|
263
|
+
* Unlike the retired USER_APPROVAL_UNIT_TYPES allowlist, this pauses for any
|
|
264
|
+
* classified consent/decision question regardless of unit type — including
|
|
265
|
+
* interactive mode where no unit is active (#682).
|
|
266
|
+
*/
|
|
267
|
+
export function shouldPauseForQuestion(unitType, messages) {
|
|
268
|
+
const { forced, text } = awaitingBoundary(messages);
|
|
269
|
+
if (forced)
|
|
270
|
+
return true;
|
|
271
|
+
// Streaming hot path: this runs on every message_update for every unit type.
|
|
272
|
+
// The classifiers only ever match question-mark-terminated fragments, so
|
|
273
|
+
// text without a "?" can never classify as consent/decision — bail before
|
|
274
|
+
// the multi-regex scan.
|
|
275
|
+
if (!text || !text.includes("?"))
|
|
276
|
+
return false;
|
|
277
|
+
const { kind } = classifyQuestion({ text, unitType });
|
|
278
|
+
return kind === "consent" || kind === "decision";
|
|
279
|
+
}
|
|
280
|
+
// ── Awaiting-input boundaries (moved from user-input-boundary) ──────────────
|
|
281
|
+
export function isAwaitingUserInput(messages) {
|
|
282
|
+
const { forced, text } = awaitingBoundary(messages);
|
|
283
|
+
if (forced)
|
|
284
|
+
return true;
|
|
285
|
+
if (!text)
|
|
286
|
+
return false;
|
|
287
|
+
const lines = text.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
288
|
+
if (lines.some((line) => line.endsWith("?")))
|
|
289
|
+
return true;
|
|
290
|
+
if (hasPlainTextNextStepsMenu(lines))
|
|
291
|
+
return true;
|
|
292
|
+
return hasApprovalQuestion(text);
|
|
293
|
+
}
|
|
294
|
+
export function isAwaitingApprovalBoundary(messages) {
|
|
295
|
+
// With no unit type, classification reduces to the approval detectors —
|
|
296
|
+
// exactly the approval boundary.
|
|
297
|
+
return shouldPauseForQuestion(undefined, messages);
|
|
298
|
+
}
|
|
299
|
+
// ── Approval gate ids + explicit responses (moved from user-input-boundary) ─
|
|
300
|
+
export function approvalGateIdForUnit(unitType, unitId) {
|
|
301
|
+
if (!unitType)
|
|
302
|
+
return null;
|
|
303
|
+
if (unitType === "discuss-project")
|
|
304
|
+
return "depth_verification_project_confirm";
|
|
305
|
+
if (unitType === "discuss-requirements")
|
|
306
|
+
return "depth_verification_requirements_confirm";
|
|
307
|
+
if (unitType === "research-decision")
|
|
308
|
+
return "depth_verification_research_decision_confirm";
|
|
309
|
+
if (unitType === "discuss-milestone") {
|
|
310
|
+
const safeUnitId = typeof unitId === "string" && /^[A-Za-z0-9_-]+$/.test(unitId)
|
|
311
|
+
? unitId
|
|
312
|
+
: "milestone";
|
|
313
|
+
return `depth_verification_${safeUnitId}_confirm`;
|
|
314
|
+
}
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
const CHANGE_REQUEST_RESPONSE_RE = /\b(?:no|nope|nah|not\s+yet|don't|do\s+not|change|add|remove|reclassify|adjust|clarify|missing|instead|but|however|wait|hold)\b/i;
|
|
318
|
+
const APPROVAL_RESPONSE_RE = /^(?:y|yes|yeah|yep|approve|approved|confirm|confirmed|correct|right|looks\s+(?:good|right)|sounds\s+good|all\s+good|ok|okay|go\s+ahead|proceed|write\s+it|save\s+it|do\s+it)\b/i;
|
|
319
|
+
const RESEARCH_DECISION_RESPONSE_RE = /^(?:research|run\s+research|do\s+research|skip|skip\s+research|no\s+research)\b/i;
|
|
320
|
+
export function isExplicitApprovalResponse(input, pendingGateId) {
|
|
321
|
+
const text = input?.trim() ?? "";
|
|
322
|
+
if (!text)
|
|
323
|
+
return false;
|
|
324
|
+
if (pendingGateId?.includes("research_decision")) {
|
|
325
|
+
return RESEARCH_DECISION_RESPONSE_RE.test(text);
|
|
326
|
+
}
|
|
327
|
+
if (CHANGE_REQUEST_RESPONSE_RE.test(text))
|
|
328
|
+
return false;
|
|
329
|
+
return APPROVAL_RESPONSE_RE.test(text);
|
|
330
|
+
}
|
|
331
|
+
/** True when an assistant message already has an in-flight ask_user_questions tool call. */
|
|
332
|
+
export function messageHasPendingAskUserQuestionsTool(message) {
|
|
333
|
+
if (!message || typeof message !== "object")
|
|
334
|
+
return false;
|
|
335
|
+
const content = message.content;
|
|
336
|
+
if (!Array.isArray(content))
|
|
337
|
+
return false;
|
|
338
|
+
return content.some((block) => {
|
|
339
|
+
if (!block || typeof block !== "object")
|
|
340
|
+
return false;
|
|
341
|
+
// Claude Code marks completion by attaching externalResult, not by setting state.
|
|
342
|
+
// Streaming blocks often carry no state; serverToolUse is the claude-code-cli MCP path.
|
|
343
|
+
const tool = block;
|
|
344
|
+
if (tool.type !== "toolCall" && tool.type !== "serverToolUse")
|
|
345
|
+
return false;
|
|
346
|
+
const name = String(tool.name ?? "").toLowerCase();
|
|
347
|
+
if (!name.includes("ask_user_questions"))
|
|
348
|
+
return false;
|
|
349
|
+
if (tool.externalResult !== undefined)
|
|
350
|
+
return false;
|
|
351
|
+
return tool.state !== "completed" && tool.state !== "done";
|
|
352
|
+
});
|
|
353
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent verdict leaf — the single per-question verdict engine shared by the
|
|
3
|
+
* write gate (bootstrap/write-gate.ts) and the Consent Question module
|
|
4
|
+
* (consent-question.ts).
|
|
5
|
+
*
|
|
6
|
+
* This module is a dependency leaf on purpose: write-gate consumes
|
|
7
|
+
* evaluateGateAnswer here while consent-question imports write-gate's id
|
|
8
|
+
* predicates, so putting the verdict anywhere else would create an import
|
|
9
|
+
* cycle. It must not import from either module (ADR-039).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Check whether a depth_verification answer confirms the discussion is complete.
|
|
13
|
+
* Uses structural validation: the selected answer must exactly match the first
|
|
14
|
+
* option label from the question definition (the confirmation option by convention).
|
|
15
|
+
* This rejects free-form "Other" text, decline options, and garbage input without
|
|
16
|
+
* coupling to any specific label substring.
|
|
17
|
+
*
|
|
18
|
+
* @param selected The answer's selected value from details.response.answers[id].selected
|
|
19
|
+
* @param options The question's options array from event.input.questions[n].options
|
|
20
|
+
*/
|
|
21
|
+
export function isDepthConfirmationAnswer(selected, options) {
|
|
22
|
+
const value = Array.isArray(selected) ? selected[0] : selected;
|
|
23
|
+
if (typeof value !== "string" || !value)
|
|
24
|
+
return false;
|
|
25
|
+
// If options are available, structurally validate: selected must exactly match
|
|
26
|
+
// the first option (confirmation) label. Rejects free-form "Other" and decline options.
|
|
27
|
+
if (Array.isArray(options) && options.length > 0) {
|
|
28
|
+
const confirmLabel = options[0]?.label;
|
|
29
|
+
return typeof confirmLabel === "string" && value === confirmLabel;
|
|
30
|
+
}
|
|
31
|
+
// Fail-closed: no options means we cannot structurally validate the answer.
|
|
32
|
+
// Returning false prevents any free-form string from unlocking the gate.
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
export function hasSelectedValue(selected) {
|
|
36
|
+
if (Array.isArray(selected)) {
|
|
37
|
+
return selected.some((value) => typeof value === "string" && value.length > 0);
|
|
38
|
+
}
|
|
39
|
+
return typeof selected === "string" && selected.length > 0;
|
|
40
|
+
}
|
|
41
|
+
export function hasNotesValue(notes) {
|
|
42
|
+
return typeof notes === "string" && notes.trim().length > 0;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* THE per-question verdict for gate questions (fail-closed):
|
|
46
|
+
*
|
|
47
|
+
* - cancelled rounds → "cancelled".
|
|
48
|
+
* - the confirmation option (structural match) → "verified".
|
|
49
|
+
* - any other real selection → "declined".
|
|
50
|
+
* - empty/missing selection → "waiting" — an empty answer is NEVER an answer,
|
|
51
|
+
* so notes can never satisfy a gate either.
|
|
52
|
+
*/
|
|
53
|
+
export function evaluateGateAnswer(question, details) {
|
|
54
|
+
if (details.cancelled)
|
|
55
|
+
return "cancelled";
|
|
56
|
+
const questionId = typeof question.id === "string" ? question.id : "";
|
|
57
|
+
const answer = details.response?.answers?.[questionId];
|
|
58
|
+
if (isDepthConfirmationAnswer(answer?.selected, question.options))
|
|
59
|
+
return "verified";
|
|
60
|
+
if (hasSelectedValue(answer?.selected))
|
|
61
|
+
return "declined";
|
|
62
|
+
return "waiting";
|
|
63
|
+
}
|
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
// ─── Timeouts ─────────────────────────────────────────────────────────────────
|
|
7
7
|
/** Default timeout for verification-gate commands (ms). */
|
|
8
8
|
export const DEFAULT_COMMAND_TIMEOUT_MS = 120_000;
|
|
9
|
-
/** Default timeout for the dynamic bash tool (seconds). */
|
|
10
|
-
export const DEFAULT_BASH_TIMEOUT_SECS = 120;
|
|
11
9
|
// ─── Cache Sizes ──────────────────────────────────────────────────────────────
|
|
12
10
|
/** Max directory-listing cache entries before eviction (#611). */
|
|
13
11
|
export const DIR_CACHE_MAX = 200;
|