@opengsd/gsd-pi 1.2.0-dev.fbdca60b → 1.3.0-dev.65546769
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/README.md +13 -7
- package/dist/cli.js +28 -1
- package/dist/headless-context.js +0 -1
- package/dist/headless-events.d.ts +16 -1
- package/dist/headless-events.js +19 -2
- package/dist/headless.js +8 -1
- package/dist/help-text.js +29 -0
- package/dist/hermes-integration-install.d.ts +17 -0
- package/dist/hermes-integration-install.js +199 -0
- package/dist/jiti-workspace-aliases.d.ts +11 -2
- package/dist/jiti-workspace-aliases.js +19 -3
- package/dist/onboarding.js +9 -4
- package/dist/provider-migrations.d.ts +23 -0
- package/dist/provider-migrations.js +41 -0
- package/dist/read-cli.d.ts +23 -0
- package/dist/read-cli.js +90 -0
- package/dist/resource-loader.d.ts +3 -3
- package/dist/resource-loader.js +4 -13
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +22 -22
- package/dist/resources/extensions/claude-code-cli/index.js +7 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +73 -20
- package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
- package/dist/resources/extensions/gsd/auto/loop.js +67 -2
- package/dist/resources/extensions/gsd/auto/orchestrator.js +50 -10
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +81 -19
- package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +47 -8
- package/dist/resources/extensions/gsd/auto-model-selection.js +14 -8
- package/dist/resources/extensions/gsd/auto-post-unit.js +39 -29
- package/dist/resources/extensions/gsd/auto-prompts.js +44 -30
- package/dist/resources/extensions/gsd/auto-recovery.js +118 -40
- package/dist/resources/extensions/gsd/auto-runtime-state.js +13 -0
- package/dist/resources/extensions/gsd/auto-start.js +58 -31
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +149 -91
- package/dist/resources/extensions/gsd/auto.js +97 -31
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +42 -54
- package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +24 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +108 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +164 -44
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +113 -27
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +92 -4
- package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
- package/dist/resources/extensions/gsd/codebase-generator.js +5 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
- package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
- package/dist/resources/extensions/gsd/commands/handlers/core.js +52 -8
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +227 -3
- package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
- package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +14 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
- package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
- package/dist/resources/extensions/gsd/compat/index.js +3 -0
- package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
- package/dist/resources/extensions/gsd/config-overlay.js +11 -8
- package/dist/resources/extensions/gsd/consent-question.js +12 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +39 -3
- package/dist/resources/extensions/gsd/db/engine.js +27 -0
- package/dist/resources/extensions/gsd/db/queries.js +54 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
- package/dist/resources/extensions/gsd/db-workspace.js +13 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
- package/dist/resources/extensions/gsd/doctor-git-checks.js +30 -4
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -24
- package/dist/resources/extensions/gsd/doctor.js +28 -7
- package/dist/resources/extensions/gsd/error-classifier.js +13 -1
- package/dist/resources/extensions/gsd/escalation.js +11 -4
- package/dist/resources/extensions/gsd/export-html.js +10 -3
- package/dist/resources/extensions/gsd/export.js +73 -0
- package/dist/resources/extensions/gsd/file-lock.js +1 -1
- package/dist/resources/extensions/gsd/flat-phase-migration.js +176 -0
- package/dist/resources/extensions/gsd/forensics.js +2 -1
- package/dist/resources/extensions/gsd/git-service.js +7 -4
- package/dist/resources/extensions/gsd/gitignore.js +6 -2
- package/dist/resources/extensions/gsd/guidance.js +7 -7
- package/dist/resources/extensions/gsd/guided-flow.js +11 -6
- package/dist/resources/extensions/gsd/layout-policy.js +75 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +391 -116
- package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
- package/dist/resources/extensions/gsd/md-importer.js +153 -51
- package/dist/resources/extensions/gsd/metrics.js +19 -11
- package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
- package/dist/resources/extensions/gsd/migrate-external.js +51 -6
- package/dist/resources/extensions/gsd/migration-auto-check.js +5 -14
- package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
- package/dist/resources/extensions/gsd/milestone-ids.js +50 -19
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
- package/dist/resources/extensions/gsd/model-router.js +79 -20
- package/dist/resources/extensions/gsd/notification-store.js +22 -29
- package/dist/resources/extensions/gsd/notifications.js +36 -7
- package/dist/resources/extensions/gsd/observability-validator.js +12 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
- package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
- package/dist/resources/extensions/gsd/paths.js +356 -44
- package/dist/resources/extensions/gsd/planning-depth.js +2 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
- package/dist/resources/extensions/gsd/preferences-models.js +34 -14
- package/dist/resources/extensions/gsd/preferences.js +148 -13
- package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/dist/resources/extensions/gsd/prompts/code-review.md +37 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +24 -15
- package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -1
- package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
- package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/dist/resources/extensions/gsd/prompts/health.md +37 -0
- package/dist/resources/extensions/gsd/prompts/import.md +30 -0
- package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
- package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
- package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/dist/resources/extensions/gsd/prompts/review.md +27 -0
- package/dist/resources/extensions/gsd/prompts/run-uat.md +5 -1
- package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
- package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
- package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
- package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
- package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
- package/dist/resources/extensions/gsd/queue-order.js +3 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
- package/dist/resources/extensions/gsd/service-tier.js +2 -1
- package/dist/resources/extensions/gsd/session-lock.js +11 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +51 -10
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +95 -19
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +36 -3
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +12 -0
- package/dist/resources/extensions/gsd/state.js +48 -17
- package/dist/resources/extensions/gsd/sync-lock.js +11 -18
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +12 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +15 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
- package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -3
- package/dist/resources/extensions/gsd/tools/plan-task.js +16 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +44 -5
- package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
- package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
- package/dist/resources/extensions/gsd/undo.js +8 -9
- package/dist/resources/extensions/gsd/unit-registry.js +27 -3
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +58 -2
- package/dist/resources/extensions/gsd/validation-block-guard.js +45 -0
- package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
- package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
- package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +25 -4
- package/dist/resources/extensions/gsd/worktree-command.js +6 -6
- package/dist/resources/extensions/gsd/worktree-health.js +6 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +109 -16
- package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
- package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
- package/dist/resources/extensions/mcp-client/manager.js +3 -3
- package/dist/resources/extensions/search-the-web/index.js +41 -9
- package/dist/resources/extensions/search-the-web/native-search.js +18 -4
- package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
- package/dist/resources/extensions/subagent/index.js +20 -15
- package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.js +15 -4
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- 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 +3 -3
- 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/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 +8 -8
- package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.8e446784528ed9dc.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/8785.481aa5869991b760.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-f0285ce91d4ec9ef.js → webpack-f46ea08200a0227e.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web-mode.d.ts +3 -1
- package/dist/web-mode.js +7 -5
- package/integrations/hermes/README.md +48 -0
- package/integrations/hermes/docs/setup.md +272 -0
- package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
- package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
- package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
- package/integrations/hermes/open_gsd_hermes/config.py +59 -0
- package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
- package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
- package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
- package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
- package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
- package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
- package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
- package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
- package/integrations/hermes/open_gsd_hermes/types.py +100 -0
- package/integrations/hermes/plugin.yaml +38 -0
- package/integrations/hermes/pyproject.toml +32 -0
- package/integrations/hermes/scripts/preflight.sh +92 -0
- package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
- package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
- package/integrations/hermes/tests/golden/snapshot.txt +8 -0
- package/integrations/hermes/tests/test_binding.py +103 -0
- package/integrations/hermes/tests/test_config.py +36 -0
- package/integrations/hermes/tests/test_cron.py +34 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
- package/integrations/hermes/tests/test_memory.py +59 -0
- package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
- package/integrations/hermes/tests/test_register.py +56 -0
- package/integrations/hermes/tests/test_snapshot.py +53 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
- package/package.json +8 -7
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- 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 -2
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -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 +37 -15
- 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 +69 -3
- 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 +223 -32
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
- 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 +26 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-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 +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.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 +3 -5
- 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-dialogs.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
- 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 +25 -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-key-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +9 -2
- 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 +31 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.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 -0
- 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 +10 -0
- package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
- package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-errors.js +12 -0
- package/packages/mcp-server/dist/cli-errors.js.map +1 -1
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +33 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/cli.d.ts +1 -0
- package/packages/mcp-server/dist/cli.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli.js +1 -0
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +29 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +82 -3
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/package.json +21 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +9 -0
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.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.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +6 -1
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- 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/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +1 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/select-list.js +8 -2
- package/packages/pi-tui/dist/components/select-list.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +22 -22
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
- package/src/resources/extensions/claude-code-cli/index.ts +8 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +83 -20
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +47 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +182 -10
- package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
- package/src/resources/extensions/gsd/auto/loop.ts +69 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +63 -10
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +13 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +83 -20
- package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +57 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +27 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -31
- package/src/resources/extensions/gsd/auto-prompts.ts +45 -30
- package/src/resources/extensions/gsd/auto-recovery.ts +126 -37
- package/src/resources/extensions/gsd/auto-runtime-state.ts +13 -0
- package/src/resources/extensions/gsd/auto-start.ts +82 -36
- package/src/resources/extensions/gsd/auto-verification.ts +5 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -15
- package/src/resources/extensions/gsd/auto.ts +133 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +45 -61
- package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +123 -9
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +185 -46
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +138 -29
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
- package/src/resources/extensions/gsd/codebase-generator.ts +6 -9
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
- package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
- package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -8
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +230 -3
- package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
- package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +13 -0
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
- package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
- package/src/resources/extensions/gsd/compat/index.ts +12 -0
- package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
- package/src/resources/extensions/gsd/config-overlay.ts +24 -9
- package/src/resources/extensions/gsd/consent-question.ts +11 -1
- package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +41 -4
- package/src/resources/extensions/gsd/db/engine.ts +26 -0
- package/src/resources/extensions/gsd/db/queries.ts +78 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
- package/src/resources/extensions/gsd/db-workspace.ts +15 -0
- package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
- package/src/resources/extensions/gsd/doctor-git-checks.ts +28 -3
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +12 -25
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +30 -7
- package/src/resources/extensions/gsd/error-classifier.ts +14 -1
- package/src/resources/extensions/gsd/escalation.ts +9 -4
- package/src/resources/extensions/gsd/export-html.ts +11 -4
- package/src/resources/extensions/gsd/export.ts +88 -1
- package/src/resources/extensions/gsd/file-lock.ts +1 -1
- package/src/resources/extensions/gsd/flat-phase-migration.ts +205 -0
- package/src/resources/extensions/gsd/forensics.ts +2 -1
- package/src/resources/extensions/gsd/git-constants.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +7 -2
- package/src/resources/extensions/gsd/gitignore.ts +7 -3
- package/src/resources/extensions/gsd/guidance.ts +7 -7
- package/src/resources/extensions/gsd/guided-flow.ts +11 -6
- package/src/resources/extensions/gsd/layout-policy.ts +85 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +404 -104
- package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
- package/src/resources/extensions/gsd/md-importer.ts +215 -65
- package/src/resources/extensions/gsd/metrics.ts +23 -10
- package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
- package/src/resources/extensions/gsd/migrate-external.ts +49 -6
- package/src/resources/extensions/gsd/migration-auto-check.ts +4 -13
- package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
- package/src/resources/extensions/gsd/milestone-ids.ts +49 -19
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
- package/src/resources/extensions/gsd/model-router.ts +98 -18
- package/src/resources/extensions/gsd/notification-store.ts +17 -28
- package/src/resources/extensions/gsd/notifications.ts +37 -6
- package/src/resources/extensions/gsd/observability-validator.ts +12 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
- package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
- package/src/resources/extensions/gsd/paths.ts +348 -39
- package/src/resources/extensions/gsd/planning-depth.ts +2 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
- package/src/resources/extensions/gsd/preferences-models.ts +47 -13
- package/src/resources/extensions/gsd/preferences.ts +188 -14
- package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/src/resources/extensions/gsd/prompts/code-review.md +37 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +24 -15
- package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -1
- package/src/resources/extensions/gsd/prompts/explore.md +58 -0
- package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/src/resources/extensions/gsd/prompts/health.md +37 -0
- package/src/resources/extensions/gsd/prompts/import.md +30 -0
- package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/src/resources/extensions/gsd/prompts/manager.md +21 -0
- package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/phase.md +22 -0
- package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/src/resources/extensions/gsd/prompts/progress.md +30 -0
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/src/resources/extensions/gsd/prompts/review.md +27 -0
- package/src/resources/extensions/gsd/prompts/run-uat.md +5 -1
- package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/settings.md +24 -0
- package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/spike.md +59 -0
- package/src/resources/extensions/gsd/prompts/stats.md +43 -0
- package/src/resources/extensions/gsd/prompts/surface.md +25 -0
- package/src/resources/extensions/gsd/prompts/thread.md +24 -0
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
- package/src/resources/extensions/gsd/queue-order.ts +3 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
- package/src/resources/extensions/gsd/service-tier.ts +2 -0
- package/src/resources/extensions/gsd/session-lock.ts +15 -13
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +58 -14
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +98 -26
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +36 -3
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +12 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
- package/src/resources/extensions/gsd/state.ts +57 -15
- package/src/resources/extensions/gsd/sync-lock.ts +11 -20
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +322 -1
- package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
- package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +28 -22
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +19 -2
- package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +862 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
- package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +38 -49
- package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
- package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +372 -0
- package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +343 -7
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +339 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +58 -23
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
- package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
- package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -4
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +155 -58
- package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/undo.test.ts +39 -37
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +34 -8
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +64 -8
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +4 -7
- package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +15 -1
- package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
- package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -3
- package/src/resources/extensions/gsd/tools/plan-task.ts +17 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +43 -4
- package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
- package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
- package/src/resources/extensions/gsd/undo.ts +8 -9
- package/src/resources/extensions/gsd/unit-registry.ts +27 -3
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +60 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +46 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
- package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
- package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +24 -4
- package/src/resources/extensions/gsd/worktree-command.ts +6 -6
- package/src/resources/extensions/gsd/worktree-health.ts +6 -3
- package/src/resources/extensions/gsd/worktree-manager.ts +122 -16
- package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
- package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
- package/src/resources/extensions/mcp-client/manager.ts +3 -3
- package/src/resources/extensions/search-the-web/index.ts +45 -9
- package/src/resources/extensions/search-the-web/native-search.ts +16 -4
- package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
- package/src/resources/extensions/subagent/index.ts +20 -15
- package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
- package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
- /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_ssgManifest.js +0 -0
|
@@ -45,11 +45,13 @@ import {
|
|
|
45
45
|
shouldRetryClaudeCodeToolSurfaceReadiness,
|
|
46
46
|
buildWorkflowMcpReadinessProgressMessage,
|
|
47
47
|
pushWorkflowMcpReadinessProgressEvent,
|
|
48
|
+
resolveWorkflowMcpPreflightServerConfig,
|
|
48
49
|
} from "../stream-adapter.ts";
|
|
49
50
|
import { CLAUDE_CODE_MODELS } from "../models.ts";
|
|
50
51
|
import type { AssistantMessage, Context, Message } from "@gsd/pi-ai";
|
|
51
52
|
import type { SDKUserMessage } from "../sdk-types.ts";
|
|
52
53
|
import { _setAutoActiveForTest } from "../../gsd/auto.ts";
|
|
54
|
+
import { autoSession } from "../../gsd/auto-runtime-state.ts";
|
|
53
55
|
import { getInFlightToolCount, hasInteractiveToolInFlight, clearInFlightTools, isInteractiveElicitationInFlight } from "../../gsd/auto-tool-tracking.ts";
|
|
54
56
|
import { clearMcpConfigCache } from "../../mcp-client/manager.ts";
|
|
55
57
|
import { UNIT_TOOL_CONTRACTS } from "../../gsd/unit-tool-contracts.ts";
|
|
@@ -405,6 +407,10 @@ describe("stream-adapter — image prompt forwarding (#4183)", () => {
|
|
|
405
407
|
systemPrompt: "UNIT: Run UAT",
|
|
406
408
|
messages: [{ role: "user", content: "Run UAT." } as Message],
|
|
407
409
|
};
|
|
410
|
+
// The test requires a resolved GSD phase so the readiness gate fires.
|
|
411
|
+
// Auto-mode with a currentUnit provides the authoritative phase signal.
|
|
412
|
+
_setAutoActiveForTest(true);
|
|
413
|
+
autoSession.currentUnit = { type: "run-uat", id: "M001/S001", startedAt: 0, workspaceRoot: cwd } as never;
|
|
408
414
|
try {
|
|
409
415
|
const stream = streamViaClaudeCode(
|
|
410
416
|
{ id: "claude-sonnet-4-6" } as any,
|
|
@@ -473,6 +479,8 @@ describe("stream-adapter — image prompt forwarding (#4183)", () => {
|
|
|
473
479
|
assert.equal(queryCalls, 2);
|
|
474
480
|
assert.deepEqual(message.content, [{ type: "text", text: "fresh retry result" }]);
|
|
475
481
|
} finally {
|
|
482
|
+
autoSession.currentUnit = null;
|
|
483
|
+
_setAutoActiveForTest(false);
|
|
476
484
|
rmSync(cwd, { recursive: true, force: true });
|
|
477
485
|
}
|
|
478
486
|
});
|
|
@@ -1543,18 +1551,43 @@ describe("stream-adapter — session persistence (#2859)", () => {
|
|
|
1543
1551
|
assert.equal(inferGsdPhaseFromContext(context), "plan-milestone");
|
|
1544
1552
|
});
|
|
1545
1553
|
|
|
1546
|
-
test("inferGsdPhaseFromContext recognizes
|
|
1547
|
-
const discussSlice = {
|
|
1548
|
-
messages: [{ role: "user", content: "Discuss slice S001 in milestone M001." }],
|
|
1549
|
-
} as Context;
|
|
1554
|
+
test("inferGsdPhaseFromContext recognizes the refine-slice UNIT header", () => {
|
|
1550
1555
|
const refineSlice = {
|
|
1551
1556
|
messages: [{ role: "user", content: "## UNIT: Refine Slice S001 (\"Auth\") - Milestone M001" }],
|
|
1552
1557
|
} as Context;
|
|
1553
1558
|
|
|
1554
|
-
assert.equal(inferGsdPhaseFromContext(discussSlice), "discuss-slice");
|
|
1555
1559
|
assert.equal(inferGsdPhaseFromContext(refineSlice), "refine-slice");
|
|
1556
1560
|
});
|
|
1557
1561
|
|
|
1562
|
+
test("inferGsdPhaseFromContext ignores bare phase slugs and prose (only the UNIT header counts)", () => {
|
|
1563
|
+
// Prose mentioning a phase must NOT classify the turn — this was the leak
|
|
1564
|
+
// that stripped tools the moment a user said "slice" or "UAT".
|
|
1565
|
+
const prose = {
|
|
1566
|
+
messages: [{ role: "user", content: "Can you discuss the slice S001 and then run UAT for me?" }],
|
|
1567
|
+
} as Context;
|
|
1568
|
+
const bareSlug = {
|
|
1569
|
+
messages: [{ role: "user", content: "I edited e2e/m039-s05-comparison-legibility.spec.ts (plan-slice, run-uat)" }],
|
|
1570
|
+
} as Context;
|
|
1571
|
+
|
|
1572
|
+
assert.equal(inferGsdPhaseFromContext(prose), undefined);
|
|
1573
|
+
assert.equal(inferGsdPhaseFromContext(bareSlug), undefined);
|
|
1574
|
+
});
|
|
1575
|
+
|
|
1576
|
+
test("inferGsdPhaseFromContext does not match a UNIT header buried in scrollback", () => {
|
|
1577
|
+
// A UNIT header from a prior turn (e.g. a SUMMARY the agent read) must not
|
|
1578
|
+
// re-classify later ad-hoc turns. Only the system prompt + latest user
|
|
1579
|
+
// message are scanned.
|
|
1580
|
+
const context = {
|
|
1581
|
+
messages: [
|
|
1582
|
+
{ role: "user", content: "## UNIT: Run UAT — M001/S001" },
|
|
1583
|
+
{ role: "assistant", content: "Done." },
|
|
1584
|
+
{ role: "user", content: "Thanks, now what files changed?" },
|
|
1585
|
+
],
|
|
1586
|
+
} as Context;
|
|
1587
|
+
|
|
1588
|
+
assert.equal(inferGsdPhaseFromContext(context), undefined);
|
|
1589
|
+
});
|
|
1590
|
+
|
|
1558
1591
|
test("resolveGsdPhaseForSdk prefers guided unit context over prompt inference", () => {
|
|
1559
1592
|
const projectRoot = "/tmp/gsd-guided-phase-project";
|
|
1560
1593
|
clearGuidedUnitContext();
|
|
@@ -1582,12 +1615,67 @@ describe("stream-adapter — session persistence (#2859)", () => {
|
|
|
1582
1615
|
}
|
|
1583
1616
|
});
|
|
1584
1617
|
|
|
1585
|
-
test("resolveGsdPhaseForSdk
|
|
1618
|
+
test("resolveGsdPhaseForSdk returns undefined for ad-hoc turns (no guided context, auto inactive)", () => {
|
|
1619
|
+
// The core bug: an ad-hoc turn must keep the full tool surface even when
|
|
1620
|
+
// its text contains a UNIT header (e.g. pasted from a prior unit). No
|
|
1621
|
+
// guided context + auto inactive => no phase, no preflight, no stripping.
|
|
1586
1622
|
clearGuidedUnitContext();
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1623
|
+
_setAutoActiveForTest(false);
|
|
1624
|
+
try {
|
|
1625
|
+
const context = {
|
|
1626
|
+
messages: [{ role: "user", content: "## UNIT: Run UAT — M001/S001 (pasted from earlier)" }],
|
|
1627
|
+
} as Context;
|
|
1628
|
+
assert.equal(resolveGsdPhaseForSdk(context, "/tmp/unrelated-project"), undefined);
|
|
1629
|
+
} finally {
|
|
1630
|
+
_setAutoActiveForTest(false);
|
|
1631
|
+
}
|
|
1632
|
+
});
|
|
1633
|
+
|
|
1634
|
+
test("resolveGsdPhaseForSdk uses the authoritative auto currentUnit, even with no UNIT header in the prompt", () => {
|
|
1635
|
+
// gate-evaluate / validate-milestone dispatch prompts have no `UNIT:`
|
|
1636
|
+
// header, so header inference alone would drop their phase (and their
|
|
1637
|
+
// workflow-MCP preflight). The dispatched unit type is authoritative.
|
|
1638
|
+
clearGuidedUnitContext();
|
|
1639
|
+
_setAutoActiveForTest(true);
|
|
1640
|
+
autoSession.currentUnit = { type: "gate-evaluate", id: "M001/S001", startedAt: 0, workspaceRoot: "/tmp/p" } as never;
|
|
1641
|
+
try {
|
|
1642
|
+
const context = {
|
|
1643
|
+
messages: [{ role: "user", content: "Quality Gate Evaluation — Parallel Dispatch. Call gsd_save_gate_result." }],
|
|
1644
|
+
} as Context;
|
|
1645
|
+
assert.equal(resolveGsdPhaseForSdk(context, "/tmp/p"), "gate-evaluate");
|
|
1646
|
+
} finally {
|
|
1647
|
+
autoSession.currentUnit = null;
|
|
1648
|
+
_setAutoActiveForTest(false);
|
|
1649
|
+
}
|
|
1650
|
+
});
|
|
1651
|
+
|
|
1652
|
+
test("resolveGsdPhaseForSdk ignores hook/* pseudo-units from currentUnit", () => {
|
|
1653
|
+
clearGuidedUnitContext();
|
|
1654
|
+
_setAutoActiveForTest(true);
|
|
1655
|
+
autoSession.currentUnit = { type: "hook/agent-end", id: "x", startedAt: 0, workspaceRoot: "/tmp/p" } as never;
|
|
1656
|
+
try {
|
|
1657
|
+
const context = { messages: [{ role: "user", content: "no phase here" }] } as Context;
|
|
1658
|
+
assert.equal(resolveGsdPhaseForSdk(context, "/tmp/p"), undefined);
|
|
1659
|
+
} finally {
|
|
1660
|
+
autoSession.currentUnit = null;
|
|
1661
|
+
_setAutoActiveForTest(false);
|
|
1662
|
+
}
|
|
1663
|
+
});
|
|
1664
|
+
|
|
1665
|
+
test("resolveGsdPhaseForSdk infers from the UNIT header only while auto-mode is active and no currentUnit is recorded", () => {
|
|
1666
|
+
// Last-resort fallback: auto running but currentUnit unexpectedly absent.
|
|
1667
|
+
// Classifies from the `UNIT:` dispatch header only.
|
|
1668
|
+
clearGuidedUnitContext();
|
|
1669
|
+
_setAutoActiveForTest(true);
|
|
1670
|
+
autoSession.currentUnit = null;
|
|
1671
|
+
try {
|
|
1672
|
+
const context = {
|
|
1673
|
+
messages: [{ role: "user", content: "## UNIT: Run UAT — M001/S001" }],
|
|
1674
|
+
} as Context;
|
|
1675
|
+
assert.equal(resolveGsdPhaseForSdk(context, "/tmp/unrelated-project"), "run-uat");
|
|
1676
|
+
} finally {
|
|
1677
|
+
_setAutoActiveForTest(false);
|
|
1678
|
+
}
|
|
1591
1679
|
});
|
|
1592
1680
|
|
|
1593
1681
|
test("buildSdkOptions presents ask_user_questions for discuss phases", () => {
|
|
@@ -1913,6 +2001,90 @@ describe("stream-adapter — session persistence (#2859)", () => {
|
|
|
1913
2001
|
});
|
|
1914
2002
|
|
|
1915
2003
|
describe("stream-adapter — workflow MCP readiness", () => {
|
|
2004
|
+
test("resolves the workflow MCP preflight config from SDK mcpServers", () => {
|
|
2005
|
+
const workflowConfig = { command: "node", args: ["workflow-server.js"] };
|
|
2006
|
+
const browserConfig = { command: "gsd-browser" };
|
|
2007
|
+
|
|
2008
|
+
assert.equal(
|
|
2009
|
+
resolveWorkflowMcpPreflightServerConfig(
|
|
2010
|
+
{ "gsd-workflow": workflowConfig, "gsd-browser": browserConfig },
|
|
2011
|
+
"gsd-workflow",
|
|
2012
|
+
),
|
|
2013
|
+
workflowConfig,
|
|
2014
|
+
);
|
|
2015
|
+
assert.equal(resolveWorkflowMcpPreflightServerConfig({ "gsd-workflow": "invalid" }, "gsd-workflow"), undefined);
|
|
2016
|
+
assert.equal(resolveWorkflowMcpPreflightServerConfig({ "gsd-workflow": workflowConfig }, undefined), undefined);
|
|
2017
|
+
});
|
|
2018
|
+
|
|
2019
|
+
test("workflow MCP preflight uses the same inline config passed to the SDK", async () => {
|
|
2020
|
+
const projectRoot = realpathSync(mkdtempSync(join(tmpdir(), "claude-sdk-inline-preflight-")));
|
|
2021
|
+
const restore = setWorkflowMcpEnv({});
|
|
2022
|
+
let queryCalls = 0;
|
|
2023
|
+
try {
|
|
2024
|
+
const require = createRequire(import.meta.url);
|
|
2025
|
+
const mcpModuleUrl = pathToFileURL(require.resolve("@modelcontextprotocol/sdk/server/mcp.js")).href;
|
|
2026
|
+
const stdioModuleUrl = pathToFileURL(require.resolve("@modelcontextprotocol/sdk/server/stdio.js")).href;
|
|
2027
|
+
const serverPath = join(projectRoot, "fake-workflow-mcp-server.mjs");
|
|
2028
|
+
writeFileSync(
|
|
2029
|
+
serverPath,
|
|
2030
|
+
[
|
|
2031
|
+
`const { McpServer } = await import(${JSON.stringify(mcpModuleUrl)});`,
|
|
2032
|
+
`const { StdioServerTransport } = await import(${JSON.stringify(stdioModuleUrl)});`,
|
|
2033
|
+
'const server = new McpServer({ name: "fake", version: "1.0.0" }, { capabilities: { tools: {} } });',
|
|
2034
|
+
'server.tool("gsd_plan_slice", "Plan slice", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
|
|
2035
|
+
'server.tool("gsd_reassess_roadmap", "Reassess roadmap", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
|
|
2036
|
+
'await server.connect(new StdioServerTransport());',
|
|
2037
|
+
].join("\n"),
|
|
2038
|
+
"utf-8",
|
|
2039
|
+
);
|
|
2040
|
+
process.env.GSD_WORKFLOW_MCP_COMMAND = process.execPath;
|
|
2041
|
+
process.env.GSD_WORKFLOW_MCP_ARGS = JSON.stringify([serverPath]);
|
|
2042
|
+
process.env.GSD_WORKFLOW_MCP_NAME = "gsd-workflow";
|
|
2043
|
+
|
|
2044
|
+
const stream = streamViaClaudeCode(
|
|
2045
|
+
{ id: "claude-sonnet-4-6" } as any,
|
|
2046
|
+
{
|
|
2047
|
+
systemPrompt: "UNIT: Plan Slice",
|
|
2048
|
+
messages: [{ role: "user", content: "Plan the next slice." } as Message],
|
|
2049
|
+
},
|
|
2050
|
+
{
|
|
2051
|
+
cwd: projectRoot,
|
|
2052
|
+
async *_sdkQueryForTest() {
|
|
2053
|
+
queryCalls += 1;
|
|
2054
|
+
yield {
|
|
2055
|
+
type: "result",
|
|
2056
|
+
subtype: "success",
|
|
2057
|
+
uuid: "result-1",
|
|
2058
|
+
session_id: "session-1",
|
|
2059
|
+
duration_ms: 1,
|
|
2060
|
+
duration_api_ms: 1,
|
|
2061
|
+
is_error: false,
|
|
2062
|
+
num_turns: 1,
|
|
2063
|
+
result: "planned",
|
|
2064
|
+
stop_reason: "end_turn",
|
|
2065
|
+
total_cost_usd: 0,
|
|
2066
|
+
usage: {
|
|
2067
|
+
input_tokens: 0,
|
|
2068
|
+
output_tokens: 0,
|
|
2069
|
+
cache_read_input_tokens: 0,
|
|
2070
|
+
cache_creation_input_tokens: 0,
|
|
2071
|
+
},
|
|
2072
|
+
};
|
|
2073
|
+
},
|
|
2074
|
+
} as any,
|
|
2075
|
+
);
|
|
2076
|
+
|
|
2077
|
+
const message = await stream.result();
|
|
2078
|
+
|
|
2079
|
+
assert.equal(queryCalls, 1);
|
|
2080
|
+
assert.deepEqual(message.content, [{ type: "text", text: "planned" }]);
|
|
2081
|
+
} finally {
|
|
2082
|
+
restore();
|
|
2083
|
+
rmSync(projectRoot, { recursive: true, force: true });
|
|
2084
|
+
clearMcpConfigCache();
|
|
2085
|
+
}
|
|
2086
|
+
});
|
|
2087
|
+
|
|
1916
2088
|
test("emits visible progress text before workflow MCP readiness waits", () => {
|
|
1917
2089
|
const partial: AssistantMessage = {
|
|
1918
2090
|
role: "assistant",
|
|
@@ -204,6 +204,27 @@ function emitText(stream: AssistantMessageEventStream, message: AssistantMessage
|
|
|
204
204
|
stream.end(message);
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
+
function isGeminiCliDeprecatedCliOutput(text: string): boolean {
|
|
208
|
+
return (
|
|
209
|
+
/IneligibleTierError/i.test(text)
|
|
210
|
+
|| /UNSUPPORTED_CLIENT/i.test(text)
|
|
211
|
+
|| /no longer supported for Gemini Code Assist for individuals/i.test(text)
|
|
212
|
+
|| /migrate to the Antigravity suite/i.test(text)
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const GEMINI_CLI_DEPRECATION_HINT =
|
|
217
|
+
"Gemini CLI is no longer supported for individual users. Install Antigravity CLI " +
|
|
218
|
+
"(curl -fsSL https://antigravity.google/cli/install.sh | bash), run `agy` to authenticate, " +
|
|
219
|
+
"then use /login → Antigravity or restart GSD to auto-migrate.";
|
|
220
|
+
|
|
221
|
+
function formatGoogleCliError(detail: string, provider: GoogleCliProviderId): string {
|
|
222
|
+
if (provider === "google-gemini-cli" && isGeminiCliDeprecatedCliOutput(detail)) {
|
|
223
|
+
return `${detail}\n\n${GEMINI_CLI_DEPRECATION_HINT}`;
|
|
224
|
+
}
|
|
225
|
+
return detail;
|
|
226
|
+
}
|
|
227
|
+
|
|
207
228
|
function emitError(stream: AssistantMessageEventStream, model: Model<Api>, error: unknown): void {
|
|
208
229
|
const message = error instanceof Error ? error.message : String(error);
|
|
209
230
|
const output = buildAssistantMessage(model, "", "error", message);
|
|
@@ -228,7 +249,7 @@ export function streamViaGoogleCli(
|
|
|
228
249
|
|
|
229
250
|
if (result.code !== 0) {
|
|
230
251
|
const detail = (result.stderr || result.stdout || `CLI exited with code ${result.code}`).trim();
|
|
231
|
-
throw new Error(detail);
|
|
252
|
+
throw new Error(formatGoogleCliError(detail, provider));
|
|
232
253
|
}
|
|
233
254
|
|
|
234
255
|
const text = provider === "google-gemini-cli"
|
|
@@ -82,6 +82,19 @@ export interface DispatchHistoryOptions {
|
|
|
82
82
|
*/
|
|
83
83
|
resolveScopeId: () => string | null;
|
|
84
84
|
windowSize?: number;
|
|
85
|
+
/**
|
|
86
|
+
* Session-level trace_id used to scope `rehydrate()` to the CURRENT session
|
|
87
|
+
* so stale finalize-retry entries from PREVIOUS sessions don't fire
|
|
88
|
+
* detectStuck Rule 1 on the first advance of a new session — killing
|
|
89
|
+
* auto-mode before any new dispatch runs (#852). When provided, only
|
|
90
|
+
* dispatches recorded with this trace_id are returned by the DB query;
|
|
91
|
+
* a brand-new session trace_id that has never been written to unit_dispatches
|
|
92
|
+
* returns 0 rows, giving a clean stuck window on session start.
|
|
93
|
+
*
|
|
94
|
+
* The unscoped (no resolveTraceId) path is preserved for callers without a
|
|
95
|
+
* session context so existing behaviour for those paths is unchanged.
|
|
96
|
+
*/
|
|
97
|
+
resolveTraceId?: () => string | null;
|
|
85
98
|
}
|
|
86
99
|
|
|
87
100
|
/**
|
|
@@ -137,7 +150,12 @@ export function createDispatchHistory(options: DispatchHistoryOptions): Dispatch
|
|
|
137
150
|
const scopeId = options.resolveScopeId();
|
|
138
151
|
if (!scopeId) return 0;
|
|
139
152
|
try {
|
|
140
|
-
|
|
153
|
+
// Scope to the current session's trace_id when available (#852):
|
|
154
|
+
// a fresh session UUID that has never been written to unit_dispatches
|
|
155
|
+
// returns 0 rows so prior-session failures don't pre-populate the
|
|
156
|
+
// stuck window and immediately block the new session.
|
|
157
|
+
const traceId = options.resolveTraceId?.() ?? undefined;
|
|
158
|
+
const persisted = getRecentUnitKeysForProjectRoot(scopeId, windowSize, traceId);
|
|
141
159
|
if (persisted.length === 0) return 0;
|
|
142
160
|
const rebuilt: WindowEntry[] = [];
|
|
143
161
|
for (const { key } of persisted) {
|
|
@@ -175,6 +175,7 @@ function resolveCompletionStopFromOutcome(
|
|
|
175
175
|
// tolerates — same behavior as a fresh session.
|
|
176
176
|
const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
|
|
177
177
|
const MAX_CONSECUTIVE_ALREADY_ACTIVE_SKIPS = 3;
|
|
178
|
+
const MAX_CONSECUTIVE_ORCHESTRATION_SKIPS = 3;
|
|
178
179
|
const ORCHESTRATION_MISSING_REASON =
|
|
179
180
|
"Auto Orchestration Module is not wired; cannot dispatch built-in GSD Unit.";
|
|
180
181
|
|
|
@@ -186,7 +187,20 @@ function loadStuckState(s: AutoSession): { recentUnits: Array<{ key: string }>;
|
|
|
186
187
|
const scopeId = stableStuckStateScopeId(s);
|
|
187
188
|
if (!scopeId) return { recentUnits: [], stuckRecoveryAttempts: 0 };
|
|
188
189
|
try {
|
|
189
|
-
|
|
190
|
+
// Scope the stuck window to the CURRENT session (trace_id) so stale
|
|
191
|
+
// finalize-retry entries from previous sessions don't fire detectStuck
|
|
192
|
+
// Rule 1 on the first iteration — killing auto-mode before any new
|
|
193
|
+
// dispatch runs (#852). A prior session's two consecutive finalize-retry
|
|
194
|
+
// failures would otherwise permanently block every new session.
|
|
195
|
+
//
|
|
196
|
+
// s.currentTraceId is only set inside the first loop iteration (line ~443),
|
|
197
|
+
// so at this call-site it is always null for a fresh session. Return []
|
|
198
|
+
// directly in that case — no prior dispatch has occurred in this session,
|
|
199
|
+
// so the stuck window is trivially empty and the DB query is skipped.
|
|
200
|
+
const recentUnits =
|
|
201
|
+
s.currentTraceId != null
|
|
202
|
+
? getRecentUnitKeysForProjectRoot(scopeId, STUCK_WINDOW_SIZE, s.currentTraceId)
|
|
203
|
+
: [];
|
|
190
204
|
const stuckRecoveryAttempts =
|
|
191
205
|
getRuntimeKv<number>("global", scopeId, STUCK_RECOVERY_ATTEMPTS_KEY) ?? 0;
|
|
192
206
|
return { recentUnits, stuckRecoveryAttempts };
|
|
@@ -406,6 +420,8 @@ export async function autoLoop(
|
|
|
406
420
|
let consecutiveErrors = 0;
|
|
407
421
|
let consecutiveCooldowns = 0;
|
|
408
422
|
let consecutiveAlreadyActiveSkips = 0;
|
|
423
|
+
let consecutiveOrchestrationSkips = 0;
|
|
424
|
+
let lastOrchestrationSkipKey: string | null = null;
|
|
409
425
|
const recentErrorMessages: string[] = [];
|
|
410
426
|
|
|
411
427
|
while (s.active) {
|
|
@@ -925,12 +941,53 @@ export async function autoLoop(
|
|
|
925
941
|
|
|
926
942
|
if (orchestrationResult.kind === "skipped") {
|
|
927
943
|
s.pendingOrchestrationDispatch = null;
|
|
944
|
+
// Idempotent re-poll skips are benign (an active unit is still running).
|
|
945
|
+
// The orchestrator's own stuck-window detection handles the truly-stuck case.
|
|
946
|
+
// Do not count these toward the consecutive-skip streak.
|
|
947
|
+
if (orchestrationResult.reason === "idempotent advance: unit already active") {
|
|
948
|
+
emitIterationEnd({ skipped: true });
|
|
949
|
+
completeIteration();
|
|
950
|
+
finishTurn("skipped");
|
|
951
|
+
continue;
|
|
952
|
+
}
|
|
953
|
+
const skipState = orchestrationResult.stateSnapshot;
|
|
954
|
+
const skipKey = [
|
|
955
|
+
orchestrationResult.reason,
|
|
956
|
+
skipState?.phase,
|
|
957
|
+
skipState?.activeMilestone?.id,
|
|
958
|
+
skipState?.activeSlice?.id,
|
|
959
|
+
skipState?.activeTask?.id,
|
|
960
|
+
].join("|");
|
|
961
|
+
consecutiveOrchestrationSkips = skipKey === lastOrchestrationSkipKey
|
|
962
|
+
? consecutiveOrchestrationSkips + 1
|
|
963
|
+
: 1;
|
|
964
|
+
lastOrchestrationSkipKey = skipKey;
|
|
965
|
+
if (consecutiveOrchestrationSkips >= MAX_CONSECUTIVE_ORCHESTRATION_SKIPS) {
|
|
966
|
+
const msg = `Orchestration skipped ${consecutiveOrchestrationSkips} consecutive attempts without progress. Pausing auto-mode for manual recovery.`;
|
|
967
|
+
ctx.ui.notify(msg, "error");
|
|
968
|
+
await deps.pauseAuto(ctx, pi, {
|
|
969
|
+
message: msg,
|
|
970
|
+
category: "unknown",
|
|
971
|
+
}, {
|
|
972
|
+
expectedCurrentUnit: null,
|
|
973
|
+
});
|
|
974
|
+
finishTurn("paused", "manual-attention", orchestrationResult.reason ?? "orchestration-skipped");
|
|
975
|
+
finishIncompleteIteration({
|
|
976
|
+
status: "paused",
|
|
977
|
+
reason: orchestrationResult.reason ?? "orchestration-skipped",
|
|
978
|
+
failureClass: "manual-attention",
|
|
979
|
+
});
|
|
980
|
+
break;
|
|
981
|
+
}
|
|
928
982
|
emitIterationEnd({ skipped: true });
|
|
929
983
|
completeIteration();
|
|
930
984
|
finishTurn("skipped");
|
|
931
985
|
continue;
|
|
932
986
|
}
|
|
933
987
|
|
|
988
|
+
consecutiveOrchestrationSkips = 0;
|
|
989
|
+
lastOrchestrationSkipKey = null;
|
|
990
|
+
|
|
934
991
|
if (orchestrationResult.kind === "paused") {
|
|
935
992
|
s.pendingOrchestrationDispatch = null;
|
|
936
993
|
finishIncompleteIteration({
|
|
@@ -1331,7 +1388,17 @@ export async function autoLoop(
|
|
|
1331
1388
|
finalizeResult.action === "break"
|
|
1332
1389
|
? { action: "break", reason: finalizeResult.reason }
|
|
1333
1390
|
: finalizeResult.action === "continue"
|
|
1334
|
-
? {
|
|
1391
|
+
? {
|
|
1392
|
+
action: "continue",
|
|
1393
|
+
// Surface the specific verification failure (e.g. "roadmap has
|
|
1394
|
+
// zero slices") in the ledger/stuck-loop reason instead of the
|
|
1395
|
+
// opaque bare "finalize-retry" token. The retry paths in
|
|
1396
|
+
// runFinalize set s.pendingVerificationRetry.failureContext
|
|
1397
|
+
// from describeArtifactVerificationFailure before returning
|
|
1398
|
+
// continue; it is cleared on the next dispatch, so reading it
|
|
1399
|
+
// here captures the reason for THIS finalize (#852 follow-up).
|
|
1400
|
+
failureDetail: s.pendingVerificationRetry?.failureContext,
|
|
1401
|
+
}
|
|
1335
1402
|
: { action: "next" },
|
|
1336
1403
|
);
|
|
1337
1404
|
if (finalizeDecision.action === "stop") {
|
|
@@ -38,7 +38,7 @@ import { checkResourcesStale, autoWorktreeBranch, mergeMilestoneToMain } from ".
|
|
|
38
38
|
import { getSessionLockStatus } from "../session-lock.js";
|
|
39
39
|
import { resolveUokFlags } from "../uok/flags.js";
|
|
40
40
|
import { emitJournalEvent as _emitJournalEvent } from "../journal.js";
|
|
41
|
-
import { loadEffectiveGSDPreferences, getIsolationMode, resolveEffectiveUnitIsolationMode } from "../preferences.js";
|
|
41
|
+
import { loadEffectiveGSDPreferences, loadEffectiveGSDPreferencesWithRegistry, getIsolationMode, resolveEffectiveUnitIsolationMode, resolveProfileAnchorProvider } from "../preferences.js";
|
|
42
42
|
import {
|
|
43
43
|
detectWorktreeName,
|
|
44
44
|
getMainBranch,
|
|
@@ -80,6 +80,17 @@ function now(): number {
|
|
|
80
80
|
return Date.now();
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
/**
|
|
84
|
+
* Optional override for the post-settlement markdown projection rebuild
|
|
85
|
+
* (mergePendingCompleteMilestone). Production leaves this null so the real
|
|
86
|
+
* rebuild runs; tests inject a throwing function to deterministically exercise
|
|
87
|
+
* the best-effort failure path (orchestrator.ts:637), which is otherwise only
|
|
88
|
+
* reachable by driving advance() through a full merge-pending milestone
|
|
89
|
+
* settlement and then contriving a projection-rebuild fault.
|
|
90
|
+
* @internal
|
|
91
|
+
*/
|
|
92
|
+
let _projectionRebuildFn: ((projectRoot: string) => Promise<void>) | null = null;
|
|
93
|
+
|
|
83
94
|
function noRemainingUnitsOutcome(stateSnapshot: GSDState): AutoTerminalOutcome {
|
|
84
95
|
if (stateSnapshot.phase === "complete") {
|
|
85
96
|
return {
|
|
@@ -196,7 +207,14 @@ export async function decideOrchestratorDispatch(
|
|
|
196
207
|
const active = state.activeMilestone;
|
|
197
208
|
const activeSession = input.session ?? session;
|
|
198
209
|
const activeDispatchBasePath = activeSession?.basePath || dispatchBasePath;
|
|
199
|
-
const prefs =
|
|
210
|
+
const prefs = loadEffectiveGSDPreferencesWithRegistry(
|
|
211
|
+
ctx.modelRegistry,
|
|
212
|
+
activeDispatchBasePath,
|
|
213
|
+
resolveProfileAnchorProvider(ctx.model?.provider, session?.autoModeStartModel?.provider),
|
|
214
|
+
activeSession?.autoModeStartModel
|
|
215
|
+
? `${activeSession.autoModeStartModel.provider}/${activeSession.autoModeStartModel.id}`
|
|
216
|
+
: undefined,
|
|
217
|
+
)?.preferences;
|
|
200
218
|
if (!active) {
|
|
201
219
|
if (state.phase !== "pre-planning") return null;
|
|
202
220
|
if (!hasPendingDeepStage(prefs, activeDispatchBasePath)) {
|
|
@@ -509,7 +527,14 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
509
527
|
milestoneId?: string;
|
|
510
528
|
}): Promise<void> {
|
|
511
529
|
const activeBasePath = this.getLiveDispatchBasePath();
|
|
512
|
-
const prefs =
|
|
530
|
+
const prefs = loadEffectiveGSDPreferencesWithRegistry(
|
|
531
|
+
this.ctx.modelRegistry,
|
|
532
|
+
activeBasePath,
|
|
533
|
+
resolveProfileAnchorProvider(this.ctx.model?.provider, this.s.autoModeStartModel?.provider),
|
|
534
|
+
this.s.autoModeStartModel
|
|
535
|
+
? `${this.s.autoModeStartModel.provider}/${this.s.autoModeStartModel.id}`
|
|
536
|
+
: undefined,
|
|
537
|
+
)?.preferences;
|
|
513
538
|
const uokFlags = resolveUokFlags(prefs);
|
|
514
539
|
if (!uokFlags.gates) return;
|
|
515
540
|
const milestoneId = input.milestoneId ?? this.s.currentMilestoneId ?? undefined;
|
|
@@ -631,8 +656,15 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
631
656
|
this.s.milestoneSettlement = { ok: true, reason: "settled" };
|
|
632
657
|
try {
|
|
633
658
|
const projectRoot = this.s.originalBasePath || this.s.canonicalProjectRoot || this.runtimeBasePath;
|
|
634
|
-
|
|
635
|
-
|
|
659
|
+
// Test seam: when _projectionRebuildFn is injected, route the rebuild
|
|
660
|
+
// through it so the best-effort failure path (:637) is deterministically
|
|
661
|
+
// reachable. Production leaves it null → real rebuildMarkdownProjectionsFromDb.
|
|
662
|
+
if (_projectionRebuildFn) {
|
|
663
|
+
await _projectionRebuildFn(projectRoot);
|
|
664
|
+
} else {
|
|
665
|
+
const { rebuildMarkdownProjectionsFromDb } = await import("../commands-maintenance.js");
|
|
666
|
+
await rebuildMarkdownProjectionsFromDb(projectRoot);
|
|
667
|
+
}
|
|
636
668
|
} catch (err) {
|
|
637
669
|
logWarning(
|
|
638
670
|
"engine",
|
|
@@ -886,12 +918,17 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
886
918
|
public async start(_sessionContext: AutoSessionContext): Promise<AutoAdvanceResult> {
|
|
887
919
|
this.lastAdvanceKey = null;
|
|
888
920
|
this.lastFinalizedUnitKey = null;
|
|
889
|
-
// #
|
|
890
|
-
//
|
|
891
|
-
//
|
|
892
|
-
//
|
|
921
|
+
// #852: a fresh user-triggered session must start with a clean stuck window.
|
|
922
|
+
// Cross-session rehydration at start() was removed because it caused false
|
|
923
|
+
// stuck-loop verdicts when prior sessions left consecutive finalize-retry
|
|
924
|
+
// entries in unit_dispatches — the new session would be killed before its
|
|
925
|
+
// first dispatch ran. Within-session stuck detection (accumulated through
|
|
926
|
+
// recordDispatch() calls during advance()) remains fully active and catches
|
|
927
|
+
// genuine stuck patterns after STUCK_WINDOW_SIZE dispatches.
|
|
928
|
+
//
|
|
929
|
+
// resume() retains cross-session rehydration: an interrupted session resuming
|
|
930
|
+
// after a crash should see the dispatch history it had been accumulating.
|
|
893
931
|
this.dispatchHistory.clearOnRecovery();
|
|
894
|
-
this.dispatchHistory.rehydrate();
|
|
895
932
|
this.lastStuckRecoveryKey = null;
|
|
896
933
|
this.lastDerivedPhase = null;
|
|
897
934
|
this.status.phase = "running";
|
|
@@ -1425,3 +1462,19 @@ export function resolveLiveOrchestratorBasePath(input: {
|
|
|
1425
1462
|
export function createAutoOrchestrator(context: OrchestratorContext): AutoOrchestrationModule {
|
|
1426
1463
|
return new AutoOrchestrator(context);
|
|
1427
1464
|
}
|
|
1465
|
+
|
|
1466
|
+
/**
|
|
1467
|
+
* Inject an override for the post-settlement markdown projection rebuild,
|
|
1468
|
+
* returning a function that restores the default (real rebuild) behavior. Used
|
|
1469
|
+
* by tests to deterministically exercise the best-effort rebuild-failure path
|
|
1470
|
+
* (orchestrator.ts:637) — otherwise only reachable by driving advance() through
|
|
1471
|
+
* a full merge-pending milestone settlement and then contriving a projection
|
|
1472
|
+
* fault. No production caller.
|
|
1473
|
+
* @internal
|
|
1474
|
+
*/
|
|
1475
|
+
export function _setProjectionRebuildFnForTests(
|
|
1476
|
+
fn: ((projectRoot: string) => Promise<void>) | null,
|
|
1477
|
+
): () => void {
|
|
1478
|
+
_projectionRebuildFn = fn;
|
|
1479
|
+
return () => { _projectionRebuildFn = null; };
|
|
1480
|
+
}
|
|
@@ -38,13 +38,19 @@ import {
|
|
|
38
38
|
} from "./closeout.js";
|
|
39
39
|
import type { IterationContext, LoopState, PhaseResult, PreDispatchData } from "./types.js";
|
|
40
40
|
|
|
41
|
-
type BlockerKind = "needs-remediation-dead-end" | "other";
|
|
41
|
+
type BlockerKind = "needs-remediation-dead-end" | "completed-milestone-reopened" | "other";
|
|
42
42
|
|
|
43
43
|
function classifyBlocker(blocker: string): BlockerKind {
|
|
44
44
|
const normalized = blocker.toLowerCase();
|
|
45
45
|
if (normalized.includes("needs-remediation") && normalized.includes("all slices are complete")) {
|
|
46
46
|
return "needs-remediation-dead-end";
|
|
47
47
|
}
|
|
48
|
+
if (
|
|
49
|
+
normalized.includes("completed closeout dispatch history") ||
|
|
50
|
+
normalized.includes("completed complete-milestone dispatch history")
|
|
51
|
+
) {
|
|
52
|
+
return "completed-milestone-reopened";
|
|
53
|
+
}
|
|
48
54
|
return "other";
|
|
49
55
|
}
|
|
50
56
|
|
|
@@ -67,6 +73,12 @@ function formatBlockedResumeMessage(blockers: string[]): string {
|
|
|
67
73
|
if (hasNeedsRemediationDeadEnd) {
|
|
68
74
|
return "Blocked: milestone validation requires remediation but all slices are complete. Run /gsd dispatch reassess to add remediation slices, then /gsd auto to continue.";
|
|
69
75
|
}
|
|
76
|
+
const completedMilestoneReopened = classifiedBlockers.find(
|
|
77
|
+
(classifiedBlocker) => classifiedBlocker.kind === "completed-milestone-reopened",
|
|
78
|
+
);
|
|
79
|
+
if (completedMilestoneReopened) {
|
|
80
|
+
return completedMilestoneReopened.blocker;
|
|
81
|
+
}
|
|
70
82
|
return `Blocked: ${classifiedBlockers.map((classifiedBlocker) => classifiedBlocker.blocker).join(", ")}. Fix and run /gsd auto to resume.`;
|
|
71
83
|
}
|
|
72
84
|
|
|
@@ -34,7 +34,7 @@ export type EngineDispatchDecision =
|
|
|
34
34
|
|
|
35
35
|
export type FinalizeInput =
|
|
36
36
|
| { action: "break"; reason?: string }
|
|
37
|
-
| { action: "continue" }
|
|
37
|
+
| { action: "continue"; failureDetail?: string }
|
|
38
38
|
| { action: "next" };
|
|
39
39
|
|
|
40
40
|
export type FinalizeDecision =
|
|
@@ -46,7 +46,14 @@ export type FinalizeDecision =
|
|
|
46
46
|
}
|
|
47
47
|
| {
|
|
48
48
|
action: "retry";
|
|
49
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Stable `"finalize-retry"` prefix plus, when available, the specific
|
|
51
|
+
* verification failure (e.g. `finalize-retry: roadmap has zero slices`).
|
|
52
|
+
* The prefix keeps legacy ledger filters matching; the suffix makes a
|
|
53
|
+
* stuck-loop kill message actionable instead of the opaque bare token
|
|
54
|
+
* that forced a full forensics dive to diagnose (#852 follow-up).
|
|
55
|
+
*/
|
|
56
|
+
ledgerErrorSummary: string;
|
|
50
57
|
}
|
|
51
58
|
| { action: "complete" }
|
|
52
59
|
| { action: "complete-and-break" };
|
|
@@ -295,6 +302,16 @@ function isCompleteAndBreakReason(
|
|
|
295
302
|
);
|
|
296
303
|
}
|
|
297
304
|
|
|
305
|
+
/** Strip per-attempt counter suffixes so detect-stuck Rule 1 can match repeats. */
|
|
306
|
+
const FAILURE_DETAIL_ATTEMPT_SUFFIX_RE = /\s*\(attempt\s+\d+(?:\/\d+)?\)\.?$/i;
|
|
307
|
+
|
|
308
|
+
function failureDetailForLedger(detail: string | undefined): string | undefined {
|
|
309
|
+
const trimmed = detail?.trim();
|
|
310
|
+
if (!trimmed) return undefined;
|
|
311
|
+
const normalized = trimmed.replace(FAILURE_DETAIL_ATTEMPT_SUFFIX_RE, "").trim();
|
|
312
|
+
return normalized || undefined;
|
|
313
|
+
}
|
|
314
|
+
|
|
298
315
|
export function decideFinalizeResult(input: FinalizeInput): FinalizeDecision {
|
|
299
316
|
if (input.action === "break") {
|
|
300
317
|
const reason = input.reason ?? "unknown";
|
|
@@ -310,9 +327,14 @@ export function decideFinalizeResult(input: FinalizeInput): FinalizeDecision {
|
|
|
310
327
|
}
|
|
311
328
|
|
|
312
329
|
if (input.action === "continue") {
|
|
330
|
+
// Carry the specific verification failure (e.g. "roadmap has zero slices",
|
|
331
|
+
// "15-SUMMARY.md was not found on disk") into the ledger summary so the
|
|
332
|
+
// stuck-loop kill message is actionable. The `finalize-retry` prefix is
|
|
333
|
+
// preserved so legacy ledger filters and dashboards still match (#852).
|
|
334
|
+
const detail = failureDetailForLedger(input.failureDetail);
|
|
313
335
|
return {
|
|
314
336
|
action: "retry",
|
|
315
|
-
ledgerErrorSummary: "finalize-retry",
|
|
337
|
+
ledgerErrorSummary: detail ? `finalize-retry: ${detail}` : "finalize-retry",
|
|
316
338
|
};
|
|
317
339
|
}
|
|
318
340
|
|