@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.8e6112e9
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-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- 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 +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/help-text.js +5 -0
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- 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 +81 -25
- 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 +546 -426
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +256 -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/closeout.js +215 -0
- 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 +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +80 -56
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +310 -78
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2299
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- 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/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -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 +161 -26
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +59 -52
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +14 -47
- 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 +68 -370
- package/dist/resources/extensions/gsd/auto.js +71 -29
- 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 +74 -50
- 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 +316 -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-mcp-status.js +2 -2
- 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/commands-workflow-templates.js +9 -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 +757 -0
- package/dist/resources/extensions/gsd/db/queries.js +428 -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/db-writer.js +8 -17
- 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 +261 -136
- 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-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 +186 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +174 -473
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +12 -1
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/memory-relations.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/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- 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 +5 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -2
- 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 +1 -1
- 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 +9 -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 +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/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/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +24 -26
- 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 +108 -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 +65 -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 +67 -2
- 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 +367 -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-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- 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 +52 -29
- 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 +36 -31
- 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/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- 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/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- 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 +4 -4
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/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 +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- 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/node-pty/build/Makefile +1 -1
- 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 +4 -3
- 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/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- 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/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -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 +58 -6
- 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.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- 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-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.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/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.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/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- 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/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.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/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- 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 +209 -103
- 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/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +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 -76
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +193 -112
- 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 +19 -13
- 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/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.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/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.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/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.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/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +94 -26
- 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 +651 -483
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +940 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +324 -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/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- 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 +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +89 -61
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +350 -81
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -2981
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- 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/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -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 +225 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +65 -53
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +21 -49
- 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 -386
- package/src/resources/extensions/gsd/auto.ts +99 -34
- 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 +93 -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 +375 -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-mcp-status.ts +2 -2
- 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/commands-workflow-templates.ts +11 -4
- 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 +811 -0
- package/src/resources/extensions/gsd/db/queries.ts +519 -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/db-writer.ts +11 -19
- 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 +272 -155
- 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-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 +190 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +240 -585
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +13 -1
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/memory-relations.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/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- 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 +5 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -2
- 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 +1 -1
- 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 +9 -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 +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/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/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +31 -27
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +649 -26
- 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 +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +395 -30
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- 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-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- 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/complete-task.test.ts +141 -5
- 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/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -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/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -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-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 +18 -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 +89 -59
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- 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/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- 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-stash-restore.test.ts +1 -1
- 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-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- 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/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/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 +56 -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 +11 -4
- 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/remote-notification-from-desktop.test.ts +31 -81
- 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 +51 -2
- 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 +300 -41
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +9 -4
- 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-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- 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 +329 -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/uok-plan-v2-wiring.test.ts +1 -1
- 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-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +193 -13
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -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-health-dispatch.test.ts +1 -1
- 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-project-root-degrade.test.ts +1 -1
- 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-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +75 -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 +24 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- 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 +183 -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 +90 -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 +81 -2
- 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 +442 -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-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- 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 +53 -29
- 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 +49 -44
- 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/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- 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/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -195
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- 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/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -88
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -198
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → pZbHa49xI-knmKlphIRq0}/_ssgManifest.js +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import test, { mock } from "node:test";
|
|
5
5
|
import assert from "node:assert/strict";
|
|
6
|
+
import { execSync } from "node:child_process";
|
|
6
7
|
import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
7
8
|
import { tmpdir } from "node:os";
|
|
8
9
|
import { join } from "node:path";
|
|
@@ -23,11 +24,14 @@ import {
|
|
|
23
24
|
import { runUnit, shouldDeferUnitFailsafeTimeout } from "../auto/run-unit.js";
|
|
24
25
|
import { scheduleAutoWakeup, _resetAutoWakeupsForTest } from "../auto/schedule-wakeup.js";
|
|
25
26
|
import { writeUnitRuntimeRecord, readUnitRuntimeRecord } from "../unit-runtime.js";
|
|
26
|
-
import { autoLoop } from "../auto/loop.js";
|
|
27
|
-
import {
|
|
27
|
+
import { autoLoop as rawAutoLoop } from "../auto/loop.js";
|
|
28
|
+
import { runPreDispatch } from "../auto/pre-dispatch.js";
|
|
29
|
+
import { runDispatch } from "../auto/dispatch.js";
|
|
30
|
+
import { runUnitPhase, resetSessionTimeoutState } from "../auto/unit-phase.js";
|
|
28
31
|
import { detectStuck } from "../auto/detect-stuck.js";
|
|
29
|
-
import type { UnitResult, AgentEndEvent } from "../auto/types.js";
|
|
32
|
+
import type { UnitResult, AgentEndEvent, LoopState } from "../auto/types.js";
|
|
30
33
|
import type { LoopDeps } from "../auto/loop-deps.js";
|
|
34
|
+
import type { AutoAdvanceResult, AutoOrchestrationModule, AutoStatus, UnitRef } from "../auto/contracts.js";
|
|
31
35
|
import { WorktreeStateProjection } from "../worktree-state-projection.js";
|
|
32
36
|
import { ModelPolicyDispatchBlockedError } from "../auto-model-selection.js";
|
|
33
37
|
import type { SessionLockStatus } from "../session-lock.js";
|
|
@@ -40,6 +44,17 @@ import { SourceObservationStore } from "../source-observations.js";
|
|
|
40
44
|
|
|
41
45
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
42
46
|
|
|
47
|
+
const ORCHESTRATION_MISSING_REASON =
|
|
48
|
+
"Auto Orchestration Module is not wired; cannot dispatch built-in GSD Unit.";
|
|
49
|
+
|
|
50
|
+
type CapturedAutoSideEffects<T> = {
|
|
51
|
+
result: T;
|
|
52
|
+
stopped: boolean;
|
|
53
|
+
stoppedReason?: string;
|
|
54
|
+
paused: boolean;
|
|
55
|
+
pausedReason?: string;
|
|
56
|
+
};
|
|
57
|
+
|
|
43
58
|
function makeEvent(
|
|
44
59
|
messages: unknown[] = [{ role: "assistant" }],
|
|
45
60
|
): AgentEndEvent {
|
|
@@ -67,12 +82,203 @@ async function waitForMicrotasks(
|
|
|
67
82
|
assert.fail(`Timed out waiting for ${label}`);
|
|
68
83
|
}
|
|
69
84
|
|
|
85
|
+
function makeLoopState(): LoopState {
|
|
86
|
+
return {
|
|
87
|
+
recentUnits: [],
|
|
88
|
+
stuckRecoveryAttempts: 0,
|
|
89
|
+
consecutiveFinalizeTimeouts: 0,
|
|
90
|
+
consecutiveDispatchCount: new Map<string, number>(),
|
|
91
|
+
lastDispatchedKey: null,
|
|
92
|
+
lastDispatchPhase: null,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function createLoopTestOrchestration(
|
|
97
|
+
ctx: any,
|
|
98
|
+
pi: any,
|
|
99
|
+
s: any,
|
|
100
|
+
deps: LoopDeps,
|
|
101
|
+
): AutoOrchestrationModule {
|
|
102
|
+
// Production auto.ts wires the real Auto Orchestration Module before entering
|
|
103
|
+
// autoLoop. These loop-mechanics tests keep their LoopDeps fixtures by
|
|
104
|
+
// adapting the old phase helpers to the public orchestration Interface.
|
|
105
|
+
const loopState = makeLoopState();
|
|
106
|
+
const status: AutoStatus = { phase: "running", transitionCount: 0 };
|
|
107
|
+
let iteration = 0;
|
|
108
|
+
let seq = 0;
|
|
109
|
+
|
|
110
|
+
function nextSeq(): number {
|
|
111
|
+
return ++seq;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function clearActiveUnit(): void {
|
|
115
|
+
status.activeUnit = undefined;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function captureAutoSideEffects<T>(
|
|
119
|
+
run: () => Promise<T>,
|
|
120
|
+
): Promise<CapturedAutoSideEffects<T>> {
|
|
121
|
+
const originalStopAuto = deps.stopAuto;
|
|
122
|
+
const originalPauseAuto = deps.pauseAuto;
|
|
123
|
+
let stoppedReason: string | undefined;
|
|
124
|
+
let pausedReason: string | undefined;
|
|
125
|
+
let stopped = false;
|
|
126
|
+
let paused = false;
|
|
127
|
+
|
|
128
|
+
(deps as any).stopAuto = async (...args: Parameters<LoopDeps["stopAuto"]>) => {
|
|
129
|
+
stopped = true;
|
|
130
|
+
stoppedReason = args[2];
|
|
131
|
+
return originalStopAuto(...args);
|
|
132
|
+
};
|
|
133
|
+
(deps as any).pauseAuto = async (...args: Parameters<LoopDeps["pauseAuto"]>) => {
|
|
134
|
+
paused = true;
|
|
135
|
+
const context = args[2] as { message?: string } | undefined;
|
|
136
|
+
pausedReason = context?.message;
|
|
137
|
+
return originalPauseAuto(...args);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
const result = await run();
|
|
142
|
+
return { result, stopped, stoppedReason, paused, pausedReason };
|
|
143
|
+
} finally {
|
|
144
|
+
(deps as any).stopAuto = originalStopAuto;
|
|
145
|
+
(deps as any).pauseAuto = originalPauseAuto;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function resultForBreak(
|
|
150
|
+
reason: string,
|
|
151
|
+
sideEffects: CapturedAutoSideEffects<unknown>,
|
|
152
|
+
): AutoAdvanceResult {
|
|
153
|
+
clearActiveUnit();
|
|
154
|
+
status.phase = sideEffects.paused && !sideEffects.stopped ? "paused" : "stopped";
|
|
155
|
+
status.transitionCount += 1;
|
|
156
|
+
if (sideEffects.paused && !sideEffects.stopped) {
|
|
157
|
+
return {
|
|
158
|
+
kind: "blocked",
|
|
159
|
+
reason: sideEffects.pausedReason ?? reason,
|
|
160
|
+
action: "pause",
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
kind: "stopped",
|
|
165
|
+
reason: sideEffects.stoppedReason ?? reason,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
async start() {
|
|
171
|
+
status.phase = "running";
|
|
172
|
+
status.transitionCount += 1;
|
|
173
|
+
return { kind: "started" };
|
|
174
|
+
},
|
|
175
|
+
async advance() {
|
|
176
|
+
iteration += 1;
|
|
177
|
+
seq = 0;
|
|
178
|
+
const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
|
|
179
|
+
const ic = {
|
|
180
|
+
ctx,
|
|
181
|
+
pi,
|
|
182
|
+
s,
|
|
183
|
+
deps,
|
|
184
|
+
prefs,
|
|
185
|
+
iteration,
|
|
186
|
+
flowId: `loop-test-orchestration-${iteration}`,
|
|
187
|
+
nextSeq,
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const preDispatch = await captureAutoSideEffects(() => runPreDispatch(ic, loopState));
|
|
191
|
+
const preDispatchResult = preDispatch.result;
|
|
192
|
+
if (preDispatchResult.action === "break") {
|
|
193
|
+
return resultForBreak(preDispatchResult.reason, preDispatch);
|
|
194
|
+
}
|
|
195
|
+
if (preDispatchResult.action === "continue") {
|
|
196
|
+
return { kind: "skipped", reason: "pre-dispatch-skip" };
|
|
197
|
+
}
|
|
198
|
+
if (preDispatchResult.action === "retry") {
|
|
199
|
+
return { kind: "paused", reason: preDispatchResult.reason };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const dispatch = await captureAutoSideEffects(() =>
|
|
203
|
+
runDispatch(ic, preDispatchResult.data, loopState),
|
|
204
|
+
);
|
|
205
|
+
if (dispatch.result.action === "break") {
|
|
206
|
+
return resultForBreak(dispatch.result.reason, dispatch);
|
|
207
|
+
}
|
|
208
|
+
if (dispatch.result.action === "continue") {
|
|
209
|
+
return {
|
|
210
|
+
kind: "skipped",
|
|
211
|
+
reason: "dispatch-skip",
|
|
212
|
+
stateSnapshot: preDispatchResult.data.state,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
if (dispatch.result.action === "retry") {
|
|
216
|
+
return { kind: "paused", reason: dispatch.result.reason };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const data = dispatch.result.data;
|
|
220
|
+
const unit: UnitRef = { unitType: data.unitType, unitId: data.unitId };
|
|
221
|
+
s.pendingOrchestrationDispatch = {
|
|
222
|
+
unitType: data.unitType,
|
|
223
|
+
unitId: data.unitId,
|
|
224
|
+
prompt: data.prompt,
|
|
225
|
+
pauseAfterUatDispatch: data.pauseAfterUatDispatch,
|
|
226
|
+
state: data.state,
|
|
227
|
+
mid: data.mid,
|
|
228
|
+
midTitle: data.midTitle,
|
|
229
|
+
};
|
|
230
|
+
status.phase = "running";
|
|
231
|
+
status.activeUnit = unit;
|
|
232
|
+
status.transitionCount += 1;
|
|
233
|
+
return { kind: "advanced", unit, stateSnapshot: data.state };
|
|
234
|
+
},
|
|
235
|
+
async completeActiveUnit() {
|
|
236
|
+
clearActiveUnit();
|
|
237
|
+
},
|
|
238
|
+
async retryActiveUnit() {
|
|
239
|
+
clearActiveUnit();
|
|
240
|
+
},
|
|
241
|
+
async resume() {
|
|
242
|
+
status.phase = "running";
|
|
243
|
+
status.transitionCount += 1;
|
|
244
|
+
return { kind: "resumed" };
|
|
245
|
+
},
|
|
246
|
+
async stop(reason: string) {
|
|
247
|
+
status.phase = "stopped";
|
|
248
|
+
clearActiveUnit();
|
|
249
|
+
status.transitionCount += 1;
|
|
250
|
+
return { kind: "stopped", reason };
|
|
251
|
+
},
|
|
252
|
+
getStatus() {
|
|
253
|
+
return {
|
|
254
|
+
...status,
|
|
255
|
+
activeUnit: status.activeUnit ? { ...status.activeUnit } : undefined,
|
|
256
|
+
};
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
async function autoLoop(
|
|
262
|
+
ctx: any,
|
|
263
|
+
pi: any,
|
|
264
|
+
s: any,
|
|
265
|
+
deps: LoopDeps,
|
|
266
|
+
options?: Parameters<typeof rawAutoLoop>[4],
|
|
267
|
+
): Promise<void> {
|
|
268
|
+
if (!s.orchestration) {
|
|
269
|
+
s.orchestration = createLoopTestOrchestration(ctx, pi, s, deps);
|
|
270
|
+
}
|
|
271
|
+
await rawAutoLoop(ctx, pi, s, deps, options);
|
|
272
|
+
}
|
|
273
|
+
|
|
70
274
|
/**
|
|
71
275
|
* Build a minimal mock AutoSession with controllable newSession behavior.
|
|
72
276
|
*/
|
|
73
277
|
function makeMockSession(opts?: {
|
|
74
278
|
newSessionResult?: { cancelled: boolean };
|
|
75
279
|
newSessionThrows?: string;
|
|
280
|
+
/** Reject newSession() with a specific Error instance (e.g. TypeError). */
|
|
281
|
+
newSessionThrowsError?: Error;
|
|
76
282
|
newSessionDelayMs?: number;
|
|
77
283
|
onNewSessionStart?: (session: any) => void;
|
|
78
284
|
onNewSessionSettle?: (session: any) => void;
|
|
@@ -87,6 +293,9 @@ function makeMockSession(opts?: {
|
|
|
87
293
|
cmdCtx: {
|
|
88
294
|
newSession: (options?: { abortSignal?: AbortSignal; workspaceRoot?: string }) => {
|
|
89
295
|
opts?.onNewSessionStart?.(session);
|
|
296
|
+
if (opts?.newSessionThrowsError) {
|
|
297
|
+
return Promise.reject(opts.newSessionThrowsError);
|
|
298
|
+
}
|
|
90
299
|
if (opts?.newSessionThrows) {
|
|
91
300
|
return Promise.reject(new Error(opts.newSessionThrows));
|
|
92
301
|
}
|
|
@@ -325,7 +534,7 @@ test("runUnit failsafe defers cancellation while timeout recovery is making fres
|
|
|
325
534
|
const ctx = makeMockCtx();
|
|
326
535
|
const pi = makeMockPi();
|
|
327
536
|
const s = makeMockSession();
|
|
328
|
-
s.basePath =
|
|
537
|
+
s.basePath = makeLoopTestBase("gsd-rununit-recovery-");
|
|
329
538
|
s.currentUnit = { type: "task", id: "T01", startedAt: 1234 };
|
|
330
539
|
|
|
331
540
|
const resultPromise = runUnit(ctx, pi, s, "task", "T01", "prompt");
|
|
@@ -497,6 +706,73 @@ test("runUnit returns cancelled when session creation fails", async () => {
|
|
|
497
706
|
assert.equal(pi.calls.length, 0);
|
|
498
707
|
});
|
|
499
708
|
|
|
709
|
+
test("runUnit: TypeError from newSession is classified as structural (isTransient: false)", async () => {
|
|
710
|
+
// Regression for #572: a TypeError thrown from newSession (e.g. "something is
|
|
711
|
+
// not a function") indicates a programming error, not a transient provider
|
|
712
|
+
// blip. Before the fix it was always classified isTransient: true, causing
|
|
713
|
+
// auto-mode to retry indefinitely instead of surfacing the real problem.
|
|
714
|
+
_resetPendingResolve();
|
|
715
|
+
|
|
716
|
+
const baseCtx = {
|
|
717
|
+
...makeMockCtx(),
|
|
718
|
+
ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
|
|
719
|
+
sessionManager: { getEntries: () => [] },
|
|
720
|
+
modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
|
|
721
|
+
} as any;
|
|
722
|
+
const pi = makeMockPi();
|
|
723
|
+
const s = makeMockSession({
|
|
724
|
+
newSessionThrowsError: new TypeError("pi.sendMessage is not a function"),
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
|
|
728
|
+
|
|
729
|
+
assert.equal(result.status, "cancelled");
|
|
730
|
+
assert.equal(result.errorContext?.category, "session-failed");
|
|
731
|
+
assert.equal(result.errorContext?.isTransient, false, "TypeError must be non-transient");
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
test("runUnit: 'is not a function' message from newSession is classified as structural", async () => {
|
|
735
|
+
// Regression for #572: the pattern also catches errors where the thrown
|
|
736
|
+
// object is not a TypeError instance but the message contains "is not a function".
|
|
737
|
+
_resetPendingResolve();
|
|
738
|
+
|
|
739
|
+
const baseCtx = {
|
|
740
|
+
...makeMockCtx(),
|
|
741
|
+
ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
|
|
742
|
+
sessionManager: { getEntries: () => [] },
|
|
743
|
+
modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
|
|
744
|
+
} as any;
|
|
745
|
+
const pi = makeMockPi();
|
|
746
|
+
const s = makeMockSession({ newSessionThrows: "pi.sendMessage is not a function" });
|
|
747
|
+
|
|
748
|
+
const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
|
|
749
|
+
|
|
750
|
+
assert.equal(result.status, "cancelled");
|
|
751
|
+
assert.equal(result.errorContext?.category, "session-failed");
|
|
752
|
+
assert.equal(result.errorContext?.isTransient, false, "'is not a function' errors must be non-transient");
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
test("runUnit: generic network error from newSession remains transient", async () => {
|
|
756
|
+
// Confirm that non-structural session errors (e.g. 429, ECONNREFUSED) are
|
|
757
|
+
// still classified as transient so auto-mode can retry them.
|
|
758
|
+
_resetPendingResolve();
|
|
759
|
+
|
|
760
|
+
const baseCtx = {
|
|
761
|
+
...makeMockCtx(),
|
|
762
|
+
ui: { notify: () => {}, setStatus: () => {}, setWorkingMessage: () => {} },
|
|
763
|
+
sessionManager: { getEntries: () => [] },
|
|
764
|
+
modelRegistry: { getProviderAuthMode: () => undefined, isProviderRequestReady: () => true },
|
|
765
|
+
} as any;
|
|
766
|
+
const pi = makeMockPi();
|
|
767
|
+
const s = makeMockSession({ newSessionThrows: "connection refused" });
|
|
768
|
+
|
|
769
|
+
const result = await runUnit(baseCtx, pi, s, "task", "T01", "prompt");
|
|
770
|
+
|
|
771
|
+
assert.equal(result.status, "cancelled");
|
|
772
|
+
assert.equal(result.errorContext?.category, "session-failed");
|
|
773
|
+
assert.equal(result.errorContext?.isTransient, true, "network errors must remain transient");
|
|
774
|
+
});
|
|
775
|
+
|
|
500
776
|
test("runUnit clears queued switch cancellation when session creation fails", async () => {
|
|
501
777
|
_resetPendingResolve();
|
|
502
778
|
|
|
@@ -1093,12 +1369,19 @@ function makeMockDeps(
|
|
|
1093
1369
|
* runUnit mock (dispatch counters, milestone state, etc.).
|
|
1094
1370
|
*/
|
|
1095
1371
|
function makeLoopSession(overrides?: Partial<Record<string, unknown>>) {
|
|
1372
|
+
const basePath = mkdtempSync(join(tmpdir(), "gsd-auto-loop-"));
|
|
1373
|
+
// Plan 001 enforces worktree safety for all isolation modes. Loop-mechanics
|
|
1374
|
+
// tests run with getIsolationMode: () => "none", so the project root itself
|
|
1375
|
+
// must be a valid git working tree for source-writing Units to dispatch.
|
|
1376
|
+
execSync("git init --initial-branch=main", { cwd: basePath, stdio: "ignore" });
|
|
1377
|
+
execSync("git config user.email test@test.com", { cwd: basePath, stdio: "ignore" });
|
|
1378
|
+
execSync("git config user.name Test", { cwd: basePath, stdio: "ignore" });
|
|
1096
1379
|
return {
|
|
1097
1380
|
active: true,
|
|
1098
1381
|
verbose: false,
|
|
1099
1382
|
stepMode: false,
|
|
1100
1383
|
paused: false,
|
|
1101
|
-
basePath
|
|
1384
|
+
basePath,
|
|
1102
1385
|
originalBasePath: "",
|
|
1103
1386
|
currentMilestoneId: "M001",
|
|
1104
1387
|
currentUnit: null,
|
|
@@ -1146,6 +1429,15 @@ function makeLoopSession(overrides?: Partial<Record<string, unknown>>) {
|
|
|
1146
1429
|
} as any;
|
|
1147
1430
|
}
|
|
1148
1431
|
|
|
1432
|
+
/** Create a temp project root suitable for loop-mechanics tests. */
|
|
1433
|
+
function makeLoopTestBase(prefix: string): string {
|
|
1434
|
+
const base = mkdtempSync(join(tmpdir(), prefix));
|
|
1435
|
+
execSync("git init --initial-branch=main", { cwd: base, stdio: "ignore" });
|
|
1436
|
+
execSync("git config user.email test@test.com", { cwd: base, stdio: "ignore" });
|
|
1437
|
+
execSync("git config user.name Test", { cwd: base, stdio: "ignore" });
|
|
1438
|
+
return base;
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1149
1441
|
test("autoLoop exits when s.active is set to false", async (t) => {
|
|
1150
1442
|
_resetPendingResolve();
|
|
1151
1443
|
|
|
@@ -1164,6 +1456,34 @@ test("autoLoop exits when s.active is set to false", async (t) => {
|
|
|
1164
1456
|
);
|
|
1165
1457
|
});
|
|
1166
1458
|
|
|
1459
|
+
test("autoLoop pauses visibly when Auto Orchestration Module is not wired", async () => {
|
|
1460
|
+
_resetPendingResolve();
|
|
1461
|
+
|
|
1462
|
+
const ctx = makeMockCtx();
|
|
1463
|
+
ctx.ui.setStatus = () => {};
|
|
1464
|
+
const pi = makeMockPi();
|
|
1465
|
+
const s = makeLoopSession();
|
|
1466
|
+
let pauseContext: unknown;
|
|
1467
|
+
|
|
1468
|
+
const deps = makeMockDeps({
|
|
1469
|
+
pauseAuto: async (_ctx, _pi, errorContext) => {
|
|
1470
|
+
pauseContext = errorContext;
|
|
1471
|
+
deps.callLog.push("pauseAuto");
|
|
1472
|
+
},
|
|
1473
|
+
});
|
|
1474
|
+
|
|
1475
|
+
await rawAutoLoop(ctx, pi, s, deps);
|
|
1476
|
+
|
|
1477
|
+
assert.ok(deps.callLog.includes("pauseAuto"), "missing orchestration should pause auto-mode");
|
|
1478
|
+
assert.equal(
|
|
1479
|
+
(pauseContext as { message?: string } | undefined)?.message,
|
|
1480
|
+
ORCHESTRATION_MISSING_REASON,
|
|
1481
|
+
);
|
|
1482
|
+
assert.equal(deps.callLog.includes("deriveState"), false);
|
|
1483
|
+
assert.equal(deps.callLog.includes("resolveDispatch"), false);
|
|
1484
|
+
assert.equal(s.pendingOrchestrationDispatch, null);
|
|
1485
|
+
});
|
|
1486
|
+
|
|
1167
1487
|
test("autoLoop exits on terminal complete state", async (t) => {
|
|
1168
1488
|
_resetPendingResolve();
|
|
1169
1489
|
|
|
@@ -1205,7 +1525,7 @@ test("autoLoop preserves stuck recovery counter when dispatch recovery continues
|
|
|
1205
1525
|
|
|
1206
1526
|
const ctx = makeMockCtx();
|
|
1207
1527
|
const pi = makeMockPi();
|
|
1208
|
-
const basePath = realpathSync(
|
|
1528
|
+
const basePath = realpathSync(makeLoopTestBase("gsd-stuck-counter-reset-"));
|
|
1209
1529
|
mkdirSync(join(basePath, ".gsd"), { recursive: true });
|
|
1210
1530
|
mkdirSync(join(basePath, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), { recursive: true });
|
|
1211
1531
|
writeFileSync(
|
|
@@ -1280,7 +1600,7 @@ test("autoLoop skips provider dispatch when execute-task is already complete in
|
|
|
1280
1600
|
ctx.ui.setStatus = () => {};
|
|
1281
1601
|
ctx.ui.setWidget = () => {};
|
|
1282
1602
|
const pi = makeMockPi();
|
|
1283
|
-
const basePath = realpathSync(
|
|
1603
|
+
const basePath = realpathSync(makeLoopTestBase("gsd-already-complete-dispatch-"));
|
|
1284
1604
|
mkdirSync(join(basePath, ".gsd"), { recursive: true });
|
|
1285
1605
|
|
|
1286
1606
|
try {
|
|
@@ -1990,11 +2310,15 @@ test("autoLoop retries next iteration when orchestration reports paused", async
|
|
|
1990
2310
|
},
|
|
1991
2311
|
});
|
|
1992
2312
|
|
|
2313
|
+
const journalEvents: Array<{ eventType: string; data?: any }> = [];
|
|
1993
2314
|
const deps = makeMockDeps({
|
|
1994
2315
|
resolveDispatch: async () => {
|
|
1995
2316
|
deps.callLog.push("resolveDispatch");
|
|
1996
2317
|
throw new Error("legacy resolveDispatch must not run after orchestration paused");
|
|
1997
2318
|
},
|
|
2319
|
+
emitJournalEvent: (entry: any) => {
|
|
2320
|
+
journalEvents.push(entry);
|
|
2321
|
+
},
|
|
1998
2322
|
});
|
|
1999
2323
|
|
|
2000
2324
|
await autoLoop(ctx, pi, s, deps);
|
|
@@ -2007,6 +2331,11 @@ test("autoLoop retries next iteration when orchestration reports paused", async
|
|
|
2007
2331
|
"orchestration paused must not fall back to legacy dispatch",
|
|
2008
2332
|
);
|
|
2009
2333
|
assert.equal(s.pendingOrchestrationDispatch, null, "no orchestration dispatch should remain pending");
|
|
2334
|
+
|
|
2335
|
+
const pausedIterationEnd = journalEvents.find(
|
|
2336
|
+
(e) => e.eventType === "iteration-end" && e.data?.status === "paused",
|
|
2337
|
+
);
|
|
2338
|
+
assert.ok(pausedIterationEnd, "orchestration paused must emit iteration-end to close the iteration journal");
|
|
2010
2339
|
});
|
|
2011
2340
|
|
|
2012
2341
|
test("autoLoop consumes pending orchestration dispatch without advancing twice", async () => {
|
|
@@ -2094,8 +2423,13 @@ test("autoLoop stops orchestrator complete state through completion surface", as
|
|
|
2094
2423
|
start: async () => ({ kind: "stopped" as const, reason: "unused" }),
|
|
2095
2424
|
advance: async () => ({
|
|
2096
2425
|
kind: "stopped" as const,
|
|
2097
|
-
reason: "
|
|
2426
|
+
reason: "legacy text not used",
|
|
2098
2427
|
stateSnapshot,
|
|
2428
|
+
terminalOutcome: {
|
|
2429
|
+
code: "all-complete" as const,
|
|
2430
|
+
displayReason: "All milestones complete",
|
|
2431
|
+
allMilestonesComplete: true as const,
|
|
2432
|
+
},
|
|
2099
2433
|
}),
|
|
2100
2434
|
completeActiveUnit: async () => {},
|
|
2101
2435
|
retryActiveUnit: async () => {},
|
|
@@ -2121,6 +2455,7 @@ test("autoLoop stops orchestrator complete state through completion surface", as
|
|
|
2121
2455
|
milestoneTitle: "Priority Levels",
|
|
2122
2456
|
allMilestonesComplete: true,
|
|
2123
2457
|
});
|
|
2458
|
+
assert.equal((stopCalls[0]?.options as any)?.terminalOutcome?.code, "all-complete");
|
|
2124
2459
|
assert.equal(
|
|
2125
2460
|
deps.callLog.includes("resolveDispatch"),
|
|
2126
2461
|
false,
|
|
@@ -2960,7 +3295,7 @@ test("autoLoop closes journal iteration on pre-dispatch health-gate break", asyn
|
|
|
2960
3295
|
assert.equal(deps.callLog.includes("pauseAuto"), true);
|
|
2961
3296
|
assert.deepEqual(pauseOptions, { expectedCurrentUnit: null });
|
|
2962
3297
|
assert.ok(
|
|
2963
|
-
journalEvents.some((event) => event.eventType === "iteration-end" && event.data?.reason === "
|
|
3298
|
+
journalEvents.some((event) => event.eventType === "iteration-end" && event.data?.reason === "health-gate-failed"),
|
|
2964
3299
|
"pre-dispatch break must close the started iteration",
|
|
2965
3300
|
);
|
|
2966
3301
|
});
|
|
@@ -3676,7 +4011,7 @@ test("resolveAgentEndCancelled with errorContext passes it through to resolved p
|
|
|
3676
4011
|
test("runUnitPhase pauses transient aborted cancellations instead of hard-stopping", async (t) => {
|
|
3677
4012
|
_resetPendingResolve();
|
|
3678
4013
|
|
|
3679
|
-
const basePath =
|
|
4014
|
+
const basePath = makeLoopTestBase("gsd-aborted-cancel-");
|
|
3680
4015
|
t.after(() => {
|
|
3681
4016
|
rmSync(basePath, { recursive: true, force: true });
|
|
3682
4017
|
});
|
|
@@ -3748,10 +4083,157 @@ test("runUnitPhase pauses transient aborted cancellations instead of hard-stoppi
|
|
|
3748
4083
|
assert.equal(deps.callLog.includes("stopAuto"), false);
|
|
3749
4084
|
});
|
|
3750
4085
|
|
|
4086
|
+
test("resetSessionTimeoutState gives a new auto session a fresh session-creation timeout budget", async (t) => {
|
|
4087
|
+
_resetPendingResolve();
|
|
4088
|
+
|
|
4089
|
+
// runUnitPhase schedules an auto-resume setTimeout on transient session
|
|
4090
|
+
// timeouts. Capture and clear those timers so the test process can exit
|
|
4091
|
+
// promptly while still exercising the real production path.
|
|
4092
|
+
const originalSetTimeout = globalThis.setTimeout;
|
|
4093
|
+
const timerHandles: ReturnType<typeof originalSetTimeout>[] = [];
|
|
4094
|
+
globalThis.setTimeout = ((callback: any, delay?: number, ...args: any[]) => {
|
|
4095
|
+
const handle = originalSetTimeout(callback, delay ?? 0, ...args);
|
|
4096
|
+
timerHandles.push(handle);
|
|
4097
|
+
return handle;
|
|
4098
|
+
}) as any;
|
|
4099
|
+
|
|
4100
|
+
const basePath = makeLoopTestBase("gsd-session-timeout-reset-");
|
|
4101
|
+
execSync("git init", { cwd: basePath });
|
|
4102
|
+
execSync('git -c user.email=test@test.com -c user.name=Test commit --allow-empty -m init', { cwd: basePath });
|
|
4103
|
+
|
|
4104
|
+
t.after(() => {
|
|
4105
|
+
for (const handle of timerHandles) clearTimeout(handle);
|
|
4106
|
+
globalThis.setTimeout = originalSetTimeout;
|
|
4107
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
4108
|
+
});
|
|
4109
|
+
|
|
4110
|
+
const ctx = {
|
|
4111
|
+
...makeMockCtx(),
|
|
4112
|
+
ui: {
|
|
4113
|
+
notify: () => {},
|
|
4114
|
+
setStatus: () => {},
|
|
4115
|
+
setWorkingMessage: () => {},
|
|
4116
|
+
},
|
|
4117
|
+
sessionManager: {
|
|
4118
|
+
getEntries: () => [],
|
|
4119
|
+
},
|
|
4120
|
+
modelRegistry: {
|
|
4121
|
+
getProviderAuthMode: () => undefined,
|
|
4122
|
+
isProviderRequestReady: () => true,
|
|
4123
|
+
},
|
|
4124
|
+
} as any;
|
|
4125
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
4126
|
+
ctx.ui.notify = (message: string, level?: string) => {
|
|
4127
|
+
notifications.push({ message, level });
|
|
4128
|
+
};
|
|
4129
|
+
const pi = makeMockPi();
|
|
4130
|
+
const s = makeLoopSession({
|
|
4131
|
+
basePath,
|
|
4132
|
+
canonicalProjectRoot: basePath,
|
|
4133
|
+
originalBasePath: basePath,
|
|
4134
|
+
});
|
|
4135
|
+
const deps = makeMockDeps();
|
|
4136
|
+
|
|
4137
|
+
async function runTimeoutUnit(iteration: number): Promise<string | undefined> {
|
|
4138
|
+
notifications.length = 0;
|
|
4139
|
+
const callsBefore = pi.calls.length;
|
|
4140
|
+
let seq = 0;
|
|
4141
|
+
const phasePromise = runUnitPhase(
|
|
4142
|
+
{ ctx, pi, s, deps, prefs: undefined, iteration, flowId: `flow-${iteration}`, nextSeq: () => ++seq },
|
|
4143
|
+
{
|
|
4144
|
+
unitType: "plan-slice",
|
|
4145
|
+
unitId: "M001/S01",
|
|
4146
|
+
prompt: "plan the slice",
|
|
4147
|
+
finalPrompt: "plan the slice",
|
|
4148
|
+
pauseAfterUatDispatch: false,
|
|
4149
|
+
state: {
|
|
4150
|
+
phase: "planning",
|
|
4151
|
+
activeMilestone: { id: "M001", title: "Milestone" },
|
|
4152
|
+
activeSlice: { id: "S01", title: "Slice" },
|
|
4153
|
+
activeTask: null,
|
|
4154
|
+
registry: [{ id: "M001", title: "Milestone", status: "active" }],
|
|
4155
|
+
recentDecisions: [],
|
|
4156
|
+
blockers: [],
|
|
4157
|
+
nextAction: "",
|
|
4158
|
+
progress: { milestones: { done: 0, total: 1 } },
|
|
4159
|
+
requirements: { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 },
|
|
4160
|
+
} as any,
|
|
4161
|
+
mid: "M001",
|
|
4162
|
+
midTitle: "Milestone",
|
|
4163
|
+
isRetry: false,
|
|
4164
|
+
previousTier: undefined,
|
|
4165
|
+
},
|
|
4166
|
+
makeLoopState(),
|
|
4167
|
+
);
|
|
4168
|
+
|
|
4169
|
+
// Wait until runUnit has dispatched the prompt, then resolve the unit
|
|
4170
|
+
// as a session-creation timeout. This avoids the 120s real timeout and
|
|
4171
|
+
// the mock-timer interaction that runUnitPhase's pre-flight setup makes
|
|
4172
|
+
// fragile.
|
|
4173
|
+
await new Promise<void>((resolve) => {
|
|
4174
|
+
const check = () => {
|
|
4175
|
+
if (pi.calls.length > callsBefore) return resolve();
|
|
4176
|
+
setTimeout(check, 5);
|
|
4177
|
+
};
|
|
4178
|
+
check();
|
|
4179
|
+
});
|
|
4180
|
+
resolveAgentEndCancelled({
|
|
4181
|
+
message: "Session creation timed out",
|
|
4182
|
+
category: "timeout",
|
|
4183
|
+
isTransient: true,
|
|
4184
|
+
});
|
|
4185
|
+
|
|
4186
|
+
const result = await phasePromise;
|
|
4187
|
+
return (result as any).reason;
|
|
4188
|
+
}
|
|
4189
|
+
|
|
4190
|
+
// Start from a known state in case a previous test left the counter raised.
|
|
4191
|
+
resetSessionTimeoutState();
|
|
4192
|
+
|
|
4193
|
+
// Exhaust the per-process timeout budget in the first "session".
|
|
4194
|
+
for (let i = 1; i <= 4; i++) {
|
|
4195
|
+
const reason = await runTimeoutUnit(i);
|
|
4196
|
+
assert.equal(reason, "session-timeout");
|
|
4197
|
+
}
|
|
4198
|
+
const lastBudgetNotification = notifications.find((n) =>
|
|
4199
|
+
n.message.includes("Session creation timed out")
|
|
4200
|
+
);
|
|
4201
|
+
assert.ok(lastBudgetNotification, "expected a session-creation timeout notification");
|
|
4202
|
+
assert.match(
|
|
4203
|
+
lastBudgetNotification.message,
|
|
4204
|
+
/Pausing for manual review/,
|
|
4205
|
+
"fourth consecutive timeout should exhaust the auto-resume budget",
|
|
4206
|
+
);
|
|
4207
|
+
|
|
4208
|
+
// Simulate a new auto-mode session starting. autoLoop() must reset the
|
|
4209
|
+
// module-level counter so the next timeout is treated as the first in the
|
|
4210
|
+
// new session rather than inheriting the exhausted budget.
|
|
4211
|
+
const freshSession = makeLoopSession({
|
|
4212
|
+
basePath,
|
|
4213
|
+
canonicalProjectRoot: basePath,
|
|
4214
|
+
originalBasePath: basePath,
|
|
4215
|
+
active: false,
|
|
4216
|
+
});
|
|
4217
|
+
freshSession.orchestration = createLoopTestOrchestration(ctx, pi, freshSession, deps);
|
|
4218
|
+
await rawAutoLoop(ctx, pi, freshSession, deps);
|
|
4219
|
+
|
|
4220
|
+
const reasonAfterReset = await runTimeoutUnit(5);
|
|
4221
|
+
assert.equal(reasonAfterReset, "session-timeout");
|
|
4222
|
+
const notificationAfterReset = notifications.find((n) =>
|
|
4223
|
+
n.message.includes("Auto-resuming")
|
|
4224
|
+
);
|
|
4225
|
+
assert.ok(notificationAfterReset, "expected an auto-resume notification after reset");
|
|
4226
|
+
assert.match(
|
|
4227
|
+
notificationAfterReset.message,
|
|
4228
|
+
/Auto-resuming/,
|
|
4229
|
+
"after autoLoop entry the timeout budget should be fresh so the first timeout auto-resumes",
|
|
4230
|
+
);
|
|
4231
|
+
});
|
|
4232
|
+
|
|
3751
4233
|
test("runUnitPhase treats setup-race cancellations as pause-induced when session is already paused", async (t) => {
|
|
3752
4234
|
_resetPendingResolve();
|
|
3753
4235
|
|
|
3754
|
-
const basePath =
|
|
4236
|
+
const basePath = makeLoopTestBase("gsd-paused-setup-race-");
|
|
3755
4237
|
t.after(() => {
|
|
3756
4238
|
rmSync(basePath, { recursive: true, force: true });
|
|
3757
4239
|
});
|
|
@@ -3826,7 +4308,7 @@ test("runUnitPhase treats setup-race cancellations as pause-induced when session
|
|
|
3826
4308
|
test("runUnitPhase remembers aborted milestone closeout for same-unit resume", async (t) => {
|
|
3827
4309
|
_resetPendingResolve();
|
|
3828
4310
|
|
|
3829
|
-
const basePath =
|
|
4311
|
+
const basePath = makeLoopTestBase("gsd-aborted-closeout-");
|
|
3830
4312
|
t.after(() => {
|
|
3831
4313
|
rmSync(basePath, { recursive: true, force: true });
|
|
3832
4314
|
});
|
|
@@ -3906,7 +4388,7 @@ test("runUnitPhase remembers aborted milestone closeout for same-unit resume", a
|
|
|
3906
4388
|
test("runUnitPhase schedules default auto-resume for transient provider cancellations", async (t) => {
|
|
3907
4389
|
_resetPendingResolve();
|
|
3908
4390
|
|
|
3909
|
-
const basePath =
|
|
4391
|
+
const basePath = makeLoopTestBase("gsd-provider-resume-");
|
|
3910
4392
|
t.after(() => {
|
|
3911
4393
|
_resetPendingResolve();
|
|
3912
4394
|
rmSync(basePath, { recursive: true, force: true });
|
|
@@ -4003,7 +4485,7 @@ test("runUnitPhase schedules default auto-resume for transient provider cancella
|
|
|
4003
4485
|
test("runUnitPhase pauses ghost completions before closeout and finalize side effects", async (t) => {
|
|
4004
4486
|
_resetPendingResolve();
|
|
4005
4487
|
|
|
4006
|
-
const basePath =
|
|
4488
|
+
const basePath = makeLoopTestBase("gsd-ghost-completion-");
|
|
4007
4489
|
t.after(() => {
|
|
4008
4490
|
_resetPendingResolve();
|
|
4009
4491
|
rmSync(basePath, { recursive: true, force: true });
|
|
@@ -4105,7 +4587,7 @@ test("runUnitPhase pauses ghost completions before closeout and finalize side ef
|
|
|
4105
4587
|
test("runUnitPhase records failed routing outcome when expected artifact is missing", async (t) => {
|
|
4106
4588
|
_resetPendingResolve();
|
|
4107
4589
|
|
|
4108
|
-
const basePath =
|
|
4590
|
+
const basePath = makeLoopTestBase("gsd-routing-artifact-missing-");
|
|
4109
4591
|
t.after(() => {
|
|
4110
4592
|
_resetPendingResolve();
|
|
4111
4593
|
rmSync(basePath, { recursive: true, force: true });
|
|
@@ -4188,7 +4670,7 @@ test("runUnitPhase records failed routing outcome when expected artifact is miss
|
|
|
4188
4670
|
test("runUnitPhase execute-task retry prompt instructs gsd_task_complete instead of manual summary writes", async (t) => {
|
|
4189
4671
|
_resetPendingResolve();
|
|
4190
4672
|
|
|
4191
|
-
const basePath =
|
|
4673
|
+
const basePath = makeLoopTestBase("gsd-execute-task-retry-prompt-");
|
|
4192
4674
|
t.after(() => {
|
|
4193
4675
|
_resetPendingResolve();
|
|
4194
4676
|
rmSync(basePath, { recursive: true, force: true });
|
|
@@ -4269,7 +4751,7 @@ test("runUnitPhase execute-task retry prompt instructs gsd_task_complete instead
|
|
|
4269
4751
|
test("runUnitPhase non-execute-task retry prompt keeps generic required-file guidance", async (t) => {
|
|
4270
4752
|
_resetPendingResolve();
|
|
4271
4753
|
|
|
4272
|
-
const basePath =
|
|
4754
|
+
const basePath = makeLoopTestBase("gsd-non-execute-retry-prompt-");
|
|
4273
4755
|
t.after(() => {
|
|
4274
4756
|
_resetPendingResolve();
|
|
4275
4757
|
rmSync(basePath, { recursive: true, force: true });
|
|
@@ -4617,7 +5099,7 @@ test("autoLoop rejects execute-task with 0 tool calls as hallucinated (#1833)",
|
|
|
4617
5099
|
test("runUnitPhase retries 0-tool units with ordinary network-related assistant text", async (t) => {
|
|
4618
5100
|
_resetPendingResolve();
|
|
4619
5101
|
|
|
4620
|
-
const basePath =
|
|
5102
|
+
const basePath = makeLoopTestBase("gsd-zero-tool-network-text-");
|
|
4621
5103
|
t.after(() => {
|
|
4622
5104
|
rmSync(basePath, { recursive: true, force: true });
|
|
4623
5105
|
});
|
|
@@ -4712,7 +5194,7 @@ test("runUnitPhase retries 0-tool units with ordinary network-related assistant
|
|
|
4712
5194
|
test("runUnitPhase pauses auto-mode when zero-tool-call retry is exhausted", async (t) => {
|
|
4713
5195
|
_resetPendingResolve();
|
|
4714
5196
|
|
|
4715
|
-
const basePath =
|
|
5197
|
+
const basePath = makeLoopTestBase("gsd-zero-tool-exhausted-");
|
|
4716
5198
|
t.after(() => {
|
|
4717
5199
|
rmSync(basePath, { recursive: true, force: true });
|
|
4718
5200
|
});
|
|
@@ -4997,7 +5479,7 @@ test("autoLoop rejects complete-slice with 0 tool calls as context-exhausted (#2
|
|
|
4997
5479
|
test("autoLoop pauses on zero-tool-call rate-limit assistant messages instead of immediate retry", async (t) => {
|
|
4998
5480
|
_resetPendingResolve();
|
|
4999
5481
|
|
|
5000
|
-
const basePath =
|
|
5482
|
+
const basePath = makeLoopTestBase("gsd-zero-tool-rate-limit-");
|
|
5001
5483
|
t.after(() => {
|
|
5002
5484
|
_resetPendingResolve();
|
|
5003
5485
|
rmSync(basePath, { recursive: true, force: true });
|
|
@@ -5201,6 +5683,147 @@ test("dispatch Worktree Safety wins before stuck detection for execute-task with
|
|
|
5201
5683
|
);
|
|
5202
5684
|
});
|
|
5203
5685
|
|
|
5686
|
+
test("dispatch Worktree Safety honors degraded branch fallback instead of demanding the canonical worktree root", async (t) => {
|
|
5687
|
+
_resetPendingResolve();
|
|
5688
|
+
|
|
5689
|
+
const ctx = makeMockCtx();
|
|
5690
|
+
const pi = makeMockPi();
|
|
5691
|
+
const notifications: string[] = [];
|
|
5692
|
+
ctx.ui.notify = (msg: string) => { notifications.push(msg); };
|
|
5693
|
+
|
|
5694
|
+
// Worktree creation failed and the lifecycle fell back to the milestone
|
|
5695
|
+
// branch in the project root. The safety gate must validate against that
|
|
5696
|
+
// effective branch mode, not the configured worktree mode.
|
|
5697
|
+
const projectRoot = mkdtempSync(join(tmpdir(), "gsd-wt-safety-degraded-"));
|
|
5698
|
+
execSync("git init --initial-branch=main", { cwd: projectRoot, stdio: "ignore" });
|
|
5699
|
+
execSync("git config user.email test@test.com", { cwd: projectRoot, stdio: "ignore" });
|
|
5700
|
+
execSync("git config user.name Test", { cwd: projectRoot, stdio: "ignore" });
|
|
5701
|
+
// The lifecycle fallback checks out the milestone branch in the project
|
|
5702
|
+
// root, so the safety gate's branch verification expects that branch here
|
|
5703
|
+
// too. expectedBranch comes from deps.autoWorktreeBranch (mocked to
|
|
5704
|
+
// "auto/M001"), so the fixture repo must be on that same branch.
|
|
5705
|
+
execSync("git commit --allow-empty -m init", { cwd: projectRoot, stdio: "ignore" });
|
|
5706
|
+
execSync("git checkout -b auto/M001", { cwd: projectRoot, stdio: "ignore" });
|
|
5707
|
+
t.after(() => rmSync(projectRoot, { recursive: true, force: true }));
|
|
5708
|
+
|
|
5709
|
+
const s = makeLoopSession({
|
|
5710
|
+
basePath: projectRoot,
|
|
5711
|
+
originalBasePath: projectRoot,
|
|
5712
|
+
canonicalProjectRoot: projectRoot,
|
|
5713
|
+
isolationDegraded: true,
|
|
5714
|
+
});
|
|
5715
|
+
const deps = makeMockDeps({
|
|
5716
|
+
getIsolationMode: () => "worktree",
|
|
5717
|
+
});
|
|
5718
|
+
const result = await runDispatch(
|
|
5719
|
+
{
|
|
5720
|
+
ctx,
|
|
5721
|
+
pi,
|
|
5722
|
+
s,
|
|
5723
|
+
deps,
|
|
5724
|
+
prefs: undefined,
|
|
5725
|
+
iteration: 1,
|
|
5726
|
+
flowId: "test-flow",
|
|
5727
|
+
nextSeq: () => 1,
|
|
5728
|
+
},
|
|
5729
|
+
{
|
|
5730
|
+
state: {
|
|
5731
|
+
phase: "executing",
|
|
5732
|
+
activeMilestone: { id: "M001", title: "Test", status: "active" },
|
|
5733
|
+
activeSlice: { id: "S01", title: "Slice 1" },
|
|
5734
|
+
activeTask: { id: "T01" },
|
|
5735
|
+
registry: [{ id: "M001", status: "active" }],
|
|
5736
|
+
blockers: [],
|
|
5737
|
+
} as any,
|
|
5738
|
+
mid: "M001",
|
|
5739
|
+
midTitle: "Test",
|
|
5740
|
+
},
|
|
5741
|
+
{
|
|
5742
|
+
recentUnits: [],
|
|
5743
|
+
stuckRecoveryAttempts: 0,
|
|
5744
|
+
consecutiveFinalizeTimeouts: 0,
|
|
5745
|
+
},
|
|
5746
|
+
);
|
|
5747
|
+
|
|
5748
|
+
assert.equal(result.action, "next", "dispatch must proceed under degraded branch isolation");
|
|
5749
|
+
assert.ok(
|
|
5750
|
+
!notifications.some((n) => n.includes("Worktree Safety failed")),
|
|
5751
|
+
"degraded branch fallback must not trip a false invalid-root",
|
|
5752
|
+
);
|
|
5753
|
+
assert.ok(!deps.callLog.includes("stopAuto"), "auto-mode must not stop on the degraded fallback");
|
|
5754
|
+
});
|
|
5755
|
+
|
|
5756
|
+
test("dispatch Worktree Safety honors stranded branch recovery instead of demanding the canonical worktree root", async (t) => {
|
|
5757
|
+
_resetPendingResolve();
|
|
5758
|
+
|
|
5759
|
+
const ctx = makeMockCtx();
|
|
5760
|
+
const pi = makeMockPi();
|
|
5761
|
+
const notifications: string[] = [];
|
|
5762
|
+
ctx.ui.notify = (msg: string) => { notifications.push(msg); };
|
|
5763
|
+
|
|
5764
|
+
// Bootstrap adopted stranded work by checking out the milestone branch in
|
|
5765
|
+
// the project root (strandedRecoveryIsolationMode = "branch"). Isolation is
|
|
5766
|
+
// NOT degraded — the adoption is intentional. The safety gate must validate
|
|
5767
|
+
// against the effective branch mode, not the configured worktree mode.
|
|
5768
|
+
const projectRoot = mkdtempSync(join(tmpdir(), "gsd-wt-safety-stranded-"));
|
|
5769
|
+
execSync("git init --initial-branch=main", { cwd: projectRoot, stdio: "ignore" });
|
|
5770
|
+
execSync("git config user.email test@test.com", { cwd: projectRoot, stdio: "ignore" });
|
|
5771
|
+
execSync("git config user.name Test", { cwd: projectRoot, stdio: "ignore" });
|
|
5772
|
+
// Stranded recovery adopts the milestone branch in the project root, so the
|
|
5773
|
+
// safety gate's branch verification expects that branch here too.
|
|
5774
|
+
// expectedBranch comes from deps.autoWorktreeBranch (mocked to "auto/M001"),
|
|
5775
|
+
// so the fixture repo must be on that same branch.
|
|
5776
|
+
execSync("git commit --allow-empty -m init", { cwd: projectRoot, stdio: "ignore" });
|
|
5777
|
+
execSync("git checkout -b auto/M001", { cwd: projectRoot, stdio: "ignore" });
|
|
5778
|
+
t.after(() => rmSync(projectRoot, { recursive: true, force: true }));
|
|
5779
|
+
|
|
5780
|
+
const s = makeLoopSession({
|
|
5781
|
+
basePath: projectRoot,
|
|
5782
|
+
originalBasePath: projectRoot,
|
|
5783
|
+
canonicalProjectRoot: projectRoot,
|
|
5784
|
+
strandedRecoveryIsolationMode: "branch",
|
|
5785
|
+
});
|
|
5786
|
+
const deps = makeMockDeps({
|
|
5787
|
+
getIsolationMode: () => "worktree",
|
|
5788
|
+
});
|
|
5789
|
+
const result = await runDispatch(
|
|
5790
|
+
{
|
|
5791
|
+
ctx,
|
|
5792
|
+
pi,
|
|
5793
|
+
s,
|
|
5794
|
+
deps,
|
|
5795
|
+
prefs: undefined,
|
|
5796
|
+
iteration: 1,
|
|
5797
|
+
flowId: "test-flow",
|
|
5798
|
+
nextSeq: () => 1,
|
|
5799
|
+
},
|
|
5800
|
+
{
|
|
5801
|
+
state: {
|
|
5802
|
+
phase: "executing",
|
|
5803
|
+
activeMilestone: { id: "M001", title: "Test", status: "active" },
|
|
5804
|
+
activeSlice: { id: "S01", title: "Slice 1" },
|
|
5805
|
+
activeTask: { id: "T01" },
|
|
5806
|
+
registry: [{ id: "M001", status: "active" }],
|
|
5807
|
+
blockers: [],
|
|
5808
|
+
} as any,
|
|
5809
|
+
mid: "M001",
|
|
5810
|
+
midTitle: "Test",
|
|
5811
|
+
},
|
|
5812
|
+
{
|
|
5813
|
+
recentUnits: [],
|
|
5814
|
+
stuckRecoveryAttempts: 0,
|
|
5815
|
+
consecutiveFinalizeTimeouts: 0,
|
|
5816
|
+
},
|
|
5817
|
+
);
|
|
5818
|
+
|
|
5819
|
+
assert.equal(result.action, "next", "dispatch must proceed under stranded branch recovery");
|
|
5820
|
+
assert.ok(
|
|
5821
|
+
!notifications.some((n) => n.includes("Worktree Safety failed")),
|
|
5822
|
+
"stranded branch recovery must not trip a false invalid-root",
|
|
5823
|
+
);
|
|
5824
|
+
assert.ok(!deps.callLog.includes("stopAuto"), "auto-mode must not stop on stranded branch recovery");
|
|
5825
|
+
});
|
|
5826
|
+
|
|
5204
5827
|
test("runDispatch runs stuck detection while artifact verification retry is pending (#5719)", async (t) => {
|
|
5205
5828
|
_resetPendingResolve();
|
|
5206
5829
|
|
|
@@ -5209,7 +5832,7 @@ test("runDispatch runs stuck detection while artifact verification retry is pend
|
|
|
5209
5832
|
const notifications: string[] = [];
|
|
5210
5833
|
ctx.ui.notify = (msg: string) => { notifications.push(msg); };
|
|
5211
5834
|
|
|
5212
|
-
const basePath =
|
|
5835
|
+
const basePath = makeLoopTestBase("gsd-5719-retry-stuck-");
|
|
5213
5836
|
t.after(() => rmSync(basePath, { recursive: true, force: true }));
|
|
5214
5837
|
|
|
5215
5838
|
const s = makeLoopSession({
|
|
@@ -5277,7 +5900,7 @@ test("runDispatch falls back to main when dispatch guard cannot read main branch
|
|
|
5277
5900
|
|
|
5278
5901
|
const ctx = makeMockCtx();
|
|
5279
5902
|
const pi = makeMockPi();
|
|
5280
|
-
const basePath =
|
|
5903
|
+
const basePath = makeLoopTestBase("gsd-5530-main-branch-fallback-");
|
|
5281
5904
|
t.after(() => rmSync(basePath, { recursive: true, force: true }));
|
|
5282
5905
|
|
|
5283
5906
|
let guardBranch: string | null = null;
|
|
@@ -5804,7 +6427,7 @@ test("pre-dispatch replace resolves final unit before dispatch health and stuck
|
|
|
5804
6427
|
);
|
|
5805
6428
|
});
|
|
5806
6429
|
|
|
5807
|
-
test("autoLoop warns but proceeds for greenfield project (no project files) (#1833)", async () => {
|
|
6430
|
+
test("autoLoop warns but proceeds for greenfield project (no project files) (#1833)", async (t) => {
|
|
5808
6431
|
_resetPendingResolve();
|
|
5809
6432
|
|
|
5810
6433
|
const ctx = makeMockCtx();
|
|
@@ -5813,7 +6436,9 @@ test("autoLoop warns but proceeds for greenfield project (no project files) (#18
|
|
|
5813
6436
|
const pi = makeMockPi();
|
|
5814
6437
|
|
|
5815
6438
|
const notifications: string[] = [];
|
|
5816
|
-
const
|
|
6439
|
+
const basePath = makeLoopTestBase("gsd-greenfield-");
|
|
6440
|
+
t.after(() => rmSync(basePath, { recursive: true, force: true }));
|
|
6441
|
+
const s = makeLoopSession({ basePath });
|
|
5817
6442
|
|
|
5818
6443
|
ctx.ui.notify = (msg: string) => {
|
|
5819
6444
|
notifications.push(msg);
|
|
@@ -5836,8 +6461,6 @@ test("autoLoop warns but proceeds for greenfield project (no project files) (#18
|
|
|
5836
6461
|
blockers: [],
|
|
5837
6462
|
} as any;
|
|
5838
6463
|
},
|
|
5839
|
-
// Has .git but no package.json or src/
|
|
5840
|
-
existsSync: (p: string) => p.endsWith(".git"),
|
|
5841
6464
|
});
|
|
5842
6465
|
|
|
5843
6466
|
await autoLoop(ctx, pi, s, deps);
|