@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
|
@@ -175,6 +175,7 @@ function resolveCompletionStopFromOutcome(
|
|
|
175
175
|
// tolerates — same behavior as a fresh session.
|
|
176
176
|
const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
|
|
177
177
|
const MAX_CONSECUTIVE_ALREADY_ACTIVE_SKIPS = 3;
|
|
178
|
+
const MAX_CONSECUTIVE_ORCHESTRATION_SKIPS = 3;
|
|
178
179
|
const ORCHESTRATION_MISSING_REASON =
|
|
179
180
|
"Auto Orchestration Module is not wired; cannot dispatch built-in GSD Unit.";
|
|
180
181
|
|
|
@@ -186,7 +187,20 @@ function loadStuckState(s: AutoSession): { recentUnits: Array<{ key: string }>;
|
|
|
186
187
|
const scopeId = stableStuckStateScopeId(s);
|
|
187
188
|
if (!scopeId) return { recentUnits: [], stuckRecoveryAttempts: 0 };
|
|
188
189
|
try {
|
|
189
|
-
|
|
190
|
+
// Scope the stuck window to the CURRENT session (trace_id) so stale
|
|
191
|
+
// finalize-retry entries from previous sessions don't fire detectStuck
|
|
192
|
+
// Rule 1 on the first iteration — killing auto-mode before any new
|
|
193
|
+
// dispatch runs (#852). A prior session's two consecutive finalize-retry
|
|
194
|
+
// failures would otherwise permanently block every new session.
|
|
195
|
+
//
|
|
196
|
+
// s.currentTraceId is only set inside the first loop iteration (line ~443),
|
|
197
|
+
// so at this call-site it is always null for a fresh session. Return []
|
|
198
|
+
// directly in that case — no prior dispatch has occurred in this session,
|
|
199
|
+
// so the stuck window is trivially empty and the DB query is skipped.
|
|
200
|
+
const recentUnits =
|
|
201
|
+
s.currentTraceId != null
|
|
202
|
+
? getRecentUnitKeysForProjectRoot(scopeId, STUCK_WINDOW_SIZE, s.currentTraceId)
|
|
203
|
+
: [];
|
|
190
204
|
const stuckRecoveryAttempts =
|
|
191
205
|
getRuntimeKv<number>("global", scopeId, STUCK_RECOVERY_ATTEMPTS_KEY) ?? 0;
|
|
192
206
|
return { recentUnits, stuckRecoveryAttempts };
|
|
@@ -406,6 +420,8 @@ export async function autoLoop(
|
|
|
406
420
|
let consecutiveErrors = 0;
|
|
407
421
|
let consecutiveCooldowns = 0;
|
|
408
422
|
let consecutiveAlreadyActiveSkips = 0;
|
|
423
|
+
let consecutiveOrchestrationSkips = 0;
|
|
424
|
+
let lastOrchestrationSkipKey: string | null = null;
|
|
409
425
|
const recentErrorMessages: string[] = [];
|
|
410
426
|
|
|
411
427
|
while (s.active) {
|
|
@@ -925,12 +941,53 @@ export async function autoLoop(
|
|
|
925
941
|
|
|
926
942
|
if (orchestrationResult.kind === "skipped") {
|
|
927
943
|
s.pendingOrchestrationDispatch = null;
|
|
944
|
+
// Idempotent re-poll skips are benign (an active unit is still running).
|
|
945
|
+
// The orchestrator's own stuck-window detection handles the truly-stuck case.
|
|
946
|
+
// Do not count these toward the consecutive-skip streak.
|
|
947
|
+
if (orchestrationResult.reason === "idempotent advance: unit already active") {
|
|
948
|
+
emitIterationEnd({ skipped: true });
|
|
949
|
+
completeIteration();
|
|
950
|
+
finishTurn("skipped");
|
|
951
|
+
continue;
|
|
952
|
+
}
|
|
953
|
+
const skipState = orchestrationResult.stateSnapshot;
|
|
954
|
+
const skipKey = [
|
|
955
|
+
orchestrationResult.reason,
|
|
956
|
+
skipState?.phase,
|
|
957
|
+
skipState?.activeMilestone?.id,
|
|
958
|
+
skipState?.activeSlice?.id,
|
|
959
|
+
skipState?.activeTask?.id,
|
|
960
|
+
].join("|");
|
|
961
|
+
consecutiveOrchestrationSkips = skipKey === lastOrchestrationSkipKey
|
|
962
|
+
? consecutiveOrchestrationSkips + 1
|
|
963
|
+
: 1;
|
|
964
|
+
lastOrchestrationSkipKey = skipKey;
|
|
965
|
+
if (consecutiveOrchestrationSkips >= MAX_CONSECUTIVE_ORCHESTRATION_SKIPS) {
|
|
966
|
+
const msg = `Orchestration skipped ${consecutiveOrchestrationSkips} consecutive attempts without progress. Pausing auto-mode for manual recovery.`;
|
|
967
|
+
ctx.ui.notify(msg, "error");
|
|
968
|
+
await deps.pauseAuto(ctx, pi, {
|
|
969
|
+
message: msg,
|
|
970
|
+
category: "unknown",
|
|
971
|
+
}, {
|
|
972
|
+
expectedCurrentUnit: null,
|
|
973
|
+
});
|
|
974
|
+
finishTurn("paused", "manual-attention", orchestrationResult.reason ?? "orchestration-skipped");
|
|
975
|
+
finishIncompleteIteration({
|
|
976
|
+
status: "paused",
|
|
977
|
+
reason: orchestrationResult.reason ?? "orchestration-skipped",
|
|
978
|
+
failureClass: "manual-attention",
|
|
979
|
+
});
|
|
980
|
+
break;
|
|
981
|
+
}
|
|
928
982
|
emitIterationEnd({ skipped: true });
|
|
929
983
|
completeIteration();
|
|
930
984
|
finishTurn("skipped");
|
|
931
985
|
continue;
|
|
932
986
|
}
|
|
933
987
|
|
|
988
|
+
consecutiveOrchestrationSkips = 0;
|
|
989
|
+
lastOrchestrationSkipKey = null;
|
|
990
|
+
|
|
934
991
|
if (orchestrationResult.kind === "paused") {
|
|
935
992
|
s.pendingOrchestrationDispatch = null;
|
|
936
993
|
finishIncompleteIteration({
|
|
@@ -1331,7 +1388,17 @@ export async function autoLoop(
|
|
|
1331
1388
|
finalizeResult.action === "break"
|
|
1332
1389
|
? { action: "break", reason: finalizeResult.reason }
|
|
1333
1390
|
: finalizeResult.action === "continue"
|
|
1334
|
-
? {
|
|
1391
|
+
? {
|
|
1392
|
+
action: "continue",
|
|
1393
|
+
// Surface the specific verification failure (e.g. "roadmap has
|
|
1394
|
+
// zero slices") in the ledger/stuck-loop reason instead of the
|
|
1395
|
+
// opaque bare "finalize-retry" token. The retry paths in
|
|
1396
|
+
// runFinalize set s.pendingVerificationRetry.failureContext
|
|
1397
|
+
// from describeArtifactVerificationFailure before returning
|
|
1398
|
+
// continue; it is cleared on the next dispatch, so reading it
|
|
1399
|
+
// here captures the reason for THIS finalize (#852 follow-up).
|
|
1400
|
+
failureDetail: s.pendingVerificationRetry?.failureContext,
|
|
1401
|
+
}
|
|
1335
1402
|
: { action: "next" },
|
|
1336
1403
|
);
|
|
1337
1404
|
if (finalizeDecision.action === "stop") {
|
|
@@ -76,6 +76,8 @@ import { join } from "node:path";
|
|
|
76
76
|
import { evaluateAllCompleteSettlement } from "../milestone-settlement.js";
|
|
77
77
|
import { hasHeldMilestoneLease, reclaimMissingMilestoneLease } from "./milestone-lease-reclaim.js";
|
|
78
78
|
|
|
79
|
+
type UokFlags = ReturnType<typeof resolveUokFlags>;
|
|
80
|
+
|
|
79
81
|
function now(): number {
|
|
80
82
|
return Date.now();
|
|
81
83
|
}
|
|
@@ -211,6 +213,9 @@ export async function decideOrchestratorDispatch(
|
|
|
211
213
|
ctx.modelRegistry,
|
|
212
214
|
activeDispatchBasePath,
|
|
213
215
|
resolveProfileAnchorProvider(ctx.model?.provider, session?.autoModeStartModel?.provider),
|
|
216
|
+
activeSession?.autoModeStartModel
|
|
217
|
+
? `${activeSession.autoModeStartModel.provider}/${activeSession.autoModeStartModel.id}`
|
|
218
|
+
: undefined,
|
|
214
219
|
)?.preferences;
|
|
215
220
|
if (!active) {
|
|
216
221
|
if (state.phase !== "pre-planning") return null;
|
|
@@ -514,6 +519,19 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
514
519
|
|
|
515
520
|
// ── UokGateAdapter (folded) ──────────────────────────────────────────────
|
|
516
521
|
|
|
522
|
+
private resolveUokGateContext(): { activeBasePath: string; uokFlags: UokFlags } {
|
|
523
|
+
const activeBasePath = this.getLiveDispatchBasePath();
|
|
524
|
+
const prefs = loadEffectiveGSDPreferencesWithRegistry(
|
|
525
|
+
this.ctx.modelRegistry,
|
|
526
|
+
activeBasePath,
|
|
527
|
+
resolveProfileAnchorProvider(this.ctx.model?.provider, this.s.autoModeStartModel?.provider),
|
|
528
|
+
this.s.autoModeStartModel
|
|
529
|
+
? `${this.s.autoModeStartModel.provider}/${this.s.autoModeStartModel.id}`
|
|
530
|
+
: undefined,
|
|
531
|
+
)?.preferences;
|
|
532
|
+
return { activeBasePath, uokFlags: resolveUokFlags(prefs) };
|
|
533
|
+
}
|
|
534
|
+
|
|
517
535
|
private async emitUokGate(input: {
|
|
518
536
|
gateId: string;
|
|
519
537
|
gateType: "policy" | "execution";
|
|
@@ -522,15 +540,11 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
522
540
|
rationale: string;
|
|
523
541
|
findings?: string;
|
|
524
542
|
milestoneId?: string;
|
|
543
|
+
activeBasePath: string;
|
|
544
|
+
uokFlags: UokFlags;
|
|
525
545
|
}): Promise<void> {
|
|
526
|
-
|
|
527
|
-
const
|
|
528
|
-
this.ctx.modelRegistry,
|
|
529
|
-
activeBasePath,
|
|
530
|
-
resolveProfileAnchorProvider(this.ctx.model?.provider, this.s.autoModeStartModel?.provider),
|
|
531
|
-
)?.preferences;
|
|
532
|
-
const uokFlags = resolveUokFlags(prefs);
|
|
533
|
-
if (!uokFlags.gates) return;
|
|
546
|
+
if (!input.uokFlags.gates) return;
|
|
547
|
+
const activeBasePath = input.activeBasePath;
|
|
534
548
|
const milestoneId = input.milestoneId ?? this.s.currentMilestoneId ?? undefined;
|
|
535
549
|
try {
|
|
536
550
|
const { UokGateRunner } = await import("../uok/gate-runner.js");
|
|
@@ -912,12 +926,17 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
912
926
|
public async start(_sessionContext: AutoSessionContext): Promise<AutoAdvanceResult> {
|
|
913
927
|
this.lastAdvanceKey = null;
|
|
914
928
|
this.lastFinalizedUnitKey = null;
|
|
915
|
-
// #
|
|
916
|
-
//
|
|
917
|
-
//
|
|
918
|
-
//
|
|
929
|
+
// #852: a fresh user-triggered session must start with a clean stuck window.
|
|
930
|
+
// Cross-session rehydration at start() was removed because it caused false
|
|
931
|
+
// stuck-loop verdicts when prior sessions left consecutive finalize-retry
|
|
932
|
+
// entries in unit_dispatches — the new session would be killed before its
|
|
933
|
+
// first dispatch ran. Within-session stuck detection (accumulated through
|
|
934
|
+
// recordDispatch() calls during advance()) remains fully active and catches
|
|
935
|
+
// genuine stuck patterns after STUCK_WINDOW_SIZE dispatches.
|
|
936
|
+
//
|
|
937
|
+
// resume() retains cross-session rehydration: an interrupted session resuming
|
|
938
|
+
// after a crash should see the dispatch history it had been accumulating.
|
|
919
939
|
this.dispatchHistory.clearOnRecovery();
|
|
920
|
-
this.dispatchHistory.rehydrate();
|
|
921
940
|
this.lastStuckRecoveryKey = null;
|
|
922
941
|
this.lastDerivedPhase = null;
|
|
923
942
|
this.status.phase = "running";
|
|
@@ -932,10 +951,12 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
932
951
|
const stopAdvanceTimer = debugTime("orchestrator-advance");
|
|
933
952
|
try {
|
|
934
953
|
this.ensureLockOwnership();
|
|
954
|
+
const uokGateContext = this.resolveUokGateContext();
|
|
935
955
|
|
|
936
956
|
const staleMsg = this.checkResourcesStale();
|
|
937
957
|
if (staleMsg) {
|
|
938
958
|
await this.emitUokGate({
|
|
959
|
+
...uokGateContext,
|
|
939
960
|
gateId: "resource-version-guard",
|
|
940
961
|
gateType: "policy",
|
|
941
962
|
outcome: "fail",
|
|
@@ -949,6 +970,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
949
970
|
return blocked;
|
|
950
971
|
}
|
|
951
972
|
await this.emitUokGate({
|
|
973
|
+
...uokGateContext,
|
|
952
974
|
gateId: "resource-version-guard",
|
|
953
975
|
gateType: "policy",
|
|
954
976
|
outcome: "pass",
|
|
@@ -959,6 +981,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
959
981
|
const gate = await this.preAdvanceGate();
|
|
960
982
|
if (gate.kind === "fail") {
|
|
961
983
|
await this.emitUokGate({
|
|
984
|
+
...uokGateContext,
|
|
962
985
|
gateId: "pre-dispatch-health-gate",
|
|
963
986
|
gateType: "execution",
|
|
964
987
|
outcome: "manual-attention",
|
|
@@ -977,6 +1000,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
977
1000
|
}
|
|
978
1001
|
if (gate.kind === "threw") {
|
|
979
1002
|
await this.emitUokGate({
|
|
1003
|
+
...uokGateContext,
|
|
980
1004
|
gateId: "pre-dispatch-health-gate",
|
|
981
1005
|
gateType: "execution",
|
|
982
1006
|
outcome: "manual-attention",
|
|
@@ -987,6 +1011,7 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
|
|
|
987
1011
|
// intentional fall-through: matches runPreDispatch behaviour
|
|
988
1012
|
} else {
|
|
989
1013
|
await this.emitUokGate({
|
|
1014
|
+
...uokGateContext,
|
|
990
1015
|
gateId: "pre-dispatch-health-gate",
|
|
991
1016
|
gateType: "execution",
|
|
992
1017
|
outcome: "pass",
|
|
@@ -30,6 +30,7 @@ import { normalizeRealPath } from "../paths.js";
|
|
|
30
30
|
import type { MilestoneScope } from "../workspace.js";
|
|
31
31
|
import type { RootDirtySnapshot } from "../root-write-leak-guard.js";
|
|
32
32
|
import type { MilestoneSettlementOutcome } from "../milestone-settlement.js";
|
|
33
|
+
import type { ToolSurfaceSnapshot } from "../tool-surface-snapshot.js";
|
|
33
34
|
|
|
34
35
|
// ─── Exported Types ──────────────────────────────────────────────────────────
|
|
35
36
|
|
|
@@ -55,6 +56,7 @@ export type ThinkingLevelSnapshot = ReturnType<ExtensionAPI["getThinkingLevel"]>
|
|
|
55
56
|
export interface PendingVerificationRetry {
|
|
56
57
|
unitId: string;
|
|
57
58
|
failureContext: string;
|
|
59
|
+
signature?: string;
|
|
58
60
|
attempt: number;
|
|
59
61
|
}
|
|
60
62
|
|
|
@@ -160,6 +162,9 @@ export class AutoSession {
|
|
|
160
162
|
currentMilestoneId: string | null = null;
|
|
161
163
|
readonly sourceObservations = new SourceObservationStore();
|
|
162
164
|
|
|
165
|
+
/** Live tool-surface snapshot for dashboard / runtime telemetry while auto is active. */
|
|
166
|
+
toolSurfaceSnapshot: ToolSurfaceSnapshot | null = null;
|
|
167
|
+
|
|
163
168
|
// ── Model state ──────────────────────────────────────────────────────────
|
|
164
169
|
autoModeStartModel: StartModel | null = null;
|
|
165
170
|
/** Explicit /gsd model pin captured at bootstrap (session-scoped policy override). */
|
|
@@ -207,6 +212,13 @@ export class AutoSession {
|
|
|
207
212
|
* the issues after MAX_PRE_EXEC_RETRIES re-attempts.
|
|
208
213
|
*/
|
|
209
214
|
readonly preExecRetryCount: Map<string, number> = new Map();
|
|
215
|
+
/**
|
|
216
|
+
* Tracks how many times each slice unit has been re-dispatched to plan-slice
|
|
217
|
+
* because task plan files were missing. Keyed by unitId (e.g. "M001/S01").
|
|
218
|
+
* Separate from preExecRetryCount so pre-exec gate failures do not block or
|
|
219
|
+
* conflate with missing-task-plan recovery.
|
|
220
|
+
*/
|
|
221
|
+
readonly missingTaskPlanRetryCount: Map<string, number> = new Map();
|
|
210
222
|
|
|
211
223
|
// ── Tool invocation errors (#2883) ──────────────────────────────────
|
|
212
224
|
/** Set when a GSD tool execution ends with isError due to malformed/truncated
|
|
@@ -367,6 +379,7 @@ export class AutoSession {
|
|
|
367
379
|
|
|
368
380
|
// Unit
|
|
369
381
|
this.clearCurrentUnit();
|
|
382
|
+
this.toolSurfaceSnapshot = null;
|
|
370
383
|
this.currentTraceId = null;
|
|
371
384
|
this.currentTurnId = null;
|
|
372
385
|
this.currentUnitRouting = null;
|
|
@@ -407,6 +420,7 @@ export class AutoSession {
|
|
|
407
420
|
this.consecutiveCompleteBootstraps = 0;
|
|
408
421
|
this.lastPreExecFailure = null;
|
|
409
422
|
this.preExecRetryCount.clear();
|
|
423
|
+
this.missingTaskPlanRetryCount.clear();
|
|
410
424
|
this.lastToolInvocationError = null;
|
|
411
425
|
this.toolUnavailableRetries = 0;
|
|
412
426
|
this.lastUnitAgentEndMessages = null;
|
|
@@ -63,7 +63,9 @@ export function decideVerificationRetry(input: {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
const key = verificationRetryKey(unitType, retryInfo.unitId);
|
|
66
|
-
const failureHash = hashVerificationFailureContext(
|
|
66
|
+
const failureHash = hashVerificationFailureContext(
|
|
67
|
+
retryInfo.signature ?? retryInfo.failureContext,
|
|
68
|
+
);
|
|
67
69
|
if (input.previousFailureHash === failureHash) {
|
|
68
70
|
return {
|
|
69
71
|
action: "pause",
|
|
@@ -34,7 +34,7 @@ export type EngineDispatchDecision =
|
|
|
34
34
|
|
|
35
35
|
export type FinalizeInput =
|
|
36
36
|
| { action: "break"; reason?: string }
|
|
37
|
-
| { action: "continue" }
|
|
37
|
+
| { action: "continue"; failureDetail?: string }
|
|
38
38
|
| { action: "next" };
|
|
39
39
|
|
|
40
40
|
export type FinalizeDecision =
|
|
@@ -46,7 +46,14 @@ export type FinalizeDecision =
|
|
|
46
46
|
}
|
|
47
47
|
| {
|
|
48
48
|
action: "retry";
|
|
49
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Stable `"finalize-retry"` prefix plus, when available, the specific
|
|
51
|
+
* verification failure (e.g. `finalize-retry: roadmap has zero slices`).
|
|
52
|
+
* The prefix keeps legacy ledger filters matching; the suffix makes a
|
|
53
|
+
* stuck-loop kill message actionable instead of the opaque bare token
|
|
54
|
+
* that forced a full forensics dive to diagnose (#852 follow-up).
|
|
55
|
+
*/
|
|
56
|
+
ledgerErrorSummary: string;
|
|
50
57
|
}
|
|
51
58
|
| { action: "complete" }
|
|
52
59
|
| { action: "complete-and-break" };
|
|
@@ -295,6 +302,16 @@ function isCompleteAndBreakReason(
|
|
|
295
302
|
);
|
|
296
303
|
}
|
|
297
304
|
|
|
305
|
+
/** Strip per-attempt counter suffixes so detect-stuck Rule 1 can match repeats. */
|
|
306
|
+
const FAILURE_DETAIL_ATTEMPT_SUFFIX_RE = /\s*\(attempt\s+\d+(?:\/\d+)?\)\.?$/i;
|
|
307
|
+
|
|
308
|
+
function failureDetailForLedger(detail: string | undefined): string | undefined {
|
|
309
|
+
const trimmed = detail?.trim();
|
|
310
|
+
if (!trimmed) return undefined;
|
|
311
|
+
const normalized = trimmed.replace(FAILURE_DETAIL_ATTEMPT_SUFFIX_RE, "").trim();
|
|
312
|
+
return normalized || undefined;
|
|
313
|
+
}
|
|
314
|
+
|
|
298
315
|
export function decideFinalizeResult(input: FinalizeInput): FinalizeDecision {
|
|
299
316
|
if (input.action === "break") {
|
|
300
317
|
const reason = input.reason ?? "unknown";
|
|
@@ -310,9 +327,14 @@ export function decideFinalizeResult(input: FinalizeInput): FinalizeDecision {
|
|
|
310
327
|
}
|
|
311
328
|
|
|
312
329
|
if (input.action === "continue") {
|
|
330
|
+
// Carry the specific verification failure (e.g. "roadmap has zero slices",
|
|
331
|
+
// "15-SUMMARY.md was not found on disk") into the ledger summary so the
|
|
332
|
+
// stuck-loop kill message is actionable. The `finalize-retry` prefix is
|
|
333
|
+
// preserved so legacy ledger filters and dashboards still match (#852).
|
|
334
|
+
const detail = failureDetailForLedger(input.failureDetail);
|
|
313
335
|
return {
|
|
314
336
|
action: "retry",
|
|
315
|
-
ledgerErrorSummary: "finalize-retry",
|
|
337
|
+
ledgerErrorSummary: detail ? `finalize-retry: ${detail}` : "finalize-retry",
|
|
316
338
|
};
|
|
317
339
|
}
|
|
318
340
|
|
|
@@ -8,17 +8,22 @@
|
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
10
|
gsdRoot,
|
|
11
|
-
gsdProjectionRoot,
|
|
12
11
|
resolveDir,
|
|
13
12
|
resolveFile,
|
|
13
|
+
resolveMilestonePath,
|
|
14
|
+
resolveMilestoneFile,
|
|
15
|
+
resolveSliceFile,
|
|
14
16
|
relMilestoneFile,
|
|
15
17
|
relSliceFile,
|
|
16
|
-
buildMilestoneFileName,
|
|
17
|
-
buildSliceFileName,
|
|
18
18
|
buildTaskFileName,
|
|
19
|
+
resolveSlicePath,
|
|
20
|
+
resolveTasksDir,
|
|
21
|
+
dirIsMetaOnlyLegacyMilestone,
|
|
19
22
|
} from "./paths.js";
|
|
23
|
+
import { milestoneIdToPhaseNum } from "./layout-policy.js";
|
|
20
24
|
import { parseUnitId } from "./unit-id.js";
|
|
21
|
-
import { join } from "node:path";
|
|
25
|
+
import { dirname, join, relative } from "node:path";
|
|
26
|
+
import { existsSync } from "node:fs";
|
|
22
27
|
|
|
23
28
|
function resolveMilestoneArtifactPath(
|
|
24
29
|
base: string,
|
|
@@ -27,8 +32,54 @@ function resolveMilestoneArtifactPath(
|
|
|
27
32
|
): string | null {
|
|
28
33
|
const existing = resolveProjectedMilestoneFile(base, mid, suffix) ?? resolveProjectMilestoneFile(base, mid, suffix);
|
|
29
34
|
if (existing) return existing;
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
// Try projected (worktree) path, then project-root path. Both can return
|
|
36
|
+
// either a legacy (milestones/<MID>/) or flat-phase (phases/NN-slug/) dir.
|
|
37
|
+
const dir = resolveProjectedMilestonePath(base, mid) ?? resolveProjectMilestonePath(base, mid) ?? resolveMilestonePath(base, mid);
|
|
38
|
+
if (dir) {
|
|
39
|
+
// The filename depends on the LAYOUT of the resolved directory, not on
|
|
40
|
+
// which resolver found it. A flat-phase dir (phases/NN-slug/) uses the
|
|
41
|
+
// phase-number prefix (15-CONTEXT.md); a legacy dir (milestones/<MID>/)
|
|
42
|
+
// uses the milestone-id prefix (M015-CONTEXT.md). Building the wrong
|
|
43
|
+
// filename for the resolved dir produces existsSync-false paths that trap
|
|
44
|
+
// the unit in a finalize-retry loop (#852).
|
|
45
|
+
//
|
|
46
|
+
// Layout is determined structurally from the resolved directory's parent
|
|
47
|
+
// segment name, NOT by comparing against a root-anchored legacyMilestonesDir
|
|
48
|
+
// base path. On a canonical worktree (<project>/.gsd-worktrees/M001/),
|
|
49
|
+
// legacyMilestonesDir uses gsdProjectionRoot (the worktree .gsd) while
|
|
50
|
+
// resolveProjectMilestonePath uses gsdRoot (the project .gsd) — two
|
|
51
|
+
// different roots. A dir returned by resolveProjectMilestonePath would
|
|
52
|
+
// fail the startsWith check against the worktree root and incorrectly
|
|
53
|
+
// produce a flat-phase filename for a legacy directory (#bugbot c5ee8eba).
|
|
54
|
+
const parentDir = dirname(dir);
|
|
55
|
+
const isLegacy = parentDir.endsWith("/milestones") || parentDir.endsWith("\\milestones");
|
|
56
|
+
const phaseNum = milestoneIdToPhaseNum(mid);
|
|
57
|
+
const filename = isLegacy
|
|
58
|
+
? `${mid}-${suffix}.md`
|
|
59
|
+
: `${String(phaseNum).padStart(2, "0")}-${suffix}.md`;
|
|
60
|
+
return join(dir, filename);
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Build the layout-aware filename for a milestone artifact suffix.
|
|
67
|
+
* Exported so other callers (e.g. verification diagnostics) use the same
|
|
68
|
+
* naming policy: flat-phase dirs use the phase-number prefix (15-CONTEXT.md),
|
|
69
|
+
* legacy dirs use the milestone-id prefix (M015-CONTEXT.md).
|
|
70
|
+
*
|
|
71
|
+
* Layout is determined structurally: dirs whose immediate parent is named
|
|
72
|
+
* "milestones" are legacy; all others are flat-phase. This avoids the
|
|
73
|
+
* root-path ambiguity between gsdProjectionRoot (worktree .gsd) and gsdRoot
|
|
74
|
+
* (project .gsd) that caused wrong filenames on canonical worktrees.
|
|
75
|
+
*/
|
|
76
|
+
export function buildMilestoneArtifactFilename(mid: string, suffix: string, dir: string): string {
|
|
77
|
+
const parentDir = dirname(dir);
|
|
78
|
+
const isLegacy = parentDir.endsWith("/milestones") || parentDir.endsWith("\\milestones");
|
|
79
|
+
const phaseNum = milestoneIdToPhaseNum(mid);
|
|
80
|
+
return isLegacy
|
|
81
|
+
? `${mid}-${suffix}.md`
|
|
82
|
+
: `${String(phaseNum).padStart(2, "0")}-${suffix}.md`;
|
|
32
83
|
}
|
|
33
84
|
|
|
34
85
|
function resolveSliceArtifactPath(
|
|
@@ -39,14 +90,30 @@ function resolveSliceArtifactPath(
|
|
|
39
90
|
): string | null {
|
|
40
91
|
const existing = resolveProjectedSliceFile(base, mid, sid, suffix) ?? resolveProjectSliceFile(base, mid, sid, suffix);
|
|
41
92
|
if (existing) return existing;
|
|
42
|
-
|
|
43
|
-
|
|
93
|
+
// Flat-phase: plan files live at phases/NN-slug/NN-MM-SUFFIX.md — resolveSliceFile handles both layouts.
|
|
94
|
+
const flatPhase = resolveSliceFile(base, mid, sid, suffix);
|
|
95
|
+
if (flatPhase) return flatPhase;
|
|
96
|
+
// File doesn't exist yet — use relSliceFile for the layout-aware canonical path.
|
|
97
|
+
// buildSliceFileName(sid) only has sliceId → MM-SUFFIX.md, wrong for both layouts.
|
|
98
|
+
return join(base, relSliceFile(base, mid, sid, suffix));
|
|
44
99
|
}
|
|
45
100
|
|
|
46
101
|
function resolveProjectMilestonePath(base: string, mid: string): string | null {
|
|
47
102
|
const milestonesDir = join(gsdRoot(base), "milestones");
|
|
48
103
|
const dir = resolveDir(milestonesDir, mid);
|
|
49
|
-
|
|
104
|
+
if (!dir) return null;
|
|
105
|
+
// git-service.ts creates milestones/<MID>/ for integration-branch metadata
|
|
106
|
+
// (<MID>-META.json) even in flat-phase projects. A dir that holds ONLY
|
|
107
|
+
// *-META.json files must not be treated as a real legacy milestone dir —
|
|
108
|
+
// otherwise this early-return resolves CONTEXT/ROADMAP/SUMMARY to the legacy
|
|
109
|
+
// path (milestones/<MID>/<MID>-<SUFFIX>.md) before the flat-phase fallback
|
|
110
|
+
// can run, trapping the unit in a finalize-retry loop (#852 follow-up).
|
|
111
|
+
//
|
|
112
|
+
// We use dirIsMetaOnlyLegacyMilestone rather than !dirIsContentBearingLegacyMilestone
|
|
113
|
+
// so that an EMPTY dir (a new milestone before any content is written) is NOT
|
|
114
|
+
// blocked — it is a valid legacy target that write-paths should resolve to.
|
|
115
|
+
if (dirIsMetaOnlyLegacyMilestone(join(milestonesDir, dir))) return null;
|
|
116
|
+
return join(milestonesDir, dir);
|
|
50
117
|
}
|
|
51
118
|
|
|
52
119
|
function resolveProjectMilestoneFile(base: string, mid: string, suffix: string): string | null {
|
|
@@ -72,16 +139,11 @@ function resolveProjectSliceFile(base: string, mid: string, sid: string, suffix:
|
|
|
72
139
|
}
|
|
73
140
|
|
|
74
141
|
function resolveProjectedMilestonePath(base: string, mid: string): string | null {
|
|
75
|
-
|
|
76
|
-
const dir = resolveDir(milestonesDir, mid);
|
|
77
|
-
return dir ? join(milestonesDir, dir) : null;
|
|
142
|
+
return resolveMilestonePath(base, mid);
|
|
78
143
|
}
|
|
79
144
|
|
|
80
145
|
function resolveProjectedMilestoneFile(base: string, mid: string, suffix: string): string | null {
|
|
81
|
-
|
|
82
|
-
if (!dir) return null;
|
|
83
|
-
const file = resolveFile(dir, mid, suffix);
|
|
84
|
-
return file ? join(dir, file) : null;
|
|
146
|
+
return resolveMilestoneFile(base, mid, suffix);
|
|
85
147
|
}
|
|
86
148
|
|
|
87
149
|
function resolveProjectedSlicePath(base: string, mid: string, sid: string): string | null {
|
|
@@ -155,10 +217,12 @@ export function resolveExpectedArtifactPath(
|
|
|
155
217
|
return resolveSliceArtifactPath(base, mid, sid!, "ASSESSMENT");
|
|
156
218
|
}
|
|
157
219
|
case "execute-task": {
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
220
|
+
const slicePath = resolveProjectedSlicePath(base, mid, sid!)
|
|
221
|
+
?? resolveProjectSlicePath(base, mid, sid!)
|
|
222
|
+
?? resolveSlicePath(base, mid, sid!);
|
|
223
|
+
if (!slicePath || !tid) return null;
|
|
224
|
+
const tasksDir = resolveTasksDir(base, mid, sid!) ?? slicePath;
|
|
225
|
+
return join(tasksDir, buildTaskFileName(tid, "SUMMARY"));
|
|
162
226
|
}
|
|
163
227
|
case "complete-slice": {
|
|
164
228
|
return resolveSliceArtifactPath(base, mid, sid!, "SUMMARY");
|
|
@@ -251,3 +315,48 @@ export function diagnoseExpectedArtifact(
|
|
|
251
315
|
return null;
|
|
252
316
|
}
|
|
253
317
|
}
|
|
318
|
+
|
|
319
|
+
export interface SliceResearchLocation {
|
|
320
|
+
/** Absolute path when research exists; null when missing. */
|
|
321
|
+
absolutePath: string | null;
|
|
322
|
+
/** Prompt-friendly relative path when research exists. */
|
|
323
|
+
relativePath: string | null;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Resolve slice RESEARCH with worktree projection first, then canonical
|
|
328
|
+
* project-root path. Shared by dispatch rules, execute-task prompts, and
|
|
329
|
+
* artifact verification.
|
|
330
|
+
*/
|
|
331
|
+
export function resolveSliceResearchLocation(
|
|
332
|
+
basePath: string,
|
|
333
|
+
mid: string,
|
|
334
|
+
sid: string,
|
|
335
|
+
): SliceResearchLocation {
|
|
336
|
+
const projectedFile = resolveSliceFile(basePath, mid, sid, "RESEARCH");
|
|
337
|
+
if (projectedFile) {
|
|
338
|
+
return {
|
|
339
|
+
absolutePath: projectedFile,
|
|
340
|
+
relativePath: relSliceFile(basePath, mid, sid, "RESEARCH"),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const canonicalPath = resolveExpectedArtifactPath("research-slice", `${mid}/${sid}`, basePath);
|
|
345
|
+
if (canonicalPath && existsSync(canonicalPath)) {
|
|
346
|
+
return {
|
|
347
|
+
absolutePath: canonicalPath,
|
|
348
|
+
relativePath: relative(basePath, canonicalPath),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return { absolutePath: null, relativePath: null };
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/** Returns the absolute RESEARCH path when it exists, otherwise null. */
|
|
356
|
+
export function resolveExistingSliceResearchPath(
|
|
357
|
+
basePath: string,
|
|
358
|
+
mid: string,
|
|
359
|
+
sid: string,
|
|
360
|
+
): string | null {
|
|
361
|
+
return resolveSliceResearchLocation(basePath, mid, sid).absolutePath;
|
|
362
|
+
}
|
|
@@ -79,7 +79,9 @@ export function resolveCompactionThresholdPercent(raw: number | undefined): numb
|
|
|
79
79
|
return value <= 1 ? value * 100 : value;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
export
|
|
82
|
+
export const HARD_CONTEXT_REROOT_THRESHOLD_PERCENT = 90;
|
|
83
|
+
|
|
84
|
+
export function shouldWarnStepSessionForContext(
|
|
83
85
|
contextPercent: number | null | undefined,
|
|
84
86
|
compactionThresholdPercent?: number,
|
|
85
87
|
): boolean {
|
|
@@ -88,3 +90,12 @@ export function shouldRerootStepSessionForContext(
|
|
|
88
90
|
resolveCompactionThresholdPercent(compactionThresholdPercent),
|
|
89
91
|
) === "pause";
|
|
90
92
|
}
|
|
93
|
+
|
|
94
|
+
export function shouldRerootStepSessionForContext(
|
|
95
|
+
contextPercent: number | null | undefined,
|
|
96
|
+
): boolean {
|
|
97
|
+
return getContextPauseAction(
|
|
98
|
+
contextPercent,
|
|
99
|
+
HARD_CONTEXT_REROOT_THRESHOLD_PERCENT,
|
|
100
|
+
) === "pause";
|
|
101
|
+
}
|