@opengsd/gsd-pi 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -10
- package/dist/cli.js +32 -4
- package/dist/headless-answers.js +1 -1
- package/dist/headless-context.js +0 -1
- package/dist/headless-ui.d.ts +1 -1
- package/dist/headless-ui.js +1 -1
- package/dist/headless.js +1 -1
- package/dist/help-text.js +29 -0
- package/dist/hermes-integration-install.d.ts +17 -0
- package/dist/hermes-integration-install.js +199 -0
- package/dist/jiti-workspace-aliases.d.ts +11 -2
- package/dist/jiti-workspace-aliases.js +19 -3
- package/dist/read-cli.d.ts +23 -0
- package/dist/read-cli.js +90 -0
- package/dist/resource-loader.d.ts +3 -3
- package/dist/resource-loader.js +4 -13
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +22 -22
- package/dist/resources/extensions/claude-code-cli/index.js +7 -1
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +84 -22
- package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
- package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
- package/dist/resources/extensions/gsd/auto/loop.js +67 -2
- package/dist/resources/extensions/gsd/auto/orchestrator.js +28 -10
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +108 -19
- package/dist/resources/extensions/gsd/auto-budget.js +5 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +62 -27
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +28 -22
- package/dist/resources/extensions/gsd/auto-prompts.js +68 -43
- package/dist/resources/extensions/gsd/auto-recovery.js +14 -483
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -5
- package/dist/resources/extensions/gsd/auto-start.js +56 -30
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
- package/dist/resources/extensions/gsd/auto-verification.js +10 -4
- package/dist/resources/extensions/gsd/auto-worktree.js +117 -91
- package/dist/resources/extensions/gsd/auto.js +40 -15
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +141 -65
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -5
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +23 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +117 -27
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +190 -43
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +96 -10
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +73 -16
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +95 -5
- package/dist/resources/extensions/gsd/codebase-generator.js +5 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
- package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +30 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +225 -1
- package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
- package/dist/resources/extensions/gsd/commands-context.js +19 -1
- package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +23 -12
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
- package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
- package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
- package/dist/resources/extensions/gsd/compat/index.js +3 -0
- package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
- package/dist/resources/extensions/gsd/config-overlay.js +2 -2
- package/dist/resources/extensions/gsd/consent-question.js +12 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +71 -6
- package/dist/resources/extensions/gsd/db/engine.js +31 -1
- package/dist/resources/extensions/gsd/db/queries.js +114 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
- package/dist/resources/extensions/gsd/db-workspace.js +68 -4
- package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
- package/dist/resources/extensions/gsd/doctor-git-checks.js +25 -3
- package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -15
- package/dist/resources/extensions/gsd/doctor.js +28 -7
- package/dist/resources/extensions/gsd/error-classifier.js +13 -1
- package/dist/resources/extensions/gsd/escalation.js +11 -4
- package/dist/resources/extensions/gsd/exec-sandbox.js +53 -11
- package/dist/resources/extensions/gsd/export-html.js +10 -3
- package/dist/resources/extensions/gsd/export.js +73 -0
- package/dist/resources/extensions/gsd/file-lock.js +1 -1
- package/dist/resources/extensions/gsd/flat-phase-migration.js +221 -0
- package/dist/resources/extensions/gsd/forensics.js +4 -33
- package/dist/resources/extensions/gsd/git-service.js +68 -8
- package/dist/resources/extensions/gsd/gitignore.js +10 -3
- package/dist/resources/extensions/gsd/guidance.js +7 -7
- package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
- package/dist/resources/extensions/gsd/guided-flow.js +11 -6
- package/dist/resources/extensions/gsd/health-widget.js +55 -29
- package/dist/resources/extensions/gsd/json-persistence.js +20 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
- package/dist/resources/extensions/gsd/layout-policy.js +77 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +396 -122
- package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
- package/dist/resources/extensions/gsd/md-importer.js +153 -51
- package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
- package/dist/resources/extensions/gsd/metrics.js +22 -14
- package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
- package/dist/resources/extensions/gsd/migrate-external.js +62 -8
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -14
- package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
- package/dist/resources/extensions/gsd/milestone-ids.js +79 -18
- package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
- package/dist/resources/extensions/gsd/model-router.js +79 -20
- package/dist/resources/extensions/gsd/notification-store.js +22 -29
- package/dist/resources/extensions/gsd/notifications.js +36 -7
- package/dist/resources/extensions/gsd/observability-validator.js +12 -4
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
- package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
- package/dist/resources/extensions/gsd/paths.js +356 -44
- package/dist/resources/extensions/gsd/planning-depth.js +2 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
- package/dist/resources/extensions/gsd/preferences-models.js +23 -11
- package/dist/resources/extensions/gsd/preferences.js +62 -13
- package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/dist/resources/extensions/gsd/prompts/code-review.md +39 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +21 -16
- package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
- package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/dist/resources/extensions/gsd/prompts/health.md +37 -0
- package/dist/resources/extensions/gsd/prompts/import.md +30 -0
- package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
- package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
- package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/dist/resources/extensions/gsd/prompts/review.md +27 -0
- package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
- package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
- package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
- package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
- package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
- package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/dist/resources/extensions/gsd/queue-order.js +3 -2
- package/dist/resources/extensions/gsd/quick.js +45 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/service-tier.js +2 -1
- package/dist/resources/extensions/gsd/session-forensics.js +11 -1
- package/dist/resources/extensions/gsd/session-lock.js +7 -6
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
- package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
- package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
- package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
- package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +38 -4
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +138 -19
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +84 -26
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +34 -18
- package/dist/resources/extensions/gsd/state.js +13 -581
- package/dist/resources/extensions/gsd/sync-lock.js +11 -18
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +8 -4
- package/dist/resources/extensions/gsd/tools/complete-slice.js +14 -4
- package/dist/resources/extensions/gsd/tools/complete-task.js +58 -15
- package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +60 -47
- package/dist/resources/extensions/gsd/tools/plan-task.js +40 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +44 -5
- package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
- package/dist/resources/extensions/gsd/undo.js +51 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
- package/dist/resources/extensions/gsd/unit-registry.js +63 -9
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +91 -5
- package/dist/resources/extensions/gsd/validation-block-guard.js +54 -4
- package/dist/resources/extensions/gsd/verification-gate.js +7 -0
- package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
- package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
- package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
- package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +44 -18
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
- package/dist/resources/extensions/gsd/worktree-command.js +6 -6
- package/dist/resources/extensions/gsd/worktree-health.js +6 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +59 -17
- package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
- package/dist/resources/extensions/mcp-client/manager.js +3 -3
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.js +15 -4
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.d0d9e0a955e441cb.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/8785.e29b3134cab1d153.js +1 -0
- package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-a48b7c48333b31c8.js → page-bc4c723c6a19c6f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web-mode.d.ts +3 -1
- package/dist/web-mode.js +7 -5
- package/integrations/hermes/README.md +48 -0
- package/integrations/hermes/docs/setup.md +272 -0
- package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
- package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
- package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
- package/integrations/hermes/open_gsd_hermes/config.py +59 -0
- package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
- package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
- package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
- package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
- package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
- package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
- package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
- package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
- package/integrations/hermes/open_gsd_hermes/types.py +100 -0
- package/integrations/hermes/plugin.yaml +38 -0
- package/integrations/hermes/pyproject.toml +32 -0
- package/integrations/hermes/scripts/preflight.sh +92 -0
- package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
- package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
- package/integrations/hermes/tests/golden/snapshot.txt +8 -0
- package/integrations/hermes/tests/test_binding.py +103 -0
- package/integrations/hermes/tests/test_config.py +36 -0
- package/integrations/hermes/tests/test_cron.py +34 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
- package/integrations/hermes/tests/test_memory.py +59 -0
- package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
- package/integrations/hermes/tests/test_register.py +56 -0
- package/integrations/hermes/tests/test_snapshot.py +53 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
- package/package.json +7 -6
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +1 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +2 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +3 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts +2 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +2 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
- package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
- package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -829
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +18 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +11 -1
- package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
- package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-errors.js +12 -0
- package/packages/mcp-server/dist/cli-errors.js.map +1 -1
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +33 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/cli.d.ts +1 -0
- package/packages/mcp-server/dist/cli.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli.js +1 -0
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +30 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +85 -6
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +35 -21
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +21 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +3 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +46 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +38 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +3 -2
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme-schema.d.ts +75 -75
- package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/theme/theme-schema.js +1 -1
- package/pkg/dist/theme/theme-schema.js.map +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +11 -7
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +22 -22
- package/src/resources/extensions/claude-code-cli/index.ts +8 -1
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +103 -22
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +61 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +262 -10
- package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
- package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +69 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +38 -13
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +129 -20
- package/src/resources/extensions/gsd/auto-budget.ts +12 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +68 -34
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -23
- package/src/resources/extensions/gsd/auto-prompts.ts +81 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +21 -484
- package/src/resources/extensions/gsd/auto-runtime-state.ts +17 -5
- package/src/resources/extensions/gsd/auto-start.ts +63 -34
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
- package/src/resources/extensions/gsd/auto-verification.ts +10 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +48 -15
- package/src/resources/extensions/gsd/auto.ts +46 -11
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +164 -71
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -5
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +139 -27
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +219 -46
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +104 -10
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +86 -18
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +109 -4
- package/src/resources/extensions/gsd/codebase-generator.ts +6 -9
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
- package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +31 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +225 -1
- package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
- package/src/resources/extensions/gsd/commands-context.ts +18 -1
- package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +21 -10
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
- package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
- package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
- package/src/resources/extensions/gsd/compat/index.ts +12 -0
- package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
- package/src/resources/extensions/gsd/config-overlay.ts +3 -1
- package/src/resources/extensions/gsd/consent-question.ts +11 -1
- package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +73 -7
- package/src/resources/extensions/gsd/db/engine.ts +34 -1
- package/src/resources/extensions/gsd/db/queries.ts +157 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
- package/src/resources/extensions/gsd/db-workspace.ts +76 -3
- package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
- package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
- package/src/resources/extensions/gsd/doctor-git-checks.ts +24 -2
- package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -15
- package/src/resources/extensions/gsd/doctor-types.ts +4 -0
- package/src/resources/extensions/gsd/doctor.ts +30 -7
- package/src/resources/extensions/gsd/error-classifier.ts +14 -1
- package/src/resources/extensions/gsd/escalation.ts +9 -4
- package/src/resources/extensions/gsd/exec-sandbox.ts +56 -11
- package/src/resources/extensions/gsd/export-html.ts +11 -4
- package/src/resources/extensions/gsd/export.ts +88 -1
- package/src/resources/extensions/gsd/file-lock.ts +1 -1
- package/src/resources/extensions/gsd/flat-phase-migration.ts +249 -0
- package/src/resources/extensions/gsd/forensics.ts +4 -34
- package/src/resources/extensions/gsd/git-constants.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +76 -7
- package/src/resources/extensions/gsd/gitignore.ts +11 -4
- package/src/resources/extensions/gsd/guidance.ts +7 -7
- package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
- package/src/resources/extensions/gsd/guided-flow.ts +11 -6
- package/src/resources/extensions/gsd/health-widget.ts +69 -32
- package/src/resources/extensions/gsd/json-persistence.ts +20 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
- package/src/resources/extensions/gsd/layout-policy.ts +86 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +409 -112
- package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
- package/src/resources/extensions/gsd/md-importer.ts +215 -65
- package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
- package/src/resources/extensions/gsd/metrics.ts +26 -13
- package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
- package/src/resources/extensions/gsd/migrate-external.ts +57 -8
- package/src/resources/extensions/gsd/migration-auto-check.ts +27 -13
- package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
- package/src/resources/extensions/gsd/milestone-ids.ts +78 -19
- package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
- package/src/resources/extensions/gsd/model-router.ts +98 -18
- package/src/resources/extensions/gsd/notification-store.ts +17 -28
- package/src/resources/extensions/gsd/notifications.ts +37 -6
- package/src/resources/extensions/gsd/observability-validator.ts +12 -4
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
- package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
- package/src/resources/extensions/gsd/paths.ts +348 -39
- package/src/resources/extensions/gsd/planning-depth.ts +2 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
- package/src/resources/extensions/gsd/preferences-models.ts +25 -9
- package/src/resources/extensions/gsd/preferences.ts +80 -12
- package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/src/resources/extensions/gsd/prompts/code-review.md +39 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +21 -16
- package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/src/resources/extensions/gsd/prompts/explore.md +58 -0
- package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/src/resources/extensions/gsd/prompts/health.md +37 -0
- package/src/resources/extensions/gsd/prompts/import.md +30 -0
- package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/src/resources/extensions/gsd/prompts/manager.md +21 -0
- package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/phase.md +22 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/src/resources/extensions/gsd/prompts/progress.md +30 -0
- package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/src/resources/extensions/gsd/prompts/review.md +27 -0
- package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/settings.md +24 -0
- package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/spike.md +59 -0
- package/src/resources/extensions/gsd/prompts/stats.md +43 -0
- package/src/resources/extensions/gsd/prompts/surface.md +25 -0
- package/src/resources/extensions/gsd/prompts/thread.md +24 -0
- package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/src/resources/extensions/gsd/queue-order.ts +3 -2
- package/src/resources/extensions/gsd/quick.ts +43 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/service-tier.ts +2 -0
- package/src/resources/extensions/gsd/session-forensics.ts +11 -1
- package/src/resources/extensions/gsd/session-lock.ts +7 -6
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
- package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
- package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
- package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
- package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +35 -4
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +176 -30
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +86 -27
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +45 -18
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
- package/src/resources/extensions/gsd/state.ts +37 -695
- package/src/resources/extensions/gsd/sync-lock.ts +11 -20
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +420 -2
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +15 -12
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +146 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +863 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +18 -7
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +82 -7
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +175 -43
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +239 -2
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +386 -0
- package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +204 -7
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +161 -27
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +48 -5
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +23 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +166 -4
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +329 -57
- package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
- package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/undo.test.ts +113 -37
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +212 -11
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +110 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +130 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +42 -12
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +70 -13
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -9
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +68 -16
- package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
- package/src/resources/extensions/gsd/tools/plan-slice.ts +61 -50
- package/src/resources/extensions/gsd/tools/plan-task.ts +43 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +43 -4
- package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
- package/src/resources/extensions/gsd/undo.ts +55 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
- package/src/resources/extensions/gsd/unit-registry.ts +63 -9
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +101 -6
- package/src/resources/extensions/gsd/validation-block-guard.ts +59 -7
- package/src/resources/extensions/gsd/verification-gate.ts +8 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
- package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
- package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
- package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +44 -18
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
- package/src/resources/extensions/gsd/worktree-command.ts +6 -6
- package/src/resources/extensions/gsd/worktree-health.ts +6 -3
- package/src/resources/extensions/gsd/worktree-manager.ts +72 -16
- package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
- package/src/resources/extensions/mcp-client/manager.ts +3 -3
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-f0285ce91d4ec9ef.js +0 -1
- /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → zQLcXm0Za8lexoXtgDpMG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → zQLcXm0Za8lexoXtgDpMG}/_ssgManifest.js +0 -0
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool-call loop guard.
|
|
3
3
|
*
|
|
4
|
-
* Detects when a model calls
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Detects when a model repeats tool calls within a single Agent Turn.
|
|
5
|
+
* Works in both auto-mode and interactive sessions by hooking into the
|
|
6
|
+
* native engine's `tool_call` event, which fires before execution and can
|
|
7
|
+
* block the call.
|
|
8
8
|
*
|
|
9
|
-
* The guard
|
|
10
|
-
* and
|
|
11
|
-
*
|
|
12
|
-
* and
|
|
9
|
+
* The guard has two independent checks: a sliding window for identical
|
|
10
|
+
* tool signatures, and a per-tool-name cap for repeated calls with varied
|
|
11
|
+
* arguments. State resets at Agent Turn boundaries (session_start,
|
|
12
|
+
* agent_end) and the identical-signature streak also resets when a
|
|
13
|
+
* different tool call breaks the streak. Block messages instruct the model
|
|
14
|
+
* to stop tooling for the rest of that turn and answer in text.
|
|
15
|
+
*
|
|
16
|
+
* The per-tool-name check (#783 Brief C) tracks call counts within a
|
|
17
|
+
* turn regardless of args, decaying after successful state-mutating tools.
|
|
18
|
+
* This catches improvisation
|
|
19
|
+
* loops where the model attempts the same missing workflow tool through
|
|
20
|
+
* varied surfaces (bash → `node -e` → CLI), each with a different
|
|
21
|
+
* signature, so the identical-args streak never trips, while allowing
|
|
22
|
+
* tool-heavy turns that are making file-mutation progress. Whichever guard
|
|
23
|
+
* trips first blocks.
|
|
13
24
|
*/
|
|
14
25
|
|
|
15
26
|
import { createHash } from "node:crypto";
|
|
27
|
+
import { INHERENTLY_REPEATABLE_TOOL_SET } from "./core-session-tools.js";
|
|
16
28
|
|
|
17
29
|
const MAX_CONSECUTIVE_IDENTICAL_CALLS = 4;
|
|
18
30
|
|
|
@@ -20,11 +32,31 @@ const MAX_CONSECUTIVE_IDENTICAL_CALLS = 4;
|
|
|
20
32
|
const STRICT_LOOP_TOOLS = new Set(["ask_user_questions"]);
|
|
21
33
|
const MAX_CONSECUTIVE_STRICT = 1;
|
|
22
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Per-turn cap on calls to the SAME tool name, regardless of args (#783).
|
|
37
|
+
*
|
|
38
|
+
* General-purpose execution tools are routinely called many times per turn
|
|
39
|
+
* (touching multiple files, running several commands), so they get a higher
|
|
40
|
+
* ceiling. Everything else — workflow one-shot tools (e.g. gsd_complete_milestone)
|
|
41
|
+
* and any non-allowlisted tool — gets the default cap. The default is generous
|
|
42
|
+
* enough to absorb legitimate retries but catches the reported improvisation
|
|
43
|
+
* loop (~51 calls) well before a cost spike.
|
|
44
|
+
*/
|
|
45
|
+
const PER_TOOL_DEFAULT_CAP = 6;
|
|
46
|
+
const PER_TOOL_REPEATABLE_CAP = 15;
|
|
47
|
+
const PER_TOOL_CAP_EXEMPT_TOOLS = new Set(["find", "glob", "grep", "ls", "read", "search_and_read"]);
|
|
48
|
+
const STATE_MUTATING_TOOL_SET = new Set(["edit", "write", "multi_edit", "notebook_edit"]);
|
|
49
|
+
|
|
23
50
|
let consecutiveCount = 0;
|
|
24
51
|
let lastSignature = "";
|
|
25
52
|
let lastToolName = "";
|
|
26
53
|
let enabled = true;
|
|
27
54
|
|
|
55
|
+
/** Per-tool-name call counts within the current turn (#783 Brief C). */
|
|
56
|
+
const perToolCounts = new Map<string, number>();
|
|
57
|
+
let mutationEpoch = 0;
|
|
58
|
+
const perToolLastMutationEpoch = new Map<string, number>();
|
|
59
|
+
|
|
28
60
|
/** Hash tool name + args into a compact signature for comparison. */
|
|
29
61
|
function hashToolCall(toolName: string, args: Record<string, unknown>): string {
|
|
30
62
|
const h = createHash("sha256");
|
|
@@ -46,6 +78,13 @@ function hashToolCall(toolName: string, args: Record<string, unknown>): string {
|
|
|
46
78
|
*
|
|
47
79
|
* Returns `{ block: false }` for allowed calls.
|
|
48
80
|
* Returns `{ block: true, reason }` when the loop threshold is exceeded.
|
|
81
|
+
*
|
|
82
|
+
* Two independent guards run; whichever trips first blocks:
|
|
83
|
+
* 1. Identical-signature streak (MAX_CONSECUTIVE_IDENTICAL_CALLS, strict for
|
|
84
|
+
* ask_user_questions).
|
|
85
|
+
* 2. Per-tool-name cap (PER_TOOL_DEFAULT_CAP / PER_TOOL_REPEATABLE_CAP),
|
|
86
|
+
* independent of args, reset after file-mutation progress — catches
|
|
87
|
+
* improvisation loops (#783).
|
|
49
88
|
*/
|
|
50
89
|
export function checkToolCallLoop(
|
|
51
90
|
toolName: string,
|
|
@@ -63,6 +102,7 @@ export function checkToolCallLoop(
|
|
|
63
102
|
lastToolName = toolName;
|
|
64
103
|
}
|
|
65
104
|
|
|
105
|
+
// ── Guard 1: identical-signature streak ──
|
|
66
106
|
const threshold = STRICT_LOOP_TOOLS.has(toolName)
|
|
67
107
|
? MAX_CONSECUTIVE_STRICT
|
|
68
108
|
: MAX_CONSECUTIVE_IDENTICAL_CALLS;
|
|
@@ -71,22 +111,65 @@ export function checkToolCallLoop(
|
|
|
71
111
|
return {
|
|
72
112
|
block: true,
|
|
73
113
|
reason:
|
|
74
|
-
`Tool loop detected: ${toolName} called ${consecutiveCount} times ` +
|
|
114
|
+
`Tool loop detected (identical args): ${toolName} called ${consecutiveCount} times ` +
|
|
75
115
|
`with identical arguments. Blocking to prevent infinite loop. ` +
|
|
76
|
-
`
|
|
116
|
+
`Do not retry this tool or call other tools this turn — stop and respond to the user in text.`,
|
|
77
117
|
count: consecutiveCount,
|
|
78
118
|
};
|
|
79
119
|
}
|
|
80
120
|
|
|
121
|
+
// ── Guard 2: per-tool-name cap, independent of args (#783 Brief C) ──
|
|
122
|
+
// Catches improvisation loops where the same tool is invoked many times with
|
|
123
|
+
// varied args (e.g. retrying a missing workflow tool via bash/node -e/CLI).
|
|
124
|
+
const priorPerToolCount =
|
|
125
|
+
(perToolLastMutationEpoch.get(toolName) ?? mutationEpoch) < mutationEpoch
|
|
126
|
+
? 0
|
|
127
|
+
: (perToolCounts.get(toolName) ?? 0);
|
|
128
|
+
const perToolCount = priorPerToolCount + 1;
|
|
129
|
+
perToolCounts.set(toolName, perToolCount);
|
|
130
|
+
perToolLastMutationEpoch.set(toolName, mutationEpoch);
|
|
131
|
+
|
|
132
|
+
// Read-only navigation tools are normal context gathering; Guard 1 still
|
|
133
|
+
// catches true reread loops with identical arguments.
|
|
134
|
+
if (PER_TOOL_CAP_EXEMPT_TOOLS.has(toolName)) {
|
|
135
|
+
return { block: false, count: consecutiveCount };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const perToolCap = INHERENTLY_REPEATABLE_TOOL_SET.has(toolName)
|
|
139
|
+
? PER_TOOL_REPEATABLE_CAP
|
|
140
|
+
: PER_TOOL_DEFAULT_CAP;
|
|
141
|
+
|
|
142
|
+
if (perToolCount > perToolCap) {
|
|
143
|
+
return {
|
|
144
|
+
block: true,
|
|
145
|
+
reason:
|
|
146
|
+
`Tool loop detected (repeated tool): ${toolName} called ${perToolCount} times ` +
|
|
147
|
+
`this turn (cap ${perToolCap}). Blocking to prevent infinite loop. ` +
|
|
148
|
+
`The tool may be unavailable or failing repeatedly. ` +
|
|
149
|
+
`Do not retry this tool or pivot to other tools this turn — stop and respond to the user in text.`,
|
|
150
|
+
count: perToolCount,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
81
154
|
return { block: false, count: consecutiveCount };
|
|
82
155
|
}
|
|
83
156
|
|
|
157
|
+
/** Record successful mutation progress so Guard 2 can decay on the next count. */
|
|
158
|
+
export function recordToolCallLoopMutation(toolName: string): void {
|
|
159
|
+
if (!enabled) return;
|
|
160
|
+
if (!STATE_MUTATING_TOOL_SET.has(toolName)) return;
|
|
161
|
+
mutationEpoch++;
|
|
162
|
+
}
|
|
163
|
+
|
|
84
164
|
/** Reset the guard state. Call at agent turn boundaries. */
|
|
85
165
|
export function resetToolCallLoopGuard(): void {
|
|
86
166
|
consecutiveCount = 0;
|
|
87
167
|
lastSignature = "";
|
|
88
168
|
lastToolName = "";
|
|
89
169
|
enabled = true;
|
|
170
|
+
perToolCounts.clear();
|
|
171
|
+
mutationEpoch = 0;
|
|
172
|
+
perToolLastMutationEpoch.clear();
|
|
90
173
|
}
|
|
91
174
|
|
|
92
175
|
/** Disable the guard (e.g. during shutdown). */
|
|
@@ -95,9 +178,20 @@ export function disableToolCallLoopGuard(): void {
|
|
|
95
178
|
consecutiveCount = 0;
|
|
96
179
|
lastSignature = "";
|
|
97
180
|
lastToolName = "";
|
|
181
|
+
perToolCounts.clear();
|
|
182
|
+
mutationEpoch = 0;
|
|
183
|
+
perToolLastMutationEpoch.clear();
|
|
98
184
|
}
|
|
99
185
|
|
|
100
186
|
/** Get current consecutive count for diagnostics. */
|
|
101
187
|
export function getToolCallLoopCount(): number {
|
|
102
188
|
return consecutiveCount;
|
|
103
189
|
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Get the per-tool-name call count for the current turn (#783 Brief C).
|
|
193
|
+
* Returns 0 for tools not yet called. Diagnostic only.
|
|
194
|
+
*/
|
|
195
|
+
export function getToolCallCountForTool(toolName: string): number {
|
|
196
|
+
return perToolCounts.get(toolName) ?? 0;
|
|
197
|
+
}
|
|
@@ -31,8 +31,26 @@ export function registerToolSearchShim(pi: ExtensionAPI): void {
|
|
|
31
31
|
},
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
// Ensure the shim is part of the active tool set. registerTool() is valid
|
|
35
|
+
// during extension loading, but getActiveTools()/setActiveTools() are stubs
|
|
36
|
+
// that throw "Extension runtime not initialized" until runner.bindCore() runs
|
|
37
|
+
// (after all registerExtension() calls return). When the throw was hit, the
|
|
38
|
+
// catch in register-extension.ts swallowed it — leaving the whole bootstrap
|
|
39
|
+
// partially failed and, under Claude Code CLI, the workflow tools could end
|
|
40
|
+
// up missing from the model's surface, which traps plan-milestone in a
|
|
41
|
+
// finalize-retry loop with no gsd_plan_milestone available.
|
|
42
|
+
//
|
|
43
|
+
// The activation here is also redundant post-bind: ToolSearch is in
|
|
44
|
+
// MINIMAL_AUTO_BASE_TOOL_NAMES, so buildMinimalAutoGsdToolSet adds it during
|
|
45
|
+
// adjust_tool_set (before_agent_start). Tolerate the loading-stub throw so
|
|
46
|
+
// the shim always registers; activation is completed by post-bind scoping.
|
|
47
|
+
try {
|
|
48
|
+
const active = pi.getActiveTools();
|
|
49
|
+
if (!active.includes("ToolSearch")) {
|
|
50
|
+
pi.setActiveTools([...active, "ToolSearch"]);
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
// Pre-bind runtime: getActiveTools/setActiveTools are not yet wired.
|
|
54
|
+
// The tool is registered; activation happens at adjust_tool_set.
|
|
37
55
|
}
|
|
38
56
|
}
|
|
@@ -25,6 +25,12 @@ export const MILESTONE_CONTEXT_RE = /M\d+(?:-[a-z0-9]{6})?-CONTEXT\.md$/;
|
|
|
25
25
|
const CONTEXT_MILESTONE_RE = /(?:^|[/\\])(M\d+(?:-[a-z0-9]{6})?)-CONTEXT\.md$/i;
|
|
26
26
|
const DEPTH_VERIFICATION_MILESTONE_RE = /depth_verification[_-](M\d+(?:-[a-z0-9]{6})?)/i;
|
|
27
27
|
|
|
28
|
+
function normalizeMilestoneId(milestoneId: string): string {
|
|
29
|
+
const match = milestoneId.match(/^(M)(\d+)(?:-([a-z0-9]{6}))?$/i);
|
|
30
|
+
if (!match) return milestoneId;
|
|
31
|
+
return `M${match[2]}${match[3] ? `-${match[3].toLowerCase()}` : ""}`;
|
|
32
|
+
}
|
|
33
|
+
|
|
28
34
|
/**
|
|
29
35
|
* Path segment that identifies .gsd/ planning artifacts.
|
|
30
36
|
* Writes to these paths are allowed during queue mode.
|
|
@@ -91,8 +97,19 @@ function createEmptyWriteGateState(): InMemoryWriteGateState {
|
|
|
91
97
|
|
|
92
98
|
const writeGateStatesByBasePath = new Map<string, InMemoryWriteGateState>();
|
|
93
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Write-gate snapshots are project-scoped, not worktree-scoped. When auto-mode
|
|
102
|
+
* routes MCP tool writes to `.gsd-worktrees/<MID>/`, depth verification still
|
|
103
|
+
* lands in the authoritative project `.gsd/runtime/` tree (or external-state
|
|
104
|
+
* symlink target). Without this canonicalization, `loadWriteGateSnapshot(worktree)`
|
|
105
|
+
* sees an empty snapshot and CONTEXT saves loop forever (#M020 gate loop).
|
|
106
|
+
*/
|
|
107
|
+
function resolveWriteGateSnapshotRoot(basePath: string): string {
|
|
108
|
+
return resolve(resolveWorktreeProjectRoot(basePath));
|
|
109
|
+
}
|
|
110
|
+
|
|
94
111
|
function writeGateStateKey(basePath: string): string {
|
|
95
|
-
return
|
|
112
|
+
return resolveWriteGateSnapshotRoot(basePath);
|
|
96
113
|
}
|
|
97
114
|
|
|
98
115
|
function getWriteGateState(basePath: string = process.cwd()): InMemoryWriteGateState {
|
|
@@ -155,17 +172,18 @@ function shouldPersistWriteGateSnapshot(env: NodeJS.ProcessEnv = process.env): b
|
|
|
155
172
|
}
|
|
156
173
|
|
|
157
174
|
function writeGateSnapshotPath(basePath: string): string {
|
|
158
|
-
return join(basePath, ".gsd", "runtime", "write-gate-state.json");
|
|
175
|
+
return join(resolveWriteGateSnapshotRoot(basePath), ".gsd", "runtime", "write-gate-state.json");
|
|
159
176
|
}
|
|
160
177
|
|
|
161
178
|
function ensureWriteGateSnapshotDirectory(basePath: string): void {
|
|
162
|
-
const
|
|
179
|
+
const snapshotRoot = resolveWriteGateSnapshotRoot(basePath);
|
|
180
|
+
const gsdPath = join(snapshotRoot, ".gsd");
|
|
163
181
|
if (!existsSync(gsdPath)) {
|
|
164
182
|
try {
|
|
165
183
|
const stat = lstatSync(gsdPath);
|
|
166
184
|
if (stat.isSymbolicLink()) {
|
|
167
185
|
const target = readlinkSync(gsdPath);
|
|
168
|
-
mkdirSync(isAbsolute(target) ? target : resolve(
|
|
186
|
+
mkdirSync(isAbsolute(target) ? target : resolve(snapshotRoot, target), { recursive: true });
|
|
169
187
|
}
|
|
170
188
|
} catch {
|
|
171
189
|
// If .gsd truly does not exist, the runtime mkdir below will create it.
|
|
@@ -174,7 +192,7 @@ function ensureWriteGateSnapshotDirectory(basePath: string): void {
|
|
|
174
192
|
mkdirSync(join(gsdPath, "runtime"), { recursive: true });
|
|
175
193
|
}
|
|
176
194
|
|
|
177
|
-
function currentWriteGateSnapshot(basePath: string = process.cwd()): WriteGateSnapshot {
|
|
195
|
+
export function currentWriteGateSnapshot(basePath: string = process.cwd()): WriteGateSnapshot {
|
|
178
196
|
const state = getWriteGateState(basePath);
|
|
179
197
|
return {
|
|
180
198
|
verifiedDepthMilestones: [...state.verifiedDepthMilestones].sort(),
|
|
@@ -228,7 +246,9 @@ function clearPersistedWriteGateSnapshot(basePath: string): void {
|
|
|
228
246
|
function normalizeWriteGateSnapshot(value: unknown): WriteGateSnapshot {
|
|
229
247
|
const record = value && typeof value === "object" ? value as Record<string, unknown> : {};
|
|
230
248
|
const verified = Array.isArray(record.verifiedDepthMilestones)
|
|
231
|
-
? record.verifiedDepthMilestones
|
|
249
|
+
? record.verifiedDepthMilestones
|
|
250
|
+
.filter((item): item is string => typeof item === "string")
|
|
251
|
+
.map(normalizeMilestoneId)
|
|
232
252
|
: [];
|
|
233
253
|
const verifiedGates = Array.isArray(record.verifiedApprovalGates)
|
|
234
254
|
? record.verifiedApprovalGates.filter((item): item is string => typeof item === "string")
|
|
@@ -289,7 +309,7 @@ export function loadWriteGateSnapshot(basePath: string): WriteGateSnapshot {
|
|
|
289
309
|
* guard that previously protected only the tool_execution_start window.
|
|
290
310
|
*/
|
|
291
311
|
function mergeSnapshotIntoState(state: InMemoryWriteGateState, disk: WriteGateSnapshot): void {
|
|
292
|
-
for (const milestone of disk.verifiedDepthMilestones) state.verifiedDepthMilestones.add(milestone);
|
|
312
|
+
for (const milestone of disk.verifiedDepthMilestones) state.verifiedDepthMilestones.add(normalizeMilestoneId(milestone));
|
|
293
313
|
for (const gate of disk.verifiedApprovalGates ?? []) state.verifiedApprovalGates.add(gate);
|
|
294
314
|
state.activeQueuePhase = disk.activeQueuePhase;
|
|
295
315
|
state.pendingGateId = disk.pendingGateId;
|
|
@@ -395,7 +415,7 @@ export function isMilestoneDepthVerified(
|
|
|
395
415
|
): boolean {
|
|
396
416
|
if (!milestoneId) return false;
|
|
397
417
|
refreshWriteGateStateFromDisk(basePath);
|
|
398
|
-
return getWriteGateState(basePath).verifiedDepthMilestones.has(milestoneId);
|
|
418
|
+
return getWriteGateState(basePath).verifiedDepthMilestones.has(normalizeMilestoneId(milestoneId));
|
|
399
419
|
}
|
|
400
420
|
|
|
401
421
|
export function isMilestoneDepthVerifiedInSnapshot(
|
|
@@ -403,7 +423,7 @@ export function isMilestoneDepthVerifiedInSnapshot(
|
|
|
403
423
|
milestoneId: string | null | undefined,
|
|
404
424
|
): boolean {
|
|
405
425
|
if (!milestoneId) return false;
|
|
406
|
-
return snapshot.verifiedDepthMilestones.includes(milestoneId);
|
|
426
|
+
return snapshot.verifiedDepthMilestones.includes(normalizeMilestoneId(milestoneId));
|
|
407
427
|
}
|
|
408
428
|
|
|
409
429
|
export function isQueuePhaseActive(basePath: string = process.cwd()): boolean {
|
|
@@ -466,7 +486,7 @@ export function isGateQuestionId(questionId: string): boolean {
|
|
|
466
486
|
*/
|
|
467
487
|
export function extractDepthVerificationMilestoneId(questionId: string): string | null {
|
|
468
488
|
const match = questionId.match(DEPTH_VERIFICATION_MILESTONE_RE);
|
|
469
|
-
return match?.[1]
|
|
489
|
+
return match?.[1] ? normalizeMilestoneId(match[1]) : null;
|
|
470
490
|
}
|
|
471
491
|
|
|
472
492
|
/**
|
|
@@ -474,7 +494,7 @@ export function extractDepthVerificationMilestoneId(questionId: string): string
|
|
|
474
494
|
*/
|
|
475
495
|
function extractContextMilestoneId(inputPath: string): string | null {
|
|
476
496
|
const match = inputPath.match(CONTEXT_MILESTONE_RE);
|
|
477
|
-
return match?.[1]
|
|
497
|
+
return match?.[1] ? normalizeMilestoneId(match[1]) : null;
|
|
478
498
|
}
|
|
479
499
|
|
|
480
500
|
/**
|
|
@@ -560,7 +580,7 @@ export const hostWriteGateAdapter: WriteGateStateAdapter = {
|
|
|
560
580
|
markDepthVerified(milestoneId, basePath): void {
|
|
561
581
|
if (!milestoneId) return;
|
|
562
582
|
mutateWriteGateState(basePath, (state) => {
|
|
563
|
-
state.verifiedDepthMilestones.add(milestoneId);
|
|
583
|
+
state.verifiedDepthMilestones.add(normalizeMilestoneId(milestoneId));
|
|
564
584
|
}, { writer: "host" });
|
|
565
585
|
},
|
|
566
586
|
markApprovalGateVerified(gateId, basePath): void {
|
|
@@ -601,7 +621,7 @@ export const childWriteGateAdapter: WriteGateStateAdapter = {
|
|
|
601
621
|
markDepthVerified(milestoneId, basePath): void {
|
|
602
622
|
if (!milestoneId) return;
|
|
603
623
|
childMutate(basePath, (state) => {
|
|
604
|
-
state.verifiedDepthMilestones.add(milestoneId);
|
|
624
|
+
state.verifiedDepthMilestones.add(normalizeMilestoneId(milestoneId));
|
|
605
625
|
});
|
|
606
626
|
},
|
|
607
627
|
markApprovalGateVerified(gateId, basePath): void {
|
|
@@ -735,6 +755,13 @@ export interface AskUserQuestionsGateQuestion {
|
|
|
735
755
|
export interface AskUserQuestionsGateDetails {
|
|
736
756
|
cancelled?: boolean;
|
|
737
757
|
interrupted?: boolean;
|
|
758
|
+
/**
|
|
759
|
+
* True when the host elicitation channel timed out before the user answered.
|
|
760
|
+
* Distinct from `cancelled` (deliberate dismissal): the gate verdict maps
|
|
761
|
+
* this to "timeout" so callers pause-and-wait instead of letting the model
|
|
762
|
+
* re-ask into the same timeout loop (#852).
|
|
763
|
+
*/
|
|
764
|
+
timed_out?: boolean;
|
|
738
765
|
response?: {
|
|
739
766
|
answers?: Record<string, { selected?: unknown } | undefined>;
|
|
740
767
|
} | null;
|
|
@@ -744,7 +771,8 @@ export type AskUserQuestionsGateResult =
|
|
|
744
771
|
| { status: "not-gate" }
|
|
745
772
|
| { status: "waiting"; pendingGateId: string; interrupted: boolean }
|
|
746
773
|
| { status: "verified"; gateId: string; milestoneId: string | null }
|
|
747
|
-
| { status: "declined"; gateId: string }
|
|
774
|
+
| { status: "declined"; gateId: string }
|
|
775
|
+
| { status: "timeout"; pendingGateId: string; interrupted: boolean };
|
|
748
776
|
|
|
749
777
|
function findGateQuestion(
|
|
750
778
|
questions: AskUserQuestionsGateQuestion[],
|
|
@@ -768,11 +796,22 @@ function verifyAnsweredGate(
|
|
|
768
796
|
|
|
769
797
|
/** Map an unresolved (non-verified) gate verdict to the caller-facing result. */
|
|
770
798
|
function unresolvedGateResult(
|
|
771
|
-
verdict: "declined" | "waiting" | "cancelled",
|
|
799
|
+
verdict: "declined" | "waiting" | "cancelled" | "timeout",
|
|
772
800
|
gateId: string,
|
|
773
801
|
details: AskUserQuestionsGateDetails,
|
|
774
802
|
): AskUserQuestionsGateResult {
|
|
775
803
|
if (verdict === "declined") return { status: "declined", gateId };
|
|
804
|
+
if (verdict === "timeout") {
|
|
805
|
+
// Host elicitation expired before the user answered. The gate stays
|
|
806
|
+
// pending (fail-closed — a timeout is never approval), but the status is
|
|
807
|
+
// "timeout" so the caller pauses-and-waits instead of re-asking into the
|
|
808
|
+
// same timeout loop (#852).
|
|
809
|
+
return {
|
|
810
|
+
status: "timeout",
|
|
811
|
+
pendingGateId: gateId,
|
|
812
|
+
interrupted: details.interrupted === true,
|
|
813
|
+
};
|
|
814
|
+
}
|
|
776
815
|
// "waiting" (and the unreachable post-cancel case): an empty selection is
|
|
777
816
|
// not an answer — keep the gate pending and make the caller pause.
|
|
778
817
|
return {
|
|
@@ -803,6 +842,16 @@ export function applyAskUserQuestionsGateResult(options: {
|
|
|
803
842
|
const { basePath, questions, details, fallbackMilestoneId } = options;
|
|
804
843
|
const currentPendingGate = getPendingGate(basePath);
|
|
805
844
|
if (currentPendingGate) {
|
|
845
|
+
if (details.timed_out) {
|
|
846
|
+
// Host elicitation timed out before the user answered. Keep the gate
|
|
847
|
+
// pending (fail-closed) but report "timeout" so the caller pauses-and-
|
|
848
|
+
// waits instead of re-asking into the same timeout loop (#852).
|
|
849
|
+
return {
|
|
850
|
+
status: "timeout",
|
|
851
|
+
pendingGateId: currentPendingGate,
|
|
852
|
+
interrupted: details.interrupted === true,
|
|
853
|
+
};
|
|
854
|
+
}
|
|
806
855
|
if (details.cancelled || !details.response) {
|
|
807
856
|
return {
|
|
808
857
|
status: "waiting",
|
|
@@ -821,6 +870,7 @@ export function applyAskUserQuestionsGateResult(options: {
|
|
|
821
870
|
}
|
|
822
871
|
}
|
|
823
872
|
|
|
873
|
+
if (details.timed_out) return { status: "not-gate" };
|
|
824
874
|
if (details.cancelled || !details.response) return { status: "not-gate" };
|
|
825
875
|
|
|
826
876
|
for (const question of questions) {
|
|
@@ -855,6 +905,24 @@ export function formatPendingAskUserQuestionsGateMessage(
|
|
|
855
905
|
].join(" ");
|
|
856
906
|
}
|
|
857
907
|
|
|
908
|
+
/**
|
|
909
|
+
* Format the LLM-facing message returned when a depth-confirmation gate
|
|
910
|
+
* elicitation times out. Distinct from {@link formatPendingAskUserQuestionsGateMessage}:
|
|
911
|
+
* a timeout must NOT tell the model to immediately re-ask (that re-triggers
|
|
912
|
+
* the same timeout loop). Instead it tells the model to stop, that auto-mode
|
|
913
|
+
* is paused, and that the user will respond on their own (#852).
|
|
914
|
+
*/
|
|
915
|
+
export function formatTimedOutAskUserQuestionsGateMessage(
|
|
916
|
+
pendingGateId: string,
|
|
917
|
+
): string {
|
|
918
|
+
return [
|
|
919
|
+
`Depth confirmation on gate "${pendingGateId}" timed out waiting for a response.`,
|
|
920
|
+
"The user did not answer within the host elicitation window — do not re-ask in this turn, it will time out again.",
|
|
921
|
+
"Auto-mode is paused. Stop calling tools and wait for the user to respond on a new turn.",
|
|
922
|
+
"When the user replies with confirmation, the gate will be satisfied and work will resume.",
|
|
923
|
+
].join(" ");
|
|
924
|
+
}
|
|
925
|
+
|
|
858
926
|
export function shouldBlockContextWrite(
|
|
859
927
|
toolName: string,
|
|
860
928
|
inputPath: string,
|
|
@@ -865,7 +933,7 @@ export function shouldBlockContextWrite(
|
|
|
865
933
|
if (toolName !== "write") return { block: false };
|
|
866
934
|
if (!MILESTONE_CONTEXT_RE.test(inputPath)) return { block: false };
|
|
867
935
|
|
|
868
|
-
const targetMilestoneId = extractContextMilestoneId(inputPath) ?? milestoneId;
|
|
936
|
+
const targetMilestoneId = extractContextMilestoneId(inputPath) ?? (milestoneId ? normalizeMilestoneId(milestoneId) : null);
|
|
869
937
|
if (!targetMilestoneId) {
|
|
870
938
|
return {
|
|
871
939
|
block: true,
|
|
@@ -884,8 +952,8 @@ export function shouldBlockContextWrite(
|
|
|
884
952
|
reason: [
|
|
885
953
|
`HARD BLOCK: Cannot write to milestone CONTEXT.md without depth verification.`,
|
|
886
954
|
`This is a mechanical gate — you MUST NOT proceed, retry, or rationalize past this block.`,
|
|
887
|
-
`Required action: call ask_user_questions with question id
|
|
888
|
-
`The user MUST select the "(Recommended)" confirmation option to unlock this gate.`,
|
|
955
|
+
`Required action: call ask_user_questions with question id "depth_verification_${targetMilestoneId}_confirm".`,
|
|
956
|
+
`The user MUST select the first "(Recommended)" confirmation option to unlock this gate.`,
|
|
889
957
|
`If the user declines, cancels, or the tool fails, you must re-ask — not bypass.`,
|
|
890
958
|
].join(" "),
|
|
891
959
|
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared DB-backed guard for milestone closeout finalization.
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
5
6
|
|
|
6
7
|
import {
|
|
7
8
|
getLatestAssessmentByScope,
|
|
@@ -9,14 +10,19 @@ import {
|
|
|
9
10
|
getMilestoneSlices,
|
|
10
11
|
getPendingGates,
|
|
11
12
|
getSliceTasks,
|
|
13
|
+
insertAssessment,
|
|
12
14
|
isDbAvailable,
|
|
15
|
+
transaction,
|
|
13
16
|
} from "./gsd-db.js";
|
|
14
17
|
import {
|
|
15
18
|
getWorkflowDatabasePath,
|
|
16
19
|
refreshWorkflowDatabaseFromDisk,
|
|
17
20
|
} from "./db-workspace.js";
|
|
18
|
-
import { isClosedStatus } from "./status-guards.js";
|
|
21
|
+
import { isClosedStatus, isDeferredStatus } from "./status-guards.js";
|
|
19
22
|
import { closeQualityGatesFromEvidence } from "./quality-gate-closure.js";
|
|
23
|
+
import { insertMilestoneValidationGates } from "./milestone-validation-gates.js";
|
|
24
|
+
import { relMilestoneFile, resolveSliceFile } from "./paths.js";
|
|
25
|
+
import { invalidateAllCaches } from "./cache.js";
|
|
20
26
|
|
|
21
27
|
export const CLOSEOUT_CONSISTENCY_BLOCKED_REASON = "closeout-consistency-blocked";
|
|
22
28
|
|
|
@@ -44,6 +50,7 @@ export interface CloseoutConsistencyOptions {
|
|
|
44
50
|
refreshFromDisk?: boolean;
|
|
45
51
|
allowOpenMilestone?: boolean;
|
|
46
52
|
artifactBasePath?: string;
|
|
53
|
+
allowPassThroughValidation?: boolean;
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
function blocked(reason: CloseoutConsistencyFailureReason, message: string): CloseoutConsistencyResult {
|
|
@@ -65,6 +72,87 @@ function artifactBasePathFromDb(): string | undefined {
|
|
|
65
72
|
return dirname(dirname(dbPath!));
|
|
66
73
|
}
|
|
67
74
|
|
|
75
|
+
function allSlicesHaveCloseoutSummaryEvidence(milestoneId: string, artifactBasePath: string): boolean {
|
|
76
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
77
|
+
if (slices.length === 0) return false;
|
|
78
|
+
|
|
79
|
+
return slices.every((slice) => {
|
|
80
|
+
if (!isClosedStatus(slice.status)) return false;
|
|
81
|
+
for (const task of getSliceTasks(milestoneId, slice.id)) {
|
|
82
|
+
if (!isClosedStatus(task.status)) return false;
|
|
83
|
+
}
|
|
84
|
+
const summaryPath = resolveSliceFile(artifactBasePath, milestoneId, slice.id, "SUMMARY");
|
|
85
|
+
return Boolean(summaryPath && existsSync(summaryPath));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function renderCloseoutPassThroughValidation(milestoneId: string): string {
|
|
90
|
+
return [
|
|
91
|
+
"---",
|
|
92
|
+
"verdict: pass",
|
|
93
|
+
"skip_validation: true",
|
|
94
|
+
"skip_validation_reason: closeout-recovery",
|
|
95
|
+
"remediation_round: 0",
|
|
96
|
+
"---",
|
|
97
|
+
"",
|
|
98
|
+
"# Milestone Validation (skipped)",
|
|
99
|
+
"",
|
|
100
|
+
`Milestone validation was recorded during closeout for ${milestoneId} because all slices already had SUMMARY evidence and no milestone-validation assessment was present.`,
|
|
101
|
+
"",
|
|
102
|
+
].join("\n");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function recordCloseoutPassThroughValidationIfReady(
|
|
106
|
+
milestoneId: string,
|
|
107
|
+
artifactBasePath?: string,
|
|
108
|
+
): boolean {
|
|
109
|
+
const basePath = artifactBasePath ?? artifactBasePathFromDb();
|
|
110
|
+
if (!basePath) return false;
|
|
111
|
+
|
|
112
|
+
const existing = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
113
|
+
if (existing?.status === "pass") return true;
|
|
114
|
+
if (existing) return false;
|
|
115
|
+
if (!allSlicesHaveCloseoutSummaryEvidence(milestoneId, basePath)) return false;
|
|
116
|
+
|
|
117
|
+
const validationPath = join(basePath, relMilestoneFile(basePath, milestoneId, "VALIDATION"));
|
|
118
|
+
const content = renderCloseoutPassThroughValidation(milestoneId);
|
|
119
|
+
mkdirSync(dirname(validationPath), { recursive: true });
|
|
120
|
+
writeFileSync(validationPath, content, "utf-8");
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
transaction(() => {
|
|
124
|
+
insertAssessment({
|
|
125
|
+
path: validationPath,
|
|
126
|
+
milestoneId,
|
|
127
|
+
sliceId: null,
|
|
128
|
+
taskId: null,
|
|
129
|
+
status: "pass",
|
|
130
|
+
scope: "milestone-validation",
|
|
131
|
+
fullContent: content,
|
|
132
|
+
});
|
|
133
|
+
const gateSliceId = getMilestoneSlices(milestoneId)[0]?.id;
|
|
134
|
+
if (gateSliceId) {
|
|
135
|
+
insertMilestoneValidationGates(
|
|
136
|
+
milestoneId,
|
|
137
|
+
gateSliceId,
|
|
138
|
+
"pass",
|
|
139
|
+
new Date().toISOString(),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
} catch (err) {
|
|
144
|
+
try {
|
|
145
|
+
unlinkSync(validationPath);
|
|
146
|
+
} catch {
|
|
147
|
+
// best effort cleanup
|
|
148
|
+
}
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
invalidateAllCaches();
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
68
156
|
export function checkCloseoutConsistencyGate(
|
|
69
157
|
milestoneId: string,
|
|
70
158
|
options: CloseoutConsistencyOptions = {},
|
|
@@ -97,14 +185,30 @@ export function checkCloseoutConsistencyGate(
|
|
|
97
185
|
);
|
|
98
186
|
}
|
|
99
187
|
|
|
100
|
-
|
|
188
|
+
let validation = milestone.status === "skipped"
|
|
101
189
|
? null
|
|
102
190
|
: getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
191
|
+
if (
|
|
192
|
+
milestone.status !== "skipped" &&
|
|
193
|
+
validation?.status !== "pass" &&
|
|
194
|
+
options.allowPassThroughValidation &&
|
|
195
|
+
recordCloseoutPassThroughValidationIfReady(
|
|
196
|
+
milestoneId,
|
|
197
|
+
options.artifactBasePath ?? artifactBasePathFromDb(),
|
|
198
|
+
)
|
|
199
|
+
) {
|
|
200
|
+
validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
201
|
+
}
|
|
103
202
|
if (milestone.status !== "skipped") {
|
|
104
203
|
if (validation?.status !== "pass") {
|
|
204
|
+
const validationStatus = validation?.status ?? "absent";
|
|
205
|
+
const recovery =
|
|
206
|
+
validationStatus === "absent"
|
|
207
|
+
? ` Run \`/gsd validate-milestone ${milestoneId}\` to create the validation, or set \`phases.skip_milestone_validation: true\` in .gsd/PREFERENCES.md to skip it.`
|
|
208
|
+
: "";
|
|
105
209
|
return blocked(
|
|
106
210
|
"validation-not-pass",
|
|
107
|
-
`Closeout consistency blocked for ${milestoneId}: latest milestone validation is "${
|
|
211
|
+
`Closeout consistency blocked for ${milestoneId}: latest milestone validation is "${validationStatus}".${recovery}`,
|
|
108
212
|
);
|
|
109
213
|
}
|
|
110
214
|
}
|
|
@@ -125,6 +229,7 @@ export function checkCloseoutConsistencyGate(
|
|
|
125
229
|
}
|
|
126
230
|
|
|
127
231
|
for (const slice of slices) {
|
|
232
|
+
if (isDeferredStatus(slice.status)) continue;
|
|
128
233
|
if (!isClosedStatus(slice.status)) {
|
|
129
234
|
return blocked(
|
|
130
235
|
"slice-open",
|
|
@@ -472,21 +472,18 @@ export function ensureCodebaseMapFresh(
|
|
|
472
472
|
const force = ensureOptions?.force === true;
|
|
473
473
|
const now = Date.now();
|
|
474
474
|
|
|
475
|
-
//
|
|
476
|
-
// file changes are always detected, even within the TTL window.
|
|
477
|
-
const existing = readCodebaseMap(basePath);
|
|
478
|
-
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
479
|
-
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
480
|
-
|
|
481
|
-
// TTL short-circuit: only bypass regeneration when the fingerprint matches,
|
|
482
|
-
// confirming that no tracked files changed since the last check.
|
|
475
|
+
// TTL short-circuit: avoid spawning git on the per-turn freshness path.
|
|
483
476
|
if (!force && ttlMs > 0) {
|
|
484
477
|
const cached = freshnessCache.get(cacheKey);
|
|
485
|
-
if (cached && now - cached.checkedAt < ttlMs
|
|
478
|
+
if (cached && now - cached.checkedAt < ttlMs) {
|
|
486
479
|
return cached.result;
|
|
487
480
|
}
|
|
488
481
|
}
|
|
489
482
|
|
|
483
|
+
const existing = readCodebaseMap(basePath);
|
|
484
|
+
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
485
|
+
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
486
|
+
|
|
490
487
|
const cacheAndReturn = (result: EnsureCodebaseMapResult): EnsureCodebaseMapResult => {
|
|
491
488
|
freshnessCache.set(cacheKey, { checkedAt: now, result });
|
|
492
489
|
return result;
|
|
@@ -5,6 +5,8 @@ import { loadRegistry } from "../workflow-templates.js";
|
|
|
5
5
|
import { gsdHome } from "../gsd-home.js";
|
|
6
6
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
7
7
|
import { VISUAL_BRIEF_MODES } from "../../visual-brief/prompts.js";
|
|
8
|
+
import { GSD_CORE_ALIAS_CATALOG } from "./gsd-core-aliases.js";
|
|
9
|
+
import { GSD_CORE_IMPLEMENTED_CATALOG } from "../commands-gsd-core.js";
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
export interface GsdCommandDefinition {
|
|
@@ -96,6 +98,10 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
|
96
98
|
{ cmd: "language", desc: "Set or clear the global response language (e.g. /gsd language Chinese)" },
|
|
97
99
|
{ cmd: "worktree", desc: "Manage worktrees from the TUI (list, merge, clean, remove)" },
|
|
98
100
|
{ cmd: "eval-review", desc: "Audit a slice's AI evaluation strategy and write a scored EVAL-REVIEW.md (--force, --show)" },
|
|
101
|
+
// Additional commands (commands-gsd-core.ts) run real prompt-driven workflows;
|
|
102
|
+
// namespace aliases (gsd-core-aliases.ts) redirect to /gsd help.
|
|
103
|
+
...GSD_CORE_IMPLEMENTED_CATALOG,
|
|
104
|
+
...GSD_CORE_ALIAS_CATALOG,
|
|
99
105
|
];
|
|
100
106
|
|
|
101
107
|
const NESTED_COMPLETIONS: CompletionMap = {
|