@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
|
@@ -326,3 +326,105 @@ test("rehydrate degrades to an empty window without a scope or ledger", () => {
|
|
|
326
326
|
assert.equal(noDb.rehydrate(), 0);
|
|
327
327
|
assert.equal(noDb.getRecentWindow().length, 0);
|
|
328
328
|
});
|
|
329
|
+
|
|
330
|
+
// ─── Session-scoped rehydration (#852) ───────────────────────────────────────
|
|
331
|
+
//
|
|
332
|
+
// Without session scoping, two consecutive finalize-retry failures from a
|
|
333
|
+
// PREVIOUS session persist in unit_dispatches and are loaded into the
|
|
334
|
+
// DispatchHistory window on the NEXT session's start() → rehydrate() call.
|
|
335
|
+
// The first advance's recordDispatch fills the window (matchingCount >=
|
|
336
|
+
// STUCK_WINDOW_SIZE) and detectStuck Rule 1 fires immediately, killing
|
|
337
|
+
// auto-mode before any new unit runs. The resolveTraceId option scopes
|
|
338
|
+
// rehydrate() to the current session so only that session's dispatches
|
|
339
|
+
// populate the window.
|
|
340
|
+
|
|
341
|
+
test("#852: rehydrate with resolveTraceId ignores prior-session entries (empty window on fresh session)", (t) => {
|
|
342
|
+
const f = makeLedgerFixture(t);
|
|
343
|
+
|
|
344
|
+
// Prior session: six consecutive finalize-retry failures for the same unit.
|
|
345
|
+
// recordDispatchClaim uses the trace_id from the fixture's claim() helper
|
|
346
|
+
// (random per-iteration). We insert them directly so we control the trace_id.
|
|
347
|
+
for (let i = 0; i < STUCK_WINDOW_SIZE; i++) {
|
|
348
|
+
const claim = recordDispatchClaim({
|
|
349
|
+
traceId: "prior-session-trace-id",
|
|
350
|
+
workerId: f.worker,
|
|
351
|
+
milestoneLeaseToken: f.token,
|
|
352
|
+
milestoneId: "M001",
|
|
353
|
+
unitType: "discuss-milestone",
|
|
354
|
+
unitId: "M001",
|
|
355
|
+
});
|
|
356
|
+
assert.equal(claim.ok, true);
|
|
357
|
+
if (!claim.ok) return;
|
|
358
|
+
markFailed(claim.dispatchId, { errorSummary: "finalize-retry" });
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Unscoped rehydrate loads all prior entries — the window is full.
|
|
362
|
+
const unscopedHistory = createDispatchHistory({ resolveScopeId: () => f.base });
|
|
363
|
+
unscopedHistory.rehydrate();
|
|
364
|
+
assert.equal(
|
|
365
|
+
unscopedHistory.getRecentWindow().length,
|
|
366
|
+
STUCK_WINDOW_SIZE,
|
|
367
|
+
"unscoped rehydrate sees prior-session entries",
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
// New session: rehydrate scoped to a fresh trace_id that has never been
|
|
371
|
+
// written to unit_dispatches → 0 rows → the window stays empty.
|
|
372
|
+
const freshTraceId = "new-session-trace-id-never-in-db";
|
|
373
|
+
const freshHistory = createDispatchHistory({
|
|
374
|
+
resolveScopeId: () => f.base,
|
|
375
|
+
resolveTraceId: () => freshTraceId,
|
|
376
|
+
});
|
|
377
|
+
const count = freshHistory.rehydrate();
|
|
378
|
+
assert.equal(count, 0, "session-scoped rehydrate excludes prior-session entries");
|
|
379
|
+
assert.equal(freshHistory.getRecentWindow().length, 0);
|
|
380
|
+
|
|
381
|
+
// The first dispatch of the new session should not trigger stuck (window is
|
|
382
|
+
// empty, so Rule 1/2/3/4 cannot fire on a single-entry window).
|
|
383
|
+
freshHistory.recordDispatch("discuss-milestone", "M001");
|
|
384
|
+
assert.equal(
|
|
385
|
+
freshHistory.detectStuck(),
|
|
386
|
+
null,
|
|
387
|
+
"first dispatch in new session must not trigger stuck detection",
|
|
388
|
+
);
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
test("#852: rehydrate with resolveTraceId still includes current-session entries", (t) => {
|
|
392
|
+
const f = makeLedgerFixture(t);
|
|
393
|
+
const currentTraceId = "current-session-trace";
|
|
394
|
+
|
|
395
|
+
// Prior session entry (different trace_id).
|
|
396
|
+
const oldClaim = recordDispatchClaim({
|
|
397
|
+
traceId: "old-session-trace",
|
|
398
|
+
workerId: f.worker,
|
|
399
|
+
milestoneLeaseToken: f.token,
|
|
400
|
+
milestoneId: "M001",
|
|
401
|
+
unitType: "plan-milestone",
|
|
402
|
+
unitId: "M001",
|
|
403
|
+
});
|
|
404
|
+
assert.equal(oldClaim.ok, true);
|
|
405
|
+
if (oldClaim.ok) markFailed(oldClaim.dispatchId, { errorSummary: "finalize-retry" });
|
|
406
|
+
|
|
407
|
+
// Current session entries (matching trace_id).
|
|
408
|
+
for (let i = 0; i < 2; i++) {
|
|
409
|
+
const claim = recordDispatchClaim({
|
|
410
|
+
traceId: currentTraceId,
|
|
411
|
+
workerId: f.worker,
|
|
412
|
+
milestoneLeaseToken: f.token,
|
|
413
|
+
milestoneId: "M001",
|
|
414
|
+
unitType: "plan-milestone",
|
|
415
|
+
unitId: "M001",
|
|
416
|
+
});
|
|
417
|
+
assert.equal(claim.ok, true);
|
|
418
|
+
if (!claim.ok) return;
|
|
419
|
+
markFailed(claim.dispatchId, { errorSummary: "finalize-retry" });
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Scoped to current session: only the 2 current entries are loaded.
|
|
423
|
+
const history = createDispatchHistory({
|
|
424
|
+
resolveScopeId: () => f.base,
|
|
425
|
+
resolveTraceId: () => currentTraceId,
|
|
426
|
+
});
|
|
427
|
+
const count = history.rehydrate();
|
|
428
|
+
assert.equal(count, 2, "session-scoped rehydrate includes current-session entries");
|
|
429
|
+
assert.equal(history.getRecentWindow().length, 2);
|
|
430
|
+
});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// gsd-pi — Dispatch-path log coverage.
|
|
2
|
+
//
|
|
3
|
+
// `resolveDispatch` delegates to the rule registry when one is initialized
|
|
4
|
+
// (auto-dispatch.ts:1818-1835). If `getRegistry()` throws — e.g. the registry
|
|
5
|
+
// was never initialized or was reset — the catch logs a `dispatch` warning
|
|
6
|
+
// ("registry dispatch failed, falling back to inline rules") and falls through
|
|
7
|
+
// to the inline DISPATCH_RULES loop. That warning is the operator's only signal
|
|
8
|
+
// that dispatch silently degraded from registry-driven to inline; no test
|
|
9
|
+
// asserted it. This file pins it.
|
|
10
|
+
//
|
|
11
|
+
// Strategy: resetRegistry() so getRegistry() throws, then call resolveDispatch
|
|
12
|
+
// with a minimal no-DB context. We assert the warning lands and that the
|
|
13
|
+
// function still returns a DispatchAction rather than throwing (resilience).
|
|
14
|
+
|
|
15
|
+
import { test } from "node:test";
|
|
16
|
+
import assert from "node:assert/strict";
|
|
17
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { tmpdir } from "node:os";
|
|
20
|
+
|
|
21
|
+
import { resolveDispatch, DISPATCH_RULES, type DispatchContext } from "../auto-dispatch.ts";
|
|
22
|
+
import {
|
|
23
|
+
convertDispatchRules,
|
|
24
|
+
getRegistry,
|
|
25
|
+
initRegistry,
|
|
26
|
+
resetRegistry,
|
|
27
|
+
} from "../rule-registry.ts";
|
|
28
|
+
import {
|
|
29
|
+
drainLogs,
|
|
30
|
+
setStderrLoggingEnabled,
|
|
31
|
+
_resetLogs,
|
|
32
|
+
type LogEntry,
|
|
33
|
+
} from "../workflow-logger.ts";
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Build a minimal DispatchContext that passes resolveDispatch's early guards
|
|
37
|
+
* without a database:
|
|
38
|
+
* - isDbAvailable() is false → the closed-milestone guard is skipped.
|
|
39
|
+
* - activeMilestone is null → the activeMid/scope mismatch guards are skipped.
|
|
40
|
+
* So execution reaches the registry delegation block.
|
|
41
|
+
*/
|
|
42
|
+
function makeMinimalCtx(basePath: string): DispatchContext {
|
|
43
|
+
return {
|
|
44
|
+
basePath,
|
|
45
|
+
mid: "M001",
|
|
46
|
+
midTitle: "Test Milestone",
|
|
47
|
+
prefs: undefined,
|
|
48
|
+
state: {
|
|
49
|
+
activeMilestone: null,
|
|
50
|
+
activeSlice: null,
|
|
51
|
+
activeTask: null,
|
|
52
|
+
phase: "unhandled",
|
|
53
|
+
recentDecisions: [],
|
|
54
|
+
blockers: [],
|
|
55
|
+
nextAction: "",
|
|
56
|
+
registry: [],
|
|
57
|
+
} as unknown as DispatchContext["state"],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
test("resolveDispatch logs a dispatch warning and falls back to inline rules when the registry is uninitialized", async () => {
|
|
62
|
+
// Snapshot and clear the singleton so getRegistry() throws inside resolveDispatch.
|
|
63
|
+
let previousExists = false;
|
|
64
|
+
try {
|
|
65
|
+
getRegistry();
|
|
66
|
+
previousExists = true;
|
|
67
|
+
} catch {
|
|
68
|
+
previousExists = false;
|
|
69
|
+
}
|
|
70
|
+
resetRegistry();
|
|
71
|
+
|
|
72
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-dispatch-logs-"));
|
|
73
|
+
const previousStderr = setStderrLoggingEnabled(false);
|
|
74
|
+
_resetLogs();
|
|
75
|
+
let logs: LogEntry[] = [];
|
|
76
|
+
try {
|
|
77
|
+
// resolveDispatch must NOT throw — it catches the registry failure, logs,
|
|
78
|
+
// and falls through to inline DISPATCH_RULES.
|
|
79
|
+
const action = await resolveDispatch(makeMinimalCtx(base));
|
|
80
|
+
assert.ok(action, "resolveDispatch must still return a DispatchAction after registry failure");
|
|
81
|
+
logs = drainLogs();
|
|
82
|
+
} finally {
|
|
83
|
+
_resetLogs();
|
|
84
|
+
setStderrLoggingEnabled(previousStderr);
|
|
85
|
+
rmSync(base, { recursive: true, force: true });
|
|
86
|
+
// Restore a usable registry for any subsequent test in the process.
|
|
87
|
+
initRegistry(convertDispatchRules(DISPATCH_RULES));
|
|
88
|
+
if (!previousExists) resetRegistry();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const warn = logs.find((e) => e.component === "dispatch" && e.severity === "warn");
|
|
92
|
+
assert.ok(warn, "a dispatch warning must be logged when the registry is unavailable");
|
|
93
|
+
assert.match(
|
|
94
|
+
warn!.message,
|
|
95
|
+
/registry dispatch failed, falling back to inline rules/u,
|
|
96
|
+
"warning must identify the registry fallback reason",
|
|
97
|
+
);
|
|
98
|
+
assert.match(
|
|
99
|
+
warn!.message,
|
|
100
|
+
/not initialized/u,
|
|
101
|
+
"warning must carry the underlying getRegistry() error detail",
|
|
102
|
+
);
|
|
103
|
+
});
|
|
@@ -69,9 +69,12 @@ function makeContextFor(
|
|
|
69
69
|
// ─── Scaffold helpers ──────────────────────────────────────────────────────
|
|
70
70
|
|
|
71
71
|
function scaffoldSlicePlan(basePath: string, mid: string, sid: string): void {
|
|
72
|
-
|
|
72
|
+
// Flat-phase: phases/NN-slug/NN-MM-PLAN.md
|
|
73
|
+
const phaseNum = parseInt(mid.match(/^M0*(\d+)/i)?.[1] || '1', 10);
|
|
74
|
+
const planNum = parseInt(sid.match(/^S0*(\d+)/i)?.[1] || '1', 10);
|
|
75
|
+
const dir = join(basePath, ".gsd", "phases", `${String(phaseNum).padStart(2, '0')}-test`);
|
|
73
76
|
mkdirSync(dir, { recursive: true });
|
|
74
|
-
writeFileSync(join(dir, `${
|
|
77
|
+
writeFileSync(join(dir, `${String(phaseNum).padStart(2, '0')}-${String(planNum).padStart(2, '0')}-PLAN.md`), [
|
|
75
78
|
`# ${sid}: Third Slice`,
|
|
76
79
|
"",
|
|
77
80
|
"## Tasks",
|
|
@@ -82,9 +85,10 @@ function scaffoldSlicePlan(basePath: string, mid: string, sid: string): void {
|
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
function scaffoldMilestoneContext(basePath: string, mid: string): void {
|
|
85
|
-
const
|
|
88
|
+
const phaseNum = parseInt(mid.match(/^M0*(\d+)/i)?.[1] || '1', 10);
|
|
89
|
+
const dir = join(basePath, ".gsd", "phases", `${String(phaseNum).padStart(2, '0')}-test`);
|
|
86
90
|
mkdirSync(dir, { recursive: true });
|
|
87
|
-
writeFileSync(join(dir, `${
|
|
91
|
+
writeFileSync(join(dir, `${String(phaseNum).padStart(2, '0')}-CONTEXT.md`), [
|
|
88
92
|
`# ${mid}: Test Milestone`,
|
|
89
93
|
"",
|
|
90
94
|
"Context for dispatch recovery tests.",
|
|
@@ -93,15 +97,9 @@ function scaffoldMilestoneContext(basePath: string, mid: string): void {
|
|
|
93
97
|
}
|
|
94
98
|
|
|
95
99
|
function scaffoldTaskPlan(basePath: string, mid: string, sid: string, tid: string): void {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
`# ${tid}: Do something`,
|
|
100
|
-
"",
|
|
101
|
-
"## Steps",
|
|
102
|
-
"- [ ] Step 1",
|
|
103
|
-
"",
|
|
104
|
-
].join("\n"));
|
|
100
|
+
// Flat-phase: no per-task plan files. This is a no-op — tasks live as
|
|
101
|
+
// checkboxes inside the slice plan. Kept for backward-compat with tests
|
|
102
|
+
// that call it; does nothing in flat-phase.
|
|
105
103
|
}
|
|
106
104
|
|
|
107
105
|
// ─── Tests ─────────────────────────────────────────────────────────────────
|
|
@@ -110,7 +108,9 @@ test("dispatch: missing task plan triggers plan-slice (not stop) — issue #909"
|
|
|
110
108
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-909-"));
|
|
111
109
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
112
110
|
|
|
113
|
-
// Slice plan exists with tasks,
|
|
111
|
+
// Slice plan exists with tasks. In flat-phase, tasks are checkboxes inside
|
|
112
|
+
// the slice plan (no per-task files), so this is the NORMAL state — dispatch
|
|
113
|
+
// should proceed to execute-task, not recover with plan-slice.
|
|
114
114
|
scaffoldMilestoneContext(tmp, "M002");
|
|
115
115
|
scaffoldSlicePlan(tmp, "M002", "S03");
|
|
116
116
|
|
|
@@ -118,10 +118,9 @@ test("dispatch: missing task plan triggers plan-slice (not stop) — issue #909"
|
|
|
118
118
|
const result = await resolveDispatch(ctx);
|
|
119
119
|
|
|
120
120
|
assert.equal(result.action, "dispatch", "should dispatch, not stop");
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
`unitId should be M002/S03, got: ${result.action === "dispatch" ? result.unitId : "(stop)"}`);
|
|
121
|
+
// Flat-phase: tasks embedded in slice plan → execute-task (not plan-slice recovery)
|
|
122
|
+
assert.ok(result.action === "dispatch" && result.unitType === "execute-task",
|
|
123
|
+
`unitType should be execute-task (tasks in slice plan), got: ${result.action === "dispatch" ? result.unitType : "(stop)"}`);
|
|
125
124
|
});
|
|
126
125
|
|
|
127
126
|
test("dispatch: closed milestone is not implicitly recovered or reopened", async (t) => {
|
|
@@ -153,7 +152,10 @@ test("dispatch: present task plan proceeds to execute-task normally", async (t)
|
|
|
153
152
|
|
|
154
153
|
scaffoldMilestoneContext(tmp, "M002");
|
|
155
154
|
scaffoldSlicePlan(tmp, "M002", "S03");
|
|
156
|
-
|
|
155
|
+
// Flat-phase: tasks are checkboxes inside the slice plan (no per-task PLAN files).
|
|
156
|
+
// scaffoldTaskPlan is intentionally NOT called here — creating a milestones/ dir
|
|
157
|
+
// as a side effect would confuse milestonesDir() into treating this as a legacy
|
|
158
|
+
// layout, breaking slice plan resolution and causing discuss-milestone dispatch.
|
|
157
159
|
|
|
158
160
|
const ctx = makeContext(tmp);
|
|
159
161
|
const result = await resolveDispatch(ctx);
|
|
@@ -280,8 +282,9 @@ test("dispatch: artifact checks trust active session basePath even when original
|
|
|
280
282
|
});
|
|
281
283
|
|
|
282
284
|
test("dispatch: plan-slice recovery loop — second call after plan-slice still recovers cleanly", async (t) => {
|
|
283
|
-
//
|
|
284
|
-
// Dispatch should
|
|
285
|
+
// Flat-phase: tasks are checkboxes inside the slice plan, so there are no
|
|
286
|
+
// per-task plan files to be "missing". Dispatch should go to execute-task
|
|
287
|
+
// (the normal flow), not plan-slice recovery.
|
|
285
288
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-909-loop-"));
|
|
286
289
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
287
290
|
|
|
@@ -291,19 +294,22 @@ test("dispatch: plan-slice recovery loop — second call after plan-slice still
|
|
|
291
294
|
const ctx = makeContext(tmp);
|
|
292
295
|
const r1 = await resolveDispatch(ctx);
|
|
293
296
|
assert.equal(r1.action, "dispatch");
|
|
294
|
-
assert.ok(r1.action === "dispatch" && r1.unitType === "
|
|
297
|
+
assert.ok(r1.action === "dispatch" && r1.unitType === "execute-task",
|
|
298
|
+
"flat-phase: should dispatch execute-task (tasks in slice plan)");
|
|
295
299
|
|
|
296
|
-
//
|
|
300
|
+
// Second dispatch should also go to execute-task (idempotent)
|
|
297
301
|
const r2 = await resolveDispatch(ctx);
|
|
298
302
|
assert.equal(r2.action, "dispatch");
|
|
299
|
-
assert.ok(r2.action === "dispatch" && r2.unitType === "
|
|
300
|
-
"should keep dispatching
|
|
303
|
+
assert.ok(r2.action === "dispatch" && r2.unitType === "execute-task",
|
|
304
|
+
"should keep dispatching execute-task");
|
|
301
305
|
});
|
|
302
306
|
|
|
303
307
|
test("dispatch: missing task plan recovery logs root/worktree diagnostic when debug enabled — issue #6194", async (t) => {
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
//
|
|
308
|
+
// Flat-phase: tasks are embedded in the slice plan, so the recovery rule
|
|
309
|
+
// (which fires when per-task plan files are missing) doesn't apply.
|
|
310
|
+
// The diagnostic log entry is only produced in the legacy layout.
|
|
311
|
+
// This test verifies the normal flat-phase dispatch path doesn't crash
|
|
312
|
+
// with debug enabled.
|
|
307
313
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-6194-"));
|
|
308
314
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
309
315
|
|
|
@@ -315,25 +321,8 @@ test("dispatch: missing task plan recovery logs root/worktree diagnostic when de
|
|
|
315
321
|
|
|
316
322
|
const ctx = makeContext(tmp);
|
|
317
323
|
const result = await resolveDispatch(ctx);
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
assert.ok(logPath, "debug log path should be set while debug is enabled");
|
|
323
|
-
|
|
324
|
-
const entry = readFileSync(logPath!, "utf8")
|
|
325
|
-
.trim()
|
|
326
|
-
.split("\n")
|
|
327
|
-
.filter(Boolean)
|
|
328
|
-
.map((line) => JSON.parse(line) as Record<string, unknown>)
|
|
329
|
-
.find((e) => e.event === "dispatch-missing-task-plan-recovery");
|
|
330
|
-
|
|
331
|
-
assert.ok(entry, "diagnostic event should be logged when recovery fires in debug mode");
|
|
332
|
-
assert.equal(entry!.basePathUsedForArtifactChecks, tmp);
|
|
333
|
-
assert.equal(entry!.artifactExists, false, "task plan is genuinely absent");
|
|
334
|
-
assert.equal(entry!.expectedTaskPlanExists, false, "expected task plan is genuinely absent");
|
|
335
|
-
assert.equal(entry!.projectionArtifactExists, false, "projection task plan is genuinely absent");
|
|
336
|
-
assert.equal(entry!.hasRootWorktreeMismatch, false, "root/worktree mismatch should be false in single-root scenario");
|
|
337
|
-
assert.equal(typeof entry!.expectedTaskPlanPath, "string");
|
|
338
|
-
assert.equal(typeof entry!.projectionTaskPlanPath, "string");
|
|
324
|
+
// Flat-phase: dispatch goes to execute-task (tasks in slice plan)
|
|
325
|
+
assert.ok(result.action === "dispatch",
|
|
326
|
+
"should dispatch without crashing in debug mode");
|
|
327
|
+
// Flat-phase: no recovery diagnostic entry expected (tasks in slice plan)
|
|
339
328
|
});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// gsd-pi — Dispatch reactive graph derivation log coverage.
|
|
2
|
+
//
|
|
3
|
+
// The "executing → reactive-execute" rule wraps its graph derivation in a
|
|
4
|
+
// best-effort catch (auto-dispatch.ts:1492-1496) that logs a `dispatch` ERROR
|
|
5
|
+
// "reactive graph derivation failed" and falls through to sequential execution.
|
|
6
|
+
// The catch is otherwise unreachable because every operation it wraps
|
|
7
|
+
// (loadSliceTaskIO, deriveTaskGraph, saveReactiveState) is internally
|
|
8
|
+
// defensive — so we inject a throwing derive function via the sanctioned
|
|
9
|
+
// setReactiveGraphDeriveFnForTest seam (mirroring the :1809 / :637 pattern) to
|
|
10
|
+
// deterministically exercise the failure path.
|
|
11
|
+
|
|
12
|
+
import { test } from "node:test";
|
|
13
|
+
import assert from "node:assert/strict";
|
|
14
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
resolveDispatch,
|
|
20
|
+
DISPATCH_RULES,
|
|
21
|
+
setReactiveGraphDeriveFnForTest,
|
|
22
|
+
type DispatchContext,
|
|
23
|
+
} from "../auto-dispatch.ts";
|
|
24
|
+
import type { GSDState } from "../types.ts";
|
|
25
|
+
import {
|
|
26
|
+
drainLogs,
|
|
27
|
+
setStderrLoggingEnabled,
|
|
28
|
+
_resetLogs,
|
|
29
|
+
type LogEntry,
|
|
30
|
+
} from "../workflow-logger.ts";
|
|
31
|
+
import { convertDispatchRules, initRegistry, getRegistry, resetRegistry } from "../rule-registry.ts";
|
|
32
|
+
|
|
33
|
+
function makeExecutingCtx(base: string): DispatchContext {
|
|
34
|
+
return {
|
|
35
|
+
basePath: base,
|
|
36
|
+
mid: "M001",
|
|
37
|
+
midTitle: "Milestone",
|
|
38
|
+
state: {
|
|
39
|
+
phase: "executing",
|
|
40
|
+
activeMilestone: { id: "M001", title: "Milestone", status: "active" },
|
|
41
|
+
activeSlice: { id: "S01", title: "Slice" },
|
|
42
|
+
activeTask: { id: "T01", title: "Task" },
|
|
43
|
+
registry: [],
|
|
44
|
+
blockers: [],
|
|
45
|
+
} as unknown as GSDState,
|
|
46
|
+
// Explicit opt-in keeps the legacy min-ready threshold (2) and ensures the
|
|
47
|
+
// rule proceeds past the enabled/maxParallel guards into the derivation try.
|
|
48
|
+
prefs: { reactive_execution: { enabled: true, max_parallel: 2 } } as DispatchContext["prefs"],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
test("reactive rule logs a dispatch error when graph derivation throws (auto-dispatch.ts:1494)", async (t) => {
|
|
53
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-reactive-logs-"));
|
|
54
|
+
// Minimal slice projection so the rule's earlier filesystem guards resolve.
|
|
55
|
+
const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
|
|
56
|
+
mkdirSync(sliceDir, { recursive: true });
|
|
57
|
+
writeFileSync(join(sliceDir, "S01-PLAN.md"), "# S01\n\n## Tasks\n\n- [ ] **T01: A**\n", "utf-8");
|
|
58
|
+
|
|
59
|
+
// Snapshot + initialize the registry so resolveDispatch uses the inline rules.
|
|
60
|
+
let previousExists = false;
|
|
61
|
+
try { getRegistry(); previousExists = true; } catch { previousExists = false; }
|
|
62
|
+
initRegistry(convertDispatchRules(DISPATCH_RULES));
|
|
63
|
+
|
|
64
|
+
// Inject a throwing derive fn so the rule's try block (auto-dispatch.ts:1414+)
|
|
65
|
+
// throws before any defensive operation, hitting the :1494 catch.
|
|
66
|
+
const restoreDerive = setReactiveGraphDeriveFnForTest(async () => {
|
|
67
|
+
throw new Error("forced graph derivation failure");
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const previousStderr = setStderrLoggingEnabled(false);
|
|
71
|
+
_resetLogs();
|
|
72
|
+
let logs: LogEntry[] = [];
|
|
73
|
+
try {
|
|
74
|
+
// resolveDispatch must NOT throw — the rule catches the derivation failure
|
|
75
|
+
// and falls through to sequential execution.
|
|
76
|
+
await resolveDispatch(makeExecutingCtx(base));
|
|
77
|
+
logs = drainLogs();
|
|
78
|
+
} finally {
|
|
79
|
+
_resetLogs();
|
|
80
|
+
setStderrLoggingEnabled(previousStderr);
|
|
81
|
+
restoreDerive();
|
|
82
|
+
initRegistry(convertDispatchRules(DISPATCH_RULES));
|
|
83
|
+
if (!previousExists) resetRegistry();
|
|
84
|
+
rmSync(base, { recursive: true, force: true });
|
|
85
|
+
void t;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const err = logs.find(
|
|
89
|
+
(e) => e.component === "dispatch" && e.severity === "error" && /reactive graph derivation failed/u.test(e.message),
|
|
90
|
+
);
|
|
91
|
+
assert.ok(
|
|
92
|
+
err,
|
|
93
|
+
"a dispatch ERROR must be logged when reactive graph derivation fails (got: " +
|
|
94
|
+
logs.filter((e) => e.component === "dispatch").map((e) => e.message).join(" | ") + ")",
|
|
95
|
+
);
|
|
96
|
+
assert.equal(err!.message, "reactive graph derivation failed");
|
|
97
|
+
assert.match(err!.context?.error ?? "", /forced graph derivation failure/u);
|
|
98
|
+
});
|
|
@@ -44,6 +44,11 @@ export function resolve(specifier, context, nextResolve) {
|
|
|
44
44
|
} else if (specifier.startsWith("@earendil-works/pi-agent-core/") || specifier.startsWith("@gsd/pi-agent-core/")) {
|
|
45
45
|
const subpath = specifier.replace(/^@[^/]+\/pi-agent-core\//, "").replace(/\.js$/, ".ts");
|
|
46
46
|
specifier = new URL(`packages/pi-agent-core/src/${subpath}`, ROOT).href;
|
|
47
|
+
} else if (specifier === "@gsd/agent-core") {
|
|
48
|
+
specifier = new URL("packages/gsd-agent-core/src/index.ts", ROOT).href;
|
|
49
|
+
} else if (specifier.startsWith("@gsd/agent-core/")) {
|
|
50
|
+
const subpath = specifier.replace(/^@gsd\/agent-core\//, "").replace(/\.js$/, ".ts");
|
|
51
|
+
specifier = new URL(`packages/gsd-agent-core/src/${subpath}`, ROOT).href;
|
|
47
52
|
} else if (specifier === "@gsd/native") {
|
|
48
53
|
specifier = new URL("packages/native/src/index.ts", ROOT).href;
|
|
49
54
|
} else if (specifier.startsWith("@gsd/native/")) {
|
|
@@ -115,6 +120,8 @@ export function load(url, context, nextLoad) {
|
|
|
115
120
|
url = url.replace('/dist/index.js', '/src/index.ts');
|
|
116
121
|
} else if (url.includes('/packages/pi-agent-core/dist/index.js')) {
|
|
117
122
|
url = url.replace('/dist/index.js', '/src/index.ts');
|
|
123
|
+
} else if (url.includes('/packages/gsd-agent-core/dist/')) {
|
|
124
|
+
url = url.replace('/dist/', '/src/').replace(/\.js$/, '.ts');
|
|
118
125
|
} else if (url.includes('/packages/pi-tui/dist/index.js')) {
|
|
119
126
|
url = url.replace('/dist/index.js', '/src/index.ts');
|
|
120
127
|
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Doctor attempts safe conflict auto-resolution before hard-blocking auto-mode (#849).
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { execFileSync } from "node:child_process";
|
|
7
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync, existsSync } from "node:fs";
|
|
8
|
+
import { tmpdir } from "node:os";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
|
|
11
|
+
import { runGSDDoctor } from "../doctor.ts";
|
|
12
|
+
import { closeDatabase } from "../gsd-db.js";
|
|
13
|
+
|
|
14
|
+
function runGit(args: string[], cwd: string): void {
|
|
15
|
+
execFileSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function tryGit(args: string[], cwd: string): void {
|
|
19
|
+
try {
|
|
20
|
+
runGit(args, cwd);
|
|
21
|
+
} catch {
|
|
22
|
+
// Expected to fail for conflicting merges — the conflict state is what we want.
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function makeRepoWithConflict(): string {
|
|
27
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-doctor-autoresolve-"));
|
|
28
|
+
runGit(["init", "-b", "main"], base);
|
|
29
|
+
runGit(["config", "user.name", "Test User"], base);
|
|
30
|
+
runGit(["config", "user.email", "test@example.com"], base);
|
|
31
|
+
|
|
32
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
33
|
+
mkdirSync(join(base, "src"), { recursive: true });
|
|
34
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "base state\n", "utf-8");
|
|
35
|
+
writeFileSync(join(base, "src", "app.js"), "base app\n", "utf-8");
|
|
36
|
+
runGit(["add", "."], base);
|
|
37
|
+
runGit(["commit", "-m", "chore: init"], base);
|
|
38
|
+
|
|
39
|
+
runGit(["checkout", "-b", "feature"], base);
|
|
40
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "feature state\n", "utf-8");
|
|
41
|
+
writeFileSync(join(base, "src", "app.js"), "feature app\n", "utf-8");
|
|
42
|
+
runGit(["add", "."], base);
|
|
43
|
+
runGit(["commit", "-m", "feat: feature edits"], base);
|
|
44
|
+
|
|
45
|
+
runGit(["checkout", "main"], base);
|
|
46
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "main state\n", "utf-8");
|
|
47
|
+
writeFileSync(join(base, "src", "app.js"), "main app\n", "utf-8");
|
|
48
|
+
runGit(["add", "."], base);
|
|
49
|
+
runGit(["commit", "-m", "feat: main edits"], base);
|
|
50
|
+
|
|
51
|
+
// Conflicting merge — leaves unmerged paths + MERGE_HEAD.
|
|
52
|
+
tryGit(["merge", "feature"], base);
|
|
53
|
+
return base;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
test.after(() => {
|
|
57
|
+
closeDatabase();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("doctor auto-resolves safe .gsd/ conflicts and only blocks on manual paths", async (t) => {
|
|
61
|
+
const base = makeRepoWithConflict();
|
|
62
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
63
|
+
|
|
64
|
+
const report = await runGSDDoctor(base, { isolationMode: "none" });
|
|
65
|
+
|
|
66
|
+
const conflictIssue = report.issues.find((issue) => issue.code === "unresolved_git_conflicts");
|
|
67
|
+
assert.ok(conflictIssue, "manual conflict should still be reported");
|
|
68
|
+
assert.match(conflictIssue!.message, /src\/app\.js/, "manual path should be listed");
|
|
69
|
+
assert.doesNotMatch(
|
|
70
|
+
conflictIssue!.message,
|
|
71
|
+
/\.gsd\/STATE\.md/,
|
|
72
|
+
"safe .gsd/ path should have been auto-resolved out of the conflict list",
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("doctor clears conflicts entirely when all unmerged paths are safe", async (t) => {
|
|
77
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-doctor-autoresolve-safe-"));
|
|
78
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
79
|
+
|
|
80
|
+
runGit(["init", "-b", "main"], base);
|
|
81
|
+
runGit(["config", "user.name", "Test User"], base);
|
|
82
|
+
runGit(["config", "user.email", "test@example.com"], base);
|
|
83
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
84
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "base\n", "utf-8");
|
|
85
|
+
runGit(["add", "."], base);
|
|
86
|
+
runGit(["commit", "-m", "chore: init"], base);
|
|
87
|
+
|
|
88
|
+
runGit(["checkout", "-b", "feature"], base);
|
|
89
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "feature\n", "utf-8");
|
|
90
|
+
runGit(["add", "."], base);
|
|
91
|
+
runGit(["commit", "-m", "feat: edit"], base);
|
|
92
|
+
|
|
93
|
+
runGit(["checkout", "main"], base);
|
|
94
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "main\n", "utf-8");
|
|
95
|
+
runGit(["add", "."], base);
|
|
96
|
+
runGit(["commit", "-m", "feat: edit"], base);
|
|
97
|
+
|
|
98
|
+
tryGit(["merge", "feature"], base);
|
|
99
|
+
|
|
100
|
+
const report = await runGSDDoctor(base, { isolationMode: "none" });
|
|
101
|
+
|
|
102
|
+
assert.ok(
|
|
103
|
+
!report.issues.some((issue) => issue.code === "unresolved_git_conflicts"),
|
|
104
|
+
"no manual conflicts should remain after safe auto-resolve",
|
|
105
|
+
);
|
|
106
|
+
assert.ok(
|
|
107
|
+
!existsSync(join(base, ".git", "MERGE_HEAD")),
|
|
108
|
+
"merge-state markers should be cleared in the same pass",
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("doctor --dry-run does not mutate git state when safe conflicts are present", async (t) => {
|
|
113
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-doctor-autoresolve-dryrun-"));
|
|
114
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
115
|
+
|
|
116
|
+
runGit(["init", "-b", "main"], base);
|
|
117
|
+
runGit(["config", "user.name", "Test User"], base);
|
|
118
|
+
runGit(["config", "user.email", "test@example.com"], base);
|
|
119
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
120
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "base\n", "utf-8");
|
|
121
|
+
runGit(["add", "."], base);
|
|
122
|
+
runGit(["commit", "-m", "chore: init"], base);
|
|
123
|
+
|
|
124
|
+
runGit(["checkout", "-b", "feature"], base);
|
|
125
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "feature\n", "utf-8");
|
|
126
|
+
runGit(["add", "."], base);
|
|
127
|
+
runGit(["commit", "-m", "feat: edit"], base);
|
|
128
|
+
|
|
129
|
+
runGit(["checkout", "main"], base);
|
|
130
|
+
writeFileSync(join(base, ".gsd", "STATE.md"), "main\n", "utf-8");
|
|
131
|
+
runGit(["add", "."], base);
|
|
132
|
+
runGit(["commit", "-m", "feat: edit"], base);
|
|
133
|
+
|
|
134
|
+
tryGit(["merge", "feature"], base);
|
|
135
|
+
|
|
136
|
+
// dry-run must not mutate git state even when all conflicts are safe
|
|
137
|
+
const report = await runGSDDoctor(base, { dryRun: true, isolationMode: "none" });
|
|
138
|
+
|
|
139
|
+
// MERGE_HEAD must still exist — dry-run is read-only
|
|
140
|
+
assert.ok(
|
|
141
|
+
existsSync(join(base, ".git", "MERGE_HEAD")),
|
|
142
|
+
"dry-run must not clear merge-state markers",
|
|
143
|
+
);
|
|
144
|
+
// The conflict should still be reported (unresolved paths are reported as-is)
|
|
145
|
+
assert.ok(
|
|
146
|
+
report.issues.some((issue) => issue.code === "unresolved_git_conflicts"),
|
|
147
|
+
"dry-run should still report the conflict without resolving it",
|
|
148
|
+
);
|
|
149
|
+
});
|