@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,119 @@
|
|
|
1
|
+
// gsd-pi — Recovery GitHub-finalize detached-promise log coverage.
|
|
2
|
+
//
|
|
3
|
+
// refreshRecoveryDbForArtifact fires a detached GitHub milestone finalize after
|
|
4
|
+
// a complete-milestone DB closeout (auto-recovery.ts finalize block). Its catch
|
|
5
|
+
// logs `GitHub milestone finalize failed after DB closeout` (:232, formerly
|
|
6
|
+
// :203). The catch is otherwise reachable only with a real GitHub remote +
|
|
7
|
+
// network failure, so we drive the real complete-milestone recovery path
|
|
8
|
+
// (seeded closed milestone + proven closeout) and inject a throwing finalize
|
|
9
|
+
// via the sanctioned _setGithubFinalizeFnForTests seam.
|
|
10
|
+
|
|
11
|
+
import { test } from "node:test";
|
|
12
|
+
import assert from "node:assert/strict";
|
|
13
|
+
import { execFileSync } from "node:child_process";
|
|
14
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
15
|
+
import { dirname, join } from "node:path";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
|
|
18
|
+
import { refreshRecoveryDbForArtifact, _setGithubFinalizeFnForTests } from "../auto-recovery.ts";
|
|
19
|
+
import { resolveExpectedArtifactPath } from "../auto-artifact-paths.ts";
|
|
20
|
+
import {
|
|
21
|
+
closeDatabase,
|
|
22
|
+
insertAssessment,
|
|
23
|
+
insertMilestone,
|
|
24
|
+
insertSlice,
|
|
25
|
+
insertTask,
|
|
26
|
+
openDatabase,
|
|
27
|
+
} from "../gsd-db.ts";
|
|
28
|
+
import { invalidateAllCaches } from "../cache.ts";
|
|
29
|
+
import {
|
|
30
|
+
drainLogs,
|
|
31
|
+
setStderrLoggingEnabled,
|
|
32
|
+
_resetLogs,
|
|
33
|
+
type LogEntry,
|
|
34
|
+
} from "../workflow-logger.ts";
|
|
35
|
+
|
|
36
|
+
function git(cwd: string, args: string[]): void {
|
|
37
|
+
execFileSync("git", args, { cwd, stdio: "ignore" });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
test("refreshRecoveryDbForArtifact logs a recovery warning when the detached GitHub finalize throws (auto-recovery.ts:232)", async () => {
|
|
41
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-recovery-finalize-"));
|
|
42
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
43
|
+
try {
|
|
44
|
+
// Real git repo with an implementation change on a milestone branch so
|
|
45
|
+
// hasImplementationArtifacts(base, "M001") returns "present" — required for
|
|
46
|
+
// proveMilestoneCloseout to pass and the recovery to reach the finalize block.
|
|
47
|
+
git(base, ["init", "-b", "main"]);
|
|
48
|
+
git(base, ["config", "user.email", "test@test.com"]);
|
|
49
|
+
git(base, ["config", "user.name", "Test"]);
|
|
50
|
+
writeFileSync(join(base, "README.md"), "# init\n");
|
|
51
|
+
git(base, ["add", "."]);
|
|
52
|
+
git(base, ["commit", "-m", "init"]);
|
|
53
|
+
git(base, ["checkout", "-b", "milestone/M001"]);
|
|
54
|
+
writeFileSync(join(base, "src.ts"), "export const x = 1;\n");
|
|
55
|
+
git(base, ["add", "."]);
|
|
56
|
+
git(base, ["commit", "-m", "impl"]);
|
|
57
|
+
|
|
58
|
+
invalidateAllCaches();
|
|
59
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
60
|
+
insertMilestone({ id: "M001", title: "Milestone One", status: "active" });
|
|
61
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice One", status: "complete" });
|
|
62
|
+
insertTask({
|
|
63
|
+
id: "T01",
|
|
64
|
+
sliceId: "S01",
|
|
65
|
+
milestoneId: "M001",
|
|
66
|
+
title: "Task One",
|
|
67
|
+
status: "complete",
|
|
68
|
+
verificationResult: "passed",
|
|
69
|
+
});
|
|
70
|
+
insertAssessment({
|
|
71
|
+
path: ".gsd/milestones/M001/M001-VALIDATION.md",
|
|
72
|
+
milestoneId: "M001",
|
|
73
|
+
status: "pass",
|
|
74
|
+
scope: "milestone-validation",
|
|
75
|
+
fullContent: "verdict: pass\n",
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Proven closeout SUMMARY artifact so proveMilestoneCloseout passes and the
|
|
79
|
+
// recovery reaches the finalize block.
|
|
80
|
+
const summaryPath = resolveExpectedArtifactPath("complete-milestone", "M001", base);
|
|
81
|
+
assert.ok(summaryPath, "complete-milestone summary path must resolve");
|
|
82
|
+
mkdirSync(dirname(summaryPath), { recursive: true });
|
|
83
|
+
writeFileSync(summaryPath, "# Milestone One\n\nComplete.\n", "utf-8");
|
|
84
|
+
|
|
85
|
+
// Inject a throwing finalize so the detached-promise catch fires. The
|
|
86
|
+
// detached promise resolves on a microtask, so we await one before draining.
|
|
87
|
+
const restoreFinalize = _setGithubFinalizeFnForTests(() => {
|
|
88
|
+
throw new Error("forced github finalize failure");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const previous = setStderrLoggingEnabled(false);
|
|
92
|
+
_resetLogs();
|
|
93
|
+
let logs: LogEntry[] = [];
|
|
94
|
+
try {
|
|
95
|
+
const result = refreshRecoveryDbForArtifact("complete-milestone", "M001", base);
|
|
96
|
+
assert.equal(result.ok, true, "DB closeout must succeed before the detached finalize");
|
|
97
|
+
// Drain detached-promise queue so the catch's logWarning lands.
|
|
98
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
99
|
+
logs = drainLogs();
|
|
100
|
+
} finally {
|
|
101
|
+
_resetLogs();
|
|
102
|
+
setStderrLoggingEnabled(previous);
|
|
103
|
+
restoreFinalize();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const warn = logs.find(
|
|
107
|
+
(e) => e.component === "recovery" && /GitHub milestone finalize failed after DB closeout/u.test(e.message),
|
|
108
|
+
);
|
|
109
|
+
assert.ok(
|
|
110
|
+
warn,
|
|
111
|
+
"a recovery warning must be logged when the detached GitHub finalize throws (got: " +
|
|
112
|
+
logs.filter((e) => e.component === "recovery").map((e) => e.message).join(" | ") + ")",
|
|
113
|
+
);
|
|
114
|
+
assert.match(warn!.message, /forced github finalize failure/u);
|
|
115
|
+
} finally {
|
|
116
|
+
closeDatabase();
|
|
117
|
+
rmSync(base, { recursive: true, force: true });
|
|
118
|
+
}
|
|
119
|
+
});
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
// gsd-pi — Recovery artifact-verification log coverage.
|
|
2
|
+
//
|
|
3
|
+
// `verifyExpectedArtifact` is the gate that prevents an LLM from advancing the
|
|
4
|
+
// pipeline with a stub or incomplete artifact. Each verify-fail branch emits a
|
|
5
|
+
// `recovery` warning (or error) describing the exact reason — these logs are
|
|
6
|
+
// the operator's signal during stuck-loop diagnosis, so regressions that change
|
|
7
|
+
// or drop them must surface. The existing artifact-verification tests assert
|
|
8
|
+
// only the boolean return value; this file pins the log output for each
|
|
9
|
+
// important gate:
|
|
10
|
+
// - plan-milestone roadmap has zero slices (auto-recovery.ts:511)
|
|
11
|
+
// - run-uat assessment missing a verdict (auto-recovery.ts:502)
|
|
12
|
+
// - validate-milestone validation not terminal (auto-recovery.ts:494)
|
|
13
|
+
// - generic verify-fail: artifact file missing (auto-recovery.ts:487)
|
|
14
|
+
|
|
15
|
+
import { test } from "node:test";
|
|
16
|
+
import assert from "node:assert/strict";
|
|
17
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { tmpdir } from "node:os";
|
|
20
|
+
|
|
21
|
+
import { verifyExpectedArtifact, _setRoadmapParserFnForTests } from "../auto-recovery.ts";
|
|
22
|
+
import { closeDatabase, openDatabase, _getAdapter } from "../gsd-db.ts";
|
|
23
|
+
import {
|
|
24
|
+
drainLogs,
|
|
25
|
+
peekLogs,
|
|
26
|
+
setStderrLoggingEnabled,
|
|
27
|
+
_resetLogs,
|
|
28
|
+
type LogEntry,
|
|
29
|
+
} from "../workflow-logger.ts";
|
|
30
|
+
|
|
31
|
+
function createFixtureBase(prefix = "gsd-recovery-logs-"): string {
|
|
32
|
+
const base = mkdtempSync(join(tmpdir(), prefix));
|
|
33
|
+
mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
|
|
34
|
+
return base;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function milestoneDir(base: string, mid: string): string {
|
|
38
|
+
const dir = join(base, ".gsd", "milestones", mid);
|
|
39
|
+
mkdirSync(dir, { recursive: true });
|
|
40
|
+
return dir;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function sliceDir(base: string, mid: string, sid: string): string {
|
|
44
|
+
const dir = join(base, ".gsd", "milestones", mid, "slices", sid);
|
|
45
|
+
mkdirSync(dir, { recursive: true });
|
|
46
|
+
return dir;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Run `verifyExpectedArtifact` with stderr suppressed and capture both the
|
|
51
|
+
* return value and the log entries emitted by the call. The log buffer is
|
|
52
|
+
* reset before the call (so no bleed from prior tests) and drained inside the
|
|
53
|
+
* capture scope (before the finally clears it) so callers can assert on logs
|
|
54
|
+
* after the helper returns.
|
|
55
|
+
*
|
|
56
|
+
* NOTE: the workflow-logger `_buffer` is a process-wide singleton shared with
|
|
57
|
+
* the code under test, so we must drain inside this scope — reading it after
|
|
58
|
+
* the finally would see an already-cleared buffer.
|
|
59
|
+
*/
|
|
60
|
+
function verifyAndCaptureLogs(
|
|
61
|
+
unitType: string,
|
|
62
|
+
unitId: string,
|
|
63
|
+
base: string,
|
|
64
|
+
): { result: boolean; logs: LogEntry[] } {
|
|
65
|
+
const previous = setStderrLoggingEnabled(false);
|
|
66
|
+
_resetLogs();
|
|
67
|
+
try {
|
|
68
|
+
const result = verifyExpectedArtifact(unitType, unitId, base);
|
|
69
|
+
return { result, logs: drainLogs() };
|
|
70
|
+
} finally {
|
|
71
|
+
_resetLogs();
|
|
72
|
+
setStderrLoggingEnabled(previous);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function findRecovery(logs: readonly LogEntry[]): LogEntry | undefined {
|
|
77
|
+
return logs.find((e) => e.component === "recovery");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
test("plan-milestone verify-fail logs a recovery warning naming the zero-slice roadmap", () => {
|
|
81
|
+
const base = createFixtureBase();
|
|
82
|
+
try {
|
|
83
|
+
const dir = milestoneDir(base, "M001");
|
|
84
|
+
writeFileSync(join(dir, "M001-ROADMAP.md"), "# M001: Stub\n\n## Slices\n\n_TBD_\n", "utf-8");
|
|
85
|
+
|
|
86
|
+
const { result, logs } = verifyAndCaptureLogs("plan-milestone", "M001", base);
|
|
87
|
+
|
|
88
|
+
assert.equal(result, false, "zero-slice roadmap must fail verification");
|
|
89
|
+
const recovery = findRecovery(logs);
|
|
90
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
91
|
+
assert.equal(recovery!.severity, "warn");
|
|
92
|
+
assert.match(recovery!.message, /verify-fail plan-milestone M001: roadmap has zero slices/u);
|
|
93
|
+
} finally {
|
|
94
|
+
rmSync(base, { recursive: true, force: true });
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("run-uat verify-fail logs a recovery warning when the assessment has no verdict", () => {
|
|
99
|
+
const base = createFixtureBase();
|
|
100
|
+
try {
|
|
101
|
+
const dir = sliceDir(base, "M001", "S01");
|
|
102
|
+
// No `verdict:` frontmatter → hasVerdict() returns false → warning fires.
|
|
103
|
+
writeFileSync(join(dir, "S01-ASSESSMENT.md"), "# UAT\n\nNo verdict yet.\n", "utf-8");
|
|
104
|
+
|
|
105
|
+
const { result, logs } = verifyAndCaptureLogs("run-uat", "M001/S01", base);
|
|
106
|
+
|
|
107
|
+
assert.equal(result, false, "verdict-less assessment must fail verification");
|
|
108
|
+
const recovery = findRecovery(logs);
|
|
109
|
+
assert.ok(recovery, "a recovery entry must be logged");
|
|
110
|
+
assert.equal(recovery!.severity, "warn");
|
|
111
|
+
assert.match(recovery!.message, /verify-fail run-uat M001\/S01: assessment missing verdict/u);
|
|
112
|
+
} finally {
|
|
113
|
+
rmSync(base, { recursive: true, force: true });
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("validate-milestone verify-fail logs a recovery warning when the validation is not terminal", () => {
|
|
118
|
+
const base = createFixtureBase();
|
|
119
|
+
try {
|
|
120
|
+
const dir = milestoneDir(base, "M001");
|
|
121
|
+
// No `verdict:` → isValidationTerminal() returns false → warning fires.
|
|
122
|
+
writeFileSync(join(dir, "M001-VALIDATION.md"), "# Validation\n\nStill in progress.\n", "utf-8");
|
|
123
|
+
|
|
124
|
+
const { result, logs } = verifyAndCaptureLogs("validate-milestone", "M001", base);
|
|
125
|
+
|
|
126
|
+
assert.equal(result, false, "non-terminal validation must fail verification");
|
|
127
|
+
const recovery = findRecovery(logs);
|
|
128
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
129
|
+
assert.equal(recovery!.severity, "warn");
|
|
130
|
+
assert.match(recovery!.message, /verify-fail validate-milestone M001: validation not terminal/u);
|
|
131
|
+
} finally {
|
|
132
|
+
rmSync(base, { recursive: true, force: true });
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test("verify-fail logs a recovery warning when an expected artifact file is absent", () => {
|
|
137
|
+
const base = createFixtureBase();
|
|
138
|
+
try {
|
|
139
|
+
// complete-slice resolves a SUMMARY path under the milestone dir, but we
|
|
140
|
+
// never write the file → existsSync is false → the generic verify-fail path
|
|
141
|
+
// logs and returns false.
|
|
142
|
+
sliceDir(base, "M001", "S01");
|
|
143
|
+
|
|
144
|
+
const { result, logs } = verifyAndCaptureLogs("complete-slice", "M001/S01", base);
|
|
145
|
+
|
|
146
|
+
assert.equal(result, false, "missing artifact must fail verification");
|
|
147
|
+
const recovery = findRecovery(logs);
|
|
148
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
149
|
+
assert.equal(recovery!.severity, "warn");
|
|
150
|
+
assert.match(recovery!.message, /verify-fail complete-slice M001\/S01: existsSync false/u);
|
|
151
|
+
} finally {
|
|
152
|
+
rmSync(base, { recursive: true, force: true });
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("a passing verification produces no recovery warnings", () => {
|
|
157
|
+
const base = createFixtureBase();
|
|
158
|
+
try {
|
|
159
|
+
const dir = milestoneDir(base, "M001");
|
|
160
|
+
writeFileSync(
|
|
161
|
+
join(dir, "M001-ROADMAP.md"),
|
|
162
|
+
["# M001: Real roadmap", "", "## Slices", "", "- [ ] **S01: First slice** `risk:low` `depends:[]`", ""].join("\n"),
|
|
163
|
+
"utf-8",
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const { result, logs } = verifyAndCaptureLogs("plan-milestone", "M001", base);
|
|
167
|
+
|
|
168
|
+
assert.equal(result, true, "a real roadmap must pass verification");
|
|
169
|
+
assert.equal(
|
|
170
|
+
findRecovery(logs),
|
|
171
|
+
undefined,
|
|
172
|
+
"no recovery warning should be logged on success",
|
|
173
|
+
);
|
|
174
|
+
} finally {
|
|
175
|
+
rmSync(base, { recursive: true, force: true });
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// ─── plan-slice verification gates (legacy path, no DB) ────────────────────
|
|
180
|
+
// These run the filesystem fallback when isDbAvailable() is false. Each verify-
|
|
181
|
+
// fail branch logs a recovery warning naming the exact missing artifact, so a
|
|
182
|
+
// regression that drops the reason would hide why a slice refused to advance.
|
|
183
|
+
|
|
184
|
+
test("plan-slice verify-fail logs a recovery warning when the plan has no task entries", () => {
|
|
185
|
+
const base = createFixtureBase("gsd-recovery-logs-plan-");
|
|
186
|
+
try {
|
|
187
|
+
const dir = sliceDir(base, "M001", "S01");
|
|
188
|
+
// A PLAN with neither a `- [ ] **T0x:**` checkbox nor a `## T0x --` heading.
|
|
189
|
+
writeFileSync(join(dir, "S01-PLAN.md"), "# S01: Stub\n\n## Tasks\n\n_TBD_\n", "utf-8");
|
|
190
|
+
|
|
191
|
+
const { result, logs } = verifyAndCaptureLogs("plan-slice", "M001/S01", base);
|
|
192
|
+
|
|
193
|
+
assert.equal(result, false, "a task-less plan must fail verification");
|
|
194
|
+
const recovery = findRecovery(logs);
|
|
195
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
196
|
+
assert.match(
|
|
197
|
+
recovery!.message,
|
|
198
|
+
/verify-fail plan-slice M001\/S01: plan has no task checkbox\/heading/u,
|
|
199
|
+
);
|
|
200
|
+
} finally {
|
|
201
|
+
rmSync(base, { recursive: true, force: true });
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test("plan-slice verify-fail logs a recovery warning when the tasks dir is missing", () => {
|
|
206
|
+
const base = createFixtureBase("gsd-recovery-logs-tasksdir-");
|
|
207
|
+
try {
|
|
208
|
+
const dir = sliceDir(base, "M001", "S01");
|
|
209
|
+
// Valid checkbox task, but we deliberately do NOT create the tasks/ dir.
|
|
210
|
+
writeFileSync(
|
|
211
|
+
join(dir, "S01-PLAN.md"),
|
|
212
|
+
"# S01: Has task\n\n## Tasks\n\n- [ ] **T01: A** `est:15m`\n",
|
|
213
|
+
"utf-8",
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
const { result, logs } = verifyAndCaptureLogs("plan-slice", "M001/S01", base);
|
|
217
|
+
|
|
218
|
+
assert.equal(result, false, "a plan without its tasks dir must fail verification");
|
|
219
|
+
const recovery = findRecovery(logs);
|
|
220
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
221
|
+
assert.match(
|
|
222
|
+
recovery!.message,
|
|
223
|
+
/verify-fail plan-slice M001\/S01: tasks dir missing/u,
|
|
224
|
+
);
|
|
225
|
+
} finally {
|
|
226
|
+
rmSync(base, { recursive: true, force: true });
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
test("plan-slice verify-fail logs a recovery warning when an individual task plan file is missing", () => {
|
|
231
|
+
const base = createFixtureBase("gsd-recovery-logs-taskplan-");
|
|
232
|
+
try {
|
|
233
|
+
const dir = sliceDir(base, "M001", "S01");
|
|
234
|
+
writeFileSync(
|
|
235
|
+
join(dir, "S01-PLAN.md"),
|
|
236
|
+
"# S01: Has task\n\n## Tasks\n\n- [ ] **T01: A** `est:15m`\n",
|
|
237
|
+
"utf-8",
|
|
238
|
+
);
|
|
239
|
+
// Create the tasks dir but NOT the T01-PLAN.md file inside it.
|
|
240
|
+
mkdirSync(join(dir, "tasks"), { recursive: true });
|
|
241
|
+
|
|
242
|
+
const { result, logs } = verifyAndCaptureLogs("plan-slice", "M001/S01", base);
|
|
243
|
+
|
|
244
|
+
assert.equal(result, false, "a missing task plan file must fail verification");
|
|
245
|
+
const recovery = findRecovery(logs);
|
|
246
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
247
|
+
assert.match(
|
|
248
|
+
recovery!.message,
|
|
249
|
+
/verify-fail plan-slice M001\/S01: task plan missing .*T01-PLAN\.md/u,
|
|
250
|
+
);
|
|
251
|
+
} finally {
|
|
252
|
+
rmSync(base, { recursive: true, force: true });
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
// ─── parallel-research sentinel verification gates ─────────────────────────
|
|
257
|
+
// The "{mid}/parallel-research" sentinel fans research across multiple slices.
|
|
258
|
+
// verifyExpectedArtifact checks every research-ready slice has a RESEARCH file;
|
|
259
|
+
// each failure logs a recovery warning naming the exact gap.
|
|
260
|
+
|
|
261
|
+
test("parallel-research verify-fail logs a recovery warning when the roadmap is missing", () => {
|
|
262
|
+
const base = createFixtureBase("gsd-recovery-logs-prr-");
|
|
263
|
+
try {
|
|
264
|
+
// No roadmap file present → resolveExpectedArtifactPath("plan-milestone")
|
|
265
|
+
// returns null/missing → :445 warning.
|
|
266
|
+
const { result, logs } = verifyAndCaptureLogs("research-slice", "M001/parallel-research", base);
|
|
267
|
+
|
|
268
|
+
assert.equal(result, false, "missing roadmap must fail parallel-research verification");
|
|
269
|
+
const recovery = findRecovery(logs);
|
|
270
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
271
|
+
assert.match(
|
|
272
|
+
recovery!.message,
|
|
273
|
+
/verify-fail research-slice M001\/parallel-research: roadmap missing/u,
|
|
274
|
+
);
|
|
275
|
+
} finally {
|
|
276
|
+
rmSync(base, { recursive: true, force: true });
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test("parallel-research verify-fail logs a recovery warning when a research-ready slice lacks RESEARCH", () => {
|
|
281
|
+
const base = createFixtureBase("gsd-recovery-logs-prrs-");
|
|
282
|
+
try {
|
|
283
|
+
const dir = milestoneDir(base, "M001");
|
|
284
|
+
// A roadmap with one not-done slice (S01) and no milestone-level RESEARCH.
|
|
285
|
+
// S01 is research-ready (no deps, not done) and has no RESEARCH file → :462.
|
|
286
|
+
writeFileSync(
|
|
287
|
+
join(dir, "M001-ROADMAP.md"),
|
|
288
|
+
["# M001: Roadmap", "", "## Slices", "", "- [ ] **S01: First** `risk:low` `depends:[]`", ""].join("\n"),
|
|
289
|
+
"utf-8",
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
const { result, logs } = verifyAndCaptureLogs("research-slice", "M001/parallel-research", base);
|
|
293
|
+
|
|
294
|
+
assert.equal(result, false, "a research-ready slice without RESEARCH must fail verification");
|
|
295
|
+
const recovery = findRecovery(logs);
|
|
296
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
297
|
+
assert.match(
|
|
298
|
+
recovery!.message,
|
|
299
|
+
/verify-fail research-slice M001\/parallel-research: slice S01 missing RESEARCH/u,
|
|
300
|
+
);
|
|
301
|
+
} finally {
|
|
302
|
+
rmSync(base, { recursive: true, force: true });
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
// ─── gate-evaluate DB-degradation gate ─────────────────────────────────────
|
|
307
|
+
// gate-evaluate verifies dispatched gates are no longer pending via a DB query.
|
|
308
|
+
// When the DB is available but the query throws (e.g. quality_gates table
|
|
309
|
+
// missing), the catch (auto-recovery.ts:411) logs a recovery warning and treats
|
|
310
|
+
// the unit as verified to avoid blocking. This pins that degradation log.
|
|
311
|
+
|
|
312
|
+
test("gate-evaluate verify logs a recovery warning when the pending-gates DB query throws", () => {
|
|
313
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-recovery-logs-gate-"));
|
|
314
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
315
|
+
try {
|
|
316
|
+
// Open a DB then drop quality_gates so getPendingGatesForTurn throws inside
|
|
317
|
+
// the gate-evaluate DB branch → :411 warning. (getGateIdsForTurn returns
|
|
318
|
+
// default gate-evaluate ids, so the query path is reached.)
|
|
319
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
320
|
+
_getAdapter()!.exec("DROP TABLE quality_gates");
|
|
321
|
+
|
|
322
|
+
const previous = setStderrLoggingEnabled(false);
|
|
323
|
+
_resetLogs();
|
|
324
|
+
let result: boolean;
|
|
325
|
+
try {
|
|
326
|
+
// Batch unitId "M001/S01/gates+Q3" encodes one dispatched gate.
|
|
327
|
+
result = verifyExpectedArtifact("gate-evaluate", "M001/S01/gates+Q3", base);
|
|
328
|
+
const logs = drainLogs();
|
|
329
|
+
const recovery = logs.find((e) => e.component === "recovery" && /gate-evaluate DB check failed/u.test(e.message));
|
|
330
|
+
assert.ok(recovery, "a recovery warning must be logged when the gate DB check throws");
|
|
331
|
+
assert.match(recovery!.message, /gate-evaluate DB check failed/u);
|
|
332
|
+
} finally {
|
|
333
|
+
_resetLogs();
|
|
334
|
+
setStderrLoggingEnabled(previous);
|
|
335
|
+
}
|
|
336
|
+
// Per :411 comment, a DB failure is treated as verified (return true) to
|
|
337
|
+
// avoid blocking the loop — pin that resilience contract too.
|
|
338
|
+
assert.equal(result, true, "a gate-evaluate DB failure must not block verification");
|
|
339
|
+
} finally {
|
|
340
|
+
closeDatabase();
|
|
341
|
+
rmSync(base, { recursive: true, force: true });
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
// ─── roadmap-parse-threw catches (:515 plan-milestone, :622 complete-slice) ─
|
|
346
|
+
// parseLegacyRoadmap is internally defensive against every malformed input, so
|
|
347
|
+
// these catches are unreachable without the _setRoadmapParserFnForTests seam.
|
|
348
|
+
// We inject a throwing parser to pin both best-effort failure logs.
|
|
349
|
+
|
|
350
|
+
test("plan-milestone verify logs a recovery warning when the roadmap parser throws (auto-recovery.ts:515)", () => {
|
|
351
|
+
const base = createFixtureBase("gsd-recovery-logs-parse-");
|
|
352
|
+
const restore = _setRoadmapParserFnForTests(() => {
|
|
353
|
+
throw new Error("forced roadmap parse failure");
|
|
354
|
+
});
|
|
355
|
+
try {
|
|
356
|
+
const dir = milestoneDir(base, "M001");
|
|
357
|
+
// A real ROADMAP file must exist so verification reaches the parser.
|
|
358
|
+
writeFileSync(join(dir, "M001-ROADMAP.md"), "# M001: x\n\n## Slices\n\n- [ ] **S01: A**\n", "utf-8");
|
|
359
|
+
|
|
360
|
+
const { result, logs } = verifyAndCaptureLogs("plan-milestone", "M001", base);
|
|
361
|
+
|
|
362
|
+
assert.equal(result, false, "a parser failure must fail plan-milestone verification");
|
|
363
|
+
const recovery = findRecovery(logs);
|
|
364
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
365
|
+
assert.match(recovery!.message, /plan-milestone roadmap verification failed/u);
|
|
366
|
+
assert.match(recovery!.message, /forced roadmap parse failure/u);
|
|
367
|
+
} finally {
|
|
368
|
+
restore();
|
|
369
|
+
rmSync(base, { recursive: true, force: true });
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
test("complete-slice verify logs a recovery warning when the legacy roadmap parse fails (auto-recovery.ts:622)", () => {
|
|
374
|
+
const base = createFixtureBase("gsd-recovery-logs-cs-parse-");
|
|
375
|
+
const restore = _setRoadmapParserFnForTests(() => {
|
|
376
|
+
throw new Error("forced legacy roadmap parse failure");
|
|
377
|
+
});
|
|
378
|
+
try {
|
|
379
|
+
const dir = sliceDir(base, "M001", "S01");
|
|
380
|
+
// complete-slice verification: SUMMARY + UAT present, DB unavailable →
|
|
381
|
+
// legacy roadmap checkbox fallback → parser throws → :622 warning.
|
|
382
|
+
writeFileSync(join(dir, "S01-SUMMARY.md"), "# S01 done\n", "utf-8");
|
|
383
|
+
// UAT file required so the complete-slice guard (auto-recovery.ts:655) does
|
|
384
|
+
// not return false before reaching the legacy roadmap fallback.
|
|
385
|
+
writeFileSync(join(dir, "S01-UAT.md"), "# UAT\n", "utf-8");
|
|
386
|
+
// Legacy ROADMAP.md (unprefixed) under the milestone dir.
|
|
387
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "ROADMAP.md"), "# M001\n\n## Slices\n\n- [ ] **S01: A**\n", "utf-8");
|
|
388
|
+
|
|
389
|
+
const { result, logs } = verifyAndCaptureLogs("complete-slice", "M001/S01", base);
|
|
390
|
+
|
|
391
|
+
assert.equal(result, false, "a parser failure must fail complete-slice verification");
|
|
392
|
+
const recovery = logs.find((e) => e.component === "recovery" && /roadmap parse failed/u.test(e.message));
|
|
393
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
394
|
+
assert.match(recovery!.message, /roadmap parse failed/u);
|
|
395
|
+
assert.match(recovery!.message, /forced legacy roadmap parse failure/u);
|
|
396
|
+
} finally {
|
|
397
|
+
restore();
|
|
398
|
+
rmSync(base, { recursive: true, force: true });
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
test("parallel-research verify logs a recovery warning when the roadmap parse throws (auto-recovery.ts:522)", () => {
|
|
403
|
+
const base = createFixtureBase("gsd-recovery-logs-prr-throw-");
|
|
404
|
+
const restore = _setRoadmapParserFnForTests(() => {
|
|
405
|
+
throw new Error("forced parallel-research parse failure");
|
|
406
|
+
});
|
|
407
|
+
try {
|
|
408
|
+
const dir = milestoneDir(base, "M001");
|
|
409
|
+
// A real ROADMAP with a research-ready slice so verification reaches the
|
|
410
|
+
// parser loop; the seam makes parseRoadmapForRecovery throw → :522 catch.
|
|
411
|
+
writeFileSync(
|
|
412
|
+
join(dir, "M001-ROADMAP.md"),
|
|
413
|
+
["# M001: Roadmap", "", "## Slices", "", "- [ ] **S01: First** `risk:low` `depends:[]`", ""].join("\n"),
|
|
414
|
+
"utf-8",
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
const { result, logs } = verifyAndCaptureLogs("research-slice", "M001/parallel-research", base);
|
|
418
|
+
|
|
419
|
+
assert.equal(result, false, "a parser failure must fail parallel-research verification");
|
|
420
|
+
const recovery = logs.find((e) => e.component === "recovery" && /parallel-research verification failed/u.test(e.message));
|
|
421
|
+
assert.ok(recovery, "a recovery warning must be logged");
|
|
422
|
+
assert.match(recovery!.message, /parallel-research verification failed/u);
|
|
423
|
+
assert.match(recovery!.message, /forced parallel-research parse failure/u);
|
|
424
|
+
} finally {
|
|
425
|
+
restore();
|
|
426
|
+
rmSync(base, { recursive: true, force: true });
|
|
427
|
+
}
|
|
428
|
+
});
|
|
@@ -52,6 +52,31 @@ test("handleRecoverableExtensionProcessError swallows uv_cwd ENOENT", () => {
|
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
+
test("handleRecoverableExtensionProcessError suppresses uv_cwd stderr in TUI mode", async () => {
|
|
56
|
+
const { setStderrLoggingEnabled } = await import("../workflow-logger.ts");
|
|
57
|
+
let stderr = "";
|
|
58
|
+
const originalWrite = process.stderr.write.bind(process.stderr);
|
|
59
|
+
process.stderr.write = ((chunk: string | Uint8Array) => {
|
|
60
|
+
stderr += String(chunk);
|
|
61
|
+
return true;
|
|
62
|
+
}) as typeof process.stderr.write;
|
|
63
|
+
const previous = setStderrLoggingEnabled(false);
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
const handled = handleRecoverableExtensionProcessError(
|
|
67
|
+
Object.assign(new Error("process.cwd failed"), {
|
|
68
|
+
code: "ENOENT",
|
|
69
|
+
syscall: "uv_cwd",
|
|
70
|
+
}),
|
|
71
|
+
);
|
|
72
|
+
assert.equal(handled, true);
|
|
73
|
+
assert.equal(stderr, "");
|
|
74
|
+
} finally {
|
|
75
|
+
setStderrLoggingEnabled(previous);
|
|
76
|
+
process.stderr.write = originalWrite;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
55
80
|
test("handleRecoverableExtensionProcessError swallows read EIO", () => {
|
|
56
81
|
let stderr = "";
|
|
57
82
|
const originalWrite = process.stderr.write.bind(process.stderr);
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
resetWriteGateState,
|
|
20
20
|
setPendingGate,
|
|
21
21
|
shouldBlockContextArtifactSave,
|
|
22
|
+
shouldBlockContextWrite,
|
|
22
23
|
} from "../bootstrap/write-gate.ts";
|
|
23
24
|
import { classifyCommand } from "../safety/destructive-guard.ts";
|
|
24
25
|
import { toRoundResultResponse } from "../../remote-questions/manager.ts";
|
|
@@ -201,9 +202,82 @@ test("register-hooks unlocks milestone depth verification from question id witho
|
|
|
201
202
|
);
|
|
202
203
|
});
|
|
203
204
|
|
|
205
|
+
test("register-hooks canonicalizes lower-case milestone ids in depth-verification question ids", async (t) => {
|
|
206
|
+
const dir = makeTempDir("lowercase-mid");
|
|
207
|
+
const originalCwd = process.cwd();
|
|
208
|
+
process.chdir(dir);
|
|
209
|
+
resetWriteGateState(dir);
|
|
210
|
+
|
|
211
|
+
t.after(() => {
|
|
212
|
+
try {
|
|
213
|
+
resetWriteGateState(dir);
|
|
214
|
+
} finally {
|
|
215
|
+
process.chdir(originalCwd);
|
|
216
|
+
rmSync(dir, { recursive: true, force: true });
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
const handlers = new Map<string, Array<(event: any, ctx?: any) => Promise<void> | void>>();
|
|
221
|
+
const pi = {
|
|
222
|
+
on(event: string, handler: (event: any, ctx?: any) => Promise<void> | void) {
|
|
223
|
+
const existing = handlers.get(event) ?? [];
|
|
224
|
+
existing.push(handler);
|
|
225
|
+
handlers.set(event, existing);
|
|
226
|
+
},
|
|
227
|
+
} as any;
|
|
228
|
+
|
|
229
|
+
registerHooks(pi, []);
|
|
230
|
+
|
|
231
|
+
const questionId = "depth_verification_m001_confirm";
|
|
232
|
+
const questions = [
|
|
233
|
+
{
|
|
234
|
+
id: questionId,
|
|
235
|
+
question: "Do you agree?",
|
|
236
|
+
options: [
|
|
237
|
+
{ label: "Yes, you got it (Recommended)" },
|
|
238
|
+
{ label: "Needs adjustment" },
|
|
239
|
+
],
|
|
240
|
+
},
|
|
241
|
+
];
|
|
242
|
+
|
|
243
|
+
await armDepthGate(handlers, "ask_user_questions", questions);
|
|
244
|
+
assert.equal(getPendingGate(), questionId);
|
|
245
|
+
|
|
246
|
+
for (const handler of handlers.get("tool_result") ?? []) {
|
|
247
|
+
await handler({
|
|
248
|
+
toolName: "ask_user_questions",
|
|
249
|
+
input: { questions },
|
|
250
|
+
details: {
|
|
251
|
+
response: {
|
|
252
|
+
answers: {
|
|
253
|
+
[questionId]: { selected: "Yes, you got it (Recommended)" },
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
assert.equal(getPendingGate(), null, "confirming lower-case m001 gate should clear pending state");
|
|
261
|
+
assert.deepEqual(
|
|
262
|
+
loadWriteGateSnapshot(dir).verifiedDepthMilestones,
|
|
263
|
+
["M001"],
|
|
264
|
+
"verified milestone id should be stored canonically",
|
|
265
|
+
);
|
|
266
|
+
assert.equal(
|
|
267
|
+
shouldBlockContextWrite(
|
|
268
|
+
"write",
|
|
269
|
+
".gsd/milestones/M001/M001-CONTEXT.md",
|
|
270
|
+
null,
|
|
271
|
+
false,
|
|
272
|
+
dir,
|
|
273
|
+
).block,
|
|
274
|
+
false,
|
|
275
|
+
"lower-case question id should unlock the matching upper-case CONTEXT.md path",
|
|
276
|
+
);
|
|
277
|
+
});
|
|
278
|
+
|
|
204
279
|
test("register-hooks persists first structured question round for new milestone re-entry", async (t) => {
|
|
205
280
|
const dir = makeTempDir("question-draft");
|
|
206
|
-
mkdirSync(join(dir, ".gsd", "milestones"), { recursive: true });
|
|
207
281
|
const originalCwd = process.cwd();
|
|
208
282
|
process.chdir(dir);
|
|
209
283
|
resetWriteGateState(dir);
|
|
@@ -274,9 +348,10 @@ test("register-hooks persists first structured question round for new milestone
|
|
|
274
348
|
}, ctx);
|
|
275
349
|
}
|
|
276
350
|
|
|
277
|
-
|
|
278
|
-
const
|
|
279
|
-
const
|
|
351
|
+
// Flat-phase: ensureMilestoneShell creates phases/04-new-milestone-m004/ for M004
|
|
352
|
+
const milestoneDir = join(dir, ".gsd", "phases", "04-new-milestone-m004");
|
|
353
|
+
const draftPath = join(milestoneDir, "04-CONTEXT-DRAFT.md");
|
|
354
|
+
const discussionPath = join(milestoneDir, "04-DISCUSSION.md");
|
|
280
355
|
|
|
281
356
|
assert.equal(existsSync(draftPath), true, "first answer round should create a resumable context draft");
|
|
282
357
|
assert.equal(existsSync(discussionPath), true, "first answer round should create a discussion log");
|