@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
|
@@ -6,9 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { randomInt } from "node:crypto";
|
|
9
|
+
import { join } from "node:path";
|
|
9
10
|
import { logWarning } from "./workflow-logger.js";
|
|
10
11
|
import { readdirSync, existsSync } from "node:fs";
|
|
11
|
-
import { milestonesDir } from "./paths.js";
|
|
12
|
+
import { milestonesDir, gsdProjectionRoot } from "./paths.js";
|
|
13
|
+
import { LAYOUT_SEGMENTS } from "./layout-policy.js";
|
|
12
14
|
import { loadQueueOrder, sortByQueueOrder } from "./queue-order.js";
|
|
13
15
|
import { getErrorMessage } from "./error-utils.js";
|
|
14
16
|
|
|
@@ -139,26 +141,83 @@ export function clearReservedMilestoneIds(): void {
|
|
|
139
141
|
|
|
140
142
|
// ─── Discovery ──────────────────────────────────────────────────────────────
|
|
141
143
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
144
|
+
function scanMilestoneIdsFromDir(basePath: string, dir: string): string[] {
|
|
145
|
+
const legacyNumericIds = idsWithLegacyNumericDirs(basePath);
|
|
146
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
147
|
+
.filter((d) => d.isDirectory())
|
|
148
|
+
.map((d) => {
|
|
149
|
+
// Legacy layout: exact M001 or M001-abcdef directory name
|
|
150
|
+
if (MILESTONE_ID_RE.test(d.name)) {
|
|
151
|
+
return d.name;
|
|
152
|
+
}
|
|
153
|
+
// Legacy recovery/imports may contain bare numeric milestone directories
|
|
154
|
+
// (for example `milestones/15/15-ROADMAP.md`). The DB can preserve that
|
|
155
|
+
// id, and rebuild renders it, so drift scans must see it too.
|
|
156
|
+
if (/^\d+$/.test(d.name)) {
|
|
157
|
+
return d.name;
|
|
158
|
+
}
|
|
159
|
+
// Legacy layout: M001-abcdef-slug descriptor directories
|
|
160
|
+
const legacyMatch = d.name.match(/^(M\d{3}(?:-[a-z0-9]{6})?)-/);
|
|
161
|
+
if (legacyMatch) {
|
|
162
|
+
return legacyMatch[1]!;
|
|
163
|
+
}
|
|
164
|
+
// Flat-phase layout: NN-slug → M00N (slug may encode M00N or M00N-abcdef)
|
|
165
|
+
const flatMatch = d.name.match(/^(\d+)-(.+)$/);
|
|
166
|
+
if (flatMatch) {
|
|
167
|
+
const phaseNum = parseInt(flatMatch[1]!, 10);
|
|
168
|
+
const fromSlug = normalizeDiscussMilestoneId(flatMatch[2]!);
|
|
169
|
+
if (MILESTONE_ID_RE.test(fromSlug)) {
|
|
170
|
+
return fromSlug;
|
|
171
|
+
}
|
|
172
|
+
const numericId = String(phaseNum);
|
|
173
|
+
if (legacyNumericIds.has(numericId)) {
|
|
174
|
+
return numericId;
|
|
175
|
+
}
|
|
176
|
+
return `M${String(phaseNum).padStart(3, "0")}`;
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
})
|
|
180
|
+
.filter((id): id is string => id !== null);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function idsWithLegacyNumericDirs(basePath: string): Set<string> {
|
|
184
|
+
const legacyDir = join(gsdProjectionRoot(basePath), "milestones");
|
|
185
|
+
const ids = new Set<string>();
|
|
145
186
|
try {
|
|
146
|
-
const
|
|
147
|
-
.
|
|
148
|
-
|
|
149
|
-
const match = d.name.match(/^(M\d+(?:-[a-z0-9]{6})?)/);
|
|
150
|
-
return match ? match[1] : null;
|
|
151
|
-
})
|
|
152
|
-
.filter((id): id is string => id !== null);
|
|
153
|
-
|
|
154
|
-
// Apply custom queue order if available, else fall back to numeric sort
|
|
155
|
-
const customOrder = loadQueueOrder(basePath);
|
|
156
|
-
return sortByQueueOrder(ids, customOrder);
|
|
187
|
+
for (const entry of readdirSync(legacyDir, { withFileTypes: true })) {
|
|
188
|
+
if (entry.isDirectory() && /^\d+$/.test(entry.name)) ids.add(entry.name);
|
|
189
|
+
}
|
|
157
190
|
} catch (err) {
|
|
158
|
-
//
|
|
159
|
-
|
|
160
|
-
|
|
191
|
+
// A missing legacy directory is the common, benign case (nothing to
|
|
192
|
+
// consult). Only surface a real failure when the directory exists but
|
|
193
|
+
// could not be read.
|
|
194
|
+
if (existsSync(legacyDir)) {
|
|
195
|
+
logWarning("engine", `idsWithLegacyNumericDirs: ${legacyDir} exists but readdirSync failed — ${getErrorMessage(err)}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return ids;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Scan the milestones directory and return IDs sorted by queue order (or numeric fallback). */
|
|
202
|
+
export function findMilestoneIds(basePath: string): string[] {
|
|
203
|
+
const root = gsdProjectionRoot(basePath);
|
|
204
|
+
const dirs = [milestonesDir(basePath)];
|
|
205
|
+
const legacyDir = join(root, "milestones");
|
|
206
|
+
if (legacyDir !== dirs[0] && existsSync(legacyDir)) dirs.push(legacyDir);
|
|
207
|
+
const phasesDir = join(root, LAYOUT_SEGMENTS.level1);
|
|
208
|
+
if (phasesDir !== dirs[0] && existsSync(phasesDir)) dirs.push(phasesDir);
|
|
209
|
+
|
|
210
|
+
const ids = new Set<string>();
|
|
211
|
+
for (const dir of dirs) {
|
|
212
|
+
try {
|
|
213
|
+
for (const id of scanMilestoneIdsFromDir(basePath, dir)) ids.add(id);
|
|
214
|
+
} catch (err) {
|
|
215
|
+
if (existsSync(dir)) {
|
|
216
|
+
logWarning("engine", `findMilestoneIds: ${dir} exists but readdirSync failed — ${getErrorMessage(err)}`);
|
|
217
|
+
}
|
|
161
218
|
}
|
|
162
|
-
return [];
|
|
163
219
|
}
|
|
220
|
+
|
|
221
|
+
const customOrder = loadQueueOrder(basePath);
|
|
222
|
+
return sortByQueueOrder([...ids], customOrder);
|
|
164
223
|
}
|
|
@@ -19,6 +19,16 @@ import { resolveTasksDir } from "./paths.js";
|
|
|
19
19
|
|
|
20
20
|
/** Large enough for unbounded milestone-history git log scans in big repos. */
|
|
21
21
|
const GIT_LOG_MAX_BUFFER = 16 * 1024 * 1024;
|
|
22
|
+
const LOG_FIELD_SEPARATOR = "\x1f";
|
|
23
|
+
const LOG_RECORD_SEPARATOR = "\x1e";
|
|
24
|
+
|
|
25
|
+
type CommitRecord = {
|
|
26
|
+
hash: string;
|
|
27
|
+
parents: string;
|
|
28
|
+
committedAt: string;
|
|
29
|
+
message: string;
|
|
30
|
+
files: string[];
|
|
31
|
+
};
|
|
22
32
|
|
|
23
33
|
/**
|
|
24
34
|
* Check whether a milestone produced implementation artifacts (non-`.gsd/`
|
|
@@ -198,7 +208,7 @@ function getChangedFilesFromMilestoneTaggedCommits(
|
|
|
198
208
|
// Primary: path-scoped log against .gsd/milestones/<id>. Fast and unbounded
|
|
199
209
|
// by depth when .gsd/ is tracked in git.
|
|
200
210
|
const scoped = scanGsdTaggedCommits(basePath, milestoneId, [
|
|
201
|
-
"log", "--format=%H%x1f%B%
|
|
211
|
+
"log", "--full-diff", "--name-only", "--format=%x1e%H%x1f%B%x1f", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
|
|
202
212
|
]);
|
|
203
213
|
if (!scoped.ok) return scoped;
|
|
204
214
|
if (scoped.matched && classifyImplementationFiles(scoped.files) === "present") return scoped;
|
|
@@ -213,7 +223,7 @@ function getChangedFilesFromMilestoneTaggedCommits(
|
|
|
213
223
|
// reintroducing the rolling-depth failure class removed in #4699 where
|
|
214
224
|
// milestone evidence aged out behind unrelated activity.
|
|
215
225
|
const unscoped = scanGsdTaggedCommits(basePath, milestoneId, [
|
|
216
|
-
"log", "--format=%H%x1f%B%
|
|
226
|
+
"log", "--name-only", "--format=%x1e%H%x1f%B%x1f", "HEAD",
|
|
217
227
|
]);
|
|
218
228
|
if (!unscoped.ok) return scoped.matched ? scoped : unscoped;
|
|
219
229
|
if (!unscoped.matched) return scoped;
|
|
@@ -299,8 +309,7 @@ function backfillChangedFilesFromUntaggedMilestoneCommits(
|
|
|
299
309
|
if (record.parents.trim().split(/\s+/).filter(Boolean).length > 1) continue;
|
|
300
310
|
if (commitMessageHasGsdTrailer(record.message)) continue;
|
|
301
311
|
|
|
302
|
-
const
|
|
303
|
-
const implementationFiles = commitFiles.map(normalizeRepoPath).filter(isImplementationPath);
|
|
312
|
+
const implementationFiles = record.files.map(normalizeRepoPath).filter(isImplementationPath);
|
|
304
313
|
if (implementationFiles.length === 0) continue;
|
|
305
314
|
if (!implementationFiles.some((file) => hintSet.has(file))) continue;
|
|
306
315
|
|
|
@@ -323,25 +332,30 @@ function backfillChangedFilesFromUntaggedMilestoneCommits(
|
|
|
323
332
|
}
|
|
324
333
|
}
|
|
325
334
|
|
|
326
|
-
function getCommitRecords(basePath: string):
|
|
327
|
-
const logOutput = execFileSync("git", ["log", "--format=%H%x1f%P%x1f%cI%x1f%B%
|
|
335
|
+
function getCommitRecords(basePath: string): CommitRecord[] {
|
|
336
|
+
const logOutput = execFileSync("git", ["log", "--name-only", "--format=%x1e%H%x1f%P%x1f%cI%x1f%B%x1f", "HEAD"], {
|
|
328
337
|
cwd: basePath,
|
|
329
338
|
stdio: ["ignore", "pipe", "pipe"],
|
|
330
339
|
encoding: "utf-8",
|
|
331
340
|
maxBuffer: GIT_LOG_MAX_BUFFER,
|
|
332
341
|
});
|
|
333
342
|
return logOutput
|
|
334
|
-
.split(
|
|
335
|
-
.map((record) => record.trim())
|
|
343
|
+
.split(LOG_RECORD_SEPARATOR)
|
|
336
344
|
.filter(Boolean)
|
|
337
345
|
.flatMap((record) => {
|
|
338
|
-
const parts = record.split(
|
|
339
|
-
if (parts.length <
|
|
340
|
-
const [hash, parents, committedAt
|
|
341
|
-
|
|
346
|
+
const parts = record.split(LOG_FIELD_SEPARATOR);
|
|
347
|
+
if (parts.length < 5) return [];
|
|
348
|
+
const [hash, parents, committedAt] = parts;
|
|
349
|
+
const files = parseNameOnlyFiles(parts.at(-1) ?? "");
|
|
350
|
+
const message = parts.slice(3, -1).join(LOG_FIELD_SEPARATOR);
|
|
351
|
+
return [{ hash: hash.trim(), parents: parents.trim(), committedAt: committedAt.trim(), message, files }];
|
|
342
352
|
});
|
|
343
353
|
}
|
|
344
354
|
|
|
355
|
+
function parseNameOnlyFiles(rawFiles: string): string[] {
|
|
356
|
+
return rawFiles.split(/\r?\n/).map((file) => file.trim()).filter(Boolean);
|
|
357
|
+
}
|
|
358
|
+
|
|
345
359
|
function isFullCommitSha(value: string): boolean {
|
|
346
360
|
return /^[0-9a-f]{40}$/i.test(value);
|
|
347
361
|
}
|
|
@@ -359,23 +373,23 @@ function scanGsdTaggedCommits(
|
|
|
359
373
|
maxBuffer: GIT_LOG_MAX_BUFFER,
|
|
360
374
|
});
|
|
361
375
|
const records = logOutput
|
|
362
|
-
.split(
|
|
363
|
-
.map((record) => record.trim())
|
|
376
|
+
.split(LOG_RECORD_SEPARATOR)
|
|
364
377
|
.filter(Boolean)
|
|
365
378
|
.flatMap((record) => {
|
|
366
|
-
const
|
|
367
|
-
if (
|
|
368
|
-
const hash =
|
|
369
|
-
|
|
370
|
-
|
|
379
|
+
const parts = record.split(LOG_FIELD_SEPARATOR);
|
|
380
|
+
if (parts.length < 3) return [];
|
|
381
|
+
const hash = parts[0].trim();
|
|
382
|
+
if (!hash) return [];
|
|
383
|
+
const files = parseNameOnlyFiles(parts.at(-1) ?? "");
|
|
384
|
+
const message = parts.slice(1, -1).join(LOG_FIELD_SEPARATOR);
|
|
385
|
+
return [{ message, files }];
|
|
371
386
|
});
|
|
372
387
|
|
|
373
388
|
const files = new Set<string>();
|
|
374
389
|
let matched = false;
|
|
375
|
-
for (const {
|
|
390
|
+
for (const { message, files: commitFiles } of records) {
|
|
376
391
|
if (!commitMessageHasGsdTrailer(message)) continue;
|
|
377
392
|
|
|
378
|
-
const commitFiles = getChangedFilesForCommit(basePath, hash);
|
|
379
393
|
if (!commitMatchesMilestone(basePath, message, milestoneId, commitFiles)) continue;
|
|
380
394
|
|
|
381
395
|
matched = true;
|
|
@@ -161,6 +161,14 @@ async function renderPlanArtifacts(
|
|
|
161
161
|
): Promise<string | { error: string }> {
|
|
162
162
|
try {
|
|
163
163
|
const renderResult = await renderRoadmapFromDb(basePath, params.milestoneId);
|
|
164
|
+
// renderRoadmapFromDb only skips for unplanned milestones (zero slices +
|
|
165
|
+
// empty vision); persistMilestonePlan always populates both via writePlanRows
|
|
166
|
+
// before this render, so the skipped branch is unreachable here. Fall back to
|
|
167
|
+
// resolving the projected path so a future invariant still surfaces a clear
|
|
168
|
+
// render failure rather than an undefined dereference.
|
|
169
|
+
if ("skipped" in renderResult) {
|
|
170
|
+
return { error: `render skipped: milestone ${params.milestoneId} has no planned slices` };
|
|
171
|
+
}
|
|
164
172
|
return renderResult.roadmapPath;
|
|
165
173
|
} catch (renderErr) {
|
|
166
174
|
logWarning("tool", `plan_milestone — render failed (DB rows preserved for debugging): ${(renderErr as Error).message}`);
|
|
@@ -7,7 +7,7 @@ import { join } from "node:path";
|
|
|
7
7
|
import { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
|
8
8
|
import { loadFile } from "./files.js";
|
|
9
9
|
import { getLatestAssessmentByScope, isDbAvailable } from "./gsd-db.js";
|
|
10
|
-
import {
|
|
10
|
+
import { relMilestoneFile } from "./paths.js";
|
|
11
11
|
import {
|
|
12
12
|
extractVerdict,
|
|
13
13
|
isValidMilestoneVerdict,
|
|
@@ -68,13 +68,11 @@ export async function resolveMilestoneValidationVerdict(
|
|
|
68
68
|
if (projectVerdict) return projectVerdict;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
// Last resort:
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
`${milestoneId}-VALIDATION.md`,
|
|
78
|
-
);
|
|
71
|
+
// Last resort: layout-aware fallback path when resolveDir helpers
|
|
72
|
+
// haven't materialized the milestone directory yet. relMilestoneFile()
|
|
73
|
+
// builds the canonical NN-VALIDATION.md path for flat-phase and the
|
|
74
|
+
// legacy MID-VALIDATION.md path for projects that haven't migrated.
|
|
75
|
+
// See open-gsd/gsd-pi#876.
|
|
76
|
+
const directPath = join(canonicalBase, relMilestoneFile(canonicalBase, milestoneId, "VALIDATION"));
|
|
79
77
|
return verdictFromValidationPath(directPath);
|
|
80
78
|
}
|
|
@@ -312,6 +312,8 @@ export function scoreEligibleModels(
|
|
|
312
312
|
|
|
313
313
|
/**
|
|
314
314
|
* Return all models eligible for a given tier, sorted cheapest first.
|
|
315
|
+
* A runtime preferred model (the user's selected/session model) is returned
|
|
316
|
+
* first when it is available and satisfies the requested tier.
|
|
315
317
|
* If routingConfig.tier_models[tier] is set and available, returns only that
|
|
316
318
|
* model. Otherwise filters availableModelIds by tier from MODEL_CAPABILITY_TIER.
|
|
317
319
|
*/
|
|
@@ -319,6 +321,7 @@ export function getEligibleModels(
|
|
|
319
321
|
tier: ComplexityTier,
|
|
320
322
|
availableModelIds: string[],
|
|
321
323
|
routingConfig: DynamicRoutingConfig,
|
|
324
|
+
preferredModelId?: string,
|
|
322
325
|
): string[] {
|
|
323
326
|
// 1. Check explicit tier_models config
|
|
324
327
|
const explicitModel = routingConfig.tier_models?.[tier];
|
|
@@ -332,13 +335,17 @@ export function getEligibleModels(
|
|
|
332
335
|
}
|
|
333
336
|
|
|
334
337
|
// 2. Auto-detect: filter by tier, sort cheapest first
|
|
335
|
-
|
|
338
|
+
const tierMatches = availableModelIds
|
|
336
339
|
.filter(id => getModelTier(id) === tier)
|
|
337
340
|
.sort((a, b) => {
|
|
338
341
|
const costA = getModelCost(a);
|
|
339
342
|
const costB = getModelCost(b);
|
|
340
343
|
return costA - costB;
|
|
341
344
|
});
|
|
345
|
+
|
|
346
|
+
const preferred = findPreferredModelForTier(tier, availableModelIds, preferredModelId);
|
|
347
|
+
if (!preferred) return tierMatches;
|
|
348
|
+
return [preferred, ...tierMatches.filter(id => id !== preferred)];
|
|
342
349
|
}
|
|
343
350
|
|
|
344
351
|
/**
|
|
@@ -398,6 +405,7 @@ export function resolveModelForComplexity(
|
|
|
398
405
|
unitType?: string,
|
|
399
406
|
taskMetadata?: TaskMetadata,
|
|
400
407
|
capabilityOverrides?: Record<string, Partial<ModelCapabilities>>,
|
|
408
|
+
preferredModelId?: string,
|
|
401
409
|
): RoutingDecision {
|
|
402
410
|
// If no phase config or routing disabled, pass through
|
|
403
411
|
if (!phaseConfig || !routingConfig.enabled) {
|
|
@@ -453,6 +461,7 @@ export function resolveModelForComplexity(
|
|
|
453
461
|
routingConfig,
|
|
454
462
|
availableModelIds,
|
|
455
463
|
routingConfig.cross_provider !== false,
|
|
464
|
+
preferredModelId,
|
|
456
465
|
);
|
|
457
466
|
|
|
458
467
|
return {
|
|
@@ -470,7 +479,7 @@ export function resolveModelForComplexity(
|
|
|
470
479
|
}
|
|
471
480
|
|
|
472
481
|
// STEP 1: Get all eligible models for the requested tier
|
|
473
|
-
const eligible = getEligibleModels(requestedTier, availableModelIds, routingConfig);
|
|
482
|
+
const eligible = getEligibleModels(requestedTier, availableModelIds, routingConfig, preferredModelId);
|
|
474
483
|
|
|
475
484
|
if (eligible.length === 0) {
|
|
476
485
|
// No suitable model found — use configured primary
|
|
@@ -484,6 +493,19 @@ export function resolveModelForComplexity(
|
|
|
484
493
|
};
|
|
485
494
|
}
|
|
486
495
|
|
|
496
|
+
const preferred = findPreferredModelForTier(requestedTier, availableModelIds, preferredModelId);
|
|
497
|
+
if (preferred && eligible.includes(preferred)) {
|
|
498
|
+
const fallbacks = buildFallbackChain(preferred, phaseConfig);
|
|
499
|
+
return {
|
|
500
|
+
modelId: preferred,
|
|
501
|
+
fallbacks,
|
|
502
|
+
tier: requestedTier,
|
|
503
|
+
wasDowngraded: !isModelAvailable(configuredPrimary, [preferred]),
|
|
504
|
+
reason: `preferred session model ${preferred} satisfies ${requestedTier} tier`,
|
|
505
|
+
selectionMethod: "tier-only",
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
|
|
487
509
|
// STEP 2: Capability scoring (when enabled and multiple eligible models exist)
|
|
488
510
|
if (routingConfig.capability_routing !== false && eligible.length > 1 && unitType) {
|
|
489
511
|
const requirements = computeTaskRequirements(unitType, taskMetadata);
|
|
@@ -551,15 +573,15 @@ export function defaultRoutingConfig(): DynamicRoutingConfig {
|
|
|
551
573
|
// ─── Tier-Based Model Resolution (for profile defaults) ─────────────────────
|
|
552
574
|
|
|
553
575
|
/**
|
|
554
|
-
* Fallback-only canonical model IDs per tier. Returned when the
|
|
576
|
+
* Fallback-only canonical model IDs per tier. Returned only when the
|
|
555
577
|
* available-model list is empty (e.g., preferences are loaded before the
|
|
556
|
-
* model registry is populated at bootstrap)
|
|
557
|
-
* no model at the requested tier.
|
|
578
|
+
* model registry is populated at bootstrap).
|
|
558
579
|
*
|
|
559
580
|
* Precedence (resolveModelForTier):
|
|
560
581
|
* 1. configured `tier_models[tier]` (via getEligibleModels) — exact/bare match
|
|
561
|
-
* 2.
|
|
562
|
-
* 3.
|
|
582
|
+
* 2. preferred/session model when it is available and satisfies `tier`
|
|
583
|
+
* 3. cheapest available model whose tier matches `tier`
|
|
584
|
+
* 4. CANONICAL_TIER_MODELS[tier] when the registry is empty
|
|
563
585
|
*/
|
|
564
586
|
const CANONICAL_TIER_MODELS: Record<ComplexityTier, string> = {
|
|
565
587
|
light: "claude-haiku-4-5",
|
|
@@ -573,9 +595,10 @@ export function canonicalModelForTier(tier: ComplexityTier): string {
|
|
|
573
595
|
|
|
574
596
|
/**
|
|
575
597
|
* Single source of truth for tier-based model selection.
|
|
576
|
-
* Returns the
|
|
577
|
-
*
|
|
578
|
-
*
|
|
598
|
+
* Returns the preferred/session model when it satisfies `tier`, otherwise the
|
|
599
|
+
* cheapest available model whose capability tier matches `tier`, honoring
|
|
600
|
+
* `routingConfig.tier_models[tier]` when set. Returns undefined when no
|
|
601
|
+
* available model satisfies the tier.
|
|
579
602
|
*
|
|
580
603
|
* `crossProvider`: when false, restricts the search to models that share the
|
|
581
604
|
* canonical (Anthropic) provider for the tier. When true, any provider is
|
|
@@ -586,8 +609,9 @@ function findModelForTier(
|
|
|
586
609
|
routingConfig: DynamicRoutingConfig,
|
|
587
610
|
availableModelIds: string[],
|
|
588
611
|
crossProvider: boolean,
|
|
612
|
+
preferredModelId?: string,
|
|
589
613
|
): string | undefined {
|
|
590
|
-
const eligible = getEligibleModels(tier, availableModelIds, routingConfig);
|
|
614
|
+
const eligible = getEligibleModels(tier, availableModelIds, routingConfig, preferredModelId);
|
|
591
615
|
if (eligible.length === 0) return undefined;
|
|
592
616
|
|
|
593
617
|
if (crossProvider) {
|
|
@@ -600,6 +624,13 @@ function findModelForTier(
|
|
|
600
624
|
const bare = bareModelId(id);
|
|
601
625
|
return MODEL_CAPABILITY_TIER[bare] === tier && bare.startsWith("claude-");
|
|
602
626
|
});
|
|
627
|
+
|
|
628
|
+
// Honor the preferred/session model only when it is itself a same-provider
|
|
629
|
+
// (Anthropic/Claude) model. A non-Anthropic session model must not bypass
|
|
630
|
+
// the cross_provider:false restriction.
|
|
631
|
+
const preferred = findPreferredModelForTier(tier, availableModelIds, preferredModelId);
|
|
632
|
+
if (preferred && sameProvider.includes(preferred)) return preferred;
|
|
633
|
+
|
|
603
634
|
return sameProvider[0];
|
|
604
635
|
}
|
|
605
636
|
|
|
@@ -610,9 +641,11 @@ function findModelForTier(
|
|
|
610
641
|
*
|
|
611
642
|
* Precedence:
|
|
612
643
|
* 1. configured `tier_models[tier]`, if provided and available
|
|
613
|
-
* 2.
|
|
614
|
-
* 3.
|
|
615
|
-
*
|
|
644
|
+
* 2. preferred/session model when available and satisfying the tier
|
|
645
|
+
* 3. tier-matching model from any provider in `availableModelIds`
|
|
646
|
+
* 4. preferred/session model, then first available model, when the registry
|
|
647
|
+
* is non-empty but has no tier match
|
|
648
|
+
* 5. canonical Anthropic ID only when `availableModelIds` is empty
|
|
616
649
|
*
|
|
617
650
|
* @param tier The capability tier to resolve
|
|
618
651
|
* @param availableModelIds List of available model IDs (REQUIRED for
|
|
@@ -620,6 +653,7 @@ function findModelForTier(
|
|
|
620
653
|
* the model registry is genuinely unavailable)
|
|
621
654
|
* @param routingConfig Optional routing config, or legacy crossProvider boolean
|
|
622
655
|
* @param crossProvider Whether to consider models from other providers
|
|
656
|
+
* @param preferredModelId Optional selected/session model ID to prefer
|
|
623
657
|
*/
|
|
624
658
|
export function resolveModelForTier(
|
|
625
659
|
tier: ComplexityTier,
|
|
@@ -631,12 +665,14 @@ export function resolveModelForTier(
|
|
|
631
665
|
availableModelIds: string[],
|
|
632
666
|
routingConfig?: DynamicRoutingConfig,
|
|
633
667
|
crossProvider?: boolean,
|
|
668
|
+
preferredModelId?: string,
|
|
634
669
|
): string;
|
|
635
670
|
export function resolveModelForTier(
|
|
636
671
|
tier: ComplexityTier,
|
|
637
672
|
availableModelIds: string[],
|
|
638
673
|
routingConfigOrCrossProvider: DynamicRoutingConfig | boolean = defaultRoutingConfig(),
|
|
639
674
|
crossProvider?: boolean,
|
|
675
|
+
preferredModelId?: string,
|
|
640
676
|
): string {
|
|
641
677
|
const routingConfig = typeof routingConfigOrCrossProvider === "boolean"
|
|
642
678
|
? defaultRoutingConfig()
|
|
@@ -645,24 +681,68 @@ export function resolveModelForTier(
|
|
|
645
681
|
? routingConfigOrCrossProvider
|
|
646
682
|
: crossProvider ?? routingConfig.cross_provider !== false;
|
|
647
683
|
|
|
648
|
-
// No available models known —
|
|
684
|
+
// No available models known — prefer the session model when provided, else canonical
|
|
649
685
|
if (availableModelIds.length === 0) {
|
|
686
|
+
if (preferredModelId) {
|
|
687
|
+
return normalizeResolvedTierModelId(preferredModelId, tier, routingConfig);
|
|
688
|
+
}
|
|
650
689
|
incrementLegacyTelemetry("legacy.providerDefaultUsed");
|
|
651
690
|
return canonicalModelForTier(tier);
|
|
652
691
|
}
|
|
653
692
|
|
|
654
693
|
// Cross-provider tier search
|
|
655
|
-
const resolved = findModelForTier(tier, routingConfig, availableModelIds, allowCrossProvider);
|
|
694
|
+
const resolved = findModelForTier(tier, routingConfig, availableModelIds, allowCrossProvider, preferredModelId);
|
|
656
695
|
if (resolved) {
|
|
657
696
|
return normalizeResolvedTierModelId(resolved, tier, routingConfig);
|
|
658
697
|
}
|
|
659
698
|
|
|
660
|
-
|
|
661
|
-
|
|
699
|
+
const providerLocalFallback = findAvailableModelId(preferredModelId, availableModelIds)
|
|
700
|
+
?? availableModelIds[0]
|
|
701
|
+
?? canonicalModelForTier(tier);
|
|
702
|
+
return normalizeResolvedTierModelId(providerLocalFallback, tier, routingConfig);
|
|
662
703
|
}
|
|
663
704
|
|
|
664
705
|
// ─── Internal ────────────────────────────────────────────────────────────────
|
|
665
706
|
|
|
707
|
+
function modelProvider(modelId: string): string | undefined {
|
|
708
|
+
const slash = modelId.indexOf("/");
|
|
709
|
+
return slash > 0 ? modelId.slice(0, slash) : undefined;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
function findAvailableModelId(
|
|
713
|
+
preferredModelId: string | undefined,
|
|
714
|
+
availableModelIds: string[],
|
|
715
|
+
): string | undefined {
|
|
716
|
+
if (!preferredModelId) return undefined;
|
|
717
|
+
if (availableModelIds.includes(preferredModelId)) return preferredModelId;
|
|
718
|
+
|
|
719
|
+
const preferredBare = bareModelId(preferredModelId);
|
|
720
|
+
if (!preferredBare) return undefined;
|
|
721
|
+
const preferredProvider = modelProvider(preferredModelId)?.toLowerCase();
|
|
722
|
+
if (preferredProvider) {
|
|
723
|
+
const providerMatch = availableModelIds.find(id =>
|
|
724
|
+
modelProvider(id)?.toLowerCase() === preferredProvider && bareModelId(id) === preferredBare
|
|
725
|
+
);
|
|
726
|
+
if (providerMatch) return providerMatch;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
return availableModelIds.find(id => bareModelId(id) === preferredBare);
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
function modelSatisfiesTier(modelId: string, tier: ComplexityTier): boolean {
|
|
733
|
+
return tierOrdinal(getModelTier(modelId)) >= tierOrdinal(tier);
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
function findPreferredModelForTier(
|
|
737
|
+
tier: ComplexityTier,
|
|
738
|
+
availableModelIds: string[],
|
|
739
|
+
preferredModelId: string | undefined,
|
|
740
|
+
): string | undefined {
|
|
741
|
+
const preferred = findAvailableModelId(preferredModelId, availableModelIds);
|
|
742
|
+
if (!preferred) return undefined;
|
|
743
|
+
return modelSatisfiesTier(preferred, tier) ? preferred : undefined;
|
|
744
|
+
}
|
|
745
|
+
|
|
666
746
|
/**
|
|
667
747
|
* Check whether a model ID is present in the available models list.
|
|
668
748
|
* Handles bare IDs ("claude-opus-4-6") and provider-prefixed IDs ("anthropic/claude-opus-4-6").
|
|
@@ -310,40 +310,29 @@ function _atomicWrite(basePath: string, content: string): void {
|
|
|
310
310
|
/**
|
|
311
311
|
* Acquire an exclusive lockfile for rewrite operations.
|
|
312
312
|
* Uses O_CREAT|O_EXCL for atomic creation — if the file exists, another
|
|
313
|
-
* process holds the lock.
|
|
314
|
-
* to avoid
|
|
313
|
+
* process holds the lock. Clears stale locks, then proceeds anyway
|
|
314
|
+
* (best-effort) to avoid blocking the UI.
|
|
315
315
|
*/
|
|
316
316
|
function _withLock<T>(basePath: string, fn: () => T): T {
|
|
317
317
|
const lockPath = join(basePath, ".gsd", LOCKFILE);
|
|
318
318
|
let fd: number | null = null;
|
|
319
|
-
const maxAttempts = 5;
|
|
320
|
-
const retryMs = 20;
|
|
321
319
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
}
|
|
337
|
-
} catch { /* can't read lock, retry */ }
|
|
338
|
-
|
|
339
|
-
// Wait and retry
|
|
340
|
-
const start = Date.now();
|
|
341
|
-
while (Date.now() - start < retryMs) { /* spin */ }
|
|
342
|
-
continue;
|
|
343
|
-
}
|
|
344
|
-
// Other error — proceed without lock
|
|
345
|
-
break;
|
|
320
|
+
try {
|
|
321
|
+
mkdirSync(join(basePath, ".gsd"), { recursive: true });
|
|
322
|
+
fd = openSync(lockPath, "wx");
|
|
323
|
+
} catch (err: any) {
|
|
324
|
+
if (err?.code === "EEXIST") {
|
|
325
|
+
// Check if lock is stale (older than 5s)
|
|
326
|
+
try {
|
|
327
|
+
const stat = readFileSync(lockPath, "utf-8");
|
|
328
|
+
const lockTime = parseInt(stat, 10);
|
|
329
|
+
if (Date.now() - lockTime > 5000) {
|
|
330
|
+
try { unlinkSync(lockPath); } catch { /* race ok */ }
|
|
331
|
+
try { fd = openSync(lockPath, "wx"); } catch { /* race ok */ }
|
|
332
|
+
}
|
|
333
|
+
} catch { /* proceed without lock */ }
|
|
346
334
|
}
|
|
335
|
+
// Any lock acquisition error leaves fd null; proceed without lock.
|
|
347
336
|
}
|
|
348
337
|
|
|
349
338
|
// Best-effort: mutation runs regardless of lock status (idempotent overwrites).
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// GSD Extension — Desktop Notification Helper
|
|
2
2
|
// Cross-platform desktop notifications for auto-mode events.
|
|
3
3
|
|
|
4
|
-
import
|
|
4
|
+
import childProcess from "node:child_process";
|
|
5
|
+
import { accessSync, constants } from "node:fs";
|
|
6
|
+
import { delimiter, resolve } from "node:path";
|
|
5
7
|
import type { NotificationPreferences } from "./types.js";
|
|
6
8
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
7
9
|
import { sendRemoteNotification as _sendRemoteNotification } from "../remote-questions/notify.js";
|
|
@@ -25,6 +27,8 @@ interface BellStream {
|
|
|
25
27
|
write(chunk: string): unknown;
|
|
26
28
|
}
|
|
27
29
|
|
|
30
|
+
const executablePathCache = new Map<string, string | null>();
|
|
31
|
+
|
|
28
32
|
/**
|
|
29
33
|
* Send a native desktop notification. Non-blocking, non-fatal.
|
|
30
34
|
* macOS: osascript, Linux: notify-send, Windows: skipped.
|
|
@@ -73,13 +77,26 @@ export function sendDesktopNotification(
|
|
|
73
77
|
try {
|
|
74
78
|
const command = buildDesktopNotificationCommand(process.platform, title, message, level);
|
|
75
79
|
if (!command) return;
|
|
76
|
-
|
|
80
|
+
launchDesktopNotification(command);
|
|
77
81
|
} catch {
|
|
78
82
|
// Non-fatal — desktop notifications are best-effort
|
|
79
83
|
}
|
|
80
84
|
}).catch(() => {});
|
|
81
85
|
}
|
|
82
86
|
|
|
87
|
+
export function launchDesktopNotification(command: NotificationCommand): void {
|
|
88
|
+
try {
|
|
89
|
+
const child = childProcess.spawn(command.file, command.args, {
|
|
90
|
+
detached: true,
|
|
91
|
+
stdio: "ignore",
|
|
92
|
+
});
|
|
93
|
+
child.on("error", () => {});
|
|
94
|
+
child.unref();
|
|
95
|
+
} catch {
|
|
96
|
+
// Non-fatal — desktop notifications are best-effort
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
83
100
|
export function shouldSendDesktopNotification(
|
|
84
101
|
kind: NotificationKind,
|
|
85
102
|
preferences: NotificationPreferences | undefined = loadEffectiveGSDPreferences()?.preferences.notifications,
|
|
@@ -194,11 +211,25 @@ function escapeAppleScript(s: string): string {
|
|
|
194
211
|
* Non-fatal — returns null on any error.
|
|
195
212
|
*/
|
|
196
213
|
function findExecutable(name: string): string | null {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
214
|
+
if (executablePathCache.has(name)) return executablePathCache.get(name) ?? null;
|
|
215
|
+
|
|
216
|
+
let resolved: string | null = null;
|
|
217
|
+
const path = process.env.PATH;
|
|
218
|
+
if (path) {
|
|
219
|
+
for (const dir of path.split(delimiter)) {
|
|
220
|
+
const candidate = resolve(dir || ".", name);
|
|
221
|
+
try {
|
|
222
|
+
accessSync(candidate, constants.X_OK);
|
|
223
|
+
resolved = candidate;
|
|
224
|
+
break;
|
|
225
|
+
} catch {
|
|
226
|
+
// keep searching PATH
|
|
227
|
+
}
|
|
228
|
+
}
|
|
201
229
|
}
|
|
230
|
+
|
|
231
|
+
executablePathCache.set(name, resolved);
|
|
232
|
+
return resolved;
|
|
202
233
|
}
|
|
203
234
|
|
|
204
235
|
function resolveBellStream(): BellStream | null {
|