@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
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Shared helpers for GsdStatusWidget progress-strip extension tests.
|
|
3
|
+
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import stripAnsi from "strip-ansi";
|
|
6
|
+
import { visibleWidth } from "@gsd/pi-tui";
|
|
7
|
+
import type { GsdProgressState } from "@gsd/pi-coding-agent/core/extensions/index.js";
|
|
8
|
+
import { initTheme } from "@gsd/pi-coding-agent/theme/theme.js";
|
|
9
|
+
import { GsdStatusWidget } from "../../../../../packages/gsd-agent-modes/src/modes/interactive/components/gsd-status-widget.ts";
|
|
10
|
+
|
|
11
|
+
export type ProgressStripUiMock = {
|
|
12
|
+
widgetCalls: Array<[string, unknown]>;
|
|
13
|
+
getProgressState: () => GsdProgressState | undefined;
|
|
14
|
+
disposeProgress: () => void;
|
|
15
|
+
ui: {
|
|
16
|
+
setWidget(key: string, factory: unknown): void;
|
|
17
|
+
setHeader(): void;
|
|
18
|
+
setStatus(key: string, value?: string): void;
|
|
19
|
+
setGsdProgress(state: GsdProgressState | undefined, dispose?: () => void): void;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export function createProgressStripUiMock(): ProgressStripUiMock {
|
|
24
|
+
const widgetCalls: Array<[string, unknown]> = [];
|
|
25
|
+
let progressState: GsdProgressState | undefined;
|
|
26
|
+
let progressDispose: (() => void) | undefined;
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
widgetCalls,
|
|
30
|
+
getProgressState: () => progressState,
|
|
31
|
+
disposeProgress: () => progressDispose?.(),
|
|
32
|
+
ui: {
|
|
33
|
+
setWidget(key: string, factory: unknown) {
|
|
34
|
+
widgetCalls.push([key, factory]);
|
|
35
|
+
},
|
|
36
|
+
setHeader() {},
|
|
37
|
+
setStatus() {},
|
|
38
|
+
setGsdProgress(state: GsdProgressState | undefined, dispose?: () => void) {
|
|
39
|
+
progressState = state;
|
|
40
|
+
if (dispose) progressDispose = dispose;
|
|
41
|
+
widgetCalls.push(["setGsdProgress", state]);
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function renderProgressStripLines(
|
|
48
|
+
progress: GsdProgressState,
|
|
49
|
+
width: number,
|
|
50
|
+
options?: { activeToolCount?: number; manuallyExpanded?: boolean; cwd?: string },
|
|
51
|
+
): string[] {
|
|
52
|
+
initTheme("dark", false);
|
|
53
|
+
const widget = new GsdStatusWidget(() => ({
|
|
54
|
+
override: "auto",
|
|
55
|
+
activeToolCount: options?.activeToolCount ?? 1,
|
|
56
|
+
cwd: options?.cwd ?? progress.path ?? "/tmp",
|
|
57
|
+
manuallyExpanded: options?.manuallyExpanded ?? progress.widgetMode !== "min",
|
|
58
|
+
gsdProgress: progress,
|
|
59
|
+
}));
|
|
60
|
+
return widget.render(width);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function renderProgressStrip(
|
|
64
|
+
progress: GsdProgressState,
|
|
65
|
+
width: number,
|
|
66
|
+
options?: { activeToolCount?: number; manuallyExpanded?: boolean; cwd?: string },
|
|
67
|
+
): string {
|
|
68
|
+
return renderProgressStripLines(progress, width, options).map((line) => stripAnsi(line)).join("\n");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function assertLinesFit(lines: string[], width: number): void {
|
|
72
|
+
for (const line of lines) {
|
|
73
|
+
const plain = stripAnsi(line);
|
|
74
|
+
assert.ok(
|
|
75
|
+
visibleWidth(plain) <= width,
|
|
76
|
+
`line exceeds width ${width}: "${plain}" (${visibleWidth(plain)})`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -620,6 +620,8 @@ describe("prompt-budget: reactive-execute builder", () => {
|
|
|
620
620
|
|
|
621
621
|
assert.match(prompt, /\[\.\.\.truncated/);
|
|
622
622
|
assert.ok(prompt.length < hugeSummary.length * 2, "reactive prompt should not include full dependency summaries");
|
|
623
|
+
assert.match(prompt, /Your working directory is/);
|
|
624
|
+
assert.doesNotMatch(prompt, /Work only in the repository root/i);
|
|
623
625
|
} finally {
|
|
624
626
|
cleanup(base);
|
|
625
627
|
}
|
|
@@ -119,6 +119,7 @@ test("reactive-execute prompt keeps task summaries with subagents and avoids bat
|
|
|
119
119
|
const prompt = readPrompt("reactive-execute");
|
|
120
120
|
assert.match(prompt, /subagent-written summary as authoritative/i);
|
|
121
121
|
assert.match(prompt, /Do NOT create a batch commit/i);
|
|
122
|
+
assert.match(prompt, /cwd:\s*"\{\{workingDirectory\}\}"/);
|
|
122
123
|
assert.doesNotMatch(prompt, /\*\*Write task summaries\*\*/i);
|
|
123
124
|
assert.doesNotMatch(prompt, /\*\*Commit\*\* all changes/i);
|
|
124
125
|
});
|
|
@@ -466,6 +467,21 @@ test("complete-slice prompt keeps source fixes in execution units", () => {
|
|
|
466
467
|
assert.doesNotMatch(prompt, /Fix failures before marking done/i);
|
|
467
468
|
});
|
|
468
469
|
|
|
470
|
+
test("complete-slice prompt terminates after reopen or replan handoff", () => {
|
|
471
|
+
const prompt = readPrompt("complete-slice");
|
|
472
|
+
assert.match(prompt, /exactly one terminal workflow tool/i);
|
|
473
|
+
assert.match(prompt, /A text-only stop, even one mentioning a tool, is invalid/i);
|
|
474
|
+
assert.match(prompt, /After any successful failure-handoff tool call, the unit is done/i);
|
|
475
|
+
assert.match(prompt, /`gsd_task_reopen` or `gsd_replan_slice` call is the handoff signal/i);
|
|
476
|
+
assert.match(prompt, /Never call `gsd_replan_slice` after calling `gsd_task_reopen`/i);
|
|
477
|
+
assert.match(prompt, /reopened tasks are pending/i);
|
|
478
|
+
assert.match(prompt, /Do not call `gsd_plan_slice`/i);
|
|
479
|
+
assert.match(prompt, /Do not read source code, run `gsd_exec`, invoke subagents/i);
|
|
480
|
+
assert.match(prompt, /Terminal reopen sequence/i);
|
|
481
|
+
assert.match(prompt, /Terminal replan sequence/i);
|
|
482
|
+
assert.match(prompt, /Never finish this unit with plain text only/i);
|
|
483
|
+
});
|
|
484
|
+
|
|
469
485
|
test("complete-slice prompt binds all file operations to workingDirectory", () => {
|
|
470
486
|
const prompt = readPrompt("complete-slice");
|
|
471
487
|
assert.match(prompt, /Your working directory is `\{\{workingDirectory\}\}`/);
|
|
@@ -56,6 +56,21 @@ test("unitTypeToPrefsPhaseKey maps research units", () => {
|
|
|
56
56
|
assert.equal(unitTypeToPrefsPhaseKey("plan-slice"), "planning");
|
|
57
57
|
});
|
|
58
58
|
|
|
59
|
+
test("resolveProviderErrorGuidance suggests Antigravity migration for deprecated Gemini CLI", () => {
|
|
60
|
+
const guidance = resolveProviderErrorGuidance({
|
|
61
|
+
errorMsg:
|
|
62
|
+
"IneligibleTierError: This client is no longer supported for Gemini Code Assist for individuals. To continue using Gemini, please migrate to the Antigravity suite of products: https://antigravity.google.",
|
|
63
|
+
provider: "google-gemini-cli",
|
|
64
|
+
modelId: "gemini-2.5-pro",
|
|
65
|
+
unitType: "execute-task",
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
assert.match(guidance.summary, /Antigravity CLI/);
|
|
69
|
+
assert.ok(guidance.steps.some((step) => step.includes("antigravity.google/cli/install.sh")));
|
|
70
|
+
assert.ok(guidance.steps.some((step) => step.includes("/login")));
|
|
71
|
+
assert.ok(guidance.steps.some((step) => step.includes("/gsd next")));
|
|
72
|
+
});
|
|
73
|
+
|
|
59
74
|
test("resolveProviderErrorGuidance suggests gemini-3-flash for antigravity pro-high", () => {
|
|
60
75
|
const guidance = resolveProviderErrorGuidance({
|
|
61
76
|
errorMsg: "Cloud Code Assist API error (400): Request contains an invalid argument.",
|
|
@@ -7,16 +7,21 @@
|
|
|
7
7
|
|
|
8
8
|
import test from "node:test";
|
|
9
9
|
import assert from "node:assert/strict";
|
|
10
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
10
13
|
import { classifyError, isTransient, isTransientNetworkError } from "../error-classifier.ts";
|
|
11
14
|
import { pauseAutoForProviderError } from "../provider-error-pause.ts";
|
|
12
15
|
import { resumeAutoAfterProviderDelay } from "../bootstrap/provider-error-resume.ts";
|
|
13
16
|
import {
|
|
14
17
|
MAX_TRANSIENT_AUTO_RESUMES,
|
|
18
|
+
handleAgentEnd,
|
|
15
19
|
isTerminalDeletedWorktreeProviderError,
|
|
16
20
|
resetTransientRetryState,
|
|
17
21
|
shouldDeferTransientErrorToCoreRetry,
|
|
18
22
|
suppressTerminalDeletedWorktreeMessageEnd,
|
|
19
23
|
} from "../bootstrap/agent-end-recovery.ts";
|
|
24
|
+
import { blockModelUntil, clearTemporaryModelBlocksForTest } from "../blocked-models.ts";
|
|
20
25
|
import { _buildCancelledUnitStopReason } from "../auto/phase-helpers.ts";
|
|
21
26
|
import { _classifyZeroToolProviderMessageForTest } from "../auto/unit-phase.ts";
|
|
22
27
|
import { autoSession } from "../auto-runtime-state.ts";
|
|
@@ -483,6 +488,108 @@ test("pauseAutoForProviderError falls back to indefinite pause when not rate lim
|
|
|
483
488
|
]);
|
|
484
489
|
});
|
|
485
490
|
|
|
491
|
+
test("rate-limit agent_end walks past unavailable fallback models before pausing (#716 follow-up)", async () => {
|
|
492
|
+
const originalCwd = process.cwd();
|
|
493
|
+
const originalSetTimeout = globalThis.setTimeout;
|
|
494
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-rate-limit-agent-end-"));
|
|
495
|
+
const notifications: Array<{ message: string; level?: string }> = [];
|
|
496
|
+
const setModelCalls: string[] = [];
|
|
497
|
+
const sendMessageCalls: unknown[][] = [];
|
|
498
|
+
const timers: Array<{ delay: number }> = [];
|
|
499
|
+
|
|
500
|
+
globalThis.setTimeout = ((_fn: (...args: unknown[]) => void, delay?: number) => {
|
|
501
|
+
if ((delay ?? 0) === 0) {
|
|
502
|
+
// delay-0 is a macrotask deferral (scheduleFallbackContinuation): invoke
|
|
503
|
+
// immediately in tests so sendMessage assertions can fire synchronously.
|
|
504
|
+
_fn();
|
|
505
|
+
} else {
|
|
506
|
+
// delay>0 is a pause/backoff timer: capture without firing so the test
|
|
507
|
+
// stays synchronous and can assert no pause was scheduled.
|
|
508
|
+
timers.push({ delay: delay ?? 0 });
|
|
509
|
+
}
|
|
510
|
+
return 0 as unknown as ReturnType<typeof setTimeout>;
|
|
511
|
+
}) as typeof setTimeout;
|
|
512
|
+
|
|
513
|
+
try {
|
|
514
|
+
clearTemporaryModelBlocksForTest();
|
|
515
|
+
autoSession.reset();
|
|
516
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
517
|
+
writeFileSync(
|
|
518
|
+
join(base, ".gsd", "PREFERENCES.md"),
|
|
519
|
+
[
|
|
520
|
+
"---",
|
|
521
|
+
"models:",
|
|
522
|
+
" execution:",
|
|
523
|
+
" model: gpt-5.5",
|
|
524
|
+
" provider: openai-codex",
|
|
525
|
+
" fallbacks:",
|
|
526
|
+
" - anthropic/claude-sonnet-4-6",
|
|
527
|
+
" - google-gemini-cli/gemini-2.5-pro",
|
|
528
|
+
"---",
|
|
529
|
+
].join("\n"),
|
|
530
|
+
"utf-8",
|
|
531
|
+
);
|
|
532
|
+
process.chdir(base);
|
|
533
|
+
|
|
534
|
+
autoSession.active = true;
|
|
535
|
+
autoSession.basePath = base;
|
|
536
|
+
autoSession.currentUnit = { type: "execute-task", id: "M001/S01/T01", startedAt: Date.now() };
|
|
537
|
+
autoSession.autoModeStartModel = { provider: "openai-codex", id: "gpt-5.5" };
|
|
538
|
+
|
|
539
|
+
blockModelUntil(base, "anthropic", "claude-sonnet-4-6", Date.now() + 60_000, "fallback also limited");
|
|
540
|
+
|
|
541
|
+
const availableModels = [
|
|
542
|
+
{ id: "gpt-5.5", provider: "openai-codex", api: "responses" },
|
|
543
|
+
{ id: "claude-sonnet-4-6", provider: "anthropic", api: "anthropic-messages" },
|
|
544
|
+
{ id: "gemini-2.5-pro", provider: "google-gemini-cli", api: "google-genai" },
|
|
545
|
+
];
|
|
546
|
+
const ctx = {
|
|
547
|
+
model: availableModels[0],
|
|
548
|
+
modelRegistry: { getAvailable: () => availableModels },
|
|
549
|
+
ui: {
|
|
550
|
+
notify(message: string, level?: "info" | "warning" | "error" | "success") {
|
|
551
|
+
notifications.push({ message, level });
|
|
552
|
+
},
|
|
553
|
+
setStatus: () => {},
|
|
554
|
+
setWidget: () => {},
|
|
555
|
+
setWorkingMessage: () => {},
|
|
556
|
+
},
|
|
557
|
+
} as any;
|
|
558
|
+
const pi = {
|
|
559
|
+
setModel: async (model: { provider: string; id: string }) => {
|
|
560
|
+
setModelCalls.push(`${model.provider}/${model.id}`);
|
|
561
|
+
return true;
|
|
562
|
+
},
|
|
563
|
+
sendMessage: (...args: unknown[]) => {
|
|
564
|
+
sendMessageCalls.push(args);
|
|
565
|
+
},
|
|
566
|
+
} as any;
|
|
567
|
+
|
|
568
|
+
await handleAgentEnd(pi, {
|
|
569
|
+
messages: [{
|
|
570
|
+
role: "assistant",
|
|
571
|
+
stopReason: "error",
|
|
572
|
+
errorMessage: "You've hit your session limit · resets 7:20 pm (Europe/Rome)",
|
|
573
|
+
}],
|
|
574
|
+
} as any, ctx);
|
|
575
|
+
|
|
576
|
+
assert.deepEqual(setModelCalls, ["google-gemini-cli/gemini-2.5-pro"]);
|
|
577
|
+
assert.equal(sendMessageCalls.length, 1, "fallback recovery must trigger a deferred continuation turn");
|
|
578
|
+
assert.deepEqual(sendMessageCalls[0][1], { triggerTurn: true }, "continuation must use plain triggerTurn — no deliverAs:steer — to start a fresh turn, not steer the dying one");
|
|
579
|
+
assert.equal(timers.length, 0, "must not schedule a delay-backoff pause timer when a fallback is available");
|
|
580
|
+
assert.ok(
|
|
581
|
+
notifications.some((n) => n.message.includes("google-gemini-cli/gemini-2.5-pro")),
|
|
582
|
+
"user-facing notification should name the fallback actually selected",
|
|
583
|
+
);
|
|
584
|
+
} finally {
|
|
585
|
+
globalThis.setTimeout = originalSetTimeout;
|
|
586
|
+
process.chdir(originalCwd);
|
|
587
|
+
clearTemporaryModelBlocksForTest();
|
|
588
|
+
autoSession.reset();
|
|
589
|
+
rmSync(base, { recursive: true, force: true });
|
|
590
|
+
}
|
|
591
|
+
});
|
|
592
|
+
|
|
486
593
|
test("isTerminalDeletedWorktreeProviderError matches removed auto-worktree paths only", () => {
|
|
487
594
|
assert.equal(
|
|
488
595
|
isTerminalDeletedWorktreeProviderError('Path "/Users/dev/.gsd/projects/abc123/worktrees/M005" does not exist'),
|
|
@@ -58,7 +58,14 @@ function mkPi(cap: MockCapture, opts: { sendThrows?: boolean } = {}): any {
|
|
|
58
58
|
|
|
59
59
|
function mkBase(): string {
|
|
60
60
|
const base = mkdtempSync(join(tmpdir(), "gsd-4573-"));
|
|
61
|
-
|
|
61
|
+
const mDir = join(base, ".gsd", "milestones", "M001");
|
|
62
|
+
mkdirSync(mDir, { recursive: true });
|
|
63
|
+
// Seed one content file so the dir is recognised as a content-bearing legacy
|
|
64
|
+
// milestone by dirIsContentBearingLegacyMilestone. Tests that check for
|
|
65
|
+
// "no CONTEXT/ROADMAP yet" still work because RESEARCH is not checked by
|
|
66
|
+
// maybeHandleReadyPhraseWithoutFiles; the stale-cache tests then verify that
|
|
67
|
+
// a file written to the same dir is NOT found until clearPathCache runs.
|
|
68
|
+
writeFileSync(join(mDir, "M001-RESEARCH.md"), "# M001 research\n");
|
|
62
69
|
return base;
|
|
63
70
|
}
|
|
64
71
|
|
|
@@ -181,32 +188,32 @@ describe("#4573 maybeHandleReadyPhraseWithoutFiles", () => {
|
|
|
181
188
|
|
|
182
189
|
test("stale path cache from a prior listing → fresh writes are detected (regression)", () => {
|
|
183
190
|
// Repro the live binary failure where:
|
|
184
|
-
// 1. paths.ts cached dir listings were populated
|
|
185
|
-
// (
|
|
191
|
+
// 1. paths.ts cached dir listings were populated before M001-CONTEXT.md
|
|
192
|
+
// and M001-ROADMAP.md existed (the dir had only M001-RESEARCH.md).
|
|
186
193
|
// 2. The LLM then wrote M001-CONTEXT.md and M001-ROADMAP.md via the
|
|
187
194
|
// standard Write tool — which has no awareness of paths.ts caches.
|
|
188
195
|
// 3. maybeHandleReadyPhraseWithoutFiles called resolveMilestoneFile,
|
|
189
|
-
// which read the stale
|
|
196
|
+
// which read the stale dirListCache and reported the artifacts missing,
|
|
190
197
|
// firing a false rejection nudge until MAX_READY_REJECTS aborted
|
|
191
198
|
// the auto-start with `LLM signaled "ready" 3 times without
|
|
192
199
|
// writing files`.
|
|
193
200
|
//
|
|
194
201
|
// The fix busts the path cache at the top of the validator before
|
|
195
202
|
// re-resolving. This test fails pre-fix (handled === true) because the
|
|
196
|
-
//
|
|
203
|
+
// dirListCache still holds the stale per-file listing for M001/ from
|
|
204
|
+
// step (a), so resolveFile cannot see the newly written CONTEXT/ROADMAP.
|
|
197
205
|
const base = mkBase();
|
|
198
206
|
try {
|
|
199
207
|
const mDir = join(base, ".gsd", "milestones", "M001");
|
|
200
208
|
|
|
201
|
-
// (a) Prime the
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
// empty entry list keyed by the M001 dir path.
|
|
209
|
+
// (a) Prime the dirListCache for M001/ with only M001-RESEARCH.md.
|
|
210
|
+
// mkBase() already created M001-RESEARCH.md; this first resolver
|
|
211
|
+
// call caches that listing so CONTEXT/ROADMAP are unknown to it.
|
|
205
212
|
clearPathCache();
|
|
206
213
|
assert.equal(
|
|
207
214
|
resolveMilestoneFile(base, "M001", "CONTEXT"),
|
|
208
215
|
null,
|
|
209
|
-
"precondition: resolver must report missing before files are written",
|
|
216
|
+
"precondition: resolver must report CONTEXT missing before files are written",
|
|
210
217
|
);
|
|
211
218
|
|
|
212
219
|
// (b) Write the artifacts directly to disk (simulates the LLM Write
|
|
@@ -215,12 +222,14 @@ describe("#4573 maybeHandleReadyPhraseWithoutFiles", () => {
|
|
|
215
222
|
writeFileSync(join(mDir, "M001-CONTEXT.md"), "# ctx");
|
|
216
223
|
writeFileSync(join(mDir, "M001-ROADMAP.md"), "# roadmap");
|
|
217
224
|
|
|
218
|
-
// (c) Sanity: the
|
|
219
|
-
//
|
|
225
|
+
// (c) Sanity: the dirListCache for M001/ is still stale (only
|
|
226
|
+
// M001-RESEARCH.md). dirIsContentBearingLegacyMilestone reads fresh
|
|
227
|
+
// so resolveMilestonePath finds the dir, but resolveFile still
|
|
228
|
+
// misses CONTEXT because cachedReaddir(M001/) is not yet cleared.
|
|
220
229
|
assert.equal(
|
|
221
230
|
resolveMilestoneFile(base, "M001", "CONTEXT"),
|
|
222
231
|
null,
|
|
223
|
-
"stale
|
|
232
|
+
"stale dirListCache still reports CONTEXT missing pre-clearPathCache",
|
|
224
233
|
);
|
|
225
234
|
|
|
226
235
|
// (d) Run the validator. With the fix it busts the cache before
|
|
@@ -19,9 +19,9 @@ import { handleReassessRoadmap } from '../tools/reassess-roadmap.ts';
|
|
|
19
19
|
|
|
20
20
|
function makeTmpBase(): string {
|
|
21
21
|
const base = mkdtempSync(join(tmpdir(), 'gsd-reassess-'));
|
|
22
|
-
mkdirSync(join(base, '.gsd', '
|
|
23
|
-
mkdirSync(join(base, '.gsd', '
|
|
24
|
-
mkdirSync(join(base, '.gsd', '
|
|
22
|
+
mkdirSync(join(base, '.gsd', 'phases', '01-test'), { recursive: true });
|
|
23
|
+
mkdirSync(join(base, '.gsd', 'phases', '01-test'), { recursive: true });
|
|
24
|
+
mkdirSync(join(base, '.gsd', 'phases', '01-test', 'slices', 'S03'), { recursive: true });
|
|
25
25
|
return base;
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -162,7 +162,7 @@ test('handleReassessRoadmap succeeds when modifying only pending slices', async
|
|
|
162
162
|
assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
|
|
163
163
|
|
|
164
164
|
// Verify assessments row exists in DB
|
|
165
|
-
const assessmentPath = join('.gsd', '
|
|
165
|
+
const assessmentPath = join('.gsd', 'phases', '01-test', '01-01-ASSESSMENT.md');
|
|
166
166
|
const assessment = getAssessment(assessmentPath);
|
|
167
167
|
assert.ok(assessment, 'assessment row should exist in DB');
|
|
168
168
|
assert.equal(assessment['milestone_id'], 'M001');
|
|
@@ -193,13 +193,14 @@ test('handleReassessRoadmap succeeds when modifying only pending slices', async
|
|
|
193
193
|
assert.equal(s01?.status, 'complete');
|
|
194
194
|
|
|
195
195
|
// Verify ROADMAP.md re-rendered on disk
|
|
196
|
-
|
|
196
|
+
// Flat-phase renderer writes NN-ROADMAP.md (01-ROADMAP.md for M001)
|
|
197
|
+
const roadmapPath = join(base, '.gsd', 'phases', '01-test', '01-ROADMAP.md');
|
|
197
198
|
assert.ok(existsSync(roadmapPath), 'ROADMAP.md should be rendered to disk');
|
|
198
199
|
const roadmapContent = readFileSync(roadmapPath, 'utf-8');
|
|
199
200
|
assert.ok(roadmapContent.includes('Updated Slice Two'), 'ROADMAP.md should contain updated S02 title');
|
|
200
201
|
|
|
201
202
|
// Verify ASSESSMENT.md exists on disk
|
|
202
|
-
const assessmentDiskPath = join(base, '.gsd', '
|
|
203
|
+
const assessmentDiskPath = join(base, '.gsd', 'phases', '01-test', '01-01-ASSESSMENT.md');
|
|
203
204
|
assert.ok(existsSync(assessmentDiskPath), 'ASSESSMENT.md should be rendered to disk');
|
|
204
205
|
const assessmentContent = readFileSync(assessmentDiskPath, 'utf-8');
|
|
205
206
|
assert.ok(assessmentContent.includes('confirmed'), 'ASSESSMENT.md should contain verdict');
|
|
@@ -340,7 +341,7 @@ test('handleReassessRoadmap invalidates stale milestone-validation when roadmap
|
|
|
340
341
|
insertSlice({ id: 'S04', milestoneId: 'M001', title: 'Slice Four', status: 'complete', demo: 'Demo' });
|
|
341
342
|
|
|
342
343
|
// Insert milestone-validation assessment with needs-remediation verdict (stale)
|
|
343
|
-
const validationPath = join('.gsd', '
|
|
344
|
+
const validationPath = join('.gsd', 'phases', '01-test', 'M001-VALIDATION.md');
|
|
344
345
|
insertAssessment({
|
|
345
346
|
path: validationPath,
|
|
346
347
|
milestoneId: 'M001',
|
|
@@ -404,7 +405,7 @@ test('handleReassessRoadmap does NOT invalidate validation when no roadmap struc
|
|
|
404
405
|
insertSlice({ id: 'S02', milestoneId: 'M001', title: 'Slice Two', status: 'pending', demo: 'Demo' });
|
|
405
406
|
|
|
406
407
|
// Insert milestone-validation assessment with pass verdict
|
|
407
|
-
const validationPath = join('.gsd', '
|
|
408
|
+
const validationPath = join('.gsd', 'phases', '01-test', 'M001-VALIDATION.md');
|
|
408
409
|
insertAssessment({
|
|
409
410
|
path: validationPath,
|
|
410
411
|
milestoneId: 'M001',
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// gsd-pi — Worktree DB reconciliation log coverage.
|
|
2
|
+
//
|
|
3
|
+
// `reconcileWorktreeDb` / `copyWorktreeDb` in db/writers/reconcile.ts ATTACH-
|
|
4
|
+
// and-merge a worktree's gsd.db back into the project-root DB. Each failure
|
|
5
|
+
// branch logs a `db` error/warning so a failed merge never silently drops
|
|
6
|
+
// worktree state — these logs are the only record that worktree-only decisions
|
|
7
|
+
// were lost. The existing worktree-db tests assert only the merge RESULT counts;
|
|
8
|
+
// none asserts any of the failure-path logs. This file pins them:
|
|
9
|
+
// - copyWorktreeDb failed (reconcile.ts:22)
|
|
10
|
+
// - realpathSync failed (reconcile.ts:71)
|
|
11
|
+
// - unsafe characters in path (reconcile.ts:76)
|
|
12
|
+
// - cannot open main DB (reconcile.ts:82)
|
|
13
|
+
// - reconcile transaction failed (reconcile.ts:494)
|
|
14
|
+
// - rollback / detach failures (reconcile.ts:486, :491)
|
|
15
|
+
|
|
16
|
+
import { test } from "node:test";
|
|
17
|
+
import assert from "node:assert/strict";
|
|
18
|
+
import * as fs from "node:fs";
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import * as os from "node:os";
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
closeDatabase,
|
|
24
|
+
copyWorktreeDb,
|
|
25
|
+
openDatabase,
|
|
26
|
+
reconcileWorktreeDb,
|
|
27
|
+
insertDecision,
|
|
28
|
+
} from "../gsd-db.ts";
|
|
29
|
+
import { _setMainDbOpenerFnForTests } from "../db/writers/reconcile.ts";
|
|
30
|
+
import {
|
|
31
|
+
drainLogs,
|
|
32
|
+
peekLogs,
|
|
33
|
+
setStderrLoggingEnabled,
|
|
34
|
+
_resetLogs,
|
|
35
|
+
type LogEntry,
|
|
36
|
+
} from "../workflow-logger.ts";
|
|
37
|
+
|
|
38
|
+
function tempDir(prefix = "gsd-reconcile-logs-"): string {
|
|
39
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), prefix));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Capture log entries emitted while running fn (stderr suppressed). */
|
|
43
|
+
function captureLogs<T>(fn: () => T): { result: T; logs: LogEntry[] } {
|
|
44
|
+
const previous = setStderrLoggingEnabled(false);
|
|
45
|
+
_resetLogs();
|
|
46
|
+
try {
|
|
47
|
+
const result = fn();
|
|
48
|
+
return { result, logs: drainLogs() };
|
|
49
|
+
} finally {
|
|
50
|
+
_resetLogs();
|
|
51
|
+
setStderrLoggingEnabled(previous);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function dbLogs(logs: readonly LogEntry[]): LogEntry[] {
|
|
56
|
+
return logs.filter((e) => e.component === "db");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Make a minimal valid gsd.db at `dbPath` so a worktree file exists/opens. */
|
|
60
|
+
function seedDb(dbPath: string): void {
|
|
61
|
+
openDatabase(dbPath);
|
|
62
|
+
insertDecision({
|
|
63
|
+
id: "D001",
|
|
64
|
+
when_context: "2025-01-01",
|
|
65
|
+
scope: "M001/S01",
|
|
66
|
+
decision: "x",
|
|
67
|
+
choice: "x",
|
|
68
|
+
rationale: "x",
|
|
69
|
+
revisable: "yes",
|
|
70
|
+
made_by: "agent",
|
|
71
|
+
superseded_by: null,
|
|
72
|
+
});
|
|
73
|
+
closeDatabase();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
test("copyWorktreeDb logs a db error when the source DB cannot be read", () => {
|
|
77
|
+
const srcDir = tempDir();
|
|
78
|
+
const destDir = tempDir();
|
|
79
|
+
const srcDb = path.join(srcDir, "gsd.db");
|
|
80
|
+
const destDb = path.join(destDir, "gsd.db");
|
|
81
|
+
try {
|
|
82
|
+
seedDb(srcDb);
|
|
83
|
+
// Make the source unreadable so copyFileSync throws EACCES.
|
|
84
|
+
fs.chmodSync(srcDb, 0o000);
|
|
85
|
+
|
|
86
|
+
const { result, logs } = captureLogs(() => copyWorktreeDb(srcDb, destDb));
|
|
87
|
+
|
|
88
|
+
assert.equal(result, false, "copy must report failure");
|
|
89
|
+
const err = dbLogs(logs).find((e) => e.severity === "error");
|
|
90
|
+
assert.ok(err, "a db error must be logged");
|
|
91
|
+
assert.match(err!.message, /failed to copy DB to worktree/u);
|
|
92
|
+
assert.ok(err!.context?.error, "the underlying error must be captured in context");
|
|
93
|
+
} finally {
|
|
94
|
+
// Restore perms so cleanup can delete the file.
|
|
95
|
+
try { fs.chmodSync(srcDb, 0o644); } catch { /* already gone */ }
|
|
96
|
+
fs.rmSync(srcDir, { recursive: true, force: true });
|
|
97
|
+
fs.rmSync(destDir, { recursive: true, force: true });
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("reconcileWorktreeDb logs a db error for an unsafe path (rejected before ATTACH)", () => {
|
|
102
|
+
const mainDir = tempDir();
|
|
103
|
+
const wtDir = tempDir("gsd-reconcile-logs-unsafe-'");
|
|
104
|
+
try {
|
|
105
|
+
const mainDb = path.join(mainDir, "gsd.db");
|
|
106
|
+
seedDb(mainDb);
|
|
107
|
+
// Worktree file must EXIST so the existsSync guard (reconcile.ts:66)
|
|
108
|
+
// passes and execution reaches the path-sanitizer (:75). The parent temp
|
|
109
|
+
// dir name carries a single-quote so the resolved path is rejected.
|
|
110
|
+
const wtDb = path.join(wtDir, "gsd.db");
|
|
111
|
+
fs.copyFileSync(mainDb, wtDb);
|
|
112
|
+
|
|
113
|
+
openDatabase(mainDb);
|
|
114
|
+
const { result, logs } = captureLogs(() => reconcileWorktreeDb(mainDb, wtDb));
|
|
115
|
+
closeDatabase();
|
|
116
|
+
|
|
117
|
+
assert.equal(result.decisions, 0, "unsafe path must yield a zero reconcile");
|
|
118
|
+
const err = dbLogs(logs).find((e) => e.severity === "error");
|
|
119
|
+
assert.ok(err, "a db error must be logged for the rejected path");
|
|
120
|
+
assert.match(err!.message, /worktree DB reconciliation failed: path contains unsafe characters/u);
|
|
121
|
+
} finally {
|
|
122
|
+
closeDatabase();
|
|
123
|
+
fs.rmSync(mainDir, { recursive: true, force: true });
|
|
124
|
+
fs.rmSync(wtDir, { recursive: true, force: true });
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("reconcileWorktreeDb logs a db warning when realpathSync on the main path fails", () => {
|
|
129
|
+
const wtDir = tempDir();
|
|
130
|
+
const mainDir = tempDir();
|
|
131
|
+
try {
|
|
132
|
+
// A real worktree DB so the existsSync guard (reconcile.ts:66) passes.
|
|
133
|
+
// The main path does not yet exist, so realpathSync(mainDbPath) throws
|
|
134
|
+
// ENOENT — exercising the same-file-guard catch (reconcile.ts:71). The
|
|
135
|
+
// function then proceeds to openDatabase(), which creates the file, so the
|
|
136
|
+
// reconcile completes; we assert only the realpath warning landed.
|
|
137
|
+
const wtDb = path.join(wtDir, "gsd.db");
|
|
138
|
+
seedDb(wtDb);
|
|
139
|
+
closeDatabase();
|
|
140
|
+
const mainDb = path.join(mainDir, "gsd.db");
|
|
141
|
+
|
|
142
|
+
const { logs } = captureLogs(() => reconcileWorktreeDb(mainDb, wtDb));
|
|
143
|
+
closeDatabase();
|
|
144
|
+
|
|
145
|
+
const warn = dbLogs(logs).find((e) => e.severity === "warn");
|
|
146
|
+
assert.ok(warn, "a db warning must be logged when realpathSync fails");
|
|
147
|
+
assert.match(warn!.message, /realpathSync failed/u);
|
|
148
|
+
} finally {
|
|
149
|
+
closeDatabase();
|
|
150
|
+
fs.rmSync(wtDir, { recursive: true, force: true });
|
|
151
|
+
fs.rmSync(mainDir, { recursive: true, force: true });
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("reconcileWorktreeDb logs a db error and zero-result when the worktree DB is corrupt", () => {
|
|
156
|
+
const mainDir = tempDir();
|
|
157
|
+
const wtDir = tempDir();
|
|
158
|
+
try {
|
|
159
|
+
const mainDb = path.join(mainDir, "gsd.db");
|
|
160
|
+
seedDb(mainDb);
|
|
161
|
+
|
|
162
|
+
// A worktree DB whose bytes are not SQLite — ATTACH DATABASE will throw,
|
|
163
|
+
// hitting the outer reconcile-failed catch (reconcile.ts:494).
|
|
164
|
+
const wtDb = path.join(wtDir, "gsd.db");
|
|
165
|
+
fs.writeFileSync(wtDb, "this is not a sqlite database", "utf-8");
|
|
166
|
+
|
|
167
|
+
openDatabase(mainDb);
|
|
168
|
+
const { result, logs } = captureLogs(() => reconcileWorktreeDb(mainDb, wtDb));
|
|
169
|
+
closeDatabase();
|
|
170
|
+
|
|
171
|
+
assert.equal(result.decisions, 0, "a corrupt worktree DB must yield a zero reconcile");
|
|
172
|
+
const err = dbLogs(logs).find((e) => e.severity === "error");
|
|
173
|
+
assert.ok(err, "a db error must be logged for the failed reconcile transaction");
|
|
174
|
+
assert.match(err!.message, /worktree DB reconciliation failed/u);
|
|
175
|
+
assert.ok(err!.context?.error, "the underlying ATTACH/merge error must be captured");
|
|
176
|
+
} finally {
|
|
177
|
+
closeDatabase();
|
|
178
|
+
fs.rmSync(mainDir, { recursive: true, force: true });
|
|
179
|
+
fs.rmSync(wtDir, { recursive: true, force: true });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("reconcileWorktreeDb produces no db errors on the happy path", () => {
|
|
184
|
+
const mainDir = tempDir();
|
|
185
|
+
const wtDir = tempDir();
|
|
186
|
+
try {
|
|
187
|
+
const mainDb = path.join(mainDir, "gsd.db");
|
|
188
|
+
const wtDb = path.join(wtDir, "gsd.db");
|
|
189
|
+
seedDb(mainDb);
|
|
190
|
+
closeDatabase();
|
|
191
|
+
copyWorktreeDb(mainDb, wtDb);
|
|
192
|
+
|
|
193
|
+
openDatabase(mainDb);
|
|
194
|
+
const { result, logs } = captureLogs(() => reconcileWorktreeDb(mainDb, wtDb));
|
|
195
|
+
closeDatabase();
|
|
196
|
+
|
|
197
|
+
assert.ok(result.decisions >= 0, "happy-path reconcile must return a result");
|
|
198
|
+
assert.equal(
|
|
199
|
+
dbLogs(logs).filter((e) => e.severity === "error").length,
|
|
200
|
+
0,
|
|
201
|
+
"no db error should be logged on a successful reconcile",
|
|
202
|
+
);
|
|
203
|
+
} finally {
|
|
204
|
+
closeDatabase();
|
|
205
|
+
fs.rmSync(mainDir, { recursive: true, force: true });
|
|
206
|
+
fs.rmSync(wtDir, { recursive: true, force: true });
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test("reconcileWorktreeDb logs a db error when the main DB cannot be opened (reconcile.ts:82)", () => {
|
|
211
|
+
const mainDir = tempDir();
|
|
212
|
+
const wtDir = tempDir();
|
|
213
|
+
try {
|
|
214
|
+
// A real worktree DB so the existsSync guard passes; a real main DB so the
|
|
215
|
+
// realpath same-file guard passes. No DB is open, so reconcileWorktreeDb
|
|
216
|
+
// reaches the openDatabase(main) branch.
|
|
217
|
+
const mainDb = path.join(mainDir, "gsd.db");
|
|
218
|
+
seedDb(mainDb);
|
|
219
|
+
closeDatabase();
|
|
220
|
+
const wtDb = path.join(wtDir, "gsd.db");
|
|
221
|
+
fs.copyFileSync(mainDb, wtDb);
|
|
222
|
+
|
|
223
|
+
// Inject an opener that always reports failure so the cannot-open-main-DB
|
|
224
|
+
// branch (reconcile.ts:82) fires deterministically. openDatabase() rethrows
|
|
225
|
+
// on real failures across providers rather than returning false, so this is
|
|
226
|
+
// the only reliable way to exercise the `!opened` branch.
|
|
227
|
+
const restore = _setMainDbOpenerFnForTests(() => false);
|
|
228
|
+
|
|
229
|
+
const { result, logs } = captureLogs(() => reconcileWorktreeDb(mainDb, wtDb));
|
|
230
|
+
restore();
|
|
231
|
+
|
|
232
|
+
assert.equal(result.decisions, 0, "an unopenable main DB must yield a zero reconcile");
|
|
233
|
+
const err = dbLogs(logs).find((e) => e.severity === "error");
|
|
234
|
+
assert.ok(err, "a db error must be logged when the main DB cannot be opened");
|
|
235
|
+
assert.match(err!.message, /worktree DB reconciliation failed: cannot open main DB/u);
|
|
236
|
+
} finally {
|
|
237
|
+
closeDatabase();
|
|
238
|
+
fs.rmSync(mainDir, { recursive: true, force: true });
|
|
239
|
+
fs.rmSync(wtDir, { recursive: true, force: true });
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// keep peekLogs import live for any future inline assertions in this file
|
|
244
|
+
void peekLogs;
|