@opengsd/gsd-pi 1.2.0-dev.fbdca60b → 1.3.0-dev.65546769
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/dist/cli.js +28 -1
- package/dist/headless-context.js +0 -1
- package/dist/headless-events.d.ts +16 -1
- package/dist/headless-events.js +19 -2
- package/dist/headless.js +8 -1
- package/dist/help-text.js +29 -0
- package/dist/hermes-integration-install.d.ts +17 -0
- package/dist/hermes-integration-install.js +199 -0
- package/dist/jiti-workspace-aliases.d.ts +11 -2
- package/dist/jiti-workspace-aliases.js +19 -3
- package/dist/onboarding.js +9 -4
- package/dist/provider-migrations.d.ts +23 -0
- package/dist/provider-migrations.js +41 -0
- package/dist/read-cli.d.ts +23 -0
- package/dist/read-cli.js +90 -0
- package/dist/resource-loader.d.ts +3 -3
- package/dist/resource-loader.js +4 -13
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +22 -22
- package/dist/resources/extensions/claude-code-cli/index.js +7 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +73 -20
- package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
- package/dist/resources/extensions/gsd/auto/loop.js +67 -2
- package/dist/resources/extensions/gsd/auto/orchestrator.js +50 -10
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +81 -19
- package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +47 -8
- package/dist/resources/extensions/gsd/auto-model-selection.js +14 -8
- package/dist/resources/extensions/gsd/auto-post-unit.js +39 -29
- package/dist/resources/extensions/gsd/auto-prompts.js +44 -30
- package/dist/resources/extensions/gsd/auto-recovery.js +118 -40
- package/dist/resources/extensions/gsd/auto-runtime-state.js +13 -0
- package/dist/resources/extensions/gsd/auto-start.js +58 -31
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +149 -91
- package/dist/resources/extensions/gsd/auto.js +97 -31
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +42 -54
- package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +24 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +108 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +164 -44
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +113 -27
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +92 -4
- package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
- package/dist/resources/extensions/gsd/codebase-generator.js +5 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
- package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
- package/dist/resources/extensions/gsd/commands/handlers/core.js +52 -8
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +227 -3
- package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
- package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +14 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
- package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
- package/dist/resources/extensions/gsd/compat/index.js +3 -0
- package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
- package/dist/resources/extensions/gsd/config-overlay.js +11 -8
- package/dist/resources/extensions/gsd/consent-question.js +12 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +39 -3
- package/dist/resources/extensions/gsd/db/engine.js +27 -0
- package/dist/resources/extensions/gsd/db/queries.js +54 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
- package/dist/resources/extensions/gsd/db-workspace.js +13 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
- package/dist/resources/extensions/gsd/doctor-git-checks.js +30 -4
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -24
- package/dist/resources/extensions/gsd/doctor.js +28 -7
- package/dist/resources/extensions/gsd/error-classifier.js +13 -1
- package/dist/resources/extensions/gsd/escalation.js +11 -4
- package/dist/resources/extensions/gsd/export-html.js +10 -3
- package/dist/resources/extensions/gsd/export.js +73 -0
- package/dist/resources/extensions/gsd/file-lock.js +1 -1
- package/dist/resources/extensions/gsd/flat-phase-migration.js +176 -0
- package/dist/resources/extensions/gsd/forensics.js +2 -1
- package/dist/resources/extensions/gsd/git-service.js +7 -4
- package/dist/resources/extensions/gsd/gitignore.js +6 -2
- package/dist/resources/extensions/gsd/guidance.js +7 -7
- package/dist/resources/extensions/gsd/guided-flow.js +11 -6
- package/dist/resources/extensions/gsd/layout-policy.js +75 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +391 -116
- package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
- package/dist/resources/extensions/gsd/md-importer.js +153 -51
- package/dist/resources/extensions/gsd/metrics.js +19 -11
- package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
- package/dist/resources/extensions/gsd/migrate-external.js +51 -6
- package/dist/resources/extensions/gsd/migration-auto-check.js +5 -14
- package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
- package/dist/resources/extensions/gsd/milestone-ids.js +50 -19
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
- package/dist/resources/extensions/gsd/model-router.js +79 -20
- package/dist/resources/extensions/gsd/notification-store.js +22 -29
- package/dist/resources/extensions/gsd/notifications.js +36 -7
- package/dist/resources/extensions/gsd/observability-validator.js +12 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
- package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
- package/dist/resources/extensions/gsd/paths.js +356 -44
- package/dist/resources/extensions/gsd/planning-depth.js +2 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
- package/dist/resources/extensions/gsd/preferences-models.js +34 -14
- package/dist/resources/extensions/gsd/preferences.js +148 -13
- package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/dist/resources/extensions/gsd/prompts/code-review.md +37 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +24 -15
- package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -1
- package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
- package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/dist/resources/extensions/gsd/prompts/health.md +37 -0
- package/dist/resources/extensions/gsd/prompts/import.md +30 -0
- package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
- package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
- package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/dist/resources/extensions/gsd/prompts/review.md +27 -0
- package/dist/resources/extensions/gsd/prompts/run-uat.md +5 -1
- package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
- package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
- package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
- package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
- package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
- package/dist/resources/extensions/gsd/queue-order.js +3 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
- package/dist/resources/extensions/gsd/service-tier.js +2 -1
- package/dist/resources/extensions/gsd/session-lock.js +11 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +51 -10
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +95 -19
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +36 -3
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +12 -0
- package/dist/resources/extensions/gsd/state.js +48 -17
- package/dist/resources/extensions/gsd/sync-lock.js +11 -18
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +12 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +15 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
- package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -3
- package/dist/resources/extensions/gsd/tools/plan-task.js +16 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +44 -5
- package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
- package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
- package/dist/resources/extensions/gsd/undo.js +8 -9
- package/dist/resources/extensions/gsd/unit-registry.js +27 -3
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +58 -2
- package/dist/resources/extensions/gsd/validation-block-guard.js +45 -0
- package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
- package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
- package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +25 -4
- package/dist/resources/extensions/gsd/worktree-command.js +6 -6
- package/dist/resources/extensions/gsd/worktree-health.js +6 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +109 -16
- package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
- package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
- package/dist/resources/extensions/mcp-client/manager.js +3 -3
- package/dist/resources/extensions/search-the-web/index.js +41 -9
- package/dist/resources/extensions/search-the-web/native-search.js +18 -4
- package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
- package/dist/resources/extensions/subagent/index.js +20 -15
- package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.js +15 -4
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.8e446784528ed9dc.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/8785.481aa5869991b760.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-f0285ce91d4ec9ef.js → webpack-f46ea08200a0227e.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web-mode.d.ts +3 -1
- package/dist/web-mode.js +7 -5
- package/integrations/hermes/README.md +48 -0
- package/integrations/hermes/docs/setup.md +272 -0
- package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
- package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
- package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
- package/integrations/hermes/open_gsd_hermes/config.py +59 -0
- package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
- package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
- package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
- package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
- package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
- package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
- package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
- package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
- package/integrations/hermes/open_gsd_hermes/types.py +100 -0
- package/integrations/hermes/plugin.yaml +38 -0
- package/integrations/hermes/pyproject.toml +32 -0
- package/integrations/hermes/scripts/preflight.sh +92 -0
- package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
- package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
- package/integrations/hermes/tests/golden/snapshot.txt +8 -0
- package/integrations/hermes/tests/test_binding.py +103 -0
- package/integrations/hermes/tests/test_config.py +36 -0
- package/integrations/hermes/tests/test_cron.py +34 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
- package/integrations/hermes/tests/test_memory.py +59 -0
- package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
- package/integrations/hermes/tests/test_register.py +56 -0
- package/integrations/hermes/tests/test_snapshot.py +53 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
- package/package.json +8 -7
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -2
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +37 -15
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +69 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +223 -32
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +9 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +31 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +10 -0
- package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
- package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-errors.js +12 -0
- package/packages/mcp-server/dist/cli-errors.js.map +1 -1
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +33 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/cli.d.ts +1 -0
- package/packages/mcp-server/dist/cli.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli.js +1 -0
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +29 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +82 -3
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/package.json +21 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +9 -0
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +6 -1
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +1 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/select-list.js +8 -2
- package/packages/pi-tui/dist/components/select-list.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +22 -22
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
- package/src/resources/extensions/claude-code-cli/index.ts +8 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +83 -20
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +47 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +182 -10
- package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
- package/src/resources/extensions/gsd/auto/loop.ts +69 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +63 -10
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +13 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +83 -20
- package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +57 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +27 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -31
- package/src/resources/extensions/gsd/auto-prompts.ts +45 -30
- package/src/resources/extensions/gsd/auto-recovery.ts +126 -37
- package/src/resources/extensions/gsd/auto-runtime-state.ts +13 -0
- package/src/resources/extensions/gsd/auto-start.ts +82 -36
- package/src/resources/extensions/gsd/auto-verification.ts +5 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -15
- package/src/resources/extensions/gsd/auto.ts +133 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +45 -61
- package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +123 -9
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +185 -46
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +138 -29
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
- package/src/resources/extensions/gsd/codebase-generator.ts +6 -9
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
- package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
- package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -8
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +230 -3
- package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
- package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +13 -0
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
- package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
- package/src/resources/extensions/gsd/compat/index.ts +12 -0
- package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
- package/src/resources/extensions/gsd/config-overlay.ts +24 -9
- package/src/resources/extensions/gsd/consent-question.ts +11 -1
- package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +41 -4
- package/src/resources/extensions/gsd/db/engine.ts +26 -0
- package/src/resources/extensions/gsd/db/queries.ts +78 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
- package/src/resources/extensions/gsd/db-workspace.ts +15 -0
- package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
- package/src/resources/extensions/gsd/doctor-git-checks.ts +28 -3
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +12 -25
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +30 -7
- package/src/resources/extensions/gsd/error-classifier.ts +14 -1
- package/src/resources/extensions/gsd/escalation.ts +9 -4
- package/src/resources/extensions/gsd/export-html.ts +11 -4
- package/src/resources/extensions/gsd/export.ts +88 -1
- package/src/resources/extensions/gsd/file-lock.ts +1 -1
- package/src/resources/extensions/gsd/flat-phase-migration.ts +205 -0
- package/src/resources/extensions/gsd/forensics.ts +2 -1
- package/src/resources/extensions/gsd/git-constants.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +7 -2
- package/src/resources/extensions/gsd/gitignore.ts +7 -3
- package/src/resources/extensions/gsd/guidance.ts +7 -7
- package/src/resources/extensions/gsd/guided-flow.ts +11 -6
- package/src/resources/extensions/gsd/layout-policy.ts +85 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +404 -104
- package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
- package/src/resources/extensions/gsd/md-importer.ts +215 -65
- package/src/resources/extensions/gsd/metrics.ts +23 -10
- package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
- package/src/resources/extensions/gsd/migrate-external.ts +49 -6
- package/src/resources/extensions/gsd/migration-auto-check.ts +4 -13
- package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
- package/src/resources/extensions/gsd/milestone-ids.ts +49 -19
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
- package/src/resources/extensions/gsd/model-router.ts +98 -18
- package/src/resources/extensions/gsd/notification-store.ts +17 -28
- package/src/resources/extensions/gsd/notifications.ts +37 -6
- package/src/resources/extensions/gsd/observability-validator.ts +12 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
- package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
- package/src/resources/extensions/gsd/paths.ts +348 -39
- package/src/resources/extensions/gsd/planning-depth.ts +2 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
- package/src/resources/extensions/gsd/preferences-models.ts +47 -13
- package/src/resources/extensions/gsd/preferences.ts +188 -14
- package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/src/resources/extensions/gsd/prompts/code-review.md +37 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +24 -15
- package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -1
- package/src/resources/extensions/gsd/prompts/explore.md +58 -0
- package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/src/resources/extensions/gsd/prompts/health.md +37 -0
- package/src/resources/extensions/gsd/prompts/import.md +30 -0
- package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/src/resources/extensions/gsd/prompts/manager.md +21 -0
- package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/phase.md +22 -0
- package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/src/resources/extensions/gsd/prompts/progress.md +30 -0
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/src/resources/extensions/gsd/prompts/review.md +27 -0
- package/src/resources/extensions/gsd/prompts/run-uat.md +5 -1
- package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/settings.md +24 -0
- package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/spike.md +59 -0
- package/src/resources/extensions/gsd/prompts/stats.md +43 -0
- package/src/resources/extensions/gsd/prompts/surface.md +25 -0
- package/src/resources/extensions/gsd/prompts/thread.md +24 -0
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
- package/src/resources/extensions/gsd/queue-order.ts +3 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
- package/src/resources/extensions/gsd/service-tier.ts +2 -0
- package/src/resources/extensions/gsd/session-lock.ts +15 -13
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +58 -14
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +98 -26
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +36 -3
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +12 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
- package/src/resources/extensions/gsd/state.ts +57 -15
- package/src/resources/extensions/gsd/sync-lock.ts +11 -20
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +322 -1
- package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
- package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +28 -22
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +19 -2
- package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +862 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
- package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +38 -49
- package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
- package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +372 -0
- package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +343 -7
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +339 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +58 -23
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
- package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
- package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -4
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +155 -58
- package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/undo.test.ts +39 -37
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +34 -8
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +64 -8
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +4 -7
- package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +15 -1
- package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
- package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -3
- package/src/resources/extensions/gsd/tools/plan-task.ts +17 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +43 -4
- package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
- package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
- package/src/resources/extensions/gsd/undo.ts +8 -9
- package/src/resources/extensions/gsd/unit-registry.ts +27 -3
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +60 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +46 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
- package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
- package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +24 -4
- package/src/resources/extensions/gsd/worktree-command.ts +6 -6
- package/src/resources/extensions/gsd/worktree-health.ts +6 -3
- package/src/resources/extensions/gsd/worktree-manager.ts +122 -16
- package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
- package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
- package/src/resources/extensions/mcp-client/manager.ts +3 -3
- package/src/resources/extensions/search-the-web/index.ts +45 -9
- package/src/resources/extensions/search-the-web/native-search.ts +16 -4
- package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
- package/src/resources/extensions/subagent/index.ts +20 -15
- package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
- package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
- /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: `.planning/` compat helpers — layout capture and projection sha
|
|
3
|
+
// recording. Parallel to the .gsd/ write-time flush in markdown-renderer.ts.
|
|
4
|
+
|
|
5
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
computeProjectionSha,
|
|
10
|
+
readCompatMarker,
|
|
11
|
+
writeCompatMarker,
|
|
12
|
+
type PlanningLayout,
|
|
13
|
+
} from "./compat-marker.js";
|
|
14
|
+
import { logWarning } from "../workflow-logger.js";
|
|
15
|
+
|
|
16
|
+
export interface PlanningProjectionWrite {
|
|
17
|
+
relPath: string;
|
|
18
|
+
entities: string[];
|
|
19
|
+
passthrough?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function isPlanningPassthroughRelPath(relPath: string): boolean {
|
|
23
|
+
if (relPath.startsWith("codebase/") || relPath.startsWith("research/")) return true;
|
|
24
|
+
if (relPath === "config.json") return true;
|
|
25
|
+
const name = relPath.split("/").pop() ?? relPath;
|
|
26
|
+
if (name === "PATTERNS.md" || name === "REVIEWS.md") return true;
|
|
27
|
+
if (name.endsWith("-DISCUSSION-LOG.md")) return true;
|
|
28
|
+
if (name.endsWith("-RESEARCH.md") && !name.endsWith("-PLAN.md")) return true;
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Files that gsd-pi creates in .gsd/ at startup and that do not constitute
|
|
33
|
+
// markdown content written by gsd-core. Excluded from the content check so a
|
|
34
|
+
// .planning/-only project that already has a gsd.db (but no milestone markdown)
|
|
35
|
+
// is not mistakenly treated as a coexistence project.
|
|
36
|
+
const KNOWN_NON_CONTENT_FILES = new Set([
|
|
37
|
+
"gsd.db",
|
|
38
|
+
"gsd.db-wal",
|
|
39
|
+
"gsd.db-shm",
|
|
40
|
+
"completed-units.json",
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
export function gsdTreeHasContent(basePath: string): boolean {
|
|
44
|
+
const gsdDir = join(basePath, ".gsd");
|
|
45
|
+
return (
|
|
46
|
+
existsSync(gsdDir) &&
|
|
47
|
+
readdirSync(gsdDir).some(
|
|
48
|
+
(name) => !name.startsWith(".") && !KNOWN_NON_CONTENT_FILES.has(name),
|
|
49
|
+
)
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function walkPlanningRelPaths(planningDir: string, prefix = ""): string[] {
|
|
54
|
+
const paths: string[] = [];
|
|
55
|
+
let entries;
|
|
56
|
+
try {
|
|
57
|
+
entries = readdirSync(join(planningDir, prefix), { withFileTypes: true });
|
|
58
|
+
} catch {
|
|
59
|
+
return paths;
|
|
60
|
+
}
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
63
|
+
if (entry.isDirectory()) {
|
|
64
|
+
if (entry.name === "workstreams") continue;
|
|
65
|
+
paths.push(...walkPlanningRelPaths(planningDir, rel));
|
|
66
|
+
} else {
|
|
67
|
+
paths.push(rel);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return paths;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Record freshly written `.planning/` projection files in the compat marker.
|
|
75
|
+
*/
|
|
76
|
+
export function applyPlanningProjectionWrites(
|
|
77
|
+
basePath: string,
|
|
78
|
+
writes: PlanningProjectionWrite[],
|
|
79
|
+
): void {
|
|
80
|
+
if (writes.length === 0) return;
|
|
81
|
+
const marker = readCompatMarker(basePath);
|
|
82
|
+
if (!marker.planning) {
|
|
83
|
+
marker.planning = { active: true, layout: null, projections: {}, passthrough: {} };
|
|
84
|
+
}
|
|
85
|
+
marker.planning.active = true;
|
|
86
|
+
for (const write of writes) {
|
|
87
|
+
const abs = join(basePath, ".planning", write.relPath);
|
|
88
|
+
if (!existsSync(abs)) continue;
|
|
89
|
+
const entry = {
|
|
90
|
+
sha: computeProjectionSha(readFileSync(abs, "utf-8")),
|
|
91
|
+
entities: write.entities,
|
|
92
|
+
};
|
|
93
|
+
const map = write.passthrough ? marker.planning.passthrough : marker.planning.projections;
|
|
94
|
+
map[write.relPath] = entry;
|
|
95
|
+
}
|
|
96
|
+
marker.lastWriter = "gsd-pi";
|
|
97
|
+
marker.lastProjectedAt = new Date().toISOString();
|
|
98
|
+
writeCompatMarker(basePath, marker);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface CapturePlanningCompatOptions {
|
|
102
|
+
dryRun?: boolean;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Capture-on-first-read: infer `.planning/` layout from disk, import content
|
|
107
|
+
* into the DB so gsd-pi's projection reflects gsd-core's tree instead of
|
|
108
|
+
* overwriting it, then activate the compat marker. Projection shas are seeded
|
|
109
|
+
* by drift repair / write-time hooks — not from raw disk here.
|
|
110
|
+
*
|
|
111
|
+
* Must only be called when !dryRun — it writes both the DB and the marker.
|
|
112
|
+
*/
|
|
113
|
+
export async function capturePlanningCompatIfNeeded(
|
|
114
|
+
basePath: string,
|
|
115
|
+
options?: CapturePlanningCompatOptions,
|
|
116
|
+
): Promise<void> {
|
|
117
|
+
if (options?.dryRun) return;
|
|
118
|
+
|
|
119
|
+
const planningDir = join(basePath, ".planning");
|
|
120
|
+
if (!existsSync(planningDir)) return;
|
|
121
|
+
|
|
122
|
+
const marker = readCompatMarker(basePath);
|
|
123
|
+
if (marker.planning?.active && marker.planning.layout) return;
|
|
124
|
+
|
|
125
|
+
// First encounter: parse layout, import content into the DB, then activate the
|
|
126
|
+
// marker. When `.gsd/` already exists (coexistence), import from disk via
|
|
127
|
+
// migrateHierarchyToDb and do not call writeGSDDirectory — reconcile runs
|
|
128
|
+
// external-markdown-edit before external-planning-edit and must not destroy
|
|
129
|
+
// gsd-core `.gsd/` edits before that pipeline can see them. Planning-only
|
|
130
|
+
// projects materialize `.gsd/` from the parsed tree first, then import.
|
|
131
|
+
const { parsePlanningDirectory } = await import("../migrate/parser.js");
|
|
132
|
+
const { detectPlanningLayout } = await import("../migrate/layout-detect.js");
|
|
133
|
+
const parsed = await parsePlanningDirectory(planningDir);
|
|
134
|
+
const layout: PlanningLayout | null = detectPlanningLayout(parsed);
|
|
135
|
+
if (!layout) return;
|
|
136
|
+
|
|
137
|
+
// Import into the DB. Dynamic imports break the module-init cycle
|
|
138
|
+
// (planning-compat ← reconcile ← state ← md-importer). Matches the import
|
|
139
|
+
// pattern in repairExternalPlanningEdit.
|
|
140
|
+
try {
|
|
141
|
+
const { migrateHierarchyToDb } = await import("../md-importer.js");
|
|
142
|
+
const { invalidateStateCache } = await import("../state.js");
|
|
143
|
+
if (!gsdTreeHasContent(basePath)) {
|
|
144
|
+
const { transformToGSD } = await import("../migrate/transformer.js");
|
|
145
|
+
const { writeGSDDirectory } = await import("../migrate/writer.js");
|
|
146
|
+
const gsdProject = transformToGSD(parsed);
|
|
147
|
+
await writeGSDDirectory(gsdProject, basePath);
|
|
148
|
+
}
|
|
149
|
+
migrateHierarchyToDb(basePath);
|
|
150
|
+
invalidateStateCache();
|
|
151
|
+
} catch (e) {
|
|
152
|
+
logWarning(
|
|
153
|
+
"reconcile",
|
|
154
|
+
`planning DB import failed on initial capture — reconcile may overwrite gsd-core content: ${(e as Error).message}`,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Activate the marker. Leave projections/passthrough empty: the next
|
|
159
|
+
// writePlanningDirectory → applyPlanningProjectionWrites call will seed
|
|
160
|
+
// accurate SHAs from the normalized output rather than the raw gsd-core files.
|
|
161
|
+
const freshMarker = readCompatMarker(basePath);
|
|
162
|
+
if (!freshMarker.planning) {
|
|
163
|
+
freshMarker.planning = { active: false, layout: null, projections: {}, passthrough: {} };
|
|
164
|
+
}
|
|
165
|
+
freshMarker.planning.active = true;
|
|
166
|
+
freshMarker.planning.layout = layout;
|
|
167
|
+
writeCompatMarker(basePath, freshMarker);
|
|
168
|
+
}
|
|
@@ -25,19 +25,28 @@ import {
|
|
|
25
25
|
|
|
26
26
|
const DEFAULT_WIDGET_MODE = "small";
|
|
27
27
|
|
|
28
|
-
// ─── Data Collection ──────────────────────────────────────────────────────
|
|
29
|
-
|
|
30
28
|
interface ConfigSection {
|
|
31
29
|
title: string;
|
|
32
30
|
rows: Array<{ label: string; value: string; accent?: boolean }>;
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
|
|
33
|
+
// ─── Data Collection ──────────────────────────────────────────────────────
|
|
34
|
+
|
|
35
|
+
export interface CollectConfigOptions {
|
|
36
|
+
basePath?: string;
|
|
37
|
+
availableModelIds?: string[];
|
|
38
|
+
preferredModelId?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function collectConfigSections(options?: CollectConfigOptions): ConfigSection[] {
|
|
36
42
|
const sections: ConfigSection[] = [];
|
|
37
43
|
|
|
38
44
|
const globalPrefs = loadGlobalGSDPreferences();
|
|
39
|
-
const projectPrefs = loadProjectGSDPreferences();
|
|
40
|
-
const
|
|
45
|
+
const projectPrefs = loadProjectGSDPreferences(options?.basePath);
|
|
46
|
+
const loadOpts = options?.availableModelIds
|
|
47
|
+
? { availableModelIds: options.availableModelIds, preferredModelId: options.preferredModelId }
|
|
48
|
+
: undefined;
|
|
49
|
+
const effective = loadEffectiveGSDPreferences(options?.basePath, loadOpts);
|
|
41
50
|
const prefs = effective?.preferences;
|
|
42
51
|
|
|
43
52
|
// ─── Sources ─────────────────────────────────────────────────────────
|
|
@@ -69,7 +78,12 @@ function collectConfigSections(): ConfigSection[] {
|
|
|
69
78
|
|
|
70
79
|
const modelRows: ConfigSection["rows"] = [];
|
|
71
80
|
for (const [label, unitType] of unitTypes) {
|
|
72
|
-
const resolved = resolveModelWithFallbacksForUnit(
|
|
81
|
+
const resolved = resolveModelWithFallbacksForUnit(
|
|
82
|
+
unitType,
|
|
83
|
+
options?.basePath,
|
|
84
|
+
options?.availableModelIds,
|
|
85
|
+
options?.preferredModelId,
|
|
86
|
+
);
|
|
73
87
|
if (resolved) {
|
|
74
88
|
let val = resolved.primary;
|
|
75
89
|
if (resolved.fallbacks.length > 0) {
|
|
@@ -204,8 +218,8 @@ function collectConfigSections(): ConfigSection[] {
|
|
|
204
218
|
|
|
205
219
|
// ─── Plain Text Formatter (headless/RPC fallback) ─────────────────────────
|
|
206
220
|
|
|
207
|
-
export function formatConfigText(): string {
|
|
208
|
-
const sections = collectConfigSections();
|
|
221
|
+
export function formatConfigText(options?: CollectConfigOptions): string {
|
|
222
|
+
const sections = collectConfigSections(options);
|
|
209
223
|
const lines: string[] = ["GSD Configuration\n"];
|
|
210
224
|
|
|
211
225
|
let maxLabel = 0;
|
|
@@ -243,11 +257,12 @@ export class GSDConfigOverlay {
|
|
|
243
257
|
tui: { requestRender: () => void },
|
|
244
258
|
theme: Theme,
|
|
245
259
|
onClose: () => void,
|
|
260
|
+
options?: CollectConfigOptions,
|
|
246
261
|
) {
|
|
247
262
|
this.tui = tui;
|
|
248
263
|
this.theme = theme;
|
|
249
264
|
this.onClose = onClose;
|
|
250
|
-
this.sections = collectConfigSections();
|
|
265
|
+
this.sections = collectConfigSections(options);
|
|
251
266
|
}
|
|
252
267
|
|
|
253
268
|
invalidate(): void {
|
|
@@ -44,7 +44,7 @@ export type GateSubKind = "depth-verification" | "approval" | "destructive-confi
|
|
|
44
44
|
|
|
45
45
|
export type FailPolicy = "closed" | "open";
|
|
46
46
|
|
|
47
|
-
export type AnswerOutcome = "waiting" | "answered" | "verified" | "declined" | "cancelled";
|
|
47
|
+
export type AnswerOutcome = "waiting" | "answered" | "verified" | "declined" | "cancelled" | "timeout";
|
|
48
48
|
|
|
49
49
|
export interface ClassifiedQuestion {
|
|
50
50
|
kind: QuestionKind;
|
|
@@ -234,6 +234,9 @@ export type ConsentAnswerDetails = VerdictAnswerDetails;
|
|
|
234
234
|
/**
|
|
235
235
|
* THE single policy point for whether a question's answer counts as answered.
|
|
236
236
|
*
|
|
237
|
+
* - timed_out rounds → "timeout" for every kind (host elicitation expired
|
|
238
|
+
* before the user answered; fail-closed, but the caller pauses-and-waits
|
|
239
|
+
* instead of re-asking into the same timeout loop, #852).
|
|
237
240
|
* - cancelled rounds → "cancelled" for every kind.
|
|
238
241
|
* - gate: delegates to evaluateGateAnswer in the consent-verdict leaf — the
|
|
239
242
|
* same verdict engine write-gate's applyAskUserQuestionsGateResult consumes;
|
|
@@ -248,6 +251,7 @@ export function evaluateAnswer(options: {
|
|
|
248
251
|
details: ConsentAnswerDetails;
|
|
249
252
|
}): AnswerOutcome {
|
|
250
253
|
const { question, details } = options;
|
|
254
|
+
if (details.timed_out) return "timeout";
|
|
251
255
|
if (details.cancelled) return "cancelled";
|
|
252
256
|
|
|
253
257
|
const { kind } = classifyQuestion({ id: question.id, options: question.options });
|
|
@@ -271,6 +275,7 @@ export function evaluateAnswer(options: {
|
|
|
271
275
|
|
|
272
276
|
const OUTCOME_PRECEDENCE: AnswerOutcome[] = [
|
|
273
277
|
"cancelled",
|
|
278
|
+
"timeout",
|
|
274
279
|
"waiting",
|
|
275
280
|
"declined",
|
|
276
281
|
"verified",
|
|
@@ -289,6 +294,11 @@ export function evaluateAskUserQuestionsRound(
|
|
|
289
294
|
questions: ConsentQuestionShape[],
|
|
290
295
|
details: ConsentAnswerDetails,
|
|
291
296
|
): AnswerOutcome {
|
|
297
|
+
// timed_out is checked before cancelled: a host elicitation timeout is a
|
|
298
|
+
// more specific signal than the deliberate-dismissal cancelled it is also
|
|
299
|
+
// marked with, and callers must pause-and-wait instead of treating it as a
|
|
300
|
+
// re-ask-able cancel (#852).
|
|
301
|
+
if (details.timed_out) return "timeout";
|
|
292
302
|
if (details.cancelled) return "cancelled";
|
|
293
303
|
let worst: AnswerOutcome = "answered";
|
|
294
304
|
for (const question of questions) {
|
|
@@ -9,7 +9,20 @@
|
|
|
9
9
|
* cycle. It must not import from either module (ADR-039).
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Per-question verdict for a gate answer.
|
|
14
|
+
*
|
|
15
|
+
* - "verified" — the confirmation option was selected (depth unlocked).
|
|
16
|
+
* - "declined" — a real but non-confirming selection (gate stays pending,
|
|
17
|
+
* model should not treat as approval).
|
|
18
|
+
* - "cancelled" — the round was cancelled by the user (deliberate dismissal).
|
|
19
|
+
* - "waiting" — no answer (fail-closed; not an answer).
|
|
20
|
+
* - "timeout" — the host elicitation timed out before the user answered.
|
|
21
|
+
* Distinct from "waiting" so callers can pause-and-wait instead of letting
|
|
22
|
+
* the model re-ask into the same timeout loop (#852). Still fail-closed:
|
|
23
|
+
* the gate stays pending — a timeout is never approval.
|
|
24
|
+
*/
|
|
25
|
+
export type GateAnswerVerdict = "waiting" | "verified" | "declined" | "cancelled" | "timeout";
|
|
13
26
|
|
|
14
27
|
export interface VerdictQuestionShape {
|
|
15
28
|
id?: unknown;
|
|
@@ -19,6 +32,13 @@ export interface VerdictQuestionShape {
|
|
|
19
32
|
export interface VerdictAnswerDetails {
|
|
20
33
|
cancelled?: boolean;
|
|
21
34
|
interrupted?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* True when the host elicitation channel timed out before the user answered.
|
|
37
|
+
* Distinct from `cancelled` (deliberate dismissal): a timeout must not be
|
|
38
|
+
* laundered into a re-ask loop. Gate verdicts map this to "timeout" so the
|
|
39
|
+
* caller pauses-and-waits instead of looping on the blocked call (#852).
|
|
40
|
+
*/
|
|
41
|
+
timed_out?: boolean;
|
|
22
42
|
response?: {
|
|
23
43
|
answers?: Record<string, { selected?: unknown; notes?: unknown } | undefined>;
|
|
24
44
|
} | null;
|
|
@@ -67,16 +87,25 @@ export function hasNotesValue(notes: unknown): boolean {
|
|
|
67
87
|
/**
|
|
68
88
|
* THE per-question verdict for gate questions (fail-closed):
|
|
69
89
|
*
|
|
90
|
+
* - timed_out rounds → "timeout" (host elicitation expired before the user
|
|
91
|
+
* answered; fail-closed — the gate stays pending — but the caller pauses
|
|
92
|
+
* instead of re-asking into the same timeout loop, #852).
|
|
70
93
|
* - cancelled rounds → "cancelled".
|
|
71
94
|
* - the confirmation option (structural match) → "verified".
|
|
72
95
|
* - any other real selection → "declined".
|
|
73
96
|
* - empty/missing selection → "waiting" — an empty answer is NEVER an answer,
|
|
74
97
|
* so notes can never satisfy a gate either.
|
|
98
|
+
*
|
|
99
|
+
* `timed_out` is checked first: the handler marks a timed-out round with both
|
|
100
|
+
* `cancelled: true` and `timed_out: true` (see
|
|
101
|
+
* `askUserQuestionsHandler`), so the timeout must win to avoid the cancelled
|
|
102
|
+
* branch's re-ask semantics.
|
|
75
103
|
*/
|
|
76
104
|
export function evaluateGateAnswer(
|
|
77
105
|
question: VerdictQuestionShape,
|
|
78
106
|
details: VerdictAnswerDetails,
|
|
79
107
|
): GateAnswerVerdict {
|
|
108
|
+
if (details.timed_out) return "timeout";
|
|
80
109
|
if (details.cancelled) return "cancelled";
|
|
81
110
|
const questionId = typeof question.id === "string" ? question.id : "";
|
|
82
111
|
const answer = details.response?.answers?.[questionId];
|
|
@@ -15,6 +15,7 @@ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
|
|
|
15
15
|
import { resolveMilestoneFile, resolveSliceFile } from "./paths.js";
|
|
16
16
|
import { getAutoDashboardData } from "./auto.js";
|
|
17
17
|
import type { AutoDashboardData } from "./auto-dashboard.js";
|
|
18
|
+
import { getAutoRuntimeSnapshot } from "./auto-runtime-state.js";
|
|
18
19
|
import {
|
|
19
20
|
getLedger, getProjectTotals, aggregateByPhase, aggregateBySlice,
|
|
20
21
|
aggregateByModel, aggregateCacheHitRate, formatCost, formatTokenCount, formatCostProjection,
|
|
@@ -22,6 +23,7 @@ import {
|
|
|
22
23
|
type UnitMetrics,
|
|
23
24
|
} from "./metrics.js";
|
|
24
25
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
26
|
+
import { countPendingCaptures } from "./captures.js";
|
|
25
27
|
import { getActiveWorktreeName } from "./worktree-session-state.js";
|
|
26
28
|
import { getWorkerBatches, hasActiveWorkers, type WorkerEntry } from "../subagent/worker-registry.js";
|
|
27
29
|
import { formatDuration, padRight, joinColumns, centerLine, fitColumns, STATUS_GLYPH, STATUS_COLOR } from "../shared/mod.js";
|
|
@@ -113,7 +115,9 @@ export class GSDDashboardOverlay {
|
|
|
113
115
|
});
|
|
114
116
|
}
|
|
115
117
|
|
|
116
|
-
private computeDashboardIdentity(
|
|
118
|
+
private computeDashboardIdentity(
|
|
119
|
+
dashData: Pick<AutoDashboardData, "active" | "paused" | "currentUnit" | "basePath">,
|
|
120
|
+
): string {
|
|
117
121
|
const base = dashData.basePath || process.cwd();
|
|
118
122
|
const currentUnit = dashData.currentUnit
|
|
119
123
|
? `${dashData.currentUnit.type}:${dashData.currentUnit.id}:${dashData.currentUnit.startedAt}`
|
|
@@ -126,18 +130,51 @@ export class GSDDashboardOverlay {
|
|
|
126
130
|
].join("|");
|
|
127
131
|
}
|
|
128
132
|
|
|
133
|
+
private refreshVolatileDashboardData(snapshot = getAutoRuntimeSnapshot()): void {
|
|
134
|
+
let pendingCaptureCount = this.dashData.pendingCaptureCount;
|
|
135
|
+
try {
|
|
136
|
+
if (snapshot.basePath) {
|
|
137
|
+
pendingCaptureCount = countPendingCaptures(snapshot.basePath);
|
|
138
|
+
}
|
|
139
|
+
} catch {
|
|
140
|
+
// Non-fatal — keep last known value
|
|
141
|
+
}
|
|
142
|
+
this.dashData = {
|
|
143
|
+
...this.dashData,
|
|
144
|
+
active: snapshot.active,
|
|
145
|
+
paused: snapshot.paused,
|
|
146
|
+
currentUnit: snapshot.currentUnit
|
|
147
|
+
? {
|
|
148
|
+
type: snapshot.currentUnit.type,
|
|
149
|
+
id: snapshot.currentUnit.id,
|
|
150
|
+
startedAt: snapshot.currentUnit.startedAt,
|
|
151
|
+
}
|
|
152
|
+
: null,
|
|
153
|
+
basePath: snapshot.basePath,
|
|
154
|
+
elapsed: snapshot.active || snapshot.paused
|
|
155
|
+
? (this.dashData.startTime > 0 ? Date.now() - this.dashData.startTime : 0)
|
|
156
|
+
: 0,
|
|
157
|
+
toolSurface: snapshot.toolSurface,
|
|
158
|
+
pendingCaptureCount,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
129
162
|
private async refreshDashboard(initial = false): Promise<void> {
|
|
130
163
|
if (this.disposed) return;
|
|
131
|
-
|
|
132
|
-
const nextIdentity = this.computeDashboardIdentity(
|
|
164
|
+
const runtimeSnapshot = getAutoRuntimeSnapshot();
|
|
165
|
+
const nextIdentity = this.computeDashboardIdentity(runtimeSnapshot);
|
|
133
166
|
|
|
134
167
|
const identityChanged = initial || nextIdentity !== this.loadedDashboardIdentity;
|
|
135
168
|
if (identityChanged) {
|
|
169
|
+
this.dashData = getAutoDashboardData();
|
|
170
|
+
const loadedIdentity = this.computeDashboardIdentity(this.dashData);
|
|
136
171
|
const loaded = await this.loadData();
|
|
137
172
|
if (this.disposed) return;
|
|
138
173
|
if (loaded) {
|
|
139
|
-
this.loadedDashboardIdentity =
|
|
174
|
+
this.loadedDashboardIdentity = loadedIdentity;
|
|
140
175
|
}
|
|
176
|
+
} else {
|
|
177
|
+
this.refreshVolatileDashboardData(runtimeSnapshot);
|
|
141
178
|
}
|
|
142
179
|
|
|
143
180
|
if (initial) {
|
|
@@ -671,6 +671,32 @@ export function closeDatabase(): void {
|
|
|
671
671
|
_dbOpenState.reset();
|
|
672
672
|
}
|
|
673
673
|
|
|
674
|
+
/**
|
|
675
|
+
* Open an isolated database connection that does NOT touch the process-wide
|
|
676
|
+
* `currentDb` singleton. Intended for background observers (e.g. the parallel
|
|
677
|
+
* monitor overlay) that must read a database without displacing an active
|
|
678
|
+
* workflow session connection.
|
|
679
|
+
*
|
|
680
|
+
* The caller MUST call `adapter.close()` when done. Schema migrations are NOT
|
|
681
|
+
* run — the database must already exist and be fully migrated by the primary
|
|
682
|
+
* connection. Returns null if the connection cannot be opened.
|
|
683
|
+
*/
|
|
684
|
+
export function openIsolatedDatabase(path: string): DbAdapter | null {
|
|
685
|
+
try {
|
|
686
|
+
const rawDb = providerLoader.openRaw(path);
|
|
687
|
+
if (!rawDb) return null;
|
|
688
|
+
const adapter = createDbAdapter(rawDb);
|
|
689
|
+
// Minimal pragmas for a short-lived read-only observer connection.
|
|
690
|
+
// WAL mode is already set file-wide by the primary connection; repeating
|
|
691
|
+
// it here is a no-op on an existing WAL file and safe to issue.
|
|
692
|
+
adapter.exec("PRAGMA journal_mode=WAL");
|
|
693
|
+
adapter.exec("PRAGMA busy_timeout = 5000");
|
|
694
|
+
return adapter;
|
|
695
|
+
} catch {
|
|
696
|
+
return null;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
674
700
|
/**
|
|
675
701
|
* Re-open the active database connection from disk.
|
|
676
702
|
*
|
|
@@ -270,6 +270,66 @@ export function getMilestoneSlices(milestoneId: string): SliceRow[] {
|
|
|
270
270
|
return rows.map(rowToSlice);
|
|
271
271
|
}
|
|
272
272
|
|
|
273
|
+
export interface ParallelMonitorSliceProgress {
|
|
274
|
+
id: string;
|
|
275
|
+
status: string;
|
|
276
|
+
total: number;
|
|
277
|
+
done: number;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export function getParallelMonitorSliceProgress(milestoneId: string): ParallelMonitorSliceProgress[] {
|
|
281
|
+
const db = getDbOrNull();
|
|
282
|
+
if (!db) return [];
|
|
283
|
+
const rows = db.prepare(
|
|
284
|
+
`SELECT
|
|
285
|
+
s.id AS id,
|
|
286
|
+
s.status AS status,
|
|
287
|
+
COUNT(t.id) AS total,
|
|
288
|
+
COALESCE(SUM(CASE WHEN t.status='complete' THEN 1 ELSE 0 END), 0) AS done
|
|
289
|
+
FROM slices s
|
|
290
|
+
LEFT JOIN tasks t ON s.milestone_id=t.milestone_id AND s.id=t.slice_id
|
|
291
|
+
WHERE s.milestone_id=:mid
|
|
292
|
+
GROUP BY s.id
|
|
293
|
+
ORDER BY s.id`,
|
|
294
|
+
).all({ ":mid": milestoneId });
|
|
295
|
+
return rows.map((row) => ({
|
|
296
|
+
id: String(row["id"] ?? ""),
|
|
297
|
+
status: String(row["status"] ?? ""),
|
|
298
|
+
total: Number(row["total"] ?? 0),
|
|
299
|
+
done: Number(row["done"] ?? 0),
|
|
300
|
+
}));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export interface ParallelMonitorCompletion {
|
|
304
|
+
taskId: string;
|
|
305
|
+
sliceId: string;
|
|
306
|
+
oneLiner: string;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export function getParallelMonitorRecentCompletions(
|
|
310
|
+
milestoneId: string,
|
|
311
|
+
limit: number = 5,
|
|
312
|
+
): ParallelMonitorCompletion[] {
|
|
313
|
+
const db = getDbOrNull();
|
|
314
|
+
if (!db) return [];
|
|
315
|
+
const numericLimit = Number.isFinite(limit) ? Math.floor(limit) : 5;
|
|
316
|
+
const safeLimit = Math.max(1, Math.min(50, numericLimit));
|
|
317
|
+
const rows = db.prepare(
|
|
318
|
+
`SELECT id, slice_id, one_liner
|
|
319
|
+
FROM tasks
|
|
320
|
+
WHERE milestone_id=:mid
|
|
321
|
+
AND status='complete'
|
|
322
|
+
AND completed_at IS NOT NULL
|
|
323
|
+
ORDER BY completed_at DESC
|
|
324
|
+
LIMIT ${safeLimit}`,
|
|
325
|
+
).all({ ":mid": milestoneId });
|
|
326
|
+
return rows.map((row) => ({
|
|
327
|
+
taskId: String(row["id"] ?? ""),
|
|
328
|
+
sliceId: String(row["slice_id"] ?? ""),
|
|
329
|
+
oneLiner: String(row["one_liner"] ?? ""),
|
|
330
|
+
}));
|
|
331
|
+
}
|
|
332
|
+
|
|
273
333
|
/**
|
|
274
334
|
* Load slices for many milestones in a single query. Returns a Map keyed by
|
|
275
335
|
* milestone_id, preserving `ORDER BY sequence, id` within each bucket.
|
|
@@ -342,6 +402,24 @@ export function getArtifact(path: string): ArtifactRow | null {
|
|
|
342
402
|
return rowToArtifact(row);
|
|
343
403
|
}
|
|
344
404
|
|
|
405
|
+
/** Milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from the artifacts table. */
|
|
406
|
+
export function getMilestoneScopedArtifacts(milestoneId: string): ArtifactRow[] {
|
|
407
|
+
if (!getDbOrNull()!) return [];
|
|
408
|
+
const rows = getDbOrNull()!.prepare(
|
|
409
|
+
"SELECT * FROM artifacts WHERE milestone_id = :mid AND slice_id IS NULL AND task_id IS NULL ORDER BY path",
|
|
410
|
+
).all({ ":mid": milestoneId });
|
|
411
|
+
return rows.map(rowToArtifact);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/** Slice-level artifacts (CONTEXT, RESEARCH, CONTINUE, etc.) from the artifacts table. */
|
|
415
|
+
export function getSliceScopedArtifacts(milestoneId: string, sliceId: string): ArtifactRow[] {
|
|
416
|
+
if (!getDbOrNull()!) return [];
|
|
417
|
+
const rows = getDbOrNull()!.prepare(
|
|
418
|
+
"SELECT * FROM artifacts WHERE milestone_id = :mid AND slice_id = :sid AND task_id IS NULL ORDER BY path",
|
|
419
|
+
).all({ ":mid": milestoneId, ":sid": sliceId });
|
|
420
|
+
return rows.map(rowToArtifact);
|
|
421
|
+
}
|
|
422
|
+
|
|
345
423
|
/** Fast milestone status check — avoids deserializing JSON planning fields. */
|
|
346
424
|
export function getActiveMilestoneIdFromDb(): IdStatusSummary | null {
|
|
347
425
|
if (!getDbOrNull()!) return null;
|
|
@@ -520,9 +520,33 @@ export function getRecentUnitKeysForWorker(
|
|
|
520
520
|
export function getRecentUnitKeysForProjectRoot(
|
|
521
521
|
projectRootRealpath: string,
|
|
522
522
|
limit = 20,
|
|
523
|
+
traceId?: string,
|
|
523
524
|
): Array<{ key: string }> {
|
|
524
525
|
if (!isDbAvailable()) return [];
|
|
525
526
|
const db = _getAdapter()!;
|
|
527
|
+
// When a trace_id is provided, scope the window to the current session so
|
|
528
|
+
// stale finalize-retry entries from PREVIOUS sessions don't fire detectStuck
|
|
529
|
+
// Rule 1 on the first iteration of a new session — killing auto-mode before
|
|
530
|
+
// any new dispatch runs. Without this, a project that had two consecutive
|
|
531
|
+
// finalize-retry failures in a prior session is permanently stuck: every
|
|
532
|
+
// fresh session loads those stale errors and immediately declares stuck.
|
|
533
|
+
if (traceId) {
|
|
534
|
+
const rows = db.prepare(
|
|
535
|
+
`SELECT ud.unit_type, ud.unit_id
|
|
536
|
+
FROM unit_dispatches ud
|
|
537
|
+
INNER JOIN workers w ON w.worker_id = ud.worker_id
|
|
538
|
+
WHERE w.project_root_realpath = :project_root_realpath
|
|
539
|
+
AND w.status != 'crashed'
|
|
540
|
+
AND ud.trace_id = :trace_id
|
|
541
|
+
ORDER BY ud.started_at DESC, ud.id DESC
|
|
542
|
+
LIMIT :limit`,
|
|
543
|
+
).all({
|
|
544
|
+
":project_root_realpath": projectRootRealpath,
|
|
545
|
+
":trace_id": traceId,
|
|
546
|
+
":limit": limit,
|
|
547
|
+
}) as Array<{ unit_type: string; unit_id: string }>;
|
|
548
|
+
return rows.reverse().map((r) => ({ key: `${r.unit_type}/${r.unit_id}` }));
|
|
549
|
+
}
|
|
526
550
|
const rows = db.prepare(
|
|
527
551
|
`SELECT ud.unit_type, ud.unit_id
|
|
528
552
|
FROM unit_dispatches ud
|
|
@@ -11,6 +11,29 @@ import { logError, logWarning } from "../../workflow-logger.js";
|
|
|
11
11
|
import { getDbOrNull, openDatabase } from "../engine.js";
|
|
12
12
|
import { TERMINAL_STATUS_SQL } from "../sql-constants.js";
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Optional override for the project-root DB open inside reconcileWorktreeDb.
|
|
16
|
+
* Production leaves this null so the real engine.openDatabase runs; tests
|
|
17
|
+
* inject a function returning false to deterministically exercise the
|
|
18
|
+
* cannot-open-main-DB branch (reconcile.ts:82), which is otherwise unreachable
|
|
19
|
+
* without a contrived provider/OS fault (openDatabase rethrows on real failures
|
|
20
|
+
* rather than returning false across providers).
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
let _mainDbOpenerFn: ((mainDbPath: string) => boolean) | null = null;
|
|
24
|
+
|
|
25
|
+
export function _setMainDbOpenerFnForTests(
|
|
26
|
+
fn: ((mainDbPath: string) => boolean) | null,
|
|
27
|
+
): () => void {
|
|
28
|
+
const previous = _mainDbOpenerFn;
|
|
29
|
+
_mainDbOpenerFn = fn;
|
|
30
|
+
return () => { _mainDbOpenerFn = previous; };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function openMainDb(mainDbPath: string): boolean {
|
|
34
|
+
return _mainDbOpenerFn ? _mainDbOpenerFn(mainDbPath) : openDatabase(mainDbPath);
|
|
35
|
+
}
|
|
36
|
+
|
|
14
37
|
export function copyWorktreeDb(srcDbPath: string, destDbPath: string): boolean {
|
|
15
38
|
try {
|
|
16
39
|
if (!existsSync(srcDbPath)) return false;
|
|
@@ -77,7 +100,7 @@ export function reconcileWorktreeDb(
|
|
|
77
100
|
return zero;
|
|
78
101
|
}
|
|
79
102
|
if (!getDbOrNull()!) {
|
|
80
|
-
const opened =
|
|
103
|
+
const opened = openMainDb(mainDbPath);
|
|
81
104
|
if (!opened) {
|
|
82
105
|
logError("db", "worktree DB reconciliation failed: cannot open main DB");
|
|
83
106
|
return zero;
|
|
@@ -5,6 +5,7 @@ import { existsSync } from "node:fs";
|
|
|
5
5
|
import { dirname } from "node:path";
|
|
6
6
|
|
|
7
7
|
import type { GsdWorkspace, MilestoneScope } from "./workspace.js";
|
|
8
|
+
import type { DbAdapter } from "./db-adapter.js";
|
|
8
9
|
import {
|
|
9
10
|
backupDatabaseSnapshot,
|
|
10
11
|
checkpointDatabase,
|
|
@@ -18,6 +19,7 @@ import {
|
|
|
18
19
|
openDatabase,
|
|
19
20
|
openDatabaseByScope,
|
|
20
21
|
openDatabaseByWorkspace,
|
|
22
|
+
openIsolatedDatabase,
|
|
21
23
|
refreshOpenDatabaseFromDisk,
|
|
22
24
|
vacuumDatabase,
|
|
23
25
|
wasDbOpenAttempted,
|
|
@@ -113,6 +115,19 @@ export function openWorkflowDatabasePath(path: string): boolean {
|
|
|
113
115
|
return openDatabase(path);
|
|
114
116
|
}
|
|
115
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Open an isolated database connection for read-only observation without
|
|
120
|
+
* displacing the active workflow session's global DB handle. The caller is
|
|
121
|
+
* responsible for calling `adapter.close()` when done.
|
|
122
|
+
*
|
|
123
|
+
* Use this for background observers (e.g. the parallel monitor overlay) that
|
|
124
|
+
* need to query a database on a 5s tick without interfering with the primary
|
|
125
|
+
* connection. Returns null if the connection cannot be opened.
|
|
126
|
+
*/
|
|
127
|
+
export function openWorkflowDatabaseIsolated(path: string): DbAdapter | null {
|
|
128
|
+
return openIsolatedDatabase(path);
|
|
129
|
+
}
|
|
130
|
+
|
|
116
131
|
export function openWorkflowDatabaseByWorkspace(workspace: GsdWorkspace): boolean {
|
|
117
132
|
return openDatabaseByWorkspace(workspace);
|
|
118
133
|
}
|