@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
|
@@ -165,7 +165,7 @@ function makeFixture(opts: FixtureOptions = {}): Fixture {
|
|
|
165
165
|
session.resourceVersionOnStart = null;
|
|
166
166
|
|
|
167
167
|
const ctx: OrchestratorContext = {
|
|
168
|
-
ctx: { model: {}, modelRegistry: { getAll: () => [] }, ui: { notify() {} } } as never,
|
|
168
|
+
ctx: { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] }, ui: { notify() {} } } as never,
|
|
169
169
|
pi: { getActiveTools: () => [] } as never,
|
|
170
170
|
dispatchBasePath: base,
|
|
171
171
|
runtimeBasePath: base,
|
|
@@ -920,15 +920,21 @@ test("stuck-loop: stop('user-request') resets the ring (hard stop)", async (t) =
|
|
|
920
920
|
assert.equal(next.kind, "advanced");
|
|
921
921
|
});
|
|
922
922
|
|
|
923
|
-
test("stuck-loop #
|
|
923
|
+
test("stuck-loop #852 fix: start() does NOT rehydrate so prior-session failures cannot false-positive on a fresh session", async (t) => {
|
|
924
924
|
const f = makeFixture();
|
|
925
925
|
t.after(() => f.cleanup());
|
|
926
926
|
|
|
927
|
-
// Simulate a PRIOR session:
|
|
928
|
-
//
|
|
929
|
-
//
|
|
930
|
-
//
|
|
931
|
-
//
|
|
927
|
+
// Simulate a PRIOR session: STUCK_WINDOW_SIZE-1 consecutive dispatches of
|
|
928
|
+
// the same unit, all failed. Before #852 was fixed, start() would rehydrate
|
|
929
|
+
// these stale entries and the very next advance() would declare stuck —
|
|
930
|
+
// killing the new session before a single dispatch ran. The fix: start()
|
|
931
|
+
// clears the window WITHOUT rehydrating, so prior-session failures are
|
|
932
|
+
// invisible to the fresh session.
|
|
933
|
+
//
|
|
934
|
+
// Cross-session stuck detection is preserved by resume() (which rehydrates
|
|
935
|
+
// when the window is empty after a crash) and by within-session accumulation
|
|
936
|
+
// (STUCK_WINDOW_SIZE dispatches of the same unit within one session still
|
|
937
|
+
// trigger stuck detection). See the resume() test below.
|
|
932
938
|
const worker = registerAutoWorker({ projectRootRealpath: normalizeRealPath(f.base) });
|
|
933
939
|
const lease = claimMilestoneLease(worker, "M001");
|
|
934
940
|
assert.equal(lease.ok, true);
|
|
@@ -950,13 +956,10 @@ test("stuck-loop #482 regression: start() rehydrates the window from the dispatc
|
|
|
950
956
|
const started = await f.orchestrator.start(SESSION_CONTEXT);
|
|
951
957
|
assert.equal(started.kind, "started");
|
|
952
958
|
|
|
953
|
-
// The
|
|
954
|
-
//
|
|
959
|
+
// The fresh session must advance past the prior-session history: window is
|
|
960
|
+
// empty after start(), so the first advance dispatches normally.
|
|
955
961
|
const result = await f.orchestrator.advance();
|
|
956
|
-
assert.equal(result.kind, "blocked");
|
|
957
|
-
if (result.kind !== "blocked") return;
|
|
958
|
-
assert.equal(result.action, "stop");
|
|
959
|
-
assert.ok(result.reason.startsWith("stuck-loop:"), `expected stuck-loop reason, got: ${result.reason}`);
|
|
962
|
+
assert.equal(result.kind, "advanced", "fresh session must not be blocked by stale prior-session dispatch history");
|
|
960
963
|
});
|
|
961
964
|
|
|
962
965
|
test("stuck-loop #482: resume() with an empty window rehydrates from the dispatch ledger", async (t) => {
|
|
@@ -1109,6 +1112,7 @@ test("decideOrchestratorDispatch forwards session-derived dispatch inputs identi
|
|
|
1109
1112
|
try {
|
|
1110
1113
|
const fakeModelRegistry = {
|
|
1111
1114
|
getAll: () => [],
|
|
1115
|
+
getAvailable: () => [],
|
|
1112
1116
|
getProviderAuthMode: (_provider: string) => "apiKey" as const,
|
|
1113
1117
|
};
|
|
1114
1118
|
const ctx = {
|
|
@@ -1208,10 +1212,12 @@ test("decideOrchestratorDispatch prefers caller-supplied dispatch inputs over ct
|
|
|
1208
1212
|
try {
|
|
1209
1213
|
const ctxModelRegistry = {
|
|
1210
1214
|
getAll: () => [],
|
|
1215
|
+
getAvailable: () => [],
|
|
1211
1216
|
getProviderAuthMode: (_provider: string) => "apiKey" as const,
|
|
1212
1217
|
};
|
|
1213
1218
|
const overrideModelRegistry = {
|
|
1214
1219
|
getAll: () => [],
|
|
1220
|
+
getAvailable: () => [],
|
|
1215
1221
|
getProviderAuthMode: (_provider: string) => "oauth" as const,
|
|
1216
1222
|
};
|
|
1217
1223
|
const ctx = {
|
|
@@ -1268,7 +1274,7 @@ test("decideOrchestratorDispatch forwards constructor session when advance input
|
|
|
1268
1274
|
setRegistry(new RuleRegistry([captureRule]));
|
|
1269
1275
|
|
|
1270
1276
|
try {
|
|
1271
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1277
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1272
1278
|
const pi = { getActiveTools: () => [] } as never;
|
|
1273
1279
|
const session = {
|
|
1274
1280
|
basePath: "/tmp/worktree-fixture",
|
|
@@ -1313,7 +1319,7 @@ test("decideOrchestratorDispatch evaluates deep pre-planning rules without an ac
|
|
|
1313
1319
|
nextAction: "All remaining milestones are parked (M027). Run /gsd unpark M027 or create a new milestone.",
|
|
1314
1320
|
registry: [{ id: "M027", title: "Parked", status: "parked" }],
|
|
1315
1321
|
};
|
|
1316
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1322
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1317
1323
|
const pi = { getActiveTools: () => [] } as never;
|
|
1318
1324
|
const session = {
|
|
1319
1325
|
basePath: base,
|
|
@@ -1354,7 +1360,7 @@ test("decideOrchestratorDispatch does not replay milestone-scoped verification r
|
|
|
1354
1360
|
nextAction: "All remaining milestones are parked (M027). Run /gsd unpark M027 or create a new milestone.",
|
|
1355
1361
|
registry: [{ id: "M027", title: "Parked", status: "parked" }],
|
|
1356
1362
|
};
|
|
1357
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1363
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1358
1364
|
const pi = { getActiveTools: () => [] } as never;
|
|
1359
1365
|
const stalePendingRetry = {
|
|
1360
1366
|
unitType: "execute-task",
|
|
@@ -1415,7 +1421,7 @@ test("decideOrchestratorDispatch adopts next active milestone after the session
|
|
|
1415
1421
|
setRegistry(new RuleRegistry([captureRule]));
|
|
1416
1422
|
|
|
1417
1423
|
try {
|
|
1418
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1424
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1419
1425
|
const pi = { getActiveTools: () => [] } as never;
|
|
1420
1426
|
const session = {
|
|
1421
1427
|
basePath: base,
|
|
@@ -1449,7 +1455,7 @@ test("decideOrchestratorDispatch keeps blocking stale milestone worktree scope",
|
|
|
1449
1455
|
};
|
|
1450
1456
|
const worktreePath = join(base, ".gsd", "worktrees", "M001");
|
|
1451
1457
|
mkdirSync(worktreePath, { recursive: true });
|
|
1452
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1458
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1453
1459
|
const pi = { getActiveTools: () => [] } as never;
|
|
1454
1460
|
const session = {
|
|
1455
1461
|
basePath: worktreePath,
|
|
@@ -1470,7 +1476,7 @@ test("decideOrchestratorDispatch keeps blocking stale milestone worktree scope",
|
|
|
1470
1476
|
|
|
1471
1477
|
test("decideOrchestratorDispatch replays pending verification retry dispatch", async () => {
|
|
1472
1478
|
const stateSnapshot = makeState();
|
|
1473
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1479
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1474
1480
|
const pi = { getActiveTools: () => [] } as never;
|
|
1475
1481
|
const session = {
|
|
1476
1482
|
basePath: "/tmp/worktree-fixture",
|
|
@@ -1527,7 +1533,7 @@ test("decideOrchestratorDispatch clears verification retry state when skipping a
|
|
|
1527
1533
|
};
|
|
1528
1534
|
setRegistry(new RuleRegistry([retryRule]));
|
|
1529
1535
|
|
|
1530
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1536
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1531
1537
|
const pi = { getActiveTools: () => [] } as never;
|
|
1532
1538
|
const session = {
|
|
1533
1539
|
basePath: base,
|
|
@@ -1571,7 +1577,7 @@ test("decideOrchestratorDispatch preserves stop reason as a blocked decision", a
|
|
|
1571
1577
|
setRegistry(new RuleRegistry([stopRule]));
|
|
1572
1578
|
|
|
1573
1579
|
try {
|
|
1574
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1580
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1575
1581
|
const pi = { getActiveTools: () => [] } as never;
|
|
1576
1582
|
|
|
1577
1583
|
const result = await decideOrchestratorDispatch(ctx, pi, "/tmp/parity-fixture", undefined, { stateSnapshot });
|
|
@@ -1601,7 +1607,7 @@ test("decideOrchestratorDispatch preserves dispatch skip instead of collapsing i
|
|
|
1601
1607
|
setRegistry(new RuleRegistry([skipRule]));
|
|
1602
1608
|
|
|
1603
1609
|
try {
|
|
1604
|
-
const ctx = { model: {}, modelRegistry: { getAll: () => [] } } as never;
|
|
1610
|
+
const ctx = { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] } } as never;
|
|
1605
1611
|
const pi = { getActiveTools: () => [] } as never;
|
|
1606
1612
|
|
|
1607
1613
|
const result = await decideOrchestratorDispatch(ctx, pi, "/tmp/parity-fixture", undefined, { stateSnapshot });
|
|
@@ -36,7 +36,12 @@ test("resolveMilestonePath returns null for missing milestone", (t) => {
|
|
|
36
36
|
|
|
37
37
|
test("resolveMilestonePath returns path for existing milestone", (t) => {
|
|
38
38
|
const base = makeTmpBase();
|
|
39
|
-
|
|
39
|
+
const mDir = join(base, ".gsd", "milestones", "M001");
|
|
40
|
+
mkdirSync(mDir, { recursive: true });
|
|
41
|
+
// A content-bearing legacy milestone dir requires at least one non-META file
|
|
42
|
+
// (dirIsContentBearingLegacyMilestone); an empty dir is now treated as a
|
|
43
|
+
// metadata-only placeholder left by git-service.ts and is not legacy layout.
|
|
44
|
+
writeFileSync(join(mDir, "M001-CONTEXT.md"), "# M001\n");
|
|
40
45
|
t.after(() => cleanup(base));
|
|
41
46
|
|
|
42
47
|
const result = resolveMilestonePath(base, "M001");
|
|
@@ -93,7 +98,11 @@ test("stale milestone: completed (has SUMMARY) means paused session should be di
|
|
|
93
98
|
|
|
94
99
|
test("valid milestone: exists and has no SUMMARY means paused session is valid", (t) => {
|
|
95
100
|
const base = makeTmpBase();
|
|
96
|
-
|
|
101
|
+
const mDir = join(base, ".gsd", "milestones", "M001");
|
|
102
|
+
mkdirSync(mDir, { recursive: true });
|
|
103
|
+
// A content-bearing legacy milestone dir requires at least one non-META file;
|
|
104
|
+
// use CONTEXT as the existing content, with no SUMMARY (milestone still active).
|
|
105
|
+
writeFileSync(join(mDir, "M001-CONTEXT.md"), "# M001\n");
|
|
97
106
|
t.after(() => cleanup(base));
|
|
98
107
|
|
|
99
108
|
const dir = resolveMilestonePath(base, "M001");
|
|
@@ -5,7 +5,7 @@ import assert from "node:assert/strict";
|
|
|
5
5
|
import { execFileSync } from "node:child_process";
|
|
6
6
|
import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
7
7
|
import { tmpdir } from "node:os";
|
|
8
|
-
import { join } from "node:path";
|
|
8
|
+
import { join, dirname } from "node:path";
|
|
9
9
|
|
|
10
10
|
import {
|
|
11
11
|
anchorProcessCwdForAutoResume,
|
|
@@ -133,6 +133,23 @@ test("anchorProcessCwdForAutoResume recovers when current cwd was deleted", () =
|
|
|
133
133
|
}
|
|
134
134
|
});
|
|
135
135
|
|
|
136
|
+
test("anchorProcessCwdForAutoResume falls back when primary basePath is missing", () => {
|
|
137
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-resume-cwd-anchor-fallback-"));
|
|
138
|
+
const missingWorktree = join(base, ".gsd-worktrees", "M002");
|
|
139
|
+
const previousCwd = process.cwd();
|
|
140
|
+
|
|
141
|
+
mkdirSync(base, { recursive: true });
|
|
142
|
+
mkdirSync(dirname(missingWorktree), { recursive: true });
|
|
143
|
+
|
|
144
|
+
try {
|
|
145
|
+
assert.equal(anchorProcessCwdForAutoResume(missingWorktree, [base]), true);
|
|
146
|
+
assert.equal(realpathSync(process.cwd()), realpathSync(base));
|
|
147
|
+
} finally {
|
|
148
|
+
process.chdir(previousCwd);
|
|
149
|
+
rmSync(base, { recursive: true, force: true });
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
|
|
136
153
|
test("cleanupAfterLoopExit clears status and progress widget without replacing outcome surface", async () => {
|
|
137
154
|
const statusCalls: unknown[] = [];
|
|
138
155
|
const widgetCalls: unknown[] = [];
|
|
@@ -845,7 +862,7 @@ test("stopAuto completion closeout emits a headless terminal notification withou
|
|
|
845
862
|
"headless completion closeout must emit the terminal stop notification headless waits for",
|
|
846
863
|
);
|
|
847
864
|
assert.equal(
|
|
848
|
-
typeof widgetCalls.filter(([key]) => key === "gsd-
|
|
865
|
+
typeof widgetCalls.filter(([key]) => key === "gsd-outcome").at(-1)?.[1],
|
|
849
866
|
"function",
|
|
850
867
|
"headless completion closeout must still leave the final roll-up widget installed",
|
|
851
868
|
);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { runPostUnitVerification } from "../auto-verification.ts";
|
|
4
|
+
|
|
5
|
+
function createVerificationContext(currentUnit: { type: string; id: string } | null) {
|
|
6
|
+
return {
|
|
7
|
+
s: {
|
|
8
|
+
currentUnit,
|
|
9
|
+
},
|
|
10
|
+
ctx: {
|
|
11
|
+
ui: {
|
|
12
|
+
notify() {
|
|
13
|
+
throw new Error("notify should not be called for pass-through units");
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
pi: {},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
test("post-unit verification continues when no host-owned verification is needed", async () => {
|
|
22
|
+
let paused = false;
|
|
23
|
+
const pauseAuto = async () => {
|
|
24
|
+
paused = true;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
assert.equal(await runPostUnitVerification(createVerificationContext(null) as never, pauseAuto), "continue");
|
|
28
|
+
assert.equal(
|
|
29
|
+
await runPostUnitVerification(
|
|
30
|
+
createVerificationContext({ type: "plan-slice", id: "M001-S001" }) as never,
|
|
31
|
+
pauseAuto,
|
|
32
|
+
),
|
|
33
|
+
"continue",
|
|
34
|
+
);
|
|
35
|
+
assert.equal(paused, false);
|
|
36
|
+
});
|
|
@@ -47,6 +47,23 @@ describe("isSafeToAutoResolve", () => {
|
|
|
47
47
|
assert.ok(isSafeToAutoResolve("out/bundle.css.map"));
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
+
// ─── Regenerable dependency lockfiles ────────────────────────────────────
|
|
51
|
+
test("returns true for common lockfiles", () => {
|
|
52
|
+
assert.ok(isSafeToAutoResolve("pnpm-lock.yaml"));
|
|
53
|
+
assert.ok(isSafeToAutoResolve("packages/app/pnpm-lock.yaml"));
|
|
54
|
+
assert.ok(isSafeToAutoResolve("package-lock.json"));
|
|
55
|
+
assert.ok(isSafeToAutoResolve("npm-shrinkwrap.json"));
|
|
56
|
+
assert.ok(isSafeToAutoResolve("yarn.lock"));
|
|
57
|
+
assert.ok(isSafeToAutoResolve("bun.lockb"));
|
|
58
|
+
assert.ok(isSafeToAutoResolve("bun.lock"));
|
|
59
|
+
assert.ok(isSafeToAutoResolve("Cargo.lock"));
|
|
60
|
+
assert.ok(isSafeToAutoResolve("crates/core/Cargo.lock"));
|
|
61
|
+
assert.ok(isSafeToAutoResolve("composer.lock"));
|
|
62
|
+
assert.ok(isSafeToAutoResolve("Gemfile.lock"));
|
|
63
|
+
assert.ok(isSafeToAutoResolve("Pipfile.lock"));
|
|
64
|
+
assert.ok(isSafeToAutoResolve("poetry.lock"));
|
|
65
|
+
});
|
|
66
|
+
|
|
50
67
|
// ─── Real source files (should NOT be auto-resolved) ─────────────────────
|
|
51
68
|
test("returns false for .ts source files", () => {
|
|
52
69
|
assert.ok(!isSafeToAutoResolve("src/index.ts"));
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// gsd-pi — Blocker-placeholder recovery log coverage.
|
|
2
|
+
//
|
|
3
|
+
// writeBlockerPlaceholder (auto-recovery.ts:782) writes a placeholder artifact
|
|
4
|
+
// so the pipeline can advance past a stuck unit, then marks the task/slice
|
|
5
|
+
// complete in the DB and appends a workflow event so reconciliation can replay
|
|
6
|
+
// the recovery. Each of those side-effects is individually best-effort and logs
|
|
7
|
+
// a recovery warning on failure (auto-recovery.ts:837/840/843/844/853/854). No
|
|
8
|
+
// test asserted any of them. We trigger each by breaking the specific sink
|
|
9
|
+
// (drop the relevant DB table, or block the events-file append) and assert the
|
|
10
|
+
// warning lands.
|
|
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 { writeBlockerPlaceholder } from "../auto-recovery.ts";
|
|
19
|
+
import { writeReactiveExecuteBlocker } from "../auto-recovery.ts";
|
|
20
|
+
import {
|
|
21
|
+
closeDatabase,
|
|
22
|
+
insertMilestone,
|
|
23
|
+
insertSlice,
|
|
24
|
+
insertTask,
|
|
25
|
+
openDatabase,
|
|
26
|
+
_getAdapter,
|
|
27
|
+
} from "../gsd-db.ts";
|
|
28
|
+
import {
|
|
29
|
+
drainLogs,
|
|
30
|
+
setStderrLoggingEnabled,
|
|
31
|
+
_resetLogs,
|
|
32
|
+
type LogEntry,
|
|
33
|
+
} from "../workflow-logger.ts";
|
|
34
|
+
|
|
35
|
+
function makeBase(prefix = "gsd-blocker-logs-"): string {
|
|
36
|
+
const base = mkdtempSync(join(tmpdir(), prefix));
|
|
37
|
+
// Slice projection dirs so the placeholder path resolves.
|
|
38
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), { recursive: true });
|
|
39
|
+
return base;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function captureLogs<T>(fn: () => T): { result: T; logs: LogEntry[] } {
|
|
43
|
+
const previous = setStderrLoggingEnabled(false);
|
|
44
|
+
_resetLogs();
|
|
45
|
+
try {
|
|
46
|
+
const result = fn();
|
|
47
|
+
return { result, logs: drainLogs() };
|
|
48
|
+
} finally {
|
|
49
|
+
_resetLogs();
|
|
50
|
+
setStderrLoggingEnabled(previous);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function recoveryWarnings(logs: readonly LogEntry[]): LogEntry[] {
|
|
55
|
+
return logs.filter((e) => e.component === "recovery" && e.severity === "warn");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
test("writeBlockerPlaceholder logs a recovery warning when updateTaskStatus throws (auto-recovery.ts:837)", () => {
|
|
59
|
+
const base = makeBase();
|
|
60
|
+
try {
|
|
61
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
62
|
+
// Drop tasks so updateTaskStatus throws inside the execute-task DB block.
|
|
63
|
+
_getAdapter()!.exec("DROP TABLE tasks");
|
|
64
|
+
|
|
65
|
+
const { logs } = captureLogs(() =>
|
|
66
|
+
writeBlockerPlaceholder("execute-task", "M001/S01/T01", base, "exhausted retries"),
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const warn = recoveryWarnings(logs).find((w) => /updateTaskStatus failed during context exhaustion/u.test(w.message));
|
|
70
|
+
assert.ok(warn, "a recovery warning must be logged when updateTaskStatus throws");
|
|
71
|
+
} finally {
|
|
72
|
+
closeDatabase();
|
|
73
|
+
rmSync(base, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("writeBlockerPlaceholder logs a recovery warning when updateSliceStatus throws (auto-recovery.ts:843)", () => {
|
|
78
|
+
const base = makeBase();
|
|
79
|
+
try {
|
|
80
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
81
|
+
// Drop slices so updateSliceStatus throws inside the complete-slice DB block.
|
|
82
|
+
_getAdapter()!.exec("DROP TABLE slices");
|
|
83
|
+
|
|
84
|
+
const { logs } = captureLogs(() =>
|
|
85
|
+
writeBlockerPlaceholder("complete-slice", "M001/S01", base, "exhausted retries"),
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
const warn = recoveryWarnings(logs).find((w) => /updateSliceStatus failed during context exhaustion/u.test(w.message));
|
|
89
|
+
assert.ok(warn, "a recovery warning must be logged when updateSliceStatus throws");
|
|
90
|
+
} finally {
|
|
91
|
+
closeDatabase();
|
|
92
|
+
rmSync(base, { recursive: true, force: true });
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("writeBlockerPlaceholder logs a recovery warning when the plan-milestone insertSlice throws (auto-recovery.ts:853)", () => {
|
|
97
|
+
const base = makeBase();
|
|
98
|
+
try {
|
|
99
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
100
|
+
// Drop slices so the S00-blocker insertSlice throws inside the
|
|
101
|
+
// plan-milestone placeholder branch.
|
|
102
|
+
_getAdapter()!.exec("DROP TABLE slices");
|
|
103
|
+
|
|
104
|
+
const { logs } = captureLogs(() =>
|
|
105
|
+
writeBlockerPlaceholder("plan-milestone", "M001", base, "exhausted retries"),
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const warn = recoveryWarnings(logs).find((w) =>
|
|
109
|
+
/insertSlice placeholder failed for plan-milestone recovery/u.test(w.message),
|
|
110
|
+
);
|
|
111
|
+
assert.ok(warn, "a recovery warning must be logged when the blocker slice insert throws");
|
|
112
|
+
} finally {
|
|
113
|
+
closeDatabase();
|
|
114
|
+
rmSync(base, { recursive: true, force: true });
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("writeBlockerPlaceholder logs a recovery warning when the workflow-event append throws (auto-recovery.ts:840)", () => {
|
|
119
|
+
const base = makeBase();
|
|
120
|
+
try {
|
|
121
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
122
|
+
// Block the workflow-events append by turning its target into a directory
|
|
123
|
+
// (appendFileSync on a directory throws EISDIR). The placeholder write still
|
|
124
|
+
// succeeds because it targets a different path under milestones/.
|
|
125
|
+
mkdirSync(join(base, ".gsd", "event-log.jsonl"), { recursive: true });
|
|
126
|
+
|
|
127
|
+
const { logs } = captureLogs(() =>
|
|
128
|
+
writeBlockerPlaceholder("execute-task", "M001/S01/T01", base, "exhausted retries"),
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
const warn = recoveryWarnings(logs).find((w) => /appendEvent failed for task recovery/u.test(w.message));
|
|
132
|
+
assert.ok(warn, "a recovery warning must be logged when the recovery event append fails");
|
|
133
|
+
} finally {
|
|
134
|
+
closeDatabase();
|
|
135
|
+
rmSync(base, { recursive: true, force: true });
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test("writeBlockerPlaceholder logs a recovery warning when the complete-slice appendEvent throws (auto-recovery.ts:898)", () => {
|
|
140
|
+
const base = makeBase("gsd-blocker-logs-cs-");
|
|
141
|
+
try {
|
|
142
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
143
|
+
// Slices table intact so updateSliceStatus (:897) succeeds; block the
|
|
144
|
+
// workflow-event append so the complete-slice appendEvent (:898) throws.
|
|
145
|
+
mkdirSync(join(base, ".gsd", "event-log.jsonl"), { recursive: true });
|
|
146
|
+
|
|
147
|
+
const { logs } = captureLogs(() =>
|
|
148
|
+
writeBlockerPlaceholder("complete-slice", "M001/S01", base, "exhausted retries"),
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
const warn = recoveryWarnings(logs).find((w) => /appendEvent failed for slice recovery/u.test(w.message));
|
|
152
|
+
assert.ok(warn, "a recovery warning must be logged when the complete-slice appendEvent throws");
|
|
153
|
+
} finally {
|
|
154
|
+
closeDatabase();
|
|
155
|
+
rmSync(base, { recursive: true, force: true });
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("writeBlockerPlaceholder logs a recovery warning when the plan-milestone appendEvent throws (auto-recovery.ts:908)", () => {
|
|
160
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-blocker-logs-pm-"));
|
|
161
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
162
|
+
try {
|
|
163
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
164
|
+
// Slices table intact so the S00-blocker insertSlice (:907) succeeds;
|
|
165
|
+
// block the workflow-event append so the plan-milestone appendEvent (:908) throws.
|
|
166
|
+
mkdirSync(join(base, ".gsd", "event-log.jsonl"), { recursive: true });
|
|
167
|
+
|
|
168
|
+
const { logs } = captureLogs(() =>
|
|
169
|
+
writeBlockerPlaceholder("plan-milestone", "M001", base, "exhausted retries"),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
const warn = recoveryWarnings(logs).find((w) => /appendEvent failed for plan-milestone recovery/u.test(w.message));
|
|
173
|
+
assert.ok(warn, "a recovery warning must be logged when the plan-milestone appendEvent throws");
|
|
174
|
+
} finally {
|
|
175
|
+
closeDatabase();
|
|
176
|
+
rmSync(base, { recursive: true, force: true });
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// ── writeReactiveExecuteBlocker append-event warnings (:755 / :768) ────────
|
|
181
|
+
// These fire after the reactive batch recovery transaction commits, when the
|
|
182
|
+
// per-task workflow-event append throws. We seed a real slice with two tasks,
|
|
183
|
+
// plant the event-log target as a directory (appendFileSync → EISDIR), and call
|
|
184
|
+
// writeReactiveExecuteBlocker; both the complete-task and skip-task appends fail.
|
|
185
|
+
|
|
186
|
+
test("writeReactiveExecuteBlocker logs recovery warnings when the post-recovery event appends throw (auto-recovery.ts:755/:768)", () => {
|
|
187
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-blocker-logs-reactive-"));
|
|
188
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), { recursive: true });
|
|
189
|
+
try {
|
|
190
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
191
|
+
insertMilestone({ id: "M001", title: "M", status: "active" });
|
|
192
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "S", status: "active", risk: "low", depends: [], demo: "", sequence: 1 });
|
|
193
|
+
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "T1", status: "active" });
|
|
194
|
+
insertTask({ id: "T02", sliceId: "S01", milestoneId: "M001", title: "T2", status: "active" });
|
|
195
|
+
// T01 has a summary (→ complete recovery path → :755), T02 does not
|
|
196
|
+
// (→ skip recovery path → :768).
|
|
197
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md"), "# T01\n", "utf-8");
|
|
198
|
+
// Block the workflow-event append (event-log.jsonl is the real ledger file).
|
|
199
|
+
mkdirSync(join(base, ".gsd", "event-log.jsonl"), { recursive: true });
|
|
200
|
+
|
|
201
|
+
const { logs } = captureLogs(() =>
|
|
202
|
+
writeReactiveExecuteBlocker("M001/S01/reactive+T01,T02", base, "batch exhausted"),
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
const warnings = recoveryWarnings(logs).map((w) => w.message);
|
|
206
|
+
assert.ok(
|
|
207
|
+
warnings.some((m) => /appendEvent failed for reactive complete recovery/u.test(m)),
|
|
208
|
+
"the complete-task append warning must be logged (:755)",
|
|
209
|
+
);
|
|
210
|
+
assert.ok(
|
|
211
|
+
warnings.some((m) => /appendEvent failed for reactive skip recovery/u.test(m)),
|
|
212
|
+
"the skip-task append warning must be logged (:768)",
|
|
213
|
+
);
|
|
214
|
+
} finally {
|
|
215
|
+
closeDatabase();
|
|
216
|
+
rmSync(base, { recursive: true, force: true });
|
|
217
|
+
}
|
|
218
|
+
});
|
|
@@ -697,23 +697,27 @@ test("ensureCodebaseMapFresh: does not rewrite expired metadata when fingerprint
|
|
|
697
697
|
}
|
|
698
698
|
});
|
|
699
699
|
|
|
700
|
-
test("ensureCodebaseMapFresh:
|
|
700
|
+
test("ensureCodebaseMapFresh: uses TTL cache before enumerating files", () => {
|
|
701
701
|
const base = makeTmpRepo();
|
|
702
702
|
try {
|
|
703
703
|
addFile(base, "src/main.ts");
|
|
704
|
-
// Generate initial map with a long TTL so the cache is still active.
|
|
705
704
|
const initial = ensureCodebaseMapFresh(base, undefined, { ttlMs: 60_000 });
|
|
706
705
|
assert.equal(initial.status, "generated");
|
|
707
706
|
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
707
|
+
const emptyBin = join(base, "empty-bin");
|
|
708
|
+
mkdirSync(emptyBin);
|
|
709
|
+
const originalPath = process.env.PATH;
|
|
710
|
+
try {
|
|
711
|
+
process.env.PATH = emptyBin;
|
|
712
|
+
|
|
713
|
+
const cached = ensureCodebaseMapFresh(base, undefined, { ttlMs: 60_000 });
|
|
714
|
+
assert.equal(cached.status, "generated");
|
|
715
|
+
assert.equal(cached.fingerprint, initial.fingerprint);
|
|
716
|
+
assert.equal(cached.fileCount, 1);
|
|
717
|
+
} finally {
|
|
718
|
+
if (originalPath === undefined) delete process.env.PATH;
|
|
719
|
+
else process.env.PATH = originalPath;
|
|
720
|
+
}
|
|
717
721
|
} finally {
|
|
718
722
|
cleanup(base);
|
|
719
723
|
}
|
|
@@ -191,6 +191,24 @@ test("dispatcher blocks workflow-advancing commands while completed branch is un
|
|
|
191
191
|
"start",
|
|
192
192
|
"workflow run release",
|
|
193
193
|
"do mark all complete",
|
|
194
|
+
"audit-fix --severity high",
|
|
195
|
+
"code-review --fix",
|
|
196
|
+
"docs-update",
|
|
197
|
+
"review-backlog",
|
|
198
|
+
"import --from plan.md",
|
|
199
|
+
"ingest-docs docs/",
|
|
200
|
+
"secure-phase",
|
|
201
|
+
"validate-phase",
|
|
202
|
+
"plan-phase",
|
|
203
|
+
"execute-phase --milestone M009",
|
|
204
|
+
"autonomous --from 1",
|
|
205
|
+
"phase add M009",
|
|
206
|
+
"phase create M009",
|
|
207
|
+
"phase new M009",
|
|
208
|
+
"phase insert M009 after M008",
|
|
209
|
+
"phase remove M008",
|
|
210
|
+
"phase edit M008",
|
|
211
|
+
"workstreams create",
|
|
194
212
|
];
|
|
195
213
|
|
|
196
214
|
for (const command of blockedCommands) {
|
|
@@ -214,6 +232,77 @@ test("dispatcher blocks workflow-advancing commands while completed branch is un
|
|
|
214
232
|
}
|
|
215
233
|
});
|
|
216
234
|
|
|
235
|
+
test("dispatcher keeps manager read-only while completed branch is unmerged", async () => {
|
|
236
|
+
const base = makeTempRepo("gsd-dispatch-unmerged-");
|
|
237
|
+
try {
|
|
238
|
+
seedCompletedUnmergedMilestone(base);
|
|
239
|
+
const { ctx, calls } = makeMockCtx(base);
|
|
240
|
+
const { pi, messages } = makeMockPi();
|
|
241
|
+
|
|
242
|
+
await handleGSDCommand("manager", ctx, pi);
|
|
243
|
+
|
|
244
|
+
assert.equal(calls.length, 1);
|
|
245
|
+
assert.equal(calls[0].kind, "info");
|
|
246
|
+
assert.equal(messages.length, 1);
|
|
247
|
+
assert.equal(messages[0].customType, "gsd-manager");
|
|
248
|
+
assert.match(messages[0].content, /read-only/i);
|
|
249
|
+
assert.match(messages[0].content, /M008 is complete but not merged/);
|
|
250
|
+
assert.doesNotMatch(messages[0].content, /Start\/stop auto-mode/);
|
|
251
|
+
assert.doesNotMatch(messages[0].content, /Run parallel milestones/);
|
|
252
|
+
assert.doesNotMatch(messages[0].content, /Act on the selection/);
|
|
253
|
+
} finally {
|
|
254
|
+
closeDatabase();
|
|
255
|
+
invalidateStateCache();
|
|
256
|
+
cleanup(base);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
test("dispatcher allows read-only workstreams routes while completed branch is unmerged", async () => {
|
|
261
|
+
const commands = ["workstreams list", "workstreams status", "workstreams progress"];
|
|
262
|
+
|
|
263
|
+
for (const command of commands) {
|
|
264
|
+
const base = makeTempRepo("gsd-dispatch-unmerged-");
|
|
265
|
+
try {
|
|
266
|
+
seedCompletedUnmergedMilestone(base);
|
|
267
|
+
const { ctx } = makeMockCtx(base);
|
|
268
|
+
const { pi, messages } = makeMockPi();
|
|
269
|
+
|
|
270
|
+
await handleGSDCommand(command, ctx, pi);
|
|
271
|
+
|
|
272
|
+
assert.equal(messages.length, 1, command);
|
|
273
|
+
assert.equal(messages[0].customType, "gsd-parallel", command);
|
|
274
|
+
assert.match(messages[0].content, /No parallel orchestration/, command);
|
|
275
|
+
assert.doesNotMatch(messages[0].content, /cannot start new workflow work/, command);
|
|
276
|
+
} finally {
|
|
277
|
+
closeDatabase();
|
|
278
|
+
invalidateStateCache();
|
|
279
|
+
cleanup(base);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test("dispatcher allows audit-fix dry-run while completed branch is unmerged", async () => {
|
|
285
|
+
const base = makeTempRepo("gsd-dispatch-unmerged-");
|
|
286
|
+
try {
|
|
287
|
+
seedCompletedUnmergedMilestone(base);
|
|
288
|
+
const { ctx, calls } = makeMockCtx(base);
|
|
289
|
+
const { pi, messages } = makeMockPi();
|
|
290
|
+
|
|
291
|
+
await handleGSDCommand("audit-fix --dry-run", ctx, pi);
|
|
292
|
+
|
|
293
|
+
assert.equal(calls.length, 1);
|
|
294
|
+
assert.equal(calls[0].kind, "info");
|
|
295
|
+
assert.match(calls[0].message, /audit-fix/);
|
|
296
|
+
assert.equal(messages.length, 1);
|
|
297
|
+
assert.equal(messages[0].customType, "gsd-audit-fix");
|
|
298
|
+
assert.doesNotMatch(messages[0].content, /cannot start new workflow work/);
|
|
299
|
+
} finally {
|
|
300
|
+
closeDatabase();
|
|
301
|
+
invalidateStateCache();
|
|
302
|
+
cleanup(base);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
|
|
217
306
|
test("dispatcher recovers a completed unmerged milestone through complete-milestone dispatch", async () => {
|
|
218
307
|
const base = makeTempRepo("gsd-dispatch-unmerged-");
|
|
219
308
|
try {
|