@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
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
import { resolveExpectedArtifactPath } from "../auto-artifact-paths.ts";
|
|
37
37
|
import { AutoSession } from "../auto/session.ts";
|
|
38
38
|
import { acquireSessionLock, releaseSessionLock } from "../session-lock.ts";
|
|
39
|
+
import { clearGSDPreferencesCache } from "../preferences.ts";
|
|
39
40
|
import { invalidateAllCaches } from "../cache.ts";
|
|
40
41
|
import { invalidateStateCache } from "../state.ts";
|
|
41
42
|
import {
|
|
@@ -63,12 +64,15 @@ interface FixtureOptions {
|
|
|
63
64
|
dispatch?: UnifiedRule["where"];
|
|
64
65
|
/** Drop the gate_runs table after seeding so emitUokGate's insertGateRun throws (:538 path). */
|
|
65
66
|
dropGateRuns?: boolean;
|
|
67
|
+
/** Write project preferences that disable UOK gate telemetry. */
|
|
68
|
+
disableUokGates?: boolean;
|
|
66
69
|
}
|
|
67
70
|
|
|
68
71
|
interface Fixture {
|
|
69
72
|
base: string;
|
|
70
73
|
session: AutoSession;
|
|
71
74
|
orchestrator: ReturnType<typeof createAutoOrchestrator>;
|
|
75
|
+
getAvailableCalls(): number;
|
|
72
76
|
cleanup(): void;
|
|
73
77
|
}
|
|
74
78
|
|
|
@@ -82,6 +86,7 @@ function makeFixture(opts: FixtureOptions = {}): Fixture {
|
|
|
82
86
|
|
|
83
87
|
invalidateAllCaches();
|
|
84
88
|
invalidateStateCache();
|
|
89
|
+
clearGSDPreferencesCache();
|
|
85
90
|
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
86
91
|
insertMilestone({ id: "M001", title: "Milestone", status: "active" });
|
|
87
92
|
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "active", risk: "low", depends: [], demo: "", sequence: 1 });
|
|
@@ -100,6 +105,13 @@ function makeFixture(opts: FixtureOptions = {}): Fixture {
|
|
|
100
105
|
join(sliceDir, "S01-PLAN.md"),
|
|
101
106
|
["# S01: Slice", "", "**Goal:** g", "**Demo:** d", "", "## Tasks", "", "- [ ] **T01: Task** `est:1h`", ""].join("\n"),
|
|
102
107
|
);
|
|
108
|
+
if (opts.disableUokGates) {
|
|
109
|
+
writeFileSync(
|
|
110
|
+
join(base, ".gsd", "PREFERENCES.md"),
|
|
111
|
+
"---\nuok:\n gates:\n enabled: false\n---\n",
|
|
112
|
+
);
|
|
113
|
+
clearGSDPreferencesCache();
|
|
114
|
+
}
|
|
103
115
|
|
|
104
116
|
acquireSessionLock(base);
|
|
105
117
|
|
|
@@ -112,8 +124,19 @@ function makeFixture(opts: FixtureOptions = {}): Fixture {
|
|
|
112
124
|
session.currentMilestoneId = "M001";
|
|
113
125
|
session.resourceVersionOnStart = null;
|
|
114
126
|
|
|
127
|
+
let getAvailableCalls = 0;
|
|
115
128
|
const ctx: OrchestratorContext = {
|
|
116
|
-
ctx: {
|
|
129
|
+
ctx: {
|
|
130
|
+
model: {},
|
|
131
|
+
modelRegistry: {
|
|
132
|
+
getAll: () => [],
|
|
133
|
+
getAvailable: () => {
|
|
134
|
+
getAvailableCalls += 1;
|
|
135
|
+
return [];
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
ui: { notify() {} },
|
|
139
|
+
} as never,
|
|
117
140
|
pi: { getActiveTools: () => [] } as never,
|
|
118
141
|
dispatchBasePath: base,
|
|
119
142
|
runtimeBasePath: base,
|
|
@@ -140,8 +163,10 @@ function makeFixture(opts: FixtureOptions = {}): Fixture {
|
|
|
140
163
|
base,
|
|
141
164
|
session,
|
|
142
165
|
orchestrator,
|
|
166
|
+
getAvailableCalls: () => getAvailableCalls,
|
|
143
167
|
cleanup() {
|
|
144
168
|
resetRegistry();
|
|
169
|
+
clearGSDPreferencesCache();
|
|
145
170
|
try { releaseSessionLock(base); } catch { /* */ }
|
|
146
171
|
try { closeDatabase(); } catch { /* */ }
|
|
147
172
|
try { rmSync(base, { recursive: true, force: true }); } catch { /* */ }
|
|
@@ -210,6 +235,23 @@ test("advance() logs an engine warning when the uok gate emit fails (orchestrato
|
|
|
210
235
|
assert.ok(uokFail!.context?.gateId, "the failing gate id must be captured in context");
|
|
211
236
|
});
|
|
212
237
|
|
|
238
|
+
test("advance() resolves disabled uok gate flags once before gate emission", async (t) => {
|
|
239
|
+
const f = makeFixture({ dropGateRuns: true, disableUokGates: true });
|
|
240
|
+
t.after(() => f.cleanup());
|
|
241
|
+
|
|
242
|
+
const { logs } = await captureLogs(() => f.orchestrator.advance());
|
|
243
|
+
|
|
244
|
+
assert.equal(
|
|
245
|
+
logs.some((e) => e.component === "engine" && /uok gate emit failed/u.test(e.message)),
|
|
246
|
+
false,
|
|
247
|
+
"disabled uok gates must not construct the runner or write gate rows",
|
|
248
|
+
);
|
|
249
|
+
assert.ok(
|
|
250
|
+
f.getAvailableCalls() <= 2,
|
|
251
|
+
`uok gate preferences should be resolved once per advance, not once per emitted gate (getAvailable calls: ${f.getAvailableCalls()})`,
|
|
252
|
+
);
|
|
253
|
+
});
|
|
254
|
+
|
|
213
255
|
// orchestrator.ts:637 — mergePendingCompleteMilestone catches a
|
|
214
256
|
// rebuildMarkdownProjectionsFromDb failure after the system-owned milestone
|
|
215
257
|
// merge and logs `markdown projection rebuild after settlement merge failed`.
|
|
@@ -261,6 +303,10 @@ test("advance() logs an engine warning when the post-settlement projection rebui
|
|
|
261
303
|
// summary artifact path (resolveExpectedArtifactPath needs the dir to exist).
|
|
262
304
|
const milestoneProjDir = join(worktree, ".gsd", "milestones", "M001");
|
|
263
305
|
mkdirSync(milestoneProjDir, { recursive: true });
|
|
306
|
+
// A content-bearing legacy milestone dir requires at least one non-META file
|
|
307
|
+
// (dirIsContentBearingLegacyMilestone) so the layout sniffer treats it as a
|
|
308
|
+
// real legacy milestone rather than a metadata-only placeholder.
|
|
309
|
+
writeFileSync(join(milestoneProjDir, "M001-CONTEXT.md"), "# M001\n");
|
|
264
310
|
const summaryPath = resolveExpectedArtifactPath("complete-milestone", "M001", worktree);
|
|
265
311
|
assert.ok(summaryPath, "complete-milestone summary path must resolve");
|
|
266
312
|
mkdirSync(dirname(summaryPath), { recursive: true });
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// gsd-pi + src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts
|
|
2
|
-
// Regression
|
|
3
|
-
//
|
|
2
|
+
// Regression coverage for orphaned gsd-preflight-stash entries from completed
|
|
3
|
+
// milestones: safe startup recovery for untracked work, manual warnings for
|
|
4
|
+
// tracked or dirty-tree cases that would silently mutate user state.
|
|
4
5
|
|
|
5
6
|
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
6
7
|
import assert from "node:assert/strict";
|
|
@@ -37,6 +38,13 @@ function pushPreflightStash(repo: string, milestoneId: string, fileName: string,
|
|
|
37
38
|
return marker;
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
function pushTrackedPreflightStash(repo: string, milestoneId: string, fileName: string, content: string): string {
|
|
42
|
+
writeFileSync(join(repo, fileName), content);
|
|
43
|
+
const marker = `gsd-preflight-stash:${milestoneId}:42:1700000000000:tracked`;
|
|
44
|
+
git(repo, "stash", "push", "-m", `gsd-preflight-stash [${marker}]`);
|
|
45
|
+
return marker;
|
|
46
|
+
}
|
|
47
|
+
|
|
40
48
|
describe("auditOrphanedPreflightStashes", () => {
|
|
41
49
|
let repo: string;
|
|
42
50
|
|
|
@@ -83,6 +91,23 @@ describe("auditOrphanedPreflightStashes", () => {
|
|
|
83
91
|
assert.match(list, /gsd-preflight-stash:M002:/);
|
|
84
92
|
});
|
|
85
93
|
|
|
94
|
+
test("does not auto-apply a tracked orphan preflight stash onto a clean working tree", () => {
|
|
95
|
+
pushTrackedPreflightStash(repo, "M006", "seed.txt", "seed\ntracked pre-merge work\n");
|
|
96
|
+
assert.equal(readFileSync(join(repo, "seed.txt"), "utf-8"), "seed\n");
|
|
97
|
+
|
|
98
|
+
const result = auditOrphanedPreflightStashes(repo, () => true);
|
|
99
|
+
|
|
100
|
+
assert.equal(result.applied.length, 0);
|
|
101
|
+
assert.equal(result.warnings.length, 1);
|
|
102
|
+
assert.match(result.warnings[0], /not auto-applied/);
|
|
103
|
+
assert.match(result.warnings[0], /stash modifies tracked files/);
|
|
104
|
+
assert.match(result.warnings[0], /git stash apply stash@\{\d+\}/);
|
|
105
|
+
assert.equal(readFileSync(join(repo, "seed.txt"), "utf-8"), "seed\n");
|
|
106
|
+
|
|
107
|
+
const list = git(repo, "stash", "list");
|
|
108
|
+
assert.match(list, /gsd-preflight-stash:M006:/);
|
|
109
|
+
});
|
|
110
|
+
|
|
86
111
|
test("ignores stashes whose milestone is not complete", () => {
|
|
87
112
|
pushPreflightStash(repo, "M003", "wip.txt", "still-working\n");
|
|
88
113
|
|
|
@@ -115,23 +140,25 @@ describe("auditOrphanedPreflightStashes", () => {
|
|
|
115
140
|
assert.match(result.warnings[0], /db unavailable/);
|
|
116
141
|
});
|
|
117
142
|
|
|
118
|
-
test("collects a warning
|
|
119
|
-
// Push a stash containing a change to seed.txt; then dirty seed.txt
|
|
120
|
-
//
|
|
143
|
+
test("collects a warning instead of applying when the working tree is not clean", () => {
|
|
144
|
+
// Push a stash containing a change to seed.txt; then dirty seed.txt before
|
|
145
|
+
// the audit runs. Startup recovery must leave the tree untouched and ask
|
|
146
|
+
// the user to apply the retained backup stash manually.
|
|
121
147
|
writeFileSync(join(repo, "seed.txt"), "stashed\n");
|
|
122
148
|
const marker = `gsd-preflight-stash:M005:42:1700:zz`;
|
|
123
149
|
git(repo, "stash", "push", "-m", `gsd-preflight-stash [${marker}]`);
|
|
124
150
|
|
|
125
|
-
// Dirty the working tree so apply will conflict.
|
|
126
151
|
writeFileSync(join(repo, "seed.txt"), "conflicting modification\n");
|
|
127
152
|
|
|
128
153
|
const result = auditOrphanedPreflightStashes(repo, () => true);
|
|
129
154
|
|
|
130
155
|
assert.equal(result.applied.length, 0);
|
|
131
156
|
assert.equal(result.warnings.length, 1);
|
|
132
|
-
assert.match(result.warnings[0], /
|
|
157
|
+
assert.match(result.warnings[0], /not auto-applied/);
|
|
158
|
+
assert.match(result.warnings[0], /working tree not clean/);
|
|
133
159
|
assert.match(result.warnings[0], /M005/);
|
|
134
160
|
assert.match(result.warnings[0], /git stash apply/);
|
|
161
|
+
assert.equal(readFileSync(join(repo, "seed.txt"), "utf-8"), "conflicting modification\n");
|
|
135
162
|
|
|
136
163
|
const list = git(repo, "stash", "list");
|
|
137
164
|
assert.match(list, /gsd-preflight-stash:M005:/);
|
|
@@ -169,6 +196,63 @@ describe("auditOrphanedPreflightStashes", () => {
|
|
|
169
196
|
"second run must NOT warn — files are already restored from first run",
|
|
170
197
|
);
|
|
171
198
|
});
|
|
199
|
+
|
|
200
|
+
test("warns instead of silently skipping when only some stash untracked files were restored", () => {
|
|
201
|
+
// Cursor Bugbot caught: isAlreadyRestoredUntrackedStatus treated a dirty
|
|
202
|
+
// tree as fully restored when every *current* untracked path appeared in
|
|
203
|
+
// the stash, without requiring every *stash* untracked path to be present.
|
|
204
|
+
// A partial restore (only some files recovered) was misread as the
|
|
205
|
+
// idempotent steady state, so the audit no-oped and the remaining pre-merge
|
|
206
|
+
// files stayed missing with no warning.
|
|
207
|
+
writeFileSync(join(repo, "first.txt"), "first\n");
|
|
208
|
+
writeFileSync(join(repo, "second.txt"), "second\n");
|
|
209
|
+
const marker = `gsd-preflight-stash:M007:42:1700000000000:partial`;
|
|
210
|
+
git(repo, "stash", "push", "--include-untracked", "-m", `gsd-preflight-stash [${marker}]`);
|
|
211
|
+
|
|
212
|
+
// Both files are stashed away.
|
|
213
|
+
assert.equal(existsSync(join(repo, "first.txt")), false);
|
|
214
|
+
assert.equal(existsSync(join(repo, "second.txt")), false);
|
|
215
|
+
|
|
216
|
+
// Simulate a partial restore: only first.txt came back; second.txt is still
|
|
217
|
+
// missing from the working tree.
|
|
218
|
+
writeFileSync(join(repo, "first.txt"), "first\n");
|
|
219
|
+
|
|
220
|
+
const result = auditOrphanedPreflightStashes(repo, () => true);
|
|
221
|
+
|
|
222
|
+
// Must NOT be treated as already-restored: second.txt is still missing, so
|
|
223
|
+
// the audit must surface a manual-recovery warning rather than no-op.
|
|
224
|
+
assert.equal(result.applied.length, 0);
|
|
225
|
+
assert.equal(result.warnings.length, 1, "partial restore must warn, not silently no-op");
|
|
226
|
+
assert.match(result.warnings[0], /not auto-applied/);
|
|
227
|
+
assert.match(result.warnings[0], /working tree not clean/);
|
|
228
|
+
assert.match(result.warnings[0], /M007/);
|
|
229
|
+
assert.match(result.warnings[0], /git stash apply/);
|
|
230
|
+
|
|
231
|
+
// The stash entry must remain so the user can recover second.txt manually.
|
|
232
|
+
const list = git(repo, "stash", "list");
|
|
233
|
+
assert.match(list, /gsd-preflight-stash:M007:/);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test("fully restored multi-file untracked stash stays a silent no-op", () => {
|
|
237
|
+
// Guards the other direction of the set-equality fix: when EVERY stash
|
|
238
|
+
// untracked file is present in the working tree, the genuine idempotent
|
|
239
|
+
// steady state must still be recognized and skipped without warning, even
|
|
240
|
+
// when the stash captured more than one file.
|
|
241
|
+
writeFileSync(join(repo, "alpha.txt"), "alpha\n");
|
|
242
|
+
writeFileSync(join(repo, "beta.txt"), "beta\n");
|
|
243
|
+
const marker = `gsd-preflight-stash:M008:42:1700000000000:multi`;
|
|
244
|
+
git(repo, "stash", "push", "--include-untracked", "-m", `gsd-preflight-stash [${marker}]`);
|
|
245
|
+
|
|
246
|
+
const first = auditOrphanedPreflightStashes(repo, () => true);
|
|
247
|
+
assert.equal(first.applied.length, 1, "first run applies both files");
|
|
248
|
+
assert.equal(first.warnings.length, 0);
|
|
249
|
+
assert.equal(existsSync(join(repo, "alpha.txt")), true);
|
|
250
|
+
assert.equal(existsSync(join(repo, "beta.txt")), true);
|
|
251
|
+
|
|
252
|
+
const second = auditOrphanedPreflightStashes(repo, () => true);
|
|
253
|
+
assert.equal(second.applied.length, 0, "second run skips");
|
|
254
|
+
assert.equal(second.warnings.length, 0, "fully restored multi-file stash must not warn");
|
|
255
|
+
});
|
|
172
256
|
});
|
|
173
257
|
|
|
174
258
|
test("_isAlreadyRestoredApplyError detects the git stash apply already-exists error", () => {
|
|
@@ -160,7 +160,10 @@ describe("auditOrphanedMilestoneBranches", () => {
|
|
|
160
160
|
`warning should mention stranded milestone/M001 and in-progress state; got: ${JSON.stringify(result.warnings)}`,
|
|
161
161
|
);
|
|
162
162
|
assert.equal(result.blockingStrandedWork?.milestoneId, "M001");
|
|
163
|
-
|
|
163
|
+
// #812 — worktree-configured isolation must recover as "worktree" even when
|
|
164
|
+
// the worktree directory is absent on disk, so recovery re-materializes the
|
|
165
|
+
// worktree from the branch instead of checking it out in the project root.
|
|
166
|
+
assert.equal(result.blockingStrandedWork?.recoveryMode, "worktree");
|
|
164
167
|
assert.equal(result.blockingStrandedWork?.commitsAhead, 1);
|
|
165
168
|
|
|
166
169
|
// Branch must still exist
|
|
@@ -168,6 +171,54 @@ describe("auditOrphanedMilestoneBranches", () => {
|
|
|
168
171
|
assert.ok(branches.includes("milestone/M001"), "in-progress branch must be preserved");
|
|
169
172
|
});
|
|
170
173
|
|
|
174
|
+
test("#812 — in-progress orphan under branch isolation recovers as branch", () => {
|
|
175
|
+
// Same stranded scenario but the project is configured for branch-mode
|
|
176
|
+
// isolation, where there is never a worktree to re-materialize. Recovery
|
|
177
|
+
// must stay "branch".
|
|
178
|
+
run("git checkout -b milestone/M001", dir);
|
|
179
|
+
writeFileSync(join(dir, "feature.txt"), "in-progress work\n");
|
|
180
|
+
run("git add feature.txt", dir);
|
|
181
|
+
run("git commit -m \"in-progress work on M001\"", dir);
|
|
182
|
+
run("git checkout main", dir);
|
|
183
|
+
|
|
184
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
185
|
+
|
|
186
|
+
const result = auditOrphanedMilestoneBranches(dir, "branch");
|
|
187
|
+
|
|
188
|
+
assert.equal(result.blockingStrandedWork?.milestoneId, "M001");
|
|
189
|
+
assert.equal(result.blockingStrandedWork?.recoveryMode, "branch");
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test("#812-followup — worktree-mode project degrades to branch recovery when branch is already checked out at root", () => {
|
|
193
|
+
// Simulates the leftover state from the pre-fix #812 recovery path: the
|
|
194
|
+
// old code checked out milestone/<id> in the project root instead of
|
|
195
|
+
// creating a worktree. On the next bootstrap:
|
|
196
|
+
// - isolationMode === "worktree"
|
|
197
|
+
// - HEAD at project root === "milestone/M001"
|
|
198
|
+
// - no linked worktree directory on disk
|
|
199
|
+
//
|
|
200
|
+
// Requesting worktree recovery in this state calls `git worktree add` for
|
|
201
|
+
// a branch git already considers "in use by another worktree" (the main
|
|
202
|
+
// worktree counts), causing bootstrap to abort with GSD_LOCK_HELD.
|
|
203
|
+
// The fix detects the root checkout and degrades to "branch" so the
|
|
204
|
+
// session resumes on the already-checked-out branch without failing.
|
|
205
|
+
run("git checkout -b milestone/M001", dir);
|
|
206
|
+
writeFileSync(join(dir, "feature.txt"), "in-progress work\n");
|
|
207
|
+
run("git add feature.txt", dir);
|
|
208
|
+
run("git commit -m \"in-progress work on M001\"", dir);
|
|
209
|
+
// NOTE: stay on milestone/M001 — do NOT check out main.
|
|
210
|
+
// This simulates the project root being on the milestone branch.
|
|
211
|
+
|
|
212
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
213
|
+
|
|
214
|
+
const result = auditOrphanedMilestoneBranches(dir, "worktree");
|
|
215
|
+
|
|
216
|
+
assert.equal(result.blockingStrandedWork?.milestoneId, "M001");
|
|
217
|
+
// Must degrade to "branch" — worktree creation would fail because the
|
|
218
|
+
// branch is already checked out at the project root.
|
|
219
|
+
assert.equal(result.blockingStrandedWork?.recoveryMode, "branch");
|
|
220
|
+
});
|
|
221
|
+
|
|
171
222
|
test("#4762 — also surfaces worktree directory for in-progress orphan when present", () => {
|
|
172
223
|
// In-progress + unmerged + physical worktree directory — the full primary scenario.
|
|
173
224
|
run("git checkout -b milestone/M001", dir);
|
|
@@ -3,9 +3,14 @@
|
|
|
3
3
|
|
|
4
4
|
import { describe, it } from "node:test";
|
|
5
5
|
import assert from "node:assert/strict";
|
|
6
|
+
import { createRequire } from "node:module";
|
|
7
|
+
import { appendFileSync, mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
6
10
|
|
|
7
11
|
import { visibleWidth } from "@gsd/pi-tui";
|
|
8
12
|
import { assertFullOuterBorder } from "./tui-border-assertions.ts";
|
|
13
|
+
import { closeDatabase, insertMilestone, insertSlice, insertTask, openDatabase } from "../gsd-db.ts";
|
|
9
14
|
|
|
10
15
|
function assertLinesFit(lines: string[], width: number): void {
|
|
11
16
|
for (const line of lines) {
|
|
@@ -17,6 +22,92 @@ function assertLinesFit(lines: string[], width: number): void {
|
|
|
17
22
|
}
|
|
18
23
|
|
|
19
24
|
describe("parallel-monitor-overlay", () => {
|
|
25
|
+
it("reads worker DB progress and appended NDJSON cost without sqlite CLI or full stdout reads", async () => {
|
|
26
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-parallel-overlay-"));
|
|
27
|
+
const stdoutPath = join(base, ".gsd", "parallel", "M001.stdout.log");
|
|
28
|
+
const cjsRequire = createRequire(import.meta.url);
|
|
29
|
+
const fsBuiltin = cjsRequire("node:fs") as typeof import("node:fs");
|
|
30
|
+
const childProcessBuiltin = cjsRequire("node:child_process") as typeof import("node:child_process");
|
|
31
|
+
const originalReadFileSync = fsBuiltin.readFileSync;
|
|
32
|
+
const originalSpawnSync = childProcessBuiltin.spawnSync;
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
mkdirSync(join(base, ".gsd", "parallel"), { recursive: true });
|
|
36
|
+
assert.equal(openDatabase(join(base, ".gsd", "gsd.db")), true);
|
|
37
|
+
insertMilestone({ id: "M001", title: "Monitor Fixture" });
|
|
38
|
+
insertSlice({ milestoneId: "M001", id: "S01", title: "Build overlay", status: "pending", sequence: 1 });
|
|
39
|
+
insertTask({
|
|
40
|
+
milestoneId: "M001",
|
|
41
|
+
sliceId: "S01",
|
|
42
|
+
id: "T01",
|
|
43
|
+
status: "complete",
|
|
44
|
+
oneLiner: "render progress",
|
|
45
|
+
sequence: 1,
|
|
46
|
+
});
|
|
47
|
+
insertTask({ milestoneId: "M001", sliceId: "S01", id: "T02", status: "pending", sequence: 2 });
|
|
48
|
+
closeDatabase();
|
|
49
|
+
|
|
50
|
+
writeFileSync(
|
|
51
|
+
join(base, ".gsd", "parallel", "M001.status.json"),
|
|
52
|
+
JSON.stringify({
|
|
53
|
+
milestoneId: "M001",
|
|
54
|
+
pid: process.pid,
|
|
55
|
+
state: "running",
|
|
56
|
+
cost: 0,
|
|
57
|
+
lastHeartbeat: Date.now(),
|
|
58
|
+
startedAt: Date.now() - 30_000,
|
|
59
|
+
worktreePath: join(base, ".gsd-worktrees", "M001"),
|
|
60
|
+
}),
|
|
61
|
+
"utf-8",
|
|
62
|
+
);
|
|
63
|
+
writeFileSync(
|
|
64
|
+
stdoutPath,
|
|
65
|
+
JSON.stringify({ type: "message_end", message: { usage: { cost: { total: 1.25 } } } }) + "\n",
|
|
66
|
+
"utf-8",
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
fsBuiltin.readFileSync = ((filePath: Parameters<typeof originalReadFileSync>[0], ...args: unknown[]) => {
|
|
70
|
+
if (String(filePath) === stdoutPath) throw new Error("full stdout log reads are disabled in this test");
|
|
71
|
+
return (originalReadFileSync as (...readArgs: unknown[]) => unknown)(filePath, ...args);
|
|
72
|
+
}) as typeof fsBuiltin.readFileSync;
|
|
73
|
+
childProcessBuiltin.spawnSync = ((command: Parameters<typeof originalSpawnSync>[0], ...args: unknown[]) => {
|
|
74
|
+
if (command === "sqlite3") throw new Error("sqlite3 CLI is disabled in this test");
|
|
75
|
+
return (originalSpawnSync as (...spawnArgs: unknown[]) => unknown)(command, ...args);
|
|
76
|
+
}) as typeof childProcessBuiltin.spawnSync;
|
|
77
|
+
|
|
78
|
+
const mod = await import("../parallel-monitor-overlay.js");
|
|
79
|
+
const mockTui = { requestRender: () => {} };
|
|
80
|
+
const mockTheme = {
|
|
81
|
+
fg: (_color: string, text: string) => text,
|
|
82
|
+
bold: (text: string) => text,
|
|
83
|
+
};
|
|
84
|
+
const overlay = new mod.ParallelMonitorOverlay(mockTui, mockTheme as any, () => {}, base);
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const joined = overlay.render(100).join("\n");
|
|
88
|
+
assert.match(joined, /S01:1\/2/, "slice progress should come from the in-process DB reader");
|
|
89
|
+
assert.match(joined, /S01\/T01: render progress/, "recent completions should come from the in-process DB reader");
|
|
90
|
+
assert.match(joined, /\$1\.25/, "cost should come from bounded NDJSON reads");
|
|
91
|
+
|
|
92
|
+
appendFileSync(
|
|
93
|
+
stdoutPath,
|
|
94
|
+
JSON.stringify({ type: "message_end", message: { usage: { cost: { total: 2.00 } } } }) + "\n",
|
|
95
|
+
"utf-8",
|
|
96
|
+
);
|
|
97
|
+
(overlay as any).refresh();
|
|
98
|
+
const refreshed = overlay.render(100).join("\n");
|
|
99
|
+
assert.match(refreshed, /\$3\.25/, "cost should include only newly appended NDJSON events");
|
|
100
|
+
} finally {
|
|
101
|
+
overlay.dispose();
|
|
102
|
+
}
|
|
103
|
+
} finally {
|
|
104
|
+
fsBuiltin.readFileSync = originalReadFileSync;
|
|
105
|
+
childProcessBuiltin.spawnSync = originalSpawnSync;
|
|
106
|
+
try { closeDatabase(); } catch { /* already closed */ }
|
|
107
|
+
rmSync(base, { recursive: true, force: true });
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
20
111
|
it("progressBar generates correct width", async () => {
|
|
21
112
|
// Dynamic import to test the module loads cleanly
|
|
22
113
|
const mod = await import("../parallel-monitor-overlay.js");
|
|
@@ -145,6 +145,32 @@ describe("parallel-research-slices dispatch rule", () => {
|
|
|
145
145
|
}
|
|
146
146
|
});
|
|
147
147
|
|
|
148
|
+
test("dispatches parallel research for S01 even when milestone research exists", async () => {
|
|
149
|
+
writeRoadmap(base, "M001", [
|
|
150
|
+
{ id: "S01", title: "Alpha" },
|
|
151
|
+
{ id: "S02", title: "Beta" },
|
|
152
|
+
]);
|
|
153
|
+
writeFileSync(
|
|
154
|
+
join(base, ".gsd", "milestones", "M001", "M001-RESEARCH.md"),
|
|
155
|
+
"# Milestone Research\n",
|
|
156
|
+
"utf-8",
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const action = await resolveDispatch({
|
|
160
|
+
basePath: base,
|
|
161
|
+
mid: "M001",
|
|
162
|
+
midTitle: "Parallel Research Milestone",
|
|
163
|
+
state: baseState(),
|
|
164
|
+
prefs: undefined,
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
assert.equal(action.action, "dispatch");
|
|
168
|
+
if (action.action === "dispatch") {
|
|
169
|
+
assert.equal(action.unitType, "research-slice");
|
|
170
|
+
assert.equal(action.unitId, "M001/parallel-research");
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
|
|
148
174
|
test("does not dispatch parallel research with only one ready slice", async () => {
|
|
149
175
|
writeRoadmap(base, "M001", [{ id: "S01", title: "Alpha" }]);
|
|
150
176
|
|
|
@@ -54,9 +54,12 @@ const ALLOWED_IMPORTERS = new Set([
|
|
|
54
54
|
// explicit degraded-mode fallback when DB has no task rows (warns on use)
|
|
55
55
|
"gsd/reactive-graph.ts",
|
|
56
56
|
// recovery path: explicit pre-migration/DB-unavailable fallback branches
|
|
57
|
-
|
|
57
|
+
// (verifyExpectedArtifact extracted here from auto-recovery.ts)
|
|
58
|
+
"gsd/artifact-verification.ts",
|
|
58
59
|
// diagnostics-only surfaces: report on projections, make no dispatch decisions
|
|
59
60
|
"gsd/doctor.ts",
|
|
61
|
+
// diagnostics-only: compares PLAN.md task checkboxes against DB status
|
|
62
|
+
"gsd/doctor-engine-checks.ts",
|
|
60
63
|
// display/telemetry-only surfaces
|
|
61
64
|
"gsd/workspace-index.ts",
|
|
62
65
|
"gsd/visualizer-data.ts",
|
|
@@ -22,7 +22,7 @@ import { invalidateAllCaches } from "../cache.ts";
|
|
|
22
22
|
import type { GSDState } from "../types.ts";
|
|
23
23
|
|
|
24
24
|
const PARALLEL_RESEARCH_RULE = "planning (multiple slices need research) → parallel-research-slices";
|
|
25
|
-
const SINGLE_RESEARCH_RULE = "planning (no research
|
|
25
|
+
const SINGLE_RESEARCH_RULE = "planning (no research) → research-slice";
|
|
26
26
|
const VALIDATE_RULE = "validating-milestone → validate-milestone";
|
|
27
27
|
|
|
28
28
|
// ─── Fixture helpers ──────────────────────────────────────────────────────
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import test from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync, existsSync } from 'node:fs';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { tmpdir } from 'node:os';
|
|
6
6
|
|
|
@@ -86,7 +86,12 @@ function planParams() {
|
|
|
86
86
|
|
|
87
87
|
test('#4402 plan-milestone preserves ## Boundary Map after post-mutation projections', async (t) => {
|
|
88
88
|
const base = mkdtempSync(join(tmpdir(), 'gsd-4402-'));
|
|
89
|
-
|
|
89
|
+
const mDir = join(base, '.gsd', 'milestones', 'M001');
|
|
90
|
+
mkdirSync(mDir, { recursive: true });
|
|
91
|
+
// A content-bearing legacy milestone dir requires at least one non-META file
|
|
92
|
+
// (dirIsContentBearingLegacyMilestone) so the layout sniffer treats it as a
|
|
93
|
+
// real legacy milestone rather than a metadata-only placeholder.
|
|
94
|
+
writeFileSync(join(mDir, 'M001-CONTEXT.md'), '# M001\n');
|
|
90
95
|
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
91
96
|
|
|
92
97
|
t.after(() => {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import test from "node:test";
|
|
9
9
|
import assert from "node:assert/strict";
|
|
10
|
-
import { mkdtempSync, mkdirSync, rmSync, readFileSync } from "node:fs";
|
|
10
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { tmpdir } from "node:os";
|
|
13
13
|
|
|
@@ -16,7 +16,12 @@ import { handlePlanMilestone, type PlanMilestoneParams } from "../tools/plan-mil
|
|
|
16
16
|
|
|
17
17
|
function makeTmpBase(): string {
|
|
18
18
|
const base = mkdtempSync(join(tmpdir(), "gsd-plan-sketch-render-"));
|
|
19
|
-
|
|
19
|
+
const mDir = join(base, ".gsd", "milestones", "M001");
|
|
20
|
+
mkdirSync(mDir, { recursive: true });
|
|
21
|
+
// A content-bearing legacy milestone dir requires at least one non-META file
|
|
22
|
+
// (dirIsContentBearingLegacyMilestone) so the layout sniffer treats it as a
|
|
23
|
+
// real legacy milestone rather than a metadata-only placeholder.
|
|
24
|
+
writeFileSync(join(mDir, "M001-CONTEXT.md"), "# M001\n");
|
|
20
25
|
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
21
26
|
return base;
|
|
22
27
|
}
|
|
@@ -13,7 +13,7 @@ import { parseRoadmap } from '../parsers-legacy.ts';
|
|
|
13
13
|
|
|
14
14
|
function makeTmpBase(): string {
|
|
15
15
|
const base = mkdtempSync(join(tmpdir(), 'gsd-plan-milestone-'));
|
|
16
|
-
mkdirSync(join(base, '.gsd', '
|
|
16
|
+
mkdirSync(join(base, '.gsd', 'phases', '01-test'), { recursive: true });
|
|
17
17
|
return base;
|
|
18
18
|
}
|
|
19
19
|
|
|
@@ -91,7 +91,7 @@ test('handlePlanMilestone writes milestone and slice planning state and renders
|
|
|
91
91
|
assert.equal(slices[0]?.goal, 'Wire the handler.');
|
|
92
92
|
assert.equal(slices[1]?.depends[0], 'S01');
|
|
93
93
|
|
|
94
|
-
const roadmapPath = join(base, '.gsd', '
|
|
94
|
+
const roadmapPath = join(base, '.gsd', 'phases', '01-test', '01-ROADMAP.md');
|
|
95
95
|
assert.ok(existsSync(roadmapPath), 'roadmap should be rendered to disk');
|
|
96
96
|
const roadmap = readFileSync(roadmapPath, 'utf-8');
|
|
97
97
|
assert.match(roadmap, /# M001: DB-backed planning/);
|
|
@@ -151,14 +151,17 @@ test('handlePlanMilestone surfaces render failures and does not clear parse-visi
|
|
|
151
151
|
openDatabase(dbPath);
|
|
152
152
|
|
|
153
153
|
try {
|
|
154
|
-
|
|
154
|
+
// Block the rendered roadmap path: M999 → phaseNum=999, slug='db-backed-planning'
|
|
155
|
+
// → renderer targets phases/999-db-backed-planning/999-ROADMAP.md.
|
|
156
|
+
// Creating that path as a directory causes EISDIR → render fails.
|
|
157
|
+
const fallbackRoadmapPath = join(base, '.gsd', 'phases', '999-db-backed-planning', '999-ROADMAP.md');
|
|
155
158
|
mkdirSync(fallbackRoadmapPath, { recursive: true });
|
|
156
159
|
|
|
157
|
-
const result = await handlePlanMilestone({ ...validParams(), milestoneId: '
|
|
160
|
+
const result = await handlePlanMilestone({ ...validParams(), milestoneId: 'M999' }, base);
|
|
158
161
|
assert.ok('error' in result);
|
|
159
162
|
assert.match(result.error, /render failed:/);
|
|
160
163
|
|
|
161
|
-
const existingRoadmapPath = join(base, '.gsd', '
|
|
164
|
+
const existingRoadmapPath = join(base, '.gsd', 'phases', '01-test', '01-ROADMAP.md');
|
|
162
165
|
writeFileSync(existingRoadmapPath, '# M001: Cached roadmap\n\n**Vision:** old value\n\n## Slices\n\n', 'utf-8');
|
|
163
166
|
const cachedAfter = parseRoadmap(readFileSync(existingRoadmapPath, 'utf-8'));
|
|
164
167
|
assert.equal(cachedAfter.vision, 'old value');
|
|
@@ -173,7 +176,7 @@ test('handlePlanMilestone clears parse-visible roadmap state after successful re
|
|
|
173
176
|
openDatabase(dbPath);
|
|
174
177
|
|
|
175
178
|
try {
|
|
176
|
-
const roadmapPath = join(base, '.gsd', '
|
|
179
|
+
const roadmapPath = join(base, '.gsd', 'phases', '01-test', '01-ROADMAP.md');
|
|
177
180
|
writeFileSync(roadmapPath, '# M001: Cached roadmap\n\n**Vision:** old value\n\n## Slices\n\n', 'utf-8');
|
|
178
181
|
|
|
179
182
|
const cachedBefore = parseRoadmap(readFileSync(roadmapPath, 'utf-8'));
|
|
@@ -94,6 +94,16 @@ test("plan-slice prompt: absence checks use negated quiet searches", () => {
|
|
|
94
94
|
assert.ok(result.includes("count commands exit 1 when they find zero matches"));
|
|
95
95
|
});
|
|
96
96
|
|
|
97
|
+
test("plan-slice prompt: npm package existence rule is stated during generation", () => {
|
|
98
|
+
const result = loadPrompt("plan-slice", { ...BASE_VARS, commitInstruction: "Do not commit." });
|
|
99
|
+
assert.ok(result.includes("reference only packages that exist on the public npm registry"));
|
|
100
|
+
assert.ok(result.includes("remove or correct any package name that is not real"));
|
|
101
|
+
// The post-unit pre-execution gate parses package names from require/import
|
|
102
|
+
// patterns too, not just install commands, so the rule must cover that scope.
|
|
103
|
+
assert.ok(result.includes("require('...')"));
|
|
104
|
+
assert.ok(result.includes("import ... from '...'"));
|
|
105
|
+
});
|
|
106
|
+
|
|
97
107
|
test("plan-slice prompt: footer references gsd_plan_slice tool, not direct write", () => {
|
|
98
108
|
const result = loadPrompt("plan-slice", { ...BASE_VARS, commitInstruction: "Do not commit." });
|
|
99
109
|
assert.ok(
|