@opengsd/gsd-pi 1.3.0 → 1.4.0
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 +10 -10
- package/dist/cli.js +32 -4
- package/dist/headless-answers.js +1 -1
- package/dist/headless-context.js +0 -1
- package/dist/headless-ui.d.ts +1 -1
- package/dist/headless-ui.js +1 -1
- package/dist/headless.js +1 -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/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/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +84 -22
- package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
- package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
- 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 +28 -10
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +108 -19
- package/dist/resources/extensions/gsd/auto-budget.js +5 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +62 -27
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +28 -22
- package/dist/resources/extensions/gsd/auto-prompts.js +68 -43
- package/dist/resources/extensions/gsd/auto-recovery.js +14 -483
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -5
- package/dist/resources/extensions/gsd/auto-start.js +56 -30
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
- package/dist/resources/extensions/gsd/auto-verification.js +10 -4
- package/dist/resources/extensions/gsd/auto-worktree.js +117 -91
- package/dist/resources/extensions/gsd/auto.js +40 -15
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +141 -65
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -5
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +23 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +117 -27
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +190 -43
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +96 -10
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +73 -16
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +95 -5
- 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/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +30 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +225 -1
- package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
- package/dist/resources/extensions/gsd/commands-context.js +19 -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 +23 -12
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
- package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
- 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 +2 -2
- 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 +71 -6
- package/dist/resources/extensions/gsd/db/engine.js +31 -1
- package/dist/resources/extensions/gsd/db/queries.js +114 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
- package/dist/resources/extensions/gsd/db-workspace.js +68 -4
- package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
- package/dist/resources/extensions/gsd/doctor-git-checks.js +25 -3
- package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -15
- 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/exec-sandbox.js +53 -11
- 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 +221 -0
- package/dist/resources/extensions/gsd/forensics.js +4 -33
- package/dist/resources/extensions/gsd/git-service.js +68 -8
- package/dist/resources/extensions/gsd/gitignore.js +10 -3
- package/dist/resources/extensions/gsd/guidance.js +7 -7
- package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
- package/dist/resources/extensions/gsd/guided-flow.js +11 -6
- package/dist/resources/extensions/gsd/health-widget.js +55 -29
- package/dist/resources/extensions/gsd/json-persistence.js +20 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
- package/dist/resources/extensions/gsd/layout-policy.js +77 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +396 -122
- 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/memory-backfill.js +28 -21
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
- package/dist/resources/extensions/gsd/metrics.js +22 -14
- 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 +62 -8
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -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 +79 -18
- package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
- 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/orphan-stash-audit.js +92 -16
- 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 +23 -11
- package/dist/resources/extensions/gsd/preferences.js +62 -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 +39 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +21 -16
- 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/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-milestone.md +2 -2
- 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/plan-slice.md +3 -3
- 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/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/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/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/queue-order.js +3 -2
- package/dist/resources/extensions/gsd/quick.js +45 -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/root-write-leak-guard.js +7 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/service-tier.js +2 -1
- package/dist/resources/extensions/gsd/session-forensics.js +11 -1
- package/dist/resources/extensions/gsd/session-lock.js +7 -6
- 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/derive/cache.js +28 -0
- package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
- package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
- package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
- package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +38 -4
- 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 +138 -19
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +84 -26
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +34 -18
- package/dist/resources/extensions/gsd/state.js +13 -581
- 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 +8 -4
- package/dist/resources/extensions/gsd/tools/complete-slice.js +14 -4
- package/dist/resources/extensions/gsd/tools/complete-task.js +58 -15
- package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +60 -47
- package/dist/resources/extensions/gsd/tools/plan-task.js +40 -2
- 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/undo.js +51 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
- package/dist/resources/extensions/gsd/unit-registry.js +63 -9
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +91 -5
- package/dist/resources/extensions/gsd/validation-block-guard.js +54 -4
- package/dist/resources/extensions/gsd/verification-gate.js +7 -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-manifest.js +126 -13
- package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +44 -18
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
- 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 +59 -17
- package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
- package/dist/resources/extensions/mcp-client/manager.js +3 -3
- 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 +11 -11
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- 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/page_client-reference-manifest.js +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/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- 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/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.d0d9e0a955e441cb.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/8785.e29b3134cab1d153.js +1 -0
- package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-a48b7c48333b31c8.js → page-bc4c723c6a19c6f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
- 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 +7 -6
- 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/dist/workflow.d.ts +1 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +2 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +3 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts +2 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +2 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
- package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
- package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -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 +25 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
- 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 -829
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -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 +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-ui-state.d.ts +54 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
- 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 +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.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 +18 -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 +11 -1
- 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 +30 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +85 -6
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +35 -21
- package/packages/mcp-server/dist/workflow-tools.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 +3 -2
- 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/dist/models.generated.d.ts +46 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +38 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +3 -2
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme-schema.d.ts +75 -75
- package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/theme/theme-schema.js +1 -1
- package/pkg/dist/theme/theme-schema.js.map +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +11 -7
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +22 -22
- package/src/resources/extensions/claude-code-cli/index.ts +8 -1
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +103 -22
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +61 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +262 -10
- package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
- package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +69 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +38 -13
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +129 -20
- package/src/resources/extensions/gsd/auto-budget.ts +12 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +68 -34
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -23
- package/src/resources/extensions/gsd/auto-prompts.ts +81 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +21 -484
- package/src/resources/extensions/gsd/auto-runtime-state.ts +17 -5
- package/src/resources/extensions/gsd/auto-start.ts +63 -34
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
- package/src/resources/extensions/gsd/auto-verification.ts +10 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +48 -15
- package/src/resources/extensions/gsd/auto.ts +46 -11
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +164 -71
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -5
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +139 -27
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +219 -46
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +104 -10
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +86 -18
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +109 -4
- 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/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +31 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +225 -1
- package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
- package/src/resources/extensions/gsd/commands-context.ts +18 -1
- 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 +21 -10
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
- package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
- 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 +3 -1
- 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 +73 -7
- package/src/resources/extensions/gsd/db/engine.ts +34 -1
- package/src/resources/extensions/gsd/db/queries.ts +157 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
- package/src/resources/extensions/gsd/db-workspace.ts +76 -3
- package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
- package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
- package/src/resources/extensions/gsd/doctor-git-checks.ts +24 -2
- package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -15
- package/src/resources/extensions/gsd/doctor-types.ts +4 -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/exec-sandbox.ts +56 -11
- 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 +249 -0
- package/src/resources/extensions/gsd/forensics.ts +4 -34
- package/src/resources/extensions/gsd/git-constants.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +76 -7
- package/src/resources/extensions/gsd/gitignore.ts +11 -4
- package/src/resources/extensions/gsd/guidance.ts +7 -7
- package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
- package/src/resources/extensions/gsd/guided-flow.ts +11 -6
- package/src/resources/extensions/gsd/health-widget.ts +69 -32
- package/src/resources/extensions/gsd/json-persistence.ts +20 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
- package/src/resources/extensions/gsd/layout-policy.ts +86 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +409 -112
- 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/memory-backfill.ts +26 -20
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
- package/src/resources/extensions/gsd/metrics.ts +26 -13
- 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 +57 -8
- package/src/resources/extensions/gsd/migration-auto-check.ts +27 -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 +78 -19
- package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
- 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/orphan-stash-audit.ts +108 -20
- 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 +25 -9
- package/src/resources/extensions/gsd/preferences.ts +80 -12
- 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 +39 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +21 -16
- 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/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-milestone.md +2 -2
- 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/plan-slice.md +3 -3
- 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/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/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/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/queue-order.ts +3 -2
- package/src/resources/extensions/gsd/quick.ts +43 -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/root-write-leak-guard.ts +13 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/service-tier.ts +2 -0
- package/src/resources/extensions/gsd/session-forensics.ts +11 -1
- package/src/resources/extensions/gsd/session-lock.ts +7 -6
- 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/derive/cache.ts +46 -0
- package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
- package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
- package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
- package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +35 -4
- 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 +176 -30
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +86 -27
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +45 -18
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
- package/src/resources/extensions/gsd/state.ts +37 -695
- 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/artifact-retry-cap.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +420 -2
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
- 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-orchestrator.test.ts +15 -12
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
- 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 +182 -4
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +146 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
- 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 +863 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
- 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.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +18 -7
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +82 -7
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -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/destructive-guard.test.ts +44 -0
- 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-history.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +175 -43
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +239 -2
- 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/exec-graceful-kill.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
- 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-change-validator.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +149 -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/forensics-error-filter.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- 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/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
- 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/integration/queue-active-milestone-context-budget.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +386 -0
- package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -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/memory-consolidation-scanner.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -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 +204 -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/observability-validator-boundary.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
- 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/parallel-research-dispatch.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
- 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-prompt.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +161 -27
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +48 -5
- 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/post-mutation-hook.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +23 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -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/register-hooks-depth-verification.test.ts +166 -4
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
- 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/stalled-tool-recovery.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +329 -57
- 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/tool-call-loop-guard.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
- 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/undo.test.ts +113 -37
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +212 -11
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +110 -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 +130 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +156 -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-manifest.test.ts +96 -15
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +42 -12
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +70 -13
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
- 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 +7 -9
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +68 -16
- package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
- package/src/resources/extensions/gsd/tools/plan-slice.ts +61 -50
- package/src/resources/extensions/gsd/tools/plan-task.ts +43 -2
- 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/undo.ts +55 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
- package/src/resources/extensions/gsd/unit-registry.ts +63 -9
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +101 -6
- package/src/resources/extensions/gsd/validation-block-guard.ts +59 -7
- package/src/resources/extensions/gsd/verification-gate.ts +8 -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-manifest.ts +141 -7
- package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +44 -18
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
- 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 +72 -16
- package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
- package/src/resources/extensions/mcp-client/manager.ts +3 -3
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-f0285ce91d4ec9ef.js +0 -1
- /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → zQLcXm0Za8lexoXtgDpMG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → zQLcXm0Za8lexoXtgDpMG}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Workspace-facing Interface for opening and maintaining the workflow database.
|
|
3
3
|
import { existsSync } from "node:fs";
|
|
4
|
-
import { dirname } from "node:path";
|
|
5
|
-
import { backupDatabaseSnapshot, checkpointDatabase, closeAllDatabases, closeDatabase, closeDatabaseByWorkspace, getDbPath, getDbStatus, getDbProvider, isDbAvailable, openDatabase, openDatabaseByScope, openDatabaseByWorkspace, refreshOpenDatabaseFromDisk, vacuumDatabase, wasDbOpenAttempted, } from "./gsd-db.js";
|
|
6
|
-
import { resolveGsdPathContract } from "./paths.js";
|
|
7
|
-
import { setLogBasePath } from "./workflow-logger.js";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { backupDatabaseSnapshot, checkpointDatabase, closeAllDatabases, closeDatabase, closeDatabaseByWorkspace, getDbPath, getDbStatus, getDbProvider, isDbAvailable, openDatabase, openDatabaseByScope, openDatabaseByWorkspace, openIsolatedDatabase, refreshOpenDatabaseFromDisk, vacuumDatabase, wasDbOpenAttempted, } from "./gsd-db.js";
|
|
6
|
+
import { resolveGsdPathContract, gsdRoot } from "./paths.js";
|
|
7
|
+
import { logWarning, setLogBasePath } from "./workflow-logger.js";
|
|
8
|
+
/**
|
|
9
|
+
* Global SQLite handle invariants:
|
|
10
|
+
*
|
|
11
|
+
* - `openWorkflowDatabase` / `openDatabase` switch the process-global handle consumed by
|
|
12
|
+
* deriveState, dispatch, reconciliation repairs, and domain writers. Only one active
|
|
13
|
+
* project database should own the global handle at a time.
|
|
14
|
+
* - `openWorkflowDatabaseIsolated` opens a caller-owned connection that does not clobber
|
|
15
|
+
* the global handle. Use for read-only observers (parallel monitor) and other background
|
|
16
|
+
* probes that must not disturb the active workflow session.
|
|
17
|
+
* - Reconciliation repairs that write markdown/DB state must use `ensureWorkflowDbForBase`
|
|
18
|
+
* so repairs target the correct project; those paths intentionally re-open the global handle.
|
|
19
|
+
* - Pair ad-hoc project switches with `closeWorkflowDatabase()` or restore via
|
|
20
|
+
* `ensureWorkflowDbForBase(..., { refresh: true })` before returning to derive/dispatch.
|
|
21
|
+
*/
|
|
8
22
|
export function resolveWorkflowDatabaseLocation(basePath) {
|
|
9
23
|
const contract = resolveGsdPathContract(basePath);
|
|
10
24
|
return {
|
|
@@ -59,6 +73,18 @@ export function openExistingWorkflowDatabase(basePath) {
|
|
|
59
73
|
export function openWorkflowDatabasePath(path) {
|
|
60
74
|
return openDatabase(path);
|
|
61
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Open an isolated database connection for read-only observation without
|
|
78
|
+
* displacing the active workflow session's global DB handle. The caller is
|
|
79
|
+
* responsible for calling `adapter.close()` when done.
|
|
80
|
+
*
|
|
81
|
+
* Use this for background observers (e.g. the parallel monitor overlay) that
|
|
82
|
+
* need to query a database on a 5s tick without interfering with the primary
|
|
83
|
+
* connection. Returns null if the connection cannot be opened.
|
|
84
|
+
*/
|
|
85
|
+
export function openWorkflowDatabaseIsolated(path) {
|
|
86
|
+
return openIsolatedDatabase(path);
|
|
87
|
+
}
|
|
62
88
|
export function openWorkflowDatabaseByWorkspace(workspace) {
|
|
63
89
|
return openDatabaseByWorkspace(workspace);
|
|
64
90
|
}
|
|
@@ -92,6 +118,44 @@ export function getWorkflowDatabasePath() {
|
|
|
92
118
|
export function refreshWorkflowDatabaseFromDisk() {
|
|
93
119
|
return refreshOpenDatabaseFromDisk();
|
|
94
120
|
}
|
|
121
|
+
export function expectedWorkflowDbPathForBase(basePath) {
|
|
122
|
+
return join(gsdRoot(basePath), "gsd.db");
|
|
123
|
+
}
|
|
124
|
+
export function ensureWorkflowDbAtPath(dbPath) {
|
|
125
|
+
if (!dbPath || dbPath === ":memory:")
|
|
126
|
+
return isDbAvailable();
|
|
127
|
+
if (isDbAvailable() && getWorkflowDatabasePath() === dbPath)
|
|
128
|
+
return true;
|
|
129
|
+
if (!existsSync(dbPath))
|
|
130
|
+
return false;
|
|
131
|
+
try {
|
|
132
|
+
return openWorkflowDatabasePath(dbPath);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
logWarning("reconcile", `ensureWorkflowDbAtPath could not reopen DB: ${err.message}`);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export function ensureWorkflowDbForBase(basePath, options = {}) {
|
|
140
|
+
const dbPath = expectedWorkflowDbPathForBase(basePath);
|
|
141
|
+
if (!existsSync(dbPath))
|
|
142
|
+
return false;
|
|
143
|
+
try {
|
|
144
|
+
if (options.refresh) {
|
|
145
|
+
if (isDbAvailable() && getWorkflowDatabasePath() === dbPath && refreshWorkflowDatabaseFromDisk()) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return openWorkflowDatabasePath(dbPath);
|
|
149
|
+
}
|
|
150
|
+
if (isDbAvailable() && getWorkflowDatabasePath() === dbPath)
|
|
151
|
+
return true;
|
|
152
|
+
return openWorkflowDatabasePath(dbPath);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
logWarning("reconcile", `ensureWorkflowDbForBase could not reopen DB: ${err.message}`);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
95
159
|
export function checkpointWorkflowDatabase() {
|
|
96
160
|
checkpointDatabase();
|
|
97
161
|
}
|
|
@@ -94,7 +94,7 @@ const POLICY = {
|
|
|
94
94
|
gsd_plan_task: {
|
|
95
95
|
toolName: "gsd_plan_task",
|
|
96
96
|
verdict: "no",
|
|
97
|
-
rationale: "
|
|
97
|
+
rationale: "Incremental task planning mutates the active slice plan and re-renders projections; keep it ordered in the foreground plan-slice unit.",
|
|
98
98
|
},
|
|
99
99
|
};
|
|
100
100
|
function resolveCanonical(name) {
|
|
@@ -6,7 +6,7 @@ import { startAutoDetached } from "./auto.js";
|
|
|
6
6
|
import { extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
|
|
7
7
|
import { getMilestone, insertMilestone, isDbAvailable } from "./gsd-db.js";
|
|
8
8
|
import { assessMilestoneHandoffReadiness, formatAcceptedDiscussHandoffMessage, } from "./milestone-readiness.js";
|
|
9
|
-
import { gsdRoot, resolveGsdRootFile, resolveMilestoneFile } from "./paths.js";
|
|
9
|
+
import { clearPathCache, gsdRoot, resolveGsdRootFile, resolveMilestoneFile } from "./paths.js";
|
|
10
10
|
import { _getPendingAutoStart, deletePendingAutoStart } from "./pending-auto-start.js";
|
|
11
11
|
import { logWarning } from "./workflow-logger.js";
|
|
12
12
|
import { readManifest } from "./workflow-manifest.js";
|
|
@@ -186,14 +186,18 @@ function cleanupAcceptedHandoffArtifacts(entry) {
|
|
|
186
186
|
}
|
|
187
187
|
/** Called from agent_end to check if auto-mode should start after discuss. */
|
|
188
188
|
export function checkAutoStartAfterDiscuss(lookupBasePath) {
|
|
189
|
+
// Clear the path cache so layout-aware resolution sees fresh directory
|
|
190
|
+
// listings — the cache may have been primed before discuss wrote its
|
|
191
|
+
// artifacts (e.g. CONTEXT.md), causing resolveMilestoneFile to miss them.
|
|
192
|
+
clearPathCache();
|
|
189
193
|
const entry = _getPendingAutoStart(lookupBasePath);
|
|
190
194
|
if (!entry)
|
|
191
195
|
return false;
|
|
192
196
|
const { ctx, pi, basePath, milestoneId, step } = entry;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const contextFile =
|
|
196
|
-
const roadmapFile =
|
|
197
|
+
// Use layout-aware resolution so flat-phase projects (phases/NN-slug/)
|
|
198
|
+
// are found as well as legacy projects (milestones/MID/).
|
|
199
|
+
const contextFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT");
|
|
200
|
+
const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
197
201
|
if (!contextFile && !roadmapFile)
|
|
198
202
|
return false;
|
|
199
203
|
if (hasBlockingDepthGate(entry))
|
|
@@ -273,10 +273,10 @@ This config sets a parent workspace with two child repositories. The implicit `p
|
|
|
273
273
|
- `audit_unified.enabled`: boolean — dual-write unified audit envelope events. Default: `true`.
|
|
274
274
|
- `plan_v2.enabled`: boolean — enable bounded clarify/research/draft/compile planning flow. Default: `true`.
|
|
275
275
|
|
|
276
|
-
- `context_management`: configures context hygiene for auto-mode sessions. Keys:
|
|
276
|
+
- `context_management`: configures context hygiene for auto-mode sessions. In step mode, the configurable threshold is a soft warning; automatic session re-rooting happens only at the fixed 90% hard context boundary. Keys:
|
|
277
277
|
- `observation_masking`: boolean — mask old tool results to reduce context bloat. Default: `true`.
|
|
278
278
|
- `observation_mask_turns`: number — keep this many recent turns verbatim (1-50). Default: `8`.
|
|
279
|
-
- `compaction_threshold_percent`: number —
|
|
279
|
+
- `compaction_threshold_percent`: number — show a soft context warning at this fraction of the context window (0.5-0.95). Lower values warn earlier so operators can compact manually before drift accumulates. Default: `0.60`.
|
|
280
280
|
- `tool_result_max_chars`: number — max chars per tool result in GSD sessions (200-10000). Default: `800`.
|
|
281
281
|
|
|
282
282
|
- `auto_visualize`: boolean — show a visualizer hint after each milestone completion in auto-mode. Default: `false`.
|
|
@@ -1,11 +1,115 @@
|
|
|
1
|
-
import { existsSync, statSync } from "node:fs";
|
|
2
|
-
import {
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, join, relative } from "node:path";
|
|
3
|
+
import { getAllMilestones, getMilestoneSlices, getSliceTasks, isDbAvailable, isMemoriesFtsAvailable, _getAdapter, } from "./gsd-db.js";
|
|
4
|
+
import { MEMORIES_FTS_REBUILT_KEY } from "./db-memory-fts-schema.js";
|
|
3
5
|
import { isAfter, latestExplicitReopenAt } from "./milestone-reopen-events.js";
|
|
4
|
-
import { resolveGsdPathContract, resolveMilestoneFile } from "./paths.js";
|
|
6
|
+
import { gsdProjectionRoot, gsdRoot, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "./paths.js";
|
|
5
7
|
import { deriveState } from "./state.js";
|
|
8
|
+
import { isClosedStatus } from "./status-guards.js";
|
|
6
9
|
import { workflowEventLogPath } from "./workflow-event-ledger.js";
|
|
7
10
|
import { readEvents } from "./workflow-events.js";
|
|
8
11
|
import { flushWorkflowProjections } from "./projection-flush.js";
|
|
12
|
+
import { parseRoadmapSlices } from "./roadmap-slices.js";
|
|
13
|
+
import { parsePlan } from "./parsers-legacy.js";
|
|
14
|
+
function relativeFile(basePath, filePath) {
|
|
15
|
+
return relative(basePath, filePath).split("\\").join("/");
|
|
16
|
+
}
|
|
17
|
+
function reportCheckboxDbStatusDivergence(issues, basePath, filePath, scope, unitId, status, checkboxDone) {
|
|
18
|
+
const dbDone = isClosedStatus(status);
|
|
19
|
+
if (checkboxDone === dbDone)
|
|
20
|
+
return;
|
|
21
|
+
issues.push({
|
|
22
|
+
severity: "error",
|
|
23
|
+
code: "checkbox_db_status_divergence",
|
|
24
|
+
scope,
|
|
25
|
+
unitId,
|
|
26
|
+
message: `${scope === "slice" ? "Slice" : "Task"} ${unitId} is ${dbDone ? "closed" : "open"} in the database (status: ${status}) but the markdown checkbox is ${checkboxDone ? "checked" : "unchecked"}.`,
|
|
27
|
+
file: relativeFile(basePath, filePath),
|
|
28
|
+
fixable: false,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function checkProjectionCheckboxDbStatus(basePath, milestoneIds, issues) {
|
|
32
|
+
for (const milestoneId of milestoneIds) {
|
|
33
|
+
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
34
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
35
|
+
if (roadmapPath && existsSync(roadmapPath)) {
|
|
36
|
+
try {
|
|
37
|
+
const roadmap = readFileSync(roadmapPath, "utf-8");
|
|
38
|
+
const sliceDoneById = new Map(parseRoadmapSlices(roadmap).map((entry) => [entry.id, entry.done]));
|
|
39
|
+
for (const slice of slices) {
|
|
40
|
+
const checkboxDone = sliceDoneById.get(slice.id);
|
|
41
|
+
if (checkboxDone === undefined)
|
|
42
|
+
continue;
|
|
43
|
+
reportCheckboxDbStatusDivergence(issues, basePath, roadmapPath, "slice", `${milestoneId}/${slice.id}`, slice.status, checkboxDone);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Non-fatal — checkbox drift diagnostics must never block doctor.
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
for (const slice of slices) {
|
|
51
|
+
const planPath = resolveSliceFile(basePath, milestoneId, slice.id, "PLAN");
|
|
52
|
+
if (!planPath || !existsSync(planPath))
|
|
53
|
+
continue;
|
|
54
|
+
try {
|
|
55
|
+
const plan = readFileSync(planPath, "utf-8");
|
|
56
|
+
// parsePlan reads the authoritative task checkboxes (the flat-phase
|
|
57
|
+
// <tasks> block / ## Tasks section), so a stray task-style checkbox
|
|
58
|
+
// line elsewhere in PLAN.md (e.g. a Must-Haves or Verification bullet
|
|
59
|
+
// above <tasks>) can no longer hide real drift or fake a divergence.
|
|
60
|
+
const taskDoneById = new Map(parsePlan(plan).tasks.map((entry) => [entry.id, entry.done]));
|
|
61
|
+
for (const task of getSliceTasks(milestoneId, slice.id)) {
|
|
62
|
+
const checkboxDone = taskDoneById.get(task.id);
|
|
63
|
+
if (checkboxDone === undefined)
|
|
64
|
+
continue;
|
|
65
|
+
reportCheckboxDbStatusDivergence(issues, basePath, planPath, "task", `${milestoneId}/${slice.id}/${task.id}`, task.status, checkboxDone);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Non-fatal — checkbox drift diagnostics must never block doctor.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function isClearedByMilestoneShellProjectionFlush(basePath, issue, reRenderedMilestoneIds) {
|
|
75
|
+
if (issue.code !== "checkbox_db_status_divergence")
|
|
76
|
+
return false;
|
|
77
|
+
if (issue.scope !== "slice")
|
|
78
|
+
return false;
|
|
79
|
+
const milestoneId = issue.unitId.split("/")[0] ?? "";
|
|
80
|
+
if (!reRenderedMilestoneIds.has(milestoneId))
|
|
81
|
+
return false;
|
|
82
|
+
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
83
|
+
if (!roadmapPath || !issue.file)
|
|
84
|
+
return false;
|
|
85
|
+
return issue.file === relativeFile(basePath, roadmapPath);
|
|
86
|
+
}
|
|
87
|
+
function artifactExistsOnDisk(basePath, artifactPath) {
|
|
88
|
+
if (isAbsolute(artifactPath))
|
|
89
|
+
return existsSync(artifactPath);
|
|
90
|
+
return [
|
|
91
|
+
join(gsdProjectionRoot(basePath), artifactPath),
|
|
92
|
+
join(gsdRoot(basePath), artifactPath),
|
|
93
|
+
].some((candidate) => existsSync(candidate));
|
|
94
|
+
}
|
|
95
|
+
function artifactUnitId(row) {
|
|
96
|
+
if (!row.milestone_id)
|
|
97
|
+
return "project";
|
|
98
|
+
if (row.slice_id && row.task_id)
|
|
99
|
+
return `${row.milestone_id}/${row.slice_id}/${row.task_id}`;
|
|
100
|
+
if (row.slice_id)
|
|
101
|
+
return `${row.milestone_id}/${row.slice_id}`;
|
|
102
|
+
return row.milestone_id;
|
|
103
|
+
}
|
|
104
|
+
function artifactScope(row) {
|
|
105
|
+
if (row.task_id)
|
|
106
|
+
return "task";
|
|
107
|
+
if (row.slice_id)
|
|
108
|
+
return "slice";
|
|
109
|
+
if (row.milestone_id)
|
|
110
|
+
return "milestone";
|
|
111
|
+
return "project";
|
|
112
|
+
}
|
|
9
113
|
export async function checkEngineHealth(basePath, issues, fixesApplied) {
|
|
10
114
|
const dbPath = resolveGsdPathContract(basePath).projectDb;
|
|
11
115
|
if (!isDbAvailable() && existsSync(dbPath)) {
|
|
@@ -23,6 +127,30 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
|
|
|
23
127
|
try {
|
|
24
128
|
if (isDbAvailable()) {
|
|
25
129
|
const adapter = _getAdapter();
|
|
130
|
+
try {
|
|
131
|
+
if (isMemoriesFtsAvailable(adapter)) {
|
|
132
|
+
const runtimeKv = adapter
|
|
133
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='runtime_kv'")
|
|
134
|
+
.get();
|
|
135
|
+
const marker = runtimeKv
|
|
136
|
+
? adapter.prepare("SELECT 1 as present FROM runtime_kv WHERE scope = 'global' AND scope_id = '' AND key = :key").get({ ":key": MEMORIES_FTS_REBUILT_KEY })
|
|
137
|
+
: undefined;
|
|
138
|
+
if (!marker) {
|
|
139
|
+
issues.push({
|
|
140
|
+
severity: "warning",
|
|
141
|
+
code: "memories_fts_rebuild_missing",
|
|
142
|
+
scope: "project",
|
|
143
|
+
unitId: "project",
|
|
144
|
+
message: `Memory full-text index exists but runtime_kv has no ${MEMORIES_FTS_REBUILT_KEY} marker. The index may be stale or incomplete, so memory search can silently degrade to the LIKE fallback.`,
|
|
145
|
+
file: ".gsd/gsd.db",
|
|
146
|
+
fixable: false,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Non-fatal — memory FTS health check failed
|
|
153
|
+
}
|
|
26
154
|
// a. Orphaned tasks (task.slice_id points to non-existent slice)
|
|
27
155
|
try {
|
|
28
156
|
const orphanedTasks = adapter
|
|
@@ -172,7 +300,33 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
|
|
|
172
300
|
catch {
|
|
173
301
|
// Non-fatal — completed-milestone reopen check failed
|
|
174
302
|
}
|
|
175
|
-
// f.
|
|
303
|
+
// f. Artifact rows reference files that no longer exist on disk.
|
|
304
|
+
try {
|
|
305
|
+
const artifactRows = adapter
|
|
306
|
+
.prepare(`SELECT path, artifact_type, milestone_id, slice_id, task_id
|
|
307
|
+
FROM artifacts
|
|
308
|
+
WHERE path != ''
|
|
309
|
+
ORDER BY path`)
|
|
310
|
+
.all();
|
|
311
|
+
for (const row of artifactRows) {
|
|
312
|
+
if (artifactExistsOnDisk(basePath, row.path))
|
|
313
|
+
continue;
|
|
314
|
+
const unitId = artifactUnitId(row);
|
|
315
|
+
issues.push({
|
|
316
|
+
severity: "error",
|
|
317
|
+
code: "artifact_file_missing",
|
|
318
|
+
scope: artifactScope(row),
|
|
319
|
+
unitId,
|
|
320
|
+
message: `Artifact ${row.path} is recorded in the database as ${row.artifact_type || "UNKNOWN"} but no matching file exists on disk`,
|
|
321
|
+
file: row.path,
|
|
322
|
+
fixable: false,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
// Non-fatal — artifact file existence check failed
|
|
328
|
+
}
|
|
329
|
+
// g. Completion artifacts disagree with open DB hierarchy rows.
|
|
176
330
|
try {
|
|
177
331
|
const rows = adapter
|
|
178
332
|
.prepare(`SELECT a.path, a.artifact_type, a.milestone_id, a.slice_id, a.task_id, a.imported_at,
|
|
@@ -189,6 +343,8 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
|
|
|
189
343
|
.all();
|
|
190
344
|
const seen = new Set();
|
|
191
345
|
for (const row of rows) {
|
|
346
|
+
if (!artifactExistsOnDisk(basePath, row.path))
|
|
347
|
+
continue;
|
|
192
348
|
const reopenAt = latestExplicitReopenAt(basePath, row.milestone_id);
|
|
193
349
|
if (!isAfter(row.imported_at, reopenAt))
|
|
194
350
|
continue;
|
|
@@ -223,9 +379,24 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
|
|
|
223
379
|
catch {
|
|
224
380
|
// Non-fatal — DB constraint checks failed entirely
|
|
225
381
|
}
|
|
382
|
+
// Checkbox-vs-DB divergence detection runs before projection drift auto-fix
|
|
383
|
+
// so stale re-renders cannot overwrite manually edited markdown first. Runs
|
|
384
|
+
// inside its own try/catch: getAllMilestones / getMilestoneSlices /
|
|
385
|
+
// getSliceTasks issue prepared queries that can throw on a corrupt or locked
|
|
386
|
+
// DB, and like every other DB-touching check here this diagnostic must never
|
|
387
|
+
// block doctor.
|
|
388
|
+
try {
|
|
389
|
+
if (isDbAvailable()) {
|
|
390
|
+
checkProjectionCheckboxDbStatus(basePath, getAllMilestones().map((milestone) => milestone.id), issues);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
// Non-fatal: checkbox-vs-DB divergence check must never block doctor
|
|
395
|
+
}
|
|
226
396
|
// ── Projection drift detection ──────────────────────────────────────────
|
|
227
397
|
// If the DB is available, check whether markdown projections are stale
|
|
228
398
|
// relative to the event log and re-render them.
|
|
399
|
+
const reRenderedMilestoneIds = [];
|
|
229
400
|
try {
|
|
230
401
|
if (isDbAvailable()) {
|
|
231
402
|
const eventLogPath = workflowEventLogPath(basePath);
|
|
@@ -241,6 +412,7 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
|
|
|
241
412
|
try {
|
|
242
413
|
await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
|
|
243
414
|
fixesApplied.push(`re-rendered missing projections for ${milestone.id}`);
|
|
415
|
+
reRenderedMilestoneIds.push(milestone.id);
|
|
244
416
|
}
|
|
245
417
|
catch {
|
|
246
418
|
// Non-fatal — projection re-render failed
|
|
@@ -252,6 +424,7 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
|
|
|
252
424
|
try {
|
|
253
425
|
await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
|
|
254
426
|
fixesApplied.push(`re-rendered stale projections for ${milestone.id}`);
|
|
427
|
+
reRenderedMilestoneIds.push(milestone.id);
|
|
255
428
|
}
|
|
256
429
|
catch {
|
|
257
430
|
// Non-fatal — projection re-render failed
|
|
@@ -264,4 +437,19 @@ export async function checkEngineHealth(basePath, issues, fixesApplied) {
|
|
|
264
437
|
catch {
|
|
265
438
|
// Non-fatal — projection drift check must never block doctor
|
|
266
439
|
}
|
|
440
|
+
if (reRenderedMilestoneIds.length > 0) {
|
|
441
|
+
const reRendered = new Set(reRenderedMilestoneIds);
|
|
442
|
+
for (let i = issues.length - 1; i >= 0; i--) {
|
|
443
|
+
const issue = issues[i];
|
|
444
|
+
// flushWorkflowProjections re-renders milestone shell projections (not
|
|
445
|
+
// slice PLAN.md files), so only clear stale ROADMAP checkbox diagnostics.
|
|
446
|
+
if (isClearedByMilestoneShellProjectionFlush(basePath, issue, reRendered)) {
|
|
447
|
+
issues.splice(i, 1);
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
if (issue.code === "artifact_file_missing" && issue.file && artifactExistsOnDisk(basePath, issue.file)) {
|
|
451
|
+
issues.splice(i, 1);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
267
455
|
}
|
|
@@ -13,7 +13,7 @@ import { RUNTIME_EXCLUSION_PATHS, resolveMilestoneIntegrationBranch, writeIntegr
|
|
|
13
13
|
import { nativeIsRepo, nativeWorktreeList, nativeWorktreeRemove, nativeBranchList, nativeBranchDelete, nativeLsFiles, nativeRmCached, nativeHasChanges, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeAddTracked, nativeCommit } from "./native-git-bridge.js";
|
|
14
14
|
import { getAllWorktreeHealth } from "./worktree-health.js";
|
|
15
15
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
16
|
-
import { listUnmergedGitPaths } from "./git-conflict-state.js";
|
|
16
|
+
import { listUnmergedGitPaths, probeGitConflictState, reconcileGitConflictsOnSignal } from "./git-conflict-state.js";
|
|
17
17
|
import { resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
18
18
|
/**
|
|
19
19
|
* Returns true if the directory contains only doctor artifacts
|
|
@@ -141,13 +141,13 @@ function getSnapshotDiffCheckFailure(basePath) {
|
|
|
141
141
|
}
|
|
142
142
|
return failures.length > 0 ? failures.join("\n") : null;
|
|
143
143
|
}
|
|
144
|
-
export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode = "none") {
|
|
144
|
+
export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode = "none", dryRun = false) {
|
|
145
145
|
// Degrade gracefully if not a git repo
|
|
146
146
|
if (!nativeIsRepo(basePath)) {
|
|
147
147
|
return; // Not a git repo — skip all git health checks
|
|
148
148
|
}
|
|
149
149
|
const gitDir = resolveGitDir(basePath);
|
|
150
|
-
|
|
150
|
+
let unmergedPaths = listUnmergedGitPaths(basePath);
|
|
151
151
|
if (unmergedPaths === null) {
|
|
152
152
|
issues.push({
|
|
153
153
|
severity: "error",
|
|
@@ -159,6 +159,28 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
|
|
|
159
159
|
});
|
|
160
160
|
return;
|
|
161
161
|
}
|
|
162
|
+
// ── Auto-resolve safe conflicts before reporting ──────────────────────
|
|
163
|
+
// A failed worktree merge (e.g. during complete-slice) can leave conflict
|
|
164
|
+
// markers for paths that are always safe to accept from the milestone side
|
|
165
|
+
// (.gsd/ state and build artifacts). Run the same reconciliation the
|
|
166
|
+
// preflight/auto-worktree paths use before the doctor hard-blocks auto-mode,
|
|
167
|
+
// so only genuinely-manual conflicts remain. This also clears stale
|
|
168
|
+
// merge-state markers (e.g. MERGE_HEAD) in the same pass when auto-resolve
|
|
169
|
+
// empties the unmerged set (#849).
|
|
170
|
+
if (unmergedPaths.length > 0 && !dryRun) {
|
|
171
|
+
try {
|
|
172
|
+
const reconcileFixes = reconcileGitConflictsOnSignal(basePath, probeGitConflictState(basePath));
|
|
173
|
+
if (reconcileFixes.length > 0) {
|
|
174
|
+
fixesApplied.push(...reconcileFixes);
|
|
175
|
+
const refreshed = listUnmergedGitPaths(basePath);
|
|
176
|
+
if (refreshed !== null)
|
|
177
|
+
unmergedPaths = refreshed;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Non-fatal — fall through to report the unmerged paths as-is
|
|
182
|
+
}
|
|
183
|
+
}
|
|
162
184
|
// ── Orphaned auto-worktrees & Stale milestone branches ────────────────
|
|
163
185
|
// These checks only apply in worktree/branch modes — skip in none mode
|
|
164
186
|
// where no milestone worktrees or branches are created.
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* - Optional search/tool integrations (Brave, Tavily, Jina, Context7)
|
|
12
12
|
*/
|
|
13
13
|
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { access, readFile } from "node:fs/promises";
|
|
14
15
|
import { delimiter, join } from "node:path";
|
|
15
16
|
import { AuthStorage } from "@gsd/pi-coding-agent";
|
|
16
17
|
import { getEnvApiKey } from "@gsd/pi-ai";
|
|
@@ -133,15 +134,11 @@ const CLI_AUTH_PATH_CHECK_PROVIDERS = new Set([
|
|
|
133
134
|
"google-gemini-cli",
|
|
134
135
|
"google-antigravity",
|
|
135
136
|
]);
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
* Fast filesystem scan — no subprocess, no network, sub-1ms.
|
|
139
|
-
*/
|
|
140
|
-
function isCliBinaryInPath(providerId) {
|
|
137
|
+
let asyncCliBinaryPathCache = null;
|
|
138
|
+
function cliExecutableNames(providerId) {
|
|
141
139
|
const binaries = CLI_BINARY_MAP[providerId];
|
|
142
140
|
if (!binaries)
|
|
143
|
-
return
|
|
144
|
-
const pathDirs = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
141
|
+
return [];
|
|
145
142
|
// On Windows, command shims are commonly installed as .cmd/.exe/.bat/.com.
|
|
146
143
|
// Scan PATHEXT candidates in addition to the bare binary name.
|
|
147
144
|
const executableNames = [...binaries];
|
|
@@ -160,8 +157,45 @@ function isCliBinaryInPath(providerId) {
|
|
|
160
157
|
}
|
|
161
158
|
}
|
|
162
159
|
}
|
|
160
|
+
return executableNames;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if a CLI provider's binary exists anywhere in PATH.
|
|
164
|
+
* Fast filesystem scan — no subprocess, no network, sub-1ms.
|
|
165
|
+
*/
|
|
166
|
+
function isCliBinaryInPath(providerId) {
|
|
167
|
+
const cached = asyncCliBinaryPathCache?.get(providerId);
|
|
168
|
+
if (cached !== undefined)
|
|
169
|
+
return cached;
|
|
170
|
+
const executableNames = cliExecutableNames(providerId);
|
|
171
|
+
if (executableNames.length === 0)
|
|
172
|
+
return false;
|
|
173
|
+
const pathDirs = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
163
174
|
return pathDirs.some(dir => executableNames.some(name => existsSync(join(dir, name))));
|
|
164
175
|
}
|
|
176
|
+
async function isCliBinaryInPathAsync(providerId) {
|
|
177
|
+
const executableNames = cliExecutableNames(providerId);
|
|
178
|
+
if (executableNames.length === 0)
|
|
179
|
+
return false;
|
|
180
|
+
const pathDirs = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
181
|
+
const candidates = pathDirs.flatMap(dir => executableNames.map(name => join(dir, name)));
|
|
182
|
+
if (candidates.length === 0)
|
|
183
|
+
return false;
|
|
184
|
+
try {
|
|
185
|
+
await Promise.any(candidates.map(candidate => access(candidate)));
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function loadCliBinaryPathCache() {
|
|
193
|
+
const entries = await Promise.all(Object.keys(CLI_BINARY_MAP).map(async (providerId) => [
|
|
194
|
+
providerId,
|
|
195
|
+
await isCliBinaryInPathAsync(providerId),
|
|
196
|
+
]));
|
|
197
|
+
return new Map(entries);
|
|
198
|
+
}
|
|
165
199
|
function modelsJsonPaths() {
|
|
166
200
|
const home = homedir();
|
|
167
201
|
return [
|
|
@@ -170,7 +204,11 @@ function modelsJsonPaths() {
|
|
|
170
204
|
join(home, ".pi", "agent", "models.json"),
|
|
171
205
|
];
|
|
172
206
|
}
|
|
207
|
+
let asyncModelsJsonApiKeyCache = null;
|
|
173
208
|
function hasModelsJsonApiKey(providerId) {
|
|
209
|
+
if (asyncModelsJsonApiKeyCache) {
|
|
210
|
+
return asyncModelsJsonApiKeyCache.has(providerId);
|
|
211
|
+
}
|
|
174
212
|
for (const path of modelsJsonPaths()) {
|
|
175
213
|
if (!existsSync(path))
|
|
176
214
|
continue;
|
|
@@ -187,7 +225,25 @@ function hasModelsJsonApiKey(providerId) {
|
|
|
187
225
|
}
|
|
188
226
|
return false;
|
|
189
227
|
}
|
|
190
|
-
function
|
|
228
|
+
async function loadModelsJsonApiKeyCache() {
|
|
229
|
+
const providersWithKeys = new Set();
|
|
230
|
+
for (const path of modelsJsonPaths()) {
|
|
231
|
+
try {
|
|
232
|
+
const parsed = JSON.parse(await readFile(path, "utf-8"));
|
|
233
|
+
for (const [providerId, provider] of Object.entries(parsed.providers ?? {})) {
|
|
234
|
+
const apiKey = provider.apiKey;
|
|
235
|
+
if (typeof apiKey === "string" && apiKey.trim().length > 0) {
|
|
236
|
+
providersWithKeys.add(providerId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// Missing or malformed models.json should not break dashboard health checks.
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return providersWithKeys;
|
|
245
|
+
}
|
|
246
|
+
function resolveKeyFromAuthOrEnv(providerId) {
|
|
191
247
|
const info = PROVIDER_REGISTRY.find(p => p.id === providerId);
|
|
192
248
|
if (providerId === "anthropic-vertex" && process.env.ANTHROPIC_VERTEX_PROJECT_ID) {
|
|
193
249
|
return { found: true, source: "env", backedOff: false };
|
|
@@ -234,6 +290,12 @@ function resolveKey(providerId) {
|
|
|
234
290
|
if (info?.envVar && process.env[info.envVar]) {
|
|
235
291
|
return { found: true, source: "env", backedOff: false };
|
|
236
292
|
}
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
function resolveKey(providerId) {
|
|
296
|
+
const direct = resolveKeyFromAuthOrEnv(providerId);
|
|
297
|
+
if (direct)
|
|
298
|
+
return direct;
|
|
237
299
|
if (hasModelsJsonApiKey(providerId)) {
|
|
238
300
|
return { found: true, source: "models.json", backedOff: false };
|
|
239
301
|
}
|
|
@@ -432,6 +494,28 @@ export function runProviderChecks() {
|
|
|
432
494
|
results.push(...checkOptionalProviders());
|
|
433
495
|
return results;
|
|
434
496
|
}
|
|
497
|
+
/**
|
|
498
|
+
* Non-blocking equivalent of `runProviderChecks` for the health-widget
|
|
499
|
+
* background refresh. PATH checks and custom models.json discovery use async
|
|
500
|
+
* filesystem APIs so periodic widget refreshes do not stall the input loop.
|
|
501
|
+
*/
|
|
502
|
+
export async function runProviderChecksAsync() {
|
|
503
|
+
const [cliCache, modelsJsonCache] = await Promise.all([
|
|
504
|
+
loadCliBinaryPathCache(),
|
|
505
|
+
loadModelsJsonApiKeyCache(),
|
|
506
|
+
]);
|
|
507
|
+
const previousCliCache = asyncCliBinaryPathCache;
|
|
508
|
+
const previousModelsJsonCache = asyncModelsJsonApiKeyCache;
|
|
509
|
+
asyncCliBinaryPathCache = cliCache;
|
|
510
|
+
asyncModelsJsonApiKeyCache = modelsJsonCache;
|
|
511
|
+
try {
|
|
512
|
+
return runProviderChecks();
|
|
513
|
+
}
|
|
514
|
+
finally {
|
|
515
|
+
asyncCliBinaryPathCache = previousCliCache;
|
|
516
|
+
asyncModelsJsonApiKeyCache = previousModelsJsonCache;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
435
519
|
/**
|
|
436
520
|
* Format provider check results as a human-readable report string.
|
|
437
521
|
*/
|
|
@@ -10,25 +10,12 @@ import { getActiveAutoWorkers } from "./db/auto-workers.js";
|
|
|
10
10
|
import { normalizeRealPath } from "./paths.js";
|
|
11
11
|
import { ensureGitignore, isGsdGitignored } from "./gitignore.js";
|
|
12
12
|
import { readAllSessionStatuses, isSessionStale, removeSessionStatus } from "./session-status-io.js";
|
|
13
|
-
import { recoverFailedMigration } from "./migrate-external.js";
|
|
13
|
+
import { isCurrentGsdStateIntactForMigratingCleanup, recoverFailedMigration } from "./migrate-external.js";
|
|
14
14
|
import { splitCompletedKey } from "./forensics.js";
|
|
15
15
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
16
16
|
import { getAllMilestones, isDbAvailable } from "./gsd-db.js";
|
|
17
17
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
18
18
|
const MAX_UAT_ATTEMPTS = 3;
|
|
19
|
-
function isCurrentGsdStateIntactForMigratingCleanup(basePath) {
|
|
20
|
-
try {
|
|
21
|
-
const stateFile = resolveGsdRootFile(basePath, "STATE");
|
|
22
|
-
const milestonesPath = milestonesDir(basePath);
|
|
23
|
-
const dbPath = join(gsdRoot(basePath), "gsd.db");
|
|
24
|
-
const hasDbFile = existsSync(dbPath);
|
|
25
|
-
const hasNonEmptyDb = hasDbFile && statSync(dbPath).size > 0;
|
|
26
|
-
return existsSync(stateFile) && existsSync(milestonesPath) && hasNonEmptyDb;
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
19
|
function hasAssessmentVerdict(basePath, mid, sid) {
|
|
33
20
|
const assessmentPath = join(gsdRoot(basePath), "milestones", mid, "slices", sid, `${sid}-ASSESSMENT.md`);
|
|
34
21
|
if (!existsSync(assessmentPath))
|
|
@@ -400,6 +387,9 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
|
|
|
400
387
|
if (!existingLines.has(".gsd-worktrees/") && !existingLines.has(".gsd-worktrees")) {
|
|
401
388
|
missing.push(".gsd-worktrees/");
|
|
402
389
|
}
|
|
390
|
+
if (!existingLines.has(".gsd-backups/") && !existingLines.has(".gsd-backups")) {
|
|
391
|
+
missing.push(".gsd-backups/");
|
|
392
|
+
}
|
|
403
393
|
if (!hasBlanketIgnore) {
|
|
404
394
|
missing.push(...criticalPatterns.filter(p => !existingLines.has(p)));
|
|
405
395
|
}
|
|
@@ -442,7 +432,7 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
|
|
|
442
432
|
});
|
|
443
433
|
if (shouldFix("failed_migration")) {
|
|
444
434
|
if (recoverFailedMigration(basePath)) {
|
|
445
|
-
fixesApplied.push("recovered failed
|
|
435
|
+
fixesApplied.push("recovered failed external state migration");
|
|
446
436
|
}
|
|
447
437
|
else if (isCurrentGsdStateIntactForMigratingCleanup(basePath)) {
|
|
448
438
|
try {
|