@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
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
insertRequirement,
|
|
21
21
|
insertSlice,
|
|
22
22
|
insertTask,
|
|
23
|
+
getAllMilestones,
|
|
23
24
|
setMilestoneQueueOrder,
|
|
24
25
|
transaction,
|
|
25
26
|
updateTaskStatus,
|
|
@@ -445,11 +446,10 @@ describe('derive-state-helpers', () => {
|
|
|
445
446
|
}
|
|
446
447
|
});
|
|
447
448
|
|
|
448
|
-
// ─── Queue order: DB sequence
|
|
449
|
-
test('deriveStateFromDb
|
|
449
|
+
// ─── Queue order: explicit file order repairs stale DB sequence ─────
|
|
450
|
+
test('deriveStateFromDb syncs QUEUE-ORDER.json into DB sequence', async () => {
|
|
450
451
|
const base = createFixtureBase();
|
|
451
452
|
try {
|
|
452
|
-
// QUEUE-ORDER.json is a projection and should not drive DB derivation.
|
|
453
453
|
const queueOrder = JSON.stringify({ order: ['M003', 'M001', 'M002'], updatedAt: new Date().toISOString() });
|
|
454
454
|
writeFileSync(join(base, '.gsd', 'QUEUE-ORDER.json'), queueOrder);
|
|
455
455
|
writeFile(base, 'milestones/M001/M001-CONTEXT.md', '# M001\n\nContext.');
|
|
@@ -466,8 +466,52 @@ describe('derive-state-helpers', () => {
|
|
|
466
466
|
invalidateStateCache();
|
|
467
467
|
const state = await deriveStateFromDb(base);
|
|
468
468
|
|
|
469
|
-
assert.equal(state.activeMilestone?.id, '
|
|
470
|
-
assert.equal(state.registry[0]?.id, '
|
|
469
|
+
assert.equal(state.activeMilestone?.id, 'M003', 'queue-order: QUEUE-ORDER.json chooses M003');
|
|
470
|
+
assert.equal(state.registry[0]?.id, 'M003', 'queue-order: registry[0] follows QUEUE-ORDER.json');
|
|
471
|
+
assert.deepEqual(getAllMilestones().map(m => m.id), ['M003', 'M001', 'M002'], 'queue-order: DB sequence is repaired');
|
|
472
|
+
} finally {
|
|
473
|
+
closeDatabase();
|
|
474
|
+
cleanup(base);
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
// ─── Queue order: milestone absent from file gets explicit sequence (idempotency) ─
|
|
479
|
+
test('deriveStateFromDb sync is idempotent when a milestone is omitted from QUEUE-ORDER.json', async () => {
|
|
480
|
+
const base = createFixtureBase();
|
|
481
|
+
try {
|
|
482
|
+
// QUEUE-ORDER.json lists only M002 and M001; M003 is absent.
|
|
483
|
+
const queueOrder = JSON.stringify({ order: ['M002', 'M001'], updatedAt: new Date().toISOString() });
|
|
484
|
+
writeFileSync(join(base, '.gsd', 'QUEUE-ORDER.json'), queueOrder);
|
|
485
|
+
writeFile(base, 'milestones/M001/M001-CONTEXT.md', '# M001\n\nContext.');
|
|
486
|
+
writeFile(base, 'milestones/M002/M002-CONTEXT.md', '# M002\n\nContext.');
|
|
487
|
+
writeFile(base, 'milestones/M003/M003-CONTEXT.md', '# M003\n\nContext.');
|
|
488
|
+
|
|
489
|
+
openDatabase(':memory:');
|
|
490
|
+
insertMilestone({ id: 'M001', title: 'First', status: 'active' });
|
|
491
|
+
insertMilestone({ id: 'M002', title: 'Second', status: 'active' });
|
|
492
|
+
insertMilestone({ id: 'M003', title: 'Third', status: 'active' });
|
|
493
|
+
// DB starts with natural order M001→M002→M003 (stale vs the file's M002→M001).
|
|
494
|
+
|
|
495
|
+
invalidateStateCache();
|
|
496
|
+
const state = await deriveStateFromDb(base);
|
|
497
|
+
|
|
498
|
+
// After sync, M002 leads (per file), M003 is appended at the end.
|
|
499
|
+
assert.equal(state.activeMilestone?.id, 'M002', 'omitted-milestone: QUEUE-ORDER.json chooses M002 as active');
|
|
500
|
+
assert.deepEqual(
|
|
501
|
+
getAllMilestones().map(m => m.id),
|
|
502
|
+
['M002', 'M001', 'M003'],
|
|
503
|
+
'omitted-milestone: DB sequence is M002, M001, M003 with M003 appended',
|
|
504
|
+
);
|
|
505
|
+
|
|
506
|
+
// Second derive must not re-write the DB (idempotency guard holds).
|
|
507
|
+
invalidateStateCache();
|
|
508
|
+
const state2 = await deriveStateFromDb(base);
|
|
509
|
+
assert.equal(state2.activeMilestone?.id, 'M002', 'omitted-milestone: second derive still picks M002');
|
|
510
|
+
assert.deepEqual(
|
|
511
|
+
getAllMilestones().map(m => m.id),
|
|
512
|
+
['M002', 'M001', 'M003'],
|
|
513
|
+
'omitted-milestone: DB sequence unchanged on second call',
|
|
514
|
+
);
|
|
471
515
|
} finally {
|
|
472
516
|
closeDatabase();
|
|
473
517
|
cleanup(base);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
|
|
4
|
+
import { classifyCommand } from "../safety/destructive-guard.ts";
|
|
5
|
+
|
|
6
|
+
test("destructive guard ignores rm -rf text inside quoted literals and comments", () => {
|
|
7
|
+
const readOnlyCommands = [
|
|
8
|
+
'grep -rn "rm -rf" .',
|
|
9
|
+
'echo "rm -rf /tmp/x"',
|
|
10
|
+
'git commit -m "remove stray rm -rf usage"',
|
|
11
|
+
"cat notes.md # remove stray rm -rf usage",
|
|
12
|
+
'printf "rm -rf /tmp/x\\n"',
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
for (const command of readOnlyCommands) {
|
|
16
|
+
assert.deepEqual(classifyCommand(command), { destructive: false, labels: [] }, command);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("destructive guard still detects direct and wrapper-prefixed recursive deletes", () => {
|
|
21
|
+
const destructiveCommands = [
|
|
22
|
+
"rm -rf build",
|
|
23
|
+
"rm build -rf",
|
|
24
|
+
"sudo rm -rf /",
|
|
25
|
+
"doas rm -rf /",
|
|
26
|
+
"sudo -u bob rm -rf /x",
|
|
27
|
+
"timeout 5 rm -rf /x",
|
|
28
|
+
"time rm -rf build",
|
|
29
|
+
"find . -exec rm -rf {} \\;",
|
|
30
|
+
"cat doomed.txt | xargs rm -rf /tmp/x",
|
|
31
|
+
'rm -rf "/tmp/my build"',
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
for (const command of destructiveCommands) {
|
|
35
|
+
assert.deepEqual(classifyCommand(command), {
|
|
36
|
+
destructive: true,
|
|
37
|
+
labels: ["recursive delete"],
|
|
38
|
+
}, command);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("destructive guard treats quoted interpreter payloads as literals", () => {
|
|
43
|
+
assert.deepEqual(classifyCommand('bash -c "rm -rf /"'), { destructive: false, labels: [] });
|
|
44
|
+
});
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Behavioural regression test for #5837.
|
|
3
3
|
*
|
|
4
|
-
* /gsd discuss
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* "DB unavailable" branch, reports no active milestone, and showDiscuss()
|
|
8
|
-
* exits as if the project had no milestones.
|
|
4
|
+
* /gsd discuss and /gsd auto can cold-start with a DB file on disk but no
|
|
5
|
+
* in-process connection yet. State derivation must open that existing DB
|
|
6
|
+
* before it decides whether DB-backed state is available.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* opened, and surfaces the milestone once ensureDbOpen() has run.
|
|
8
|
+
* This test pins that behavioural contract: with a milestone living only in
|
|
9
|
+
* the DB, deriveState() surfaces it even when the process begins with no DB
|
|
10
|
+
* handle open.
|
|
14
11
|
*/
|
|
15
12
|
|
|
16
13
|
import { describe, test, afterEach } from "node:test";
|
|
@@ -19,7 +16,6 @@ import { mkdtempSync, mkdirSync, realpathSync, rmSync } from "node:fs";
|
|
|
19
16
|
import { join } from "node:path";
|
|
20
17
|
import { tmpdir } from "node:os";
|
|
21
18
|
|
|
22
|
-
import { ensureDbOpen } from "../bootstrap/dynamic-tools.ts";
|
|
23
19
|
import { openDatabase, closeDatabase, isDbAvailable, insertMilestone } from "../gsd-db.ts";
|
|
24
20
|
import { deriveState, invalidateStateCache } from "../state.ts";
|
|
25
21
|
|
|
@@ -29,7 +25,7 @@ afterEach(() => {
|
|
|
29
25
|
});
|
|
30
26
|
|
|
31
27
|
describe("discuss cold-start DB ordering (#5837)", () => {
|
|
32
|
-
test("deriveState
|
|
28
|
+
test("deriveState opens an existing DB before reading a DB-resident milestone", async () => {
|
|
33
29
|
const base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-discuss-cold-")));
|
|
34
30
|
try {
|
|
35
31
|
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
@@ -42,26 +38,13 @@ describe("discuss cold-start DB ordering (#5837)", () => {
|
|
|
42
38
|
closeDatabase();
|
|
43
39
|
invalidateStateCache();
|
|
44
40
|
|
|
45
|
-
// Before ensureDbOpen(): showDiscuss's pre-fix ordering. The DB is not
|
|
46
|
-
// open, so state derivation cannot see the milestone — the silent exit.
|
|
47
41
|
const coldState = await deriveState(base);
|
|
48
42
|
assert.equal(
|
|
49
|
-
coldState.activeMilestone,
|
|
50
|
-
null,
|
|
51
|
-
"without an open DB, deriveState must not surface the milestone — this is the cold-start silent-exit bug",
|
|
52
|
-
);
|
|
53
|
-
assert.equal(isDbAvailable(), false, "DB must still be closed before ensureDbOpen");
|
|
54
|
-
|
|
55
|
-
// The fix: ensureDbOpen(basePath) runs before deriveState.
|
|
56
|
-
assert.equal(await ensureDbOpen(base), true, "ensureDbOpen must open the cold-start DB");
|
|
57
|
-
invalidateStateCache();
|
|
58
|
-
|
|
59
|
-
const warmState = await deriveState(base);
|
|
60
|
-
assert.equal(
|
|
61
|
-
warmState.activeMilestone?.id,
|
|
43
|
+
coldState.activeMilestone?.id,
|
|
62
44
|
"M001",
|
|
63
|
-
"
|
|
45
|
+
"cold-start deriveState must open and read the existing workflow DB",
|
|
64
46
|
);
|
|
47
|
+
assert.equal(isDbAvailable(), true, "deriveState must leave the existing DB open for downstream reads");
|
|
65
48
|
} finally {
|
|
66
49
|
if (isDbAvailable()) closeDatabase();
|
|
67
50
|
invalidateStateCache();
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import { describe, test, afterEach } from "node:test";
|
|
9
9
|
import assert from "node:assert/strict";
|
|
10
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { existsSync, mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { tmpdir } from "node:os";
|
|
13
13
|
import { execFileSync } from "node:child_process";
|
|
@@ -16,6 +16,7 @@ import { DISPATCH_RULES, resolveDispatch, type DispatchContext } from "../auto-d
|
|
|
16
16
|
import { AutoSession } from "../auto/session.ts";
|
|
17
17
|
import {
|
|
18
18
|
closeDatabase,
|
|
19
|
+
getLatestAssessmentByScope,
|
|
19
20
|
getPendingGates,
|
|
20
21
|
insertAssessment,
|
|
21
22
|
insertGateRow,
|
|
@@ -99,6 +100,23 @@ describe("completing-milestone dispatch guard (#4324)", () => {
|
|
|
99
100
|
assert.equal(result?.unitId, "M001");
|
|
100
101
|
});
|
|
101
102
|
|
|
103
|
+
test("records pass-through validation before completing-milestone dispatch when validation is absent (#823)", async () => {
|
|
104
|
+
base = makeBase();
|
|
105
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
106
|
+
insertMilestone({ id: "M001", title: "Milestone One", status: "active" });
|
|
107
|
+
insertSlice({ milestoneId: "M001", id: "S01", title: "Done", status: "complete" });
|
|
108
|
+
|
|
109
|
+
const result = await rule.match(buildDispatchCtx(base));
|
|
110
|
+
|
|
111
|
+
assert.equal(result?.action, "dispatch");
|
|
112
|
+
assert.equal(result?.unitType, "complete-milestone");
|
|
113
|
+
const validation = getLatestAssessmentByScope("M001", "milestone-validation");
|
|
114
|
+
assert.equal(validation?.status, "pass");
|
|
115
|
+
const validationPath = join(base, ".gsd", "milestones", "M001", "M001-VALIDATION.md");
|
|
116
|
+
assert.equal(existsSync(validationPath), true);
|
|
117
|
+
assert.match(readFileSync(validationPath, "utf-8"), /skip_validation_reason: closeout-recovery/);
|
|
118
|
+
});
|
|
119
|
+
|
|
102
120
|
test("resolveDispatch stops complete-milestone when unit is exhausted in-session (#5662)", async () => {
|
|
103
121
|
base = makeBase();
|
|
104
122
|
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
@@ -303,6 +321,7 @@ describe("complete phase dispatch guard (#5683)", () => {
|
|
|
303
321
|
assert.equal(result?.level, "warning");
|
|
304
322
|
assert.match(result?.reason ?? "", /closeout-consistency-blocked/);
|
|
305
323
|
assert.match(result?.reason ?? "", /latest milestone validation is "absent"/);
|
|
324
|
+
assert.match(result?.reason ?? "", /\/gsd validate-milestone M001/);
|
|
306
325
|
});
|
|
307
326
|
});
|
|
308
327
|
|
|
@@ -326,3 +326,105 @@ test("rehydrate degrades to an empty window without a scope or ledger", () => {
|
|
|
326
326
|
assert.equal(noDb.rehydrate(), 0);
|
|
327
327
|
assert.equal(noDb.getRecentWindow().length, 0);
|
|
328
328
|
});
|
|
329
|
+
|
|
330
|
+
// ─── Session-scoped rehydration (#852) ───────────────────────────────────────
|
|
331
|
+
//
|
|
332
|
+
// Without session scoping, two consecutive finalize-retry failures from a
|
|
333
|
+
// PREVIOUS session persist in unit_dispatches and are loaded into the
|
|
334
|
+
// DispatchHistory window on the NEXT session's start() → rehydrate() call.
|
|
335
|
+
// The first advance's recordDispatch fills the window (matchingCount >=
|
|
336
|
+
// STUCK_WINDOW_SIZE) and detectStuck Rule 1 fires immediately, killing
|
|
337
|
+
// auto-mode before any new unit runs. The resolveTraceId option scopes
|
|
338
|
+
// rehydrate() to the current session so only that session's dispatches
|
|
339
|
+
// populate the window.
|
|
340
|
+
|
|
341
|
+
test("#852: rehydrate with resolveTraceId ignores prior-session entries (empty window on fresh session)", (t) => {
|
|
342
|
+
const f = makeLedgerFixture(t);
|
|
343
|
+
|
|
344
|
+
// Prior session: six consecutive finalize-retry failures for the same unit.
|
|
345
|
+
// recordDispatchClaim uses the trace_id from the fixture's claim() helper
|
|
346
|
+
// (random per-iteration). We insert them directly so we control the trace_id.
|
|
347
|
+
for (let i = 0; i < STUCK_WINDOW_SIZE; i++) {
|
|
348
|
+
const claim = recordDispatchClaim({
|
|
349
|
+
traceId: "prior-session-trace-id",
|
|
350
|
+
workerId: f.worker,
|
|
351
|
+
milestoneLeaseToken: f.token,
|
|
352
|
+
milestoneId: "M001",
|
|
353
|
+
unitType: "discuss-milestone",
|
|
354
|
+
unitId: "M001",
|
|
355
|
+
});
|
|
356
|
+
assert.equal(claim.ok, true);
|
|
357
|
+
if (!claim.ok) return;
|
|
358
|
+
markFailed(claim.dispatchId, { errorSummary: "finalize-retry" });
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Unscoped rehydrate loads all prior entries — the window is full.
|
|
362
|
+
const unscopedHistory = createDispatchHistory({ resolveScopeId: () => f.base });
|
|
363
|
+
unscopedHistory.rehydrate();
|
|
364
|
+
assert.equal(
|
|
365
|
+
unscopedHistory.getRecentWindow().length,
|
|
366
|
+
STUCK_WINDOW_SIZE,
|
|
367
|
+
"unscoped rehydrate sees prior-session entries",
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
// New session: rehydrate scoped to a fresh trace_id that has never been
|
|
371
|
+
// written to unit_dispatches → 0 rows → the window stays empty.
|
|
372
|
+
const freshTraceId = "new-session-trace-id-never-in-db";
|
|
373
|
+
const freshHistory = createDispatchHistory({
|
|
374
|
+
resolveScopeId: () => f.base,
|
|
375
|
+
resolveTraceId: () => freshTraceId,
|
|
376
|
+
});
|
|
377
|
+
const count = freshHistory.rehydrate();
|
|
378
|
+
assert.equal(count, 0, "session-scoped rehydrate excludes prior-session entries");
|
|
379
|
+
assert.equal(freshHistory.getRecentWindow().length, 0);
|
|
380
|
+
|
|
381
|
+
// The first dispatch of the new session should not trigger stuck (window is
|
|
382
|
+
// empty, so Rule 1/2/3/4 cannot fire on a single-entry window).
|
|
383
|
+
freshHistory.recordDispatch("discuss-milestone", "M001");
|
|
384
|
+
assert.equal(
|
|
385
|
+
freshHistory.detectStuck(),
|
|
386
|
+
null,
|
|
387
|
+
"first dispatch in new session must not trigger stuck detection",
|
|
388
|
+
);
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
test("#852: rehydrate with resolveTraceId still includes current-session entries", (t) => {
|
|
392
|
+
const f = makeLedgerFixture(t);
|
|
393
|
+
const currentTraceId = "current-session-trace";
|
|
394
|
+
|
|
395
|
+
// Prior session entry (different trace_id).
|
|
396
|
+
const oldClaim = recordDispatchClaim({
|
|
397
|
+
traceId: "old-session-trace",
|
|
398
|
+
workerId: f.worker,
|
|
399
|
+
milestoneLeaseToken: f.token,
|
|
400
|
+
milestoneId: "M001",
|
|
401
|
+
unitType: "plan-milestone",
|
|
402
|
+
unitId: "M001",
|
|
403
|
+
});
|
|
404
|
+
assert.equal(oldClaim.ok, true);
|
|
405
|
+
if (oldClaim.ok) markFailed(oldClaim.dispatchId, { errorSummary: "finalize-retry" });
|
|
406
|
+
|
|
407
|
+
// Current session entries (matching trace_id).
|
|
408
|
+
for (let i = 0; i < 2; i++) {
|
|
409
|
+
const claim = recordDispatchClaim({
|
|
410
|
+
traceId: currentTraceId,
|
|
411
|
+
workerId: f.worker,
|
|
412
|
+
milestoneLeaseToken: f.token,
|
|
413
|
+
milestoneId: "M001",
|
|
414
|
+
unitType: "plan-milestone",
|
|
415
|
+
unitId: "M001",
|
|
416
|
+
});
|
|
417
|
+
assert.equal(claim.ok, true);
|
|
418
|
+
if (!claim.ok) return;
|
|
419
|
+
markFailed(claim.dispatchId, { errorSummary: "finalize-retry" });
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Scoped to current session: only the 2 current entries are loaded.
|
|
423
|
+
const history = createDispatchHistory({
|
|
424
|
+
resolveScopeId: () => f.base,
|
|
425
|
+
resolveTraceId: () => currentTraceId,
|
|
426
|
+
});
|
|
427
|
+
const count = history.rehydrate();
|
|
428
|
+
assert.equal(count, 2, "session-scoped rehydrate includes current-session entries");
|
|
429
|
+
assert.equal(history.getRecentWindow().length, 2);
|
|
430
|
+
});
|
|
@@ -69,9 +69,12 @@ function makeContextFor(
|
|
|
69
69
|
// ─── Scaffold helpers ──────────────────────────────────────────────────────
|
|
70
70
|
|
|
71
71
|
function scaffoldSlicePlan(basePath: string, mid: string, sid: string): void {
|
|
72
|
-
|
|
72
|
+
// Flat-phase: phases/NN-slug/NN-MM-PLAN.md
|
|
73
|
+
const phaseNum = parseInt(mid.match(/^M0*(\d+)/i)?.[1] || '1', 10);
|
|
74
|
+
const planNum = parseInt(sid.match(/^S0*(\d+)/i)?.[1] || '1', 10);
|
|
75
|
+
const dir = join(basePath, ".gsd", "phases", `${String(phaseNum).padStart(2, '0')}-test`);
|
|
73
76
|
mkdirSync(dir, { recursive: true });
|
|
74
|
-
writeFileSync(join(dir, `${
|
|
77
|
+
writeFileSync(join(dir, `${String(phaseNum).padStart(2, '0')}-${String(planNum).padStart(2, '0')}-PLAN.md`), [
|
|
75
78
|
`# ${sid}: Third Slice`,
|
|
76
79
|
"",
|
|
77
80
|
"## Tasks",
|
|
@@ -82,35 +85,66 @@ function scaffoldSlicePlan(basePath: string, mid: string, sid: string): void {
|
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
function scaffoldMilestoneContext(basePath: string, mid: string): void {
|
|
88
|
+
const phaseNum = parseInt(mid.match(/^M0*(\d+)/i)?.[1] || '1', 10);
|
|
89
|
+
const dir = join(basePath, ".gsd", "phases", `${String(phaseNum).padStart(2, '0')}-test`);
|
|
90
|
+
mkdirSync(dir, { recursive: true });
|
|
91
|
+
writeFileSync(join(dir, `${String(phaseNum).padStart(2, '0')}-CONTEXT.md`), [
|
|
92
|
+
`# ${mid}: Test Milestone`,
|
|
93
|
+
"",
|
|
94
|
+
"Context for dispatch recovery tests.",
|
|
95
|
+
"",
|
|
96
|
+
].join("\n"));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function scaffoldLegacyMilestoneContext(basePath: string, mid: string): void {
|
|
85
100
|
const dir = join(basePath, ".gsd", "milestones", mid);
|
|
86
101
|
mkdirSync(dir, { recursive: true });
|
|
87
102
|
writeFileSync(join(dir, `${mid}-CONTEXT.md`), [
|
|
88
103
|
`# ${mid}: Test Milestone`,
|
|
89
104
|
"",
|
|
90
|
-
"Context for dispatch recovery tests.",
|
|
105
|
+
"Context for legacy dispatch recovery tests.",
|
|
91
106
|
"",
|
|
92
107
|
].join("\n"));
|
|
93
108
|
}
|
|
94
109
|
|
|
95
|
-
function
|
|
110
|
+
function scaffoldLegacySlicePlan(basePath: string, mid: string, sid: string): void {
|
|
111
|
+
const dir = join(basePath, ".gsd", "milestones", mid, "slices", sid);
|
|
112
|
+
mkdirSync(join(dir, "tasks"), { recursive: true });
|
|
113
|
+
writeFileSync(join(dir, `${sid}-PLAN.md`), [
|
|
114
|
+
`# ${sid}: Legacy Slice`,
|
|
115
|
+
"",
|
|
116
|
+
"## Tasks",
|
|
117
|
+
"- T01: Do something",
|
|
118
|
+
"",
|
|
119
|
+
].join("\n"));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function scaffoldLegacyTaskPlan(basePath: string, mid: string, sid: string, tid: string): void {
|
|
96
123
|
const dir = join(basePath, ".gsd", "milestones", mid, "slices", sid, "tasks");
|
|
97
124
|
mkdirSync(dir, { recursive: true });
|
|
98
125
|
writeFileSync(join(dir, `${tid}-PLAN.md`), [
|
|
99
|
-
`# ${tid}:
|
|
126
|
+
`# ${tid}: First Task`,
|
|
100
127
|
"",
|
|
101
|
-
"
|
|
102
|
-
"- [ ] Step 1",
|
|
128
|
+
"Implement the task.",
|
|
103
129
|
"",
|
|
104
130
|
].join("\n"));
|
|
105
131
|
}
|
|
106
132
|
|
|
133
|
+
function scaffoldTaskPlan(basePath: string, mid: string, sid: string, tid: string): void {
|
|
134
|
+
// Flat-phase: no per-task plan files. This is a no-op — tasks live as
|
|
135
|
+
// checkboxes inside the slice plan. Kept for backward-compat with tests
|
|
136
|
+
// that call it; does nothing in flat-phase.
|
|
137
|
+
}
|
|
138
|
+
|
|
107
139
|
// ─── Tests ─────────────────────────────────────────────────────────────────
|
|
108
140
|
|
|
109
141
|
test("dispatch: missing task plan triggers plan-slice (not stop) — issue #909", async (t) => {
|
|
110
142
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-909-"));
|
|
111
143
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
112
144
|
|
|
113
|
-
// Slice plan exists with tasks,
|
|
145
|
+
// Slice plan exists with tasks. In flat-phase, tasks are checkboxes inside
|
|
146
|
+
// the slice plan (no per-task files), so this is the NORMAL state — dispatch
|
|
147
|
+
// should proceed to execute-task, not recover with plan-slice.
|
|
114
148
|
scaffoldMilestoneContext(tmp, "M002");
|
|
115
149
|
scaffoldSlicePlan(tmp, "M002", "S03");
|
|
116
150
|
|
|
@@ -118,10 +152,9 @@ test("dispatch: missing task plan triggers plan-slice (not stop) — issue #909"
|
|
|
118
152
|
const result = await resolveDispatch(ctx);
|
|
119
153
|
|
|
120
154
|
assert.equal(result.action, "dispatch", "should dispatch, not stop");
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
`unitId should be M002/S03, got: ${result.action === "dispatch" ? result.unitId : "(stop)"}`);
|
|
155
|
+
// Flat-phase: tasks embedded in slice plan → execute-task (not plan-slice recovery)
|
|
156
|
+
assert.ok(result.action === "dispatch" && result.unitType === "execute-task",
|
|
157
|
+
`unitType should be execute-task (tasks in slice plan), got: ${result.action === "dispatch" ? result.unitType : "(stop)"}`);
|
|
125
158
|
});
|
|
126
159
|
|
|
127
160
|
test("dispatch: closed milestone is not implicitly recovered or reopened", async (t) => {
|
|
@@ -153,7 +186,10 @@ test("dispatch: present task plan proceeds to execute-task normally", async (t)
|
|
|
153
186
|
|
|
154
187
|
scaffoldMilestoneContext(tmp, "M002");
|
|
155
188
|
scaffoldSlicePlan(tmp, "M002", "S03");
|
|
156
|
-
|
|
189
|
+
// Flat-phase: tasks are checkboxes inside the slice plan (no per-task PLAN files).
|
|
190
|
+
// scaffoldTaskPlan is intentionally NOT called here — creating a milestones/ dir
|
|
191
|
+
// as a side effect would confuse milestonesDir() into treating this as a legacy
|
|
192
|
+
// layout, breaking slice plan resolution and causing discuss-milestone dispatch.
|
|
157
193
|
|
|
158
194
|
const ctx = makeContext(tmp);
|
|
159
195
|
const result = await resolveDispatch(ctx);
|
|
@@ -165,6 +201,115 @@ test("dispatch: present task plan proceeds to execute-task normally", async (t)
|
|
|
165
201
|
`unitId should be M002/S03/T01, got: ${result.action === "dispatch" ? result.unitId : "(stop)"}`);
|
|
166
202
|
});
|
|
167
203
|
|
|
204
|
+
test("dispatch: missing legacy task plan recovery increments a per-slice retry counter", async (t) => {
|
|
205
|
+
const tmp = mkdtempSync(join(tmpdir(), "gsd-1087-retry-"));
|
|
206
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
207
|
+
|
|
208
|
+
scaffoldLegacyMilestoneContext(tmp, "M002");
|
|
209
|
+
scaffoldLegacySlicePlan(tmp, "M002", "S03");
|
|
210
|
+
|
|
211
|
+
const session = {
|
|
212
|
+
missingTaskPlanRetryCount: new Map<string, number>(),
|
|
213
|
+
};
|
|
214
|
+
const result = await resolveDispatch(makeContextFor(tmp, "M002", "S03", "T01", session));
|
|
215
|
+
|
|
216
|
+
assert.equal(result.action, "dispatch");
|
|
217
|
+
assert.ok(result.action === "dispatch" && result.unitType === "plan-slice",
|
|
218
|
+
`unitType should be plan-slice, got: ${result.action === "dispatch" ? result.unitType : "(stop)"}`);
|
|
219
|
+
assert.ok(result.action === "dispatch" && result.unitId === "M002/S03",
|
|
220
|
+
`unitId should be M002/S03, got: ${result.action === "dispatch" ? result.unitId : "(stop)"}`);
|
|
221
|
+
assert.equal(session.missingTaskPlanRetryCount.get("M002/S03"), 1);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
test("dispatch: missing legacy task plan recovery stops when retry counter is exhausted", async (t) => {
|
|
225
|
+
const tmp = mkdtempSync(join(tmpdir(), "gsd-1087-stop-"));
|
|
226
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
227
|
+
|
|
228
|
+
scaffoldLegacyMilestoneContext(tmp, "M002");
|
|
229
|
+
scaffoldLegacySlicePlan(tmp, "M002", "S03");
|
|
230
|
+
|
|
231
|
+
const session = {
|
|
232
|
+
missingTaskPlanRetryCount: new Map<string, number>([["M002/S03", 2]]),
|
|
233
|
+
};
|
|
234
|
+
const result = await resolveDispatch(makeContextFor(tmp, "M002", "S03", "T01", session));
|
|
235
|
+
|
|
236
|
+
assert.equal(result.action, "stop");
|
|
237
|
+
assert.ok(result.action === "stop");
|
|
238
|
+
assert.equal(result.level, "error");
|
|
239
|
+
assert.match(result.reason, /Missing task-plan recovery failed 2 times for M002\/S03/);
|
|
240
|
+
assert.match(result.reason, /manual intervention required/);
|
|
241
|
+
assert.equal(session.missingTaskPlanRetryCount.has("M002/S03"), false);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test("dispatch: present legacy task plan clears missing-plan recovery retry counter", async (t) => {
|
|
245
|
+
const tmp = mkdtempSync(join(tmpdir(), "gsd-1087-clear-"));
|
|
246
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
247
|
+
|
|
248
|
+
scaffoldLegacyMilestoneContext(tmp, "M002");
|
|
249
|
+
scaffoldLegacySlicePlan(tmp, "M002", "S03");
|
|
250
|
+
scaffoldLegacyTaskPlan(tmp, "M002", "S03", "T01");
|
|
251
|
+
|
|
252
|
+
const session = {
|
|
253
|
+
missingTaskPlanRetryCount: new Map<string, number>([["M002/S03", 1]]),
|
|
254
|
+
preExecRetryCount: new Map<string, number>([["M002/S03", 2]]),
|
|
255
|
+
};
|
|
256
|
+
const result = await resolveDispatch(makeContextFor(tmp, "M002", "S03", "T01", session));
|
|
257
|
+
|
|
258
|
+
assert.equal(result.action, "dispatch");
|
|
259
|
+
assert.ok(result.action === "dispatch" && result.unitType === "execute-task",
|
|
260
|
+
`unitType should be execute-task, got: ${result.action === "dispatch" ? result.unitType : "(stop)"}`);
|
|
261
|
+
assert.equal(session.missingTaskPlanRetryCount.has("M002/S03"), false);
|
|
262
|
+
assert.equal(session.preExecRetryCount.get("M002/S03"), 2,
|
|
263
|
+
"pre-exec retry counter must not be cleared when task plan is present");
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
test("dispatch: missing-task-plan recovery loop terminates even when the shared pre-exec key is reset between rounds (#1087)", async (t) => {
|
|
267
|
+
// The recovery rule re-dispatches plan-slice with unitId "${mid}/${sid}".
|
|
268
|
+
// That regenerated plan-slice carries the same currentUnit.id, and on a
|
|
269
|
+
// pre-execution pass the post-unit hook deletes that key from
|
|
270
|
+
// preExecRetryCount (auto-post-unit.ts). Missing per-task PLAN projection
|
|
271
|
+
// files do not fail pre-exec checks, so the regenerated plan-slice typically
|
|
272
|
+
// passes and that delete fires every cycle. If recovery shared
|
|
273
|
+
// preExecRetryCount, its counter would be wiped to 0 each round and the loop
|
|
274
|
+
// would never reach the cap. Here we simulate that reset between rounds and
|
|
275
|
+
// assert the dedicated counter still climbs to MAX and stops.
|
|
276
|
+
const tmp = mkdtempSync(join(tmpdir(), "gsd-1087-loop-term-"));
|
|
277
|
+
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
278
|
+
|
|
279
|
+
scaffoldLegacyMilestoneContext(tmp, "M002");
|
|
280
|
+
scaffoldLegacySlicePlan(tmp, "M002", "S03");
|
|
281
|
+
|
|
282
|
+
const session = {
|
|
283
|
+
missingTaskPlanRetryCount: new Map<string, number>(),
|
|
284
|
+
preExecRetryCount: new Map<string, number>(),
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
// Round 1: missing task plan → recover (counter 0 → 1).
|
|
288
|
+
const r1 = await resolveDispatch(makeContextFor(tmp, "M002", "S03", "T01", session));
|
|
289
|
+
assert.ok(r1.action === "dispatch" && r1.unitType === "plan-slice",
|
|
290
|
+
`round 1 should re-dispatch plan-slice, got: ${r1.action === "dispatch" ? r1.unitType : "(stop)"}`);
|
|
291
|
+
assert.equal(session.missingTaskPlanRetryCount.get("M002/S03"), 1);
|
|
292
|
+
|
|
293
|
+
// The regenerated plan-slice passes its post-unit pre-exec check, deleting
|
|
294
|
+
// the shared "${mid}/${sid}" key from preExecRetryCount.
|
|
295
|
+
session.preExecRetryCount.delete("M002/S03");
|
|
296
|
+
|
|
297
|
+
// Round 2: still missing → recover (counter 1 → 2), unaffected by the reset.
|
|
298
|
+
const r2 = await resolveDispatch(makeContextFor(tmp, "M002", "S03", "T01", session));
|
|
299
|
+
assert.ok(r2.action === "dispatch" && r2.unitType === "plan-slice",
|
|
300
|
+
`round 2 should re-dispatch plan-slice, got: ${r2.action === "dispatch" ? r2.unitType : "(stop)"}`);
|
|
301
|
+
assert.equal(session.missingTaskPlanRetryCount.get("M002/S03"), 2);
|
|
302
|
+
|
|
303
|
+
session.preExecRetryCount.delete("M002/S03");
|
|
304
|
+
|
|
305
|
+
// Round 3: cap reached → stop. The loop terminates despite the resets.
|
|
306
|
+
const r3 = await resolveDispatch(makeContextFor(tmp, "M002", "S03", "T01", session));
|
|
307
|
+
assert.equal(r3.action, "stop");
|
|
308
|
+
assert.ok(r3.action === "stop" && r3.level === "error");
|
|
309
|
+
assert.match(r3.reason, /Missing task-plan recovery failed 2 times for M002\/S03/);
|
|
310
|
+
assert.equal(session.missingTaskPlanRetryCount.has("M002/S03"), false);
|
|
311
|
+
});
|
|
312
|
+
|
|
168
313
|
test("dispatch: session milestone mismatch stops before missing-task-plan recovery", async (t) => {
|
|
169
314
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-session-milestone-mismatch-"));
|
|
170
315
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
@@ -280,8 +425,9 @@ test("dispatch: artifact checks trust active session basePath even when original
|
|
|
280
425
|
});
|
|
281
426
|
|
|
282
427
|
test("dispatch: plan-slice recovery loop — second call after plan-slice still recovers cleanly", async (t) => {
|
|
283
|
-
//
|
|
284
|
-
// Dispatch should
|
|
428
|
+
// Flat-phase: tasks are checkboxes inside the slice plan, so there are no
|
|
429
|
+
// per-task plan files to be "missing". Dispatch should go to execute-task
|
|
430
|
+
// (the normal flow), not plan-slice recovery.
|
|
285
431
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-909-loop-"));
|
|
286
432
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
287
433
|
|
|
@@ -291,19 +437,22 @@ test("dispatch: plan-slice recovery loop — second call after plan-slice still
|
|
|
291
437
|
const ctx = makeContext(tmp);
|
|
292
438
|
const r1 = await resolveDispatch(ctx);
|
|
293
439
|
assert.equal(r1.action, "dispatch");
|
|
294
|
-
assert.ok(r1.action === "dispatch" && r1.unitType === "
|
|
440
|
+
assert.ok(r1.action === "dispatch" && r1.unitType === "execute-task",
|
|
441
|
+
"flat-phase: should dispatch execute-task (tasks in slice plan)");
|
|
295
442
|
|
|
296
|
-
//
|
|
443
|
+
// Second dispatch should also go to execute-task (idempotent)
|
|
297
444
|
const r2 = await resolveDispatch(ctx);
|
|
298
445
|
assert.equal(r2.action, "dispatch");
|
|
299
|
-
assert.ok(r2.action === "dispatch" && r2.unitType === "
|
|
300
|
-
"should keep dispatching
|
|
446
|
+
assert.ok(r2.action === "dispatch" && r2.unitType === "execute-task",
|
|
447
|
+
"should keep dispatching execute-task");
|
|
301
448
|
});
|
|
302
449
|
|
|
303
450
|
test("dispatch: missing task plan recovery logs root/worktree diagnostic when debug enabled — issue #6194", async (t) => {
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
//
|
|
451
|
+
// Flat-phase: tasks are embedded in the slice plan, so the recovery rule
|
|
452
|
+
// (which fires when per-task plan files are missing) doesn't apply.
|
|
453
|
+
// The diagnostic log entry is only produced in the legacy layout.
|
|
454
|
+
// This test verifies the normal flat-phase dispatch path doesn't crash
|
|
455
|
+
// with debug enabled.
|
|
307
456
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-6194-"));
|
|
308
457
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
309
458
|
|
|
@@ -315,25 +464,8 @@ test("dispatch: missing task plan recovery logs root/worktree diagnostic when de
|
|
|
315
464
|
|
|
316
465
|
const ctx = makeContext(tmp);
|
|
317
466
|
const result = await resolveDispatch(ctx);
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
assert.ok(logPath, "debug log path should be set while debug is enabled");
|
|
323
|
-
|
|
324
|
-
const entry = readFileSync(logPath!, "utf8")
|
|
325
|
-
.trim()
|
|
326
|
-
.split("\n")
|
|
327
|
-
.filter(Boolean)
|
|
328
|
-
.map((line) => JSON.parse(line) as Record<string, unknown>)
|
|
329
|
-
.find((e) => e.event === "dispatch-missing-task-plan-recovery");
|
|
330
|
-
|
|
331
|
-
assert.ok(entry, "diagnostic event should be logged when recovery fires in debug mode");
|
|
332
|
-
assert.equal(entry!.basePathUsedForArtifactChecks, tmp);
|
|
333
|
-
assert.equal(entry!.artifactExists, false, "task plan is genuinely absent");
|
|
334
|
-
assert.equal(entry!.expectedTaskPlanExists, false, "expected task plan is genuinely absent");
|
|
335
|
-
assert.equal(entry!.projectionArtifactExists, false, "projection task plan is genuinely absent");
|
|
336
|
-
assert.equal(entry!.hasRootWorktreeMismatch, false, "root/worktree mismatch should be false in single-root scenario");
|
|
337
|
-
assert.equal(typeof entry!.expectedTaskPlanPath, "string");
|
|
338
|
-
assert.equal(typeof entry!.projectionTaskPlanPath, "string");
|
|
467
|
+
// Flat-phase: dispatch goes to execute-task (tasks in slice plan)
|
|
468
|
+
assert.ok(result.action === "dispatch",
|
|
469
|
+
"should dispatch without crashing in debug mode");
|
|
470
|
+
// Flat-phase: no recovery diagnostic entry expected (tasks in slice plan)
|
|
339
471
|
});
|