@opengsd/gsd-pi 1.2.0-dev.fbdca60b → 1.3.0-dev.65546769
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 +13 -7
- package/dist/cli.js +28 -1
- package/dist/headless-context.js +0 -1
- package/dist/headless-events.d.ts +16 -1
- package/dist/headless-events.js +19 -2
- package/dist/headless.js +8 -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/onboarding.js +9 -4
- package/dist/provider-migrations.d.ts +23 -0
- package/dist/provider-migrations.js +41 -0
- 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/stream-adapter.js +73 -20
- package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
- 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 +50 -10
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +81 -19
- package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +47 -8
- package/dist/resources/extensions/gsd/auto-model-selection.js +14 -8
- package/dist/resources/extensions/gsd/auto-post-unit.js +39 -29
- package/dist/resources/extensions/gsd/auto-prompts.js +44 -30
- package/dist/resources/extensions/gsd/auto-recovery.js +118 -40
- package/dist/resources/extensions/gsd/auto-runtime-state.js +13 -0
- package/dist/resources/extensions/gsd/auto-start.js +58 -31
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +149 -91
- package/dist/resources/extensions/gsd/auto.js +97 -31
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +42 -54
- package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +24 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +108 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +164 -44
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +113 -27
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +92 -4
- package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
- 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/core.js +52 -8
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +227 -3
- package/dist/resources/extensions/gsd/commands-cmux.js +3 -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 +14 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
- 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 +11 -8
- 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 +39 -3
- package/dist/resources/extensions/gsd/db/engine.js +27 -0
- package/dist/resources/extensions/gsd/db/queries.js +54 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
- package/dist/resources/extensions/gsd/db-workspace.js +13 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
- package/dist/resources/extensions/gsd/doctor-git-checks.js +30 -4
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -24
- 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/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 +176 -0
- package/dist/resources/extensions/gsd/forensics.js +2 -1
- package/dist/resources/extensions/gsd/git-service.js +7 -4
- package/dist/resources/extensions/gsd/gitignore.js +6 -2
- package/dist/resources/extensions/gsd/guidance.js +7 -7
- package/dist/resources/extensions/gsd/guided-flow.js +11 -6
- package/dist/resources/extensions/gsd/layout-policy.js +75 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +391 -116
- 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/metrics.js +19 -11
- 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 +51 -6
- package/dist/resources/extensions/gsd/migration-auto-check.js +5 -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 +50 -19
- 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/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 +34 -14
- package/dist/resources/extensions/gsd/preferences.js +148 -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 +37 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +24 -15
- 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/execute-task.md +5 -1
- 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-phase.md +34 -0
- package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- 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/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- 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/run-uat.md +5 -1
- 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/triage-captures.md +1 -1
- 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/provider-error-guidance.js +24 -0
- package/dist/resources/extensions/gsd/queue-order.js +3 -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/safety/content-validator.js +2 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
- package/dist/resources/extensions/gsd/service-tier.js +2 -1
- package/dist/resources/extensions/gsd/session-lock.js +11 -9
- 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-reconciliation/drift/artifact-db.js +51 -10
- 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 +95 -19
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +36 -3
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +12 -0
- package/dist/resources/extensions/gsd/state.js +48 -17
- 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 +4 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +12 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +15 -1
- package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
- package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -3
- package/dist/resources/extensions/gsd/tools/plan-task.js +16 -1
- 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/tui/render-kit.js +38 -13
- package/dist/resources/extensions/gsd/undo.js +8 -9
- package/dist/resources/extensions/gsd/unit-registry.js +27 -3
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +58 -2
- package/dist/resources/extensions/gsd/validation-block-guard.js +45 -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-logger.js +4 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +25 -4
- 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 +109 -16
- package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
- package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
- package/dist/resources/extensions/mcp-client/manager.js +3 -3
- package/dist/resources/extensions/search-the-web/index.js +41 -9
- package/dist/resources/extensions/search-the-web/native-search.js +18 -4
- package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
- package/dist/resources/extensions/subagent/index.js +20 -15
- package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
- 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 +8 -8
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
- 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.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/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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-paths-manifest.json +8 -8
- 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/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.8e446784528ed9dc.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/8785.481aa5869991b760.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-f0285ce91d4ec9ef.js → webpack-f46ea08200a0227e.js} +1 -1
- 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 +8 -7
- 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/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -2
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -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 +37 -15
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +69 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +223 -32
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
- 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 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -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.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +9 -2
- 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 +31 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.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 +3 -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 +10 -0
- 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 +29 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +82 -3
- package/packages/mcp-server/dist/server.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 +9 -0
- 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/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +6 -1
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +1 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/select-list.js +8 -2
- package/packages/pi-tui/dist/components/select-list.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +22 -22
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
- package/src/resources/extensions/claude-code-cli/index.ts +8 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +83 -20
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +47 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +182 -10
- package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
- package/src/resources/extensions/gsd/auto/loop.ts +69 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +63 -10
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +13 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +83 -20
- package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +57 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +27 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -31
- package/src/resources/extensions/gsd/auto-prompts.ts +45 -30
- package/src/resources/extensions/gsd/auto-recovery.ts +126 -37
- package/src/resources/extensions/gsd/auto-runtime-state.ts +13 -0
- package/src/resources/extensions/gsd/auto-start.ts +82 -36
- package/src/resources/extensions/gsd/auto-verification.ts +5 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -15
- package/src/resources/extensions/gsd/auto.ts +133 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +45 -61
- package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +123 -9
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +185 -46
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +138 -29
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
- 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/core.ts +58 -8
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +230 -3
- package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
- 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 +13 -0
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
- 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 +24 -9
- 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 +41 -4
- package/src/resources/extensions/gsd/db/engine.ts +26 -0
- package/src/resources/extensions/gsd/db/queries.ts +78 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
- package/src/resources/extensions/gsd/db-workspace.ts +15 -0
- package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
- package/src/resources/extensions/gsd/doctor-git-checks.ts +28 -3
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +12 -25
- package/src/resources/extensions/gsd/doctor-types.ts +1 -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/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 +205 -0
- package/src/resources/extensions/gsd/forensics.ts +2 -1
- package/src/resources/extensions/gsd/git-constants.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +7 -2
- package/src/resources/extensions/gsd/gitignore.ts +7 -3
- package/src/resources/extensions/gsd/guidance.ts +7 -7
- package/src/resources/extensions/gsd/guided-flow.ts +11 -6
- package/src/resources/extensions/gsd/layout-policy.ts +85 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +404 -104
- 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/metrics.ts +23 -10
- 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 +49 -6
- package/src/resources/extensions/gsd/migration-auto-check.ts +4 -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 +49 -19
- 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/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 +47 -13
- package/src/resources/extensions/gsd/preferences.ts +188 -14
- 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 +37 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +24 -15
- 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/execute-task.md +5 -1
- 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-phase.md +34 -0
- package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- 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/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- 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/run-uat.md +5 -1
- 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/triage-captures.md +1 -1
- 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/provider-error-guidance.ts +32 -0
- package/src/resources/extensions/gsd/queue-order.ts +3 -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/safety/content-validator.ts +2 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
- package/src/resources/extensions/gsd/service-tier.ts +2 -0
- package/src/resources/extensions/gsd/session-lock.ts +15 -13
- 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-reconciliation/drift/artifact-db.ts +58 -14
- 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 +98 -26
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +36 -3
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +12 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
- package/src/resources/extensions/gsd/state.ts +57 -15
- 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/auto-artifact-paths.test.ts +322 -1
- package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
- package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
- 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-model-selection-tool-poisoning.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +28 -22
- 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 +19 -2
- package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
- 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 +862 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
- 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-prompt-rendering.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -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/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-db-degradation-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +38 -49
- package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
- 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/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-lock.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +114 -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/flat-rate-routing-guard.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
- 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/integration/auto-recovery.test.ts +19 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
- 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/interactive-routing-bypass.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +372 -0
- package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/loop.test.ts +60 -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/metrics-ledger-cap.test.ts +239 -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 +343 -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/oauth-api-model-routing.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +339 -0
- 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/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.test.ts +58 -23
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +4 -4
- 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/preferences.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
- package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +107 -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/reconcile-logs.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -4
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
- 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/state-reconciliation-drift.test.ts +155 -58
- 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/thinking-level-resolution.test.ts +1 -1
- 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/tui-header-lifecycle.test.ts +40 -86
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/undo.test.ts +39 -37
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +72 -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 +51 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +90 -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-mcp-preflight.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +34 -8
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +64 -8
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
- 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 +4 -7
- package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +15 -1
- package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
- package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -3
- package/src/resources/extensions/gsd/tools/plan-task.ts +17 -1
- 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/tui/render-kit.ts +56 -13
- package/src/resources/extensions/gsd/undo.ts +8 -9
- package/src/resources/extensions/gsd/unit-registry.ts +27 -3
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +60 -1
- package/src/resources/extensions/gsd/validation-block-guard.ts +46 -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-logger.ts +5 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +24 -4
- 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 +122 -16
- package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
- package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
- package/src/resources/extensions/mcp-client/manager.ts +3 -3
- package/src/resources/extensions/search-the-web/index.ts +45 -9
- package/src/resources/extensions/search-the-web/native-search.ts +16 -4
- package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
- package/src/resources/extensions/subagent/index.ts +20 -15
- package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
- package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
- /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_ssgManifest.js +0 -0
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { existsSync } from "node:fs";
|
|
8
8
|
import { getMilestone, isDbAvailable } from "../../gsd-db.js";
|
|
9
9
|
import { findMilestoneIds } from "../../milestone-ids.js";
|
|
10
|
-
import { resolveMilestoneFile } from "../../paths.js";
|
|
10
|
+
import { resolveMilestoneFile, resolveMilestonePath } from "../../paths.js";
|
|
11
11
|
function milestoneHasContent(basePath, milestoneId) {
|
|
12
12
|
const roadmap = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
13
13
|
const context = resolveMilestoneFile(basePath, milestoneId, "CONTEXT");
|
|
@@ -31,12 +31,25 @@ export function detectUnregisteredMilestoneDrift(_state, ctx) {
|
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Repair intentionally fails closed. The project-root DB is authoritative at
|
|
34
|
-
* runtime; markdown-only milestones must be
|
|
35
|
-
*
|
|
34
|
+
* runtime; markdown-only milestones must be reconciled through an explicit,
|
|
35
|
+
* operator-controlled action so operators opt into changing canonical state.
|
|
36
|
+
*
|
|
37
|
+
* The hint deliberately leads with the *targeted*, non-destructive options. The
|
|
38
|
+
* common cause of this drift is a directory left under an old ID after a
|
|
39
|
+
* `unique_milestone_ids` rename, where the right fix is to rename (move) the
|
|
40
|
+
* directory — not a full DB reimport. `/gsd recover --confirm` is a destructive
|
|
41
|
+
* clear-and-reimport of the entire DB and is offered only as a last resort, so
|
|
42
|
+
* users do not reach for it expecting a targeted repair (see issue #826).
|
|
36
43
|
*/
|
|
37
|
-
export function repairUnregisteredMilestone(record,
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
export function repairUnregisteredMilestone(record, ctx) {
|
|
45
|
+
const dir = resolveMilestonePath(ctx.basePath, record.milestoneId);
|
|
46
|
+
const dirHint = dir ?? `the .gsd directory for ${record.milestoneId}`;
|
|
47
|
+
throw new Error(`Milestone ${record.milestoneId} exists only as markdown projection ` +
|
|
48
|
+
"(on-disk ROADMAP/CONTEXT/SUMMARY with no authoritative DB row). " +
|
|
49
|
+
"Runtime reconciliation will not import markdown into the DB. Choose one:\n" +
|
|
50
|
+
` • Rename: if this directory is the same milestone under an old ID (e.g. a unique_milestone_ids rename), move \`${dirHint}\` to the current ID's directory and re-run.\n` +
|
|
51
|
+
` • Discard: if this milestone is no longer relevant, delete \`${dirHint}\` and re-run.\n` +
|
|
52
|
+
" • Last resort: `/gsd recover --confirm` performs a destructive full DB clear-and-reimport — it does NOT do a targeted import and can replace or duplicate existing DB milestones.");
|
|
40
53
|
}
|
|
41
54
|
export const unregisteredMilestoneHandler = {
|
|
42
55
|
kind: "unregistered-milestone",
|
|
@@ -40,6 +40,7 @@ function milestoneHasDivergence(basePath, milestoneId) {
|
|
|
40
40
|
}
|
|
41
41
|
const dbSlices = getMilestoneSlices(milestoneId);
|
|
42
42
|
const dbSliceMap = new Map(dbSlices.map((s) => [s.id, s]));
|
|
43
|
+
const dbSliceOrder = new Map(dbSlices.map((s, index) => [s.id, index]));
|
|
43
44
|
const readySliceIds = getSlicesReadyForDivergenceCheck(milestoneId, dbSlices);
|
|
44
45
|
if (dbSlices.length > 0 && readySliceIds.size === 0) {
|
|
45
46
|
return false;
|
|
@@ -48,13 +49,12 @@ function milestoneHasDivergence(basePath, milestoneId) {
|
|
|
48
49
|
for (let i = 0; i < roadmap.slices.length; i++) {
|
|
49
50
|
const roadmapSlice = roadmap.slices[i];
|
|
50
51
|
roadmapSliceIds.add(roadmapSlice.id);
|
|
51
|
-
const expectedSequence = i + 1;
|
|
52
52
|
const dbSlice = dbSliceMap.get(roadmapSlice.id);
|
|
53
53
|
if (!dbSlice)
|
|
54
54
|
return true; // Roadmap has a slice the DB doesn't.
|
|
55
55
|
if (!readySliceIds.has(dbSlice.id))
|
|
56
56
|
continue;
|
|
57
|
-
if (dbSlice.
|
|
57
|
+
if (dbSliceOrder.get(dbSlice.id) !== i)
|
|
58
58
|
return true;
|
|
59
59
|
if (!arraysEqual(dbSlice.depends, roadmapSlice.depends))
|
|
60
60
|
return true;
|
|
@@ -5,11 +5,9 @@
|
|
|
5
5
|
// the detect+repair composition moves here. The previous repairStaleRenders
|
|
6
6
|
// had zero callers in production code — wiring it through
|
|
7
7
|
// reconcileBeforeDispatch closes that gap.
|
|
8
|
-
import { existsSync } from "node:fs";
|
|
9
|
-
import { dirname, join } from "node:path";
|
|
10
8
|
import { detectStaleRenders, renderPlanCheckboxes, renderRoadmapFromDb, renderSliceSummary, renderTaskSummary, } from "../../markdown-renderer.js";
|
|
11
|
-
import { getMilestone, getSlice, setSliceSummaryMd } from "../../gsd-db.js";
|
|
12
|
-
import {
|
|
9
|
+
import { getMilestone, getMilestoneSlices, getSlice, getSliceTasks, setSliceSummaryMd } from "../../gsd-db.js";
|
|
10
|
+
import { resolveSliceFile } from "../../paths.js";
|
|
13
11
|
import { logWarning } from "../../workflow-logger.js";
|
|
14
12
|
// ─── Core (basePath-only — usable by both drift API and legacy wrapper) ──────
|
|
15
13
|
function detectStaleRenderDriftFromBasePath(basePath) {
|
|
@@ -50,17 +48,31 @@ function canonicalizeMilestoneId(dirSegment) {
|
|
|
50
48
|
const baseId = dirSegment.match(/^(M\d+)(?:$|-)/i)?.[1];
|
|
51
49
|
if (baseId && getMilestone(baseId))
|
|
52
50
|
return baseId;
|
|
51
|
+
// Flat-phase: e.g. 01-test → M001
|
|
52
|
+
const phaseMatch = dirSegment.match(/^(\d+)-/);
|
|
53
|
+
if (phaseMatch) {
|
|
54
|
+
const flatId = `M${String(parseInt(phaseMatch[1], 10)).padStart(3, "0")}`;
|
|
55
|
+
if (getMilestone(flatId))
|
|
56
|
+
return flatId;
|
|
57
|
+
}
|
|
53
58
|
return suffixId ?? baseId ?? dirSegment;
|
|
54
59
|
}
|
|
55
60
|
function resolveRoadmapMilestoneIdFromPath(normPath) {
|
|
56
|
-
|
|
61
|
+
// Flat-phase: phases/NN-slug/NN-ROADMAP.md
|
|
62
|
+
// Legacy: milestones/MID/MID-ROADMAP.md
|
|
63
|
+
const milestoneMatch = normPath.match(/phases\/([^/]+)\//)
|
|
64
|
+
|| normPath.match(/milestones\/([^/]+)\//);
|
|
57
65
|
if (!milestoneMatch) {
|
|
58
66
|
throw new Error(`stale-render drift: roadmap path missing milestone segment: ${normPath}`);
|
|
59
67
|
}
|
|
60
68
|
const fileMatch = normPath.match(/(?:^|\/)([^/]+)-ROADMAP\.md$/i);
|
|
69
|
+
// For flat-phase, derive milestone id from phase number prefix
|
|
70
|
+
const phaseNumMatch = milestoneMatch[1].match(/^(\d+)-/);
|
|
71
|
+
const phaseDerivedId = phaseNumMatch ? `M${String(parseInt(phaseNumMatch[1], 10)).padStart(3, "0")}` : null;
|
|
61
72
|
const candidates = [
|
|
62
73
|
fileMatch?.[1],
|
|
63
74
|
milestoneMatch[1],
|
|
75
|
+
phaseDerivedId,
|
|
64
76
|
fileMatch?.[1]?.match(/^(M\d+)/i)?.[1],
|
|
65
77
|
milestoneMatch[1].match(/^(M\d+)/i)?.[1],
|
|
66
78
|
].filter((candidate) => !!candidate);
|
|
@@ -78,12 +90,18 @@ async function repairStaleRenderFromBasePath(record, basePath) {
|
|
|
78
90
|
return;
|
|
79
91
|
}
|
|
80
92
|
if (reason.includes("in plan")) {
|
|
81
|
-
|
|
93
|
+
// Flat-phase: phases/NN-slug/NN-MM-PLAN.md
|
|
94
|
+
// Legacy: milestones/X/slices/Y/PLAN.md
|
|
95
|
+
const pathMatch = normPath.match(/phases\/([^/]+)\/(\d+)-(\d+)-PLAN/)
|
|
96
|
+
|| normPath.match(/milestones\/([^/]+)\/slices\/([^/]+)\//);
|
|
82
97
|
if (!pathMatch) {
|
|
83
98
|
throw new Error(`stale-render drift: plan path missing milestone/slice segments: ${record.renderPath}`);
|
|
84
99
|
}
|
|
85
100
|
const milestoneId = canonicalizeMilestoneId(pathMatch[1]);
|
|
86
|
-
const
|
|
101
|
+
const sliceId = pathMatch[2] && pathMatch[3] && /^\d+$/.test(pathMatch[2])
|
|
102
|
+
? `S${String(parseInt(pathMatch[3], 10)).padStart(2, "0")}`
|
|
103
|
+
: pathMatch[2];
|
|
104
|
+
const wrote = await renderPlanCheckboxes(basePath, milestoneId, sliceId, record.renderPath);
|
|
87
105
|
if (!wrote) {
|
|
88
106
|
throw new Error(`stale-render drift: plan re-render wrote nothing for ${milestoneId}/${pathMatch[2]} ` +
|
|
89
107
|
`(${record.renderPath}); slice has no tasks or its path is unresolvable`);
|
|
@@ -91,31 +109,77 @@ async function repairStaleRenderFromBasePath(record, basePath) {
|
|
|
91
109
|
return;
|
|
92
110
|
}
|
|
93
111
|
if (reason.includes("SUMMARY.md missing") && /^T\d+/.test(reason)) {
|
|
94
|
-
|
|
112
|
+
// Flat-phase: phases/NN-slug/ (no tasks/ subdir, task summaries in phase dir)
|
|
113
|
+
// Legacy: milestones/X/slices/Y/tasks/
|
|
114
|
+
const pathMatch = normPath.match(/phases\/([^/]+)\//)
|
|
115
|
+
|| normPath.match(/milestones\/([^/]+)\/slices\/([^/]+)\/tasks\//);
|
|
95
116
|
const taskMatch = reason.match(/^(T\d+)/);
|
|
96
117
|
if (!pathMatch || !taskMatch) {
|
|
97
118
|
throw new Error(`stale-render drift: task summary path/reason malformed: ${record.renderPath} reason=${reason}`);
|
|
98
119
|
}
|
|
99
120
|
const milestoneId = canonicalizeMilestoneId(pathMatch[1]);
|
|
100
|
-
|
|
121
|
+
// In flat-phase there's no slice segment in the path; find the task's slice from DB.
|
|
122
|
+
let sliceId;
|
|
123
|
+
if (pathMatch[2]) {
|
|
124
|
+
sliceId = pathMatch[2];
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Flat-phase: scan milestone's slices for the task
|
|
128
|
+
let foundSliceId;
|
|
129
|
+
for (const s of getMilestoneSlices(milestoneId)) {
|
|
130
|
+
if (getSliceTasks(milestoneId, s.id).some(t => t.id === taskMatch[1])) {
|
|
131
|
+
foundSliceId = s.id;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (!foundSliceId) {
|
|
136
|
+
throw new Error(`stale-render drift: task ${taskMatch[1]} not found in any slice of ${milestoneId} (${record.renderPath})`);
|
|
137
|
+
}
|
|
138
|
+
sliceId = foundSliceId;
|
|
139
|
+
}
|
|
140
|
+
const wrote = await renderTaskSummary(basePath, milestoneId, sliceId, taskMatch[1]);
|
|
101
141
|
if (!wrote) {
|
|
102
142
|
throw new Error(`stale-render drift: task summary re-render wrote nothing for ` +
|
|
103
|
-
`${milestoneId}/${
|
|
143
|
+
`${milestoneId}/${sliceId}/${taskMatch[1]} (${record.renderPath}); ` +
|
|
104
144
|
`task has no summary in DB or its slice path is unresolvable`);
|
|
105
145
|
}
|
|
106
146
|
return;
|
|
107
147
|
}
|
|
108
148
|
if (reason.includes("SUMMARY.md missing") && /^S\d+/.test(reason)) {
|
|
109
|
-
|
|
149
|
+
// Flat-phase: phases/NN-slug/NN-MM-SUMMARY.md or phases/NN-slug/NN-SUMMARY.md
|
|
150
|
+
// Legacy: milestones/X/slices/Y/SUMMARY.md
|
|
151
|
+
const pathMatch = normPath.match(/phases\/([^/]+)\/(\d+)-(\d+)-SUMMARY/)
|
|
152
|
+
|| normPath.match(/phases\/([^/]+)\/(\d+)-SUMMARY/)
|
|
153
|
+
|| normPath.match(/milestones\/([^/]+)\/slices\/([^/]+)\//);
|
|
110
154
|
if (!pathMatch) {
|
|
111
155
|
throw new Error(`stale-render drift: slice summary path missing milestone/slice segments: ${record.renderPath}`);
|
|
112
156
|
}
|
|
113
|
-
|
|
114
|
-
|
|
157
|
+
// Flat-phase: groups are (phaseDir, phaseNum, planNum) for NN-MM-SUMMARY,
|
|
158
|
+
// or (phaseDir, phaseNum) for NN-SUMMARY (phase-level). In the latter case,
|
|
159
|
+
// derive slice from the reason text which starts with S\d+.
|
|
160
|
+
// Legacy: groups are (milestoneDir, sliceDir).
|
|
161
|
+
let milestoneId;
|
|
162
|
+
let sliceId;
|
|
163
|
+
milestoneId = canonicalizeMilestoneId(pathMatch[1]);
|
|
164
|
+
if (pathMatch[3] && /^\d+$/.test(pathMatch[2])) {
|
|
165
|
+
// NN-MM-SUMMARY: pathMatch[3] is the plan number
|
|
166
|
+
sliceId = `S${String(parseInt(pathMatch[3], 10)).padStart(2, "0")}`;
|
|
167
|
+
}
|
|
168
|
+
else if (pathMatch[2] && /^S\d+/.test(pathMatch[2])) {
|
|
169
|
+
// Legacy: pathMatch[2] is the slice dir name
|
|
170
|
+
sliceId = pathMatch[2];
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// NN-SUMMARY (phase-level): derive slice from reason
|
|
174
|
+
const reasonSlice = reason.match(/^(S\d+)/);
|
|
175
|
+
sliceId = reasonSlice ? reasonSlice[1] : "S01";
|
|
176
|
+
}
|
|
115
177
|
const slice = getSlice(milestoneId, sliceId);
|
|
116
|
-
|
|
178
|
+
// Use resolveSliceFile so the UAT existence check matches the NN-MM-UAT.md
|
|
179
|
+
// name that renderSliceSummary actually writes (buildSliceFileName only yields MM-UAT.md).
|
|
180
|
+
const uatPath = resolveSliceFile(basePath, milestoneId, sliceId, "UAT");
|
|
117
181
|
// renderSliceSummary writes both artifacts, so clear deleted UAT first.
|
|
118
|
-
if (slice?.full_uat_md && !
|
|
182
|
+
if (slice?.full_uat_md && !uatPath) {
|
|
119
183
|
setSliceSummaryMd(milestoneId, sliceId, slice.full_summary_md ?? "", "");
|
|
120
184
|
}
|
|
121
185
|
const wrote = await renderSliceSummary(basePath, milestoneId, sliceId);
|
|
@@ -127,14 +191,26 @@ async function repairStaleRenderFromBasePath(record, basePath) {
|
|
|
127
191
|
return;
|
|
128
192
|
}
|
|
129
193
|
if (reason.includes("UAT.md missing")) {
|
|
130
|
-
|
|
194
|
+
// Flat-phase: phases/NN-slug/NN-MM-UAT.md or phases/NN-slug/NN-UAT.md
|
|
195
|
+
// Legacy: milestones/X/slices/Y/UAT.md
|
|
196
|
+
const pathMatch = normPath.match(/phases\/([^/]+)\/(\d+)-(\d+)-UAT/)
|
|
197
|
+
|| normPath.match(/phases\/([^/]+)\/(\d+)-UAT/)
|
|
198
|
+
|| normPath.match(/milestones\/([^/]+)\/slices\/([^/]+)\//);
|
|
131
199
|
if (!pathMatch) {
|
|
132
200
|
throw new Error(`stale-render drift: UAT path missing milestone/slice segments: ${record.renderPath}`);
|
|
133
201
|
}
|
|
134
|
-
// When UAT.md is removed from disk, mirror that intent by clearing stale
|
|
135
|
-
// persisted UAT content instead of rehydrating it back onto disk.
|
|
136
202
|
const milestoneId = canonicalizeMilestoneId(pathMatch[1]);
|
|
137
|
-
|
|
203
|
+
let sliceId;
|
|
204
|
+
if (pathMatch[3] && /^\d+$/.test(pathMatch[2])) {
|
|
205
|
+
sliceId = `S${String(parseInt(pathMatch[3], 10)).padStart(2, "0")}`;
|
|
206
|
+
}
|
|
207
|
+
else if (pathMatch[2] && /^S\d+/.test(pathMatch[2])) {
|
|
208
|
+
sliceId = pathMatch[2];
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const reasonSlice = reason.match(/(S\d+)/);
|
|
212
|
+
sliceId = reasonSlice ? reasonSlice[1] : "S01";
|
|
213
|
+
}
|
|
138
214
|
const slice = getSlice(milestoneId, sliceId);
|
|
139
215
|
if (!slice) {
|
|
140
216
|
throw new Error(`stale-render drift: missing slice for UAT clear ${milestoneId}/${sliceId}`);
|
|
@@ -29,16 +29,49 @@ const defaultDeps = {
|
|
|
29
29
|
* - any repair function throws within a pass, or
|
|
30
30
|
* - drift persists after the cap.
|
|
31
31
|
*/
|
|
32
|
-
export async function reconcileBeforeDispatch(basePath,
|
|
32
|
+
export async function reconcileBeforeDispatch(basePath, partialDeps = {}) {
|
|
33
|
+
const deps = { ...defaultDeps, ...partialDeps };
|
|
33
34
|
const registry = deps.registry ?? DRIFT_REGISTRY;
|
|
34
35
|
const clearParseCache = deps.clearParseCache ?? defaultClearParseCache;
|
|
35
36
|
const repaired = [];
|
|
37
|
+
// Capture-on-first-read: infer .planning/ layout, import content into DB, and
|
|
38
|
+
// activate the compat marker. Skipped in dry-run mode to keep the reconcile
|
|
39
|
+
// pass fully read-only — no marker writes.
|
|
40
|
+
if (!deps.dryRun) {
|
|
41
|
+
const { capturePlanningCompatIfNeeded } = await import("../compat/planning-compat.js");
|
|
42
|
+
await capturePlanningCompatIfNeeded(basePath);
|
|
43
|
+
}
|
|
36
44
|
for (let pass = 0; pass < MAX_PASSES; pass++) {
|
|
37
45
|
deps.invalidateStateCache();
|
|
38
46
|
const stateSnapshot = await deps.deriveState(basePath, deps.deriveStateOptions);
|
|
39
|
-
const ctx = { basePath, state: stateSnapshot };
|
|
47
|
+
const ctx = { basePath, state: stateSnapshot, dryRun: deps.dryRun };
|
|
40
48
|
const detection = await detectAllDrift(stateSnapshot, ctx, registry);
|
|
41
49
|
const drift = detection.records;
|
|
50
|
+
if (deps.dryRun && drift.length > 0) {
|
|
51
|
+
const wouldRepair = [];
|
|
52
|
+
const blockers = [...detection.detectBlockers];
|
|
53
|
+
for (const record of drift) {
|
|
54
|
+
const handler = registry.find((h) => h.kind === record.kind);
|
|
55
|
+
const blocker = handler?.blocker ? await handler.blocker(record, ctx) : null;
|
|
56
|
+
if (blocker) {
|
|
57
|
+
blockers.push(blocker);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
wouldRepair.push(record);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
ok: true,
|
|
65
|
+
stateSnapshot,
|
|
66
|
+
repaired: wouldRepair,
|
|
67
|
+
blockers: [
|
|
68
|
+
...new Set([
|
|
69
|
+
...(stateSnapshot.blockers ?? []),
|
|
70
|
+
...blockers,
|
|
71
|
+
]),
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
42
75
|
if (drift.length === 0) {
|
|
43
76
|
return {
|
|
44
77
|
ok: true,
|
|
@@ -106,7 +139,7 @@ export async function reconcileBeforeDispatch(basePath, deps = defaultDeps) {
|
|
|
106
139
|
// After MAX_PASSES, one more derive+detect to verify nothing persists.
|
|
107
140
|
deps.invalidateStateCache();
|
|
108
141
|
const finalState = await deps.deriveState(basePath, deps.deriveStateOptions);
|
|
109
|
-
const finalCtx = { basePath, state: finalState };
|
|
142
|
+
const finalCtx = { basePath, state: finalState, dryRun: deps.dryRun };
|
|
110
143
|
const finalDetection = await detectAllDrift(finalState, finalCtx, registry);
|
|
111
144
|
const persistent = finalDetection.records;
|
|
112
145
|
if (persistent.length > 0) {
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
import { completionTimestampHandler } from "./drift/completion.js";
|
|
5
5
|
import { artifactDbStatusDivergenceHandler, completedMilestoneReopenedHandler, diskSliceIdDivergenceHandler, } from "./drift/artifact-db.js";
|
|
6
6
|
import { mergeStateHandler } from "./drift/merge-state.js";
|
|
7
|
+
import { externalMarkdownEditHandler } from "./drift/external-markdown-edit.js";
|
|
8
|
+
import { externalPlanningEditHandler } from "./drift/external-planning-edit.js";
|
|
7
9
|
import { unregisteredMilestoneHandler } from "./drift/project-md.js";
|
|
8
10
|
import { roadmapDivergenceHandler } from "./drift/roadmap.js";
|
|
9
11
|
import { sketchFlagHandler } from "./drift/sketch-flag.js";
|
|
@@ -15,6 +17,16 @@ import { staleWorkerHandler } from "./drift/stale-worker.js";
|
|
|
15
17
|
// by kind before invoking repair, so this is sound at runtime.
|
|
16
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
19
|
export const DRIFT_REGISTRY = [
|
|
20
|
+
// ⚠ ORDER IS SIGNIFICANT for repairs within a single pass.
|
|
21
|
+
// external-markdown-edit MUST run before any handler that re-projects
|
|
22
|
+
// markdown from DB (stale-render, roadmap-divergence). If a DB-projection
|
|
23
|
+
// handler runs first it overwrites the gsd-core file and the subsequent
|
|
24
|
+
// external-markdown-edit repair imports the already-overwritten content —
|
|
25
|
+
// silently discarding the cross-tool edit. With external-markdown-edit first
|
|
26
|
+
// the DB is updated to reflect the gsd-core edit before stale-render
|
|
27
|
+
// re-renders, so the canonical re-projection preserves the edit's intent.
|
|
28
|
+
externalMarkdownEditHandler,
|
|
29
|
+
externalPlanningEditHandler,
|
|
18
30
|
sketchFlagHandler,
|
|
19
31
|
mergeStateHandler,
|
|
20
32
|
staleRenderHandler,
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// must never be consulted when DB data is present.
|
|
11
11
|
import { parseRoadmap, parsePlan, } from './parsers-legacy.js';
|
|
12
12
|
import { parseSummary, loadFile, parseRequirementCounts, parseContextDependsOn, } from './files.js';
|
|
13
|
-
import { resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
|
|
13
|
+
import { buildMilestoneFileName, resolveFile, resolveMilestonePath, resolveMilestoneFile, resolveSlicePath, resolveSliceFile, resolveTaskFile, resolveTasksDir, resolveGsdRootFile, gsdRoot, } from './paths.js';
|
|
14
14
|
import { findMilestoneIds } from './milestone-ids.js';
|
|
15
15
|
import { loadQueueOrder, sortByQueueOrder } from './queue-order.js';
|
|
16
16
|
import { isClosedStatus, isDeferredStatus } from './status-guards.js';
|
|
@@ -23,8 +23,8 @@ import { logWarning } from './workflow-logger.js';
|
|
|
23
23
|
import { extractVerdict } from './verdict-parser.js';
|
|
24
24
|
import { detectPendingEscalation } from './escalation.js';
|
|
25
25
|
import { isTerminalMilestoneSummaryContent } from './milestone-summary-classifier.js';
|
|
26
|
-
import { isDbAvailable, getAllMilestones, getMilestone, getSlicesByMilestoneIds, getSliceTasks, getReplanHistory, getSlice, getRequirementCounts, getLatestAssessmentByScope, getPendingGateCountForTurn, } from './gsd-db.js';
|
|
27
|
-
import { wasWorkflowDatabaseOpenAttempted } from './db-workspace.js';
|
|
26
|
+
import { isDbAvailable, getAllMilestones, getMilestone, getSlicesByMilestoneIds, getSliceTasks, getReplanHistory, getSlice, getRequirementCounts, getLatestAssessmentByScope, getPendingGateCountForTurn, setMilestoneQueueOrder, } from './gsd-db.js';
|
|
27
|
+
import { openExistingWorkflowDatabase, wasWorkflowDatabaseOpenAttempted } from './db-workspace.js';
|
|
28
28
|
import { formatCompletePhaseNextAction, countUnmappedActiveRequirements } from './requirements-backlog.js';
|
|
29
29
|
import { classifyMilestoneReadiness, readinessNeedsDiscussion, } from './milestone-readiness.js';
|
|
30
30
|
import { needsAttentionBlockerGuidance as formatNeedsAttentionBlocker, needsRemediationBlockerGuidance as formatNeedsRemediationBlocker, } from './guidance.js';
|
|
@@ -189,6 +189,36 @@ async function loadRecentDecisions(basePath) {
|
|
|
189
189
|
export function invalidateStateCache() {
|
|
190
190
|
_stateCache = null;
|
|
191
191
|
}
|
|
192
|
+
function syncQueueOrderProjectionToDb(basePath) {
|
|
193
|
+
const queueOrder = loadQueueOrder(basePath);
|
|
194
|
+
if (!queueOrder)
|
|
195
|
+
return;
|
|
196
|
+
const currentIds = getAllMilestones().map((m) => m.id);
|
|
197
|
+
const desiredIds = sortByQueueOrder(currentIds, queueOrder);
|
|
198
|
+
if (currentIds.length === desiredIds.length && currentIds.every((id, i) => id === desiredIds[i]))
|
|
199
|
+
return;
|
|
200
|
+
setMilestoneQueueOrder(desiredIds);
|
|
201
|
+
}
|
|
202
|
+
function ensureExistingWorkflowDbOpen(basePath) {
|
|
203
|
+
const opened = isDbAvailable() || openExistingWorkflowDatabase(basePath).ok;
|
|
204
|
+
if (opened)
|
|
205
|
+
syncQueueOrderProjectionToDb(basePath);
|
|
206
|
+
return opened;
|
|
207
|
+
}
|
|
208
|
+
function buildDbUnavailableState() {
|
|
209
|
+
return {
|
|
210
|
+
activeMilestone: null,
|
|
211
|
+
activeSlice: null,
|
|
212
|
+
activeTask: null,
|
|
213
|
+
phase: "pre-planning",
|
|
214
|
+
recentDecisions: [],
|
|
215
|
+
blockers: ["DB unavailable — runtime markdown state derivation is disabled"],
|
|
216
|
+
nextAction: "Open or create the canonical GSD database before deriving workflow state. If this project only has markdown state, run /gsd migrate explicitly.",
|
|
217
|
+
registry: [],
|
|
218
|
+
requirements: { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 },
|
|
219
|
+
progress: { milestones: { done: 0, total: 0 } },
|
|
220
|
+
};
|
|
221
|
+
}
|
|
192
222
|
/**
|
|
193
223
|
* Returns the ID of the first incomplete milestone, or null if all are complete.
|
|
194
224
|
*/
|
|
@@ -219,6 +249,7 @@ export async function getActiveMilestoneId(basePath) {
|
|
|
219
249
|
}
|
|
220
250
|
// DB-first: query milestones table for the first non-complete, non-parked milestone
|
|
221
251
|
if (isDbAvailable()) {
|
|
252
|
+
syncQueueOrderProjectionToDb(basePath);
|
|
222
253
|
const allMilestones = getAllMilestones();
|
|
223
254
|
if (allMilestones.length > 0) {
|
|
224
255
|
for (const m of allMilestones) {
|
|
@@ -282,6 +313,7 @@ export async function deriveState(basePath, opts) {
|
|
|
282
313
|
// DB-backed derivation is authoritative whenever the DB is open. Runtime
|
|
283
314
|
// degrade must not infer state from ROADMAP.md, PLAN.md, SUMMARY.md,
|
|
284
315
|
// REQUIREMENTS.md, or flag files.
|
|
316
|
+
ensureExistingWorkflowDbOpen(basePath);
|
|
285
317
|
if (isDbAvailable()) {
|
|
286
318
|
const stopDbTimer = debugTime("derive-state-db");
|
|
287
319
|
result = await deriveStateFromDb(basePath, opts?.projectRootForReads ?? basePath);
|
|
@@ -292,18 +324,7 @@ export async function deriveState(basePath, opts) {
|
|
|
292
324
|
if (wasWorkflowDatabaseOpenAttempted()) {
|
|
293
325
|
logWarning("state", "DB unavailable — refusing implicit markdown state derivation");
|
|
294
326
|
}
|
|
295
|
-
result =
|
|
296
|
-
activeMilestone: null,
|
|
297
|
-
activeSlice: null,
|
|
298
|
-
activeTask: null,
|
|
299
|
-
phase: "pre-planning",
|
|
300
|
-
recentDecisions: [],
|
|
301
|
-
blockers: ["DB unavailable — runtime markdown state derivation is disabled"],
|
|
302
|
-
nextAction: "Open or create the canonical GSD database before deriving workflow state. If this project only has markdown state, run /gsd migrate explicitly.",
|
|
303
|
-
registry: [],
|
|
304
|
-
requirements: { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 },
|
|
305
|
-
progress: { milestones: { done: 0, total: 0 } },
|
|
306
|
-
};
|
|
327
|
+
result = buildDbUnavailableState();
|
|
307
328
|
}
|
|
308
329
|
result.recentDecisions = await loadRecentDecisions(cacheKey);
|
|
309
330
|
stopTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
@@ -359,6 +380,12 @@ function buildCompletenessSet(basePath, milestones) {
|
|
|
359
380
|
}
|
|
360
381
|
return { completeMilestoneIds, parkedMilestoneIds };
|
|
361
382
|
}
|
|
383
|
+
function milestoneArtifactExistsInResolvedDir(milestoneDir, milestoneId, suffix) {
|
|
384
|
+
if (!milestoneDir)
|
|
385
|
+
return false;
|
|
386
|
+
const flatPath = join(milestoneDir, buildMilestoneFileName(milestoneId, suffix));
|
|
387
|
+
return existsSync(flatPath) || resolveFile(milestoneDir, milestoneId, suffix) !== null;
|
|
388
|
+
}
|
|
362
389
|
async function buildRegistryAndFindActive(basePath, milestones, completeMilestoneIds, parkedMilestoneIds) {
|
|
363
390
|
const registry = [];
|
|
364
391
|
let activeMilestone = null;
|
|
@@ -386,8 +413,9 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
|
|
|
386
413
|
}
|
|
387
414
|
const allSlicesDone = slices.length > 0 && slices.every(s => isStatusDone(s.status));
|
|
388
415
|
const title = stripMilestonePrefix(m.title) || m.id;
|
|
389
|
-
const
|
|
390
|
-
const
|
|
416
|
+
const milestoneDir = resolveMilestonePath(basePath, m.id);
|
|
417
|
+
const hasContext = milestoneArtifactExistsInResolvedDir(milestoneDir, m.id, "CONTEXT");
|
|
418
|
+
const hasDraftContext = !hasContext && milestoneArtifactExistsInResolvedDir(milestoneDir, m.id, "CONTEXT-DRAFT");
|
|
391
419
|
const readiness = classifyMilestoneReadiness({
|
|
392
420
|
status: m.status,
|
|
393
421
|
hasContext,
|
|
@@ -579,6 +607,9 @@ function checkReplanTrigger(basePath, milestoneId, sliceId) {
|
|
|
579
607
|
return !!sliceRow?.replan_triggered_at;
|
|
580
608
|
}
|
|
581
609
|
export async function deriveStateFromDb(basePath, artifactReadRoot = basePath) {
|
|
610
|
+
if (!ensureExistingWorkflowDbOpen(basePath)) {
|
|
611
|
+
return buildDbUnavailableState();
|
|
612
|
+
}
|
|
582
613
|
const requirements = getRequirementCounts();
|
|
583
614
|
const allMilestones = getAllMilestones();
|
|
584
615
|
const milestoneLock = getRequestedMilestoneLock();
|
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
// GSD Extension — Advisory Sync Lock
|
|
2
2
|
// Prevents concurrent worktree syncs from colliding via a simple file lock.
|
|
3
3
|
// Stale locks (mtime > 60s, owner PID confirmed dead) are overridden. Lock
|
|
4
|
-
// acquisition
|
|
4
|
+
// acquisition skips non-fatally when a live lock is already held.
|
|
5
5
|
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, statSync, unlinkSync, writeSync } from "node:fs";
|
|
6
6
|
import { dirname, join } from "node:path";
|
|
7
7
|
const STALE_THRESHOLD_MS = 60_000; // 60 seconds
|
|
8
|
-
const DEFAULT_TIMEOUT_MS =
|
|
9
|
-
const SPIN_INTERVAL_MS = 100; // 100ms polling interval
|
|
10
|
-
// SharedArrayBuffer for synchronous sleep via Atomics.wait
|
|
11
|
-
const SLEEP_BUFFER = new SharedArrayBuffer(4);
|
|
12
|
-
const SLEEP_VIEW = new Int32Array(SLEEP_BUFFER);
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 0; // fail fast; sync waits block the JS event loop
|
|
13
9
|
function lockFilePath(basePath) {
|
|
14
10
|
return join(basePath, ".gsd", "sync.lock");
|
|
15
11
|
}
|
|
16
|
-
function sleepSync(ms) {
|
|
17
|
-
Atomics.wait(SLEEP_VIEW, 0, 0, ms);
|
|
18
|
-
}
|
|
19
12
|
/** True if the given PID is alive in the current process namespace. */
|
|
20
13
|
function isPidAlive(pid) {
|
|
21
14
|
try {
|
|
@@ -62,7 +55,7 @@ function tryCreateLockFile(lp, payload) {
|
|
|
62
55
|
}
|
|
63
56
|
/**
|
|
64
57
|
* Acquire an advisory sync lock for the given basePath.
|
|
65
|
-
* Returns { acquired: true } on success, { acquired: false }
|
|
58
|
+
* Returns { acquired: true } on success, { acquired: false } when a live lock is held.
|
|
66
59
|
*
|
|
67
60
|
* Replaces a non-atomic `existsSync` + `atomicWriteSync` (write-temp+rename,
|
|
68
61
|
* which is not exclusive-create) sequence that allowed two callers to both
|
|
@@ -73,10 +66,13 @@ function tryCreateLockFile(lp, payload) {
|
|
|
73
66
|
* before stealing — prevents a slow event-loop pause (>60s under heavy I/O)
|
|
74
67
|
* from making a legitimately-held lock appear stale and get stolen.
|
|
75
68
|
* (Issue #4980 M-concurrency-3)
|
|
69
|
+
*
|
|
70
|
+
* Contended live locks fail fast. A synchronous wait here would freeze timers,
|
|
71
|
+
* I/O, and UI work on Node's single JS thread. The timeout argument remains
|
|
72
|
+
* accepted for compatibility but is intentionally not used for sync waiting.
|
|
76
73
|
*/
|
|
77
|
-
export function acquireSyncLock(basePath,
|
|
74
|
+
export function acquireSyncLock(basePath, _timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
78
75
|
const lp = lockFilePath(basePath);
|
|
79
|
-
const deadline = Date.now() + timeoutMs;
|
|
80
76
|
const lockData = JSON.stringify({ pid: process.pid, acquired_at: new Date().toISOString() }, null, 2);
|
|
81
77
|
while (true) {
|
|
82
78
|
// First try the fast path: atomic create. No check-then-write race.
|
|
@@ -88,7 +84,7 @@ export function acquireSyncLock(basePath, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
|
88
84
|
catch {
|
|
89
85
|
/* unexpected — fall through to retry */
|
|
90
86
|
}
|
|
91
|
-
// File exists. Decide whether to steal (stale + owner dead) or
|
|
87
|
+
// File exists. Decide whether to steal (stale + owner dead) or skip.
|
|
92
88
|
let canSteal = false;
|
|
93
89
|
try {
|
|
94
90
|
const stat = statSync(lp);
|
|
@@ -122,11 +118,8 @@ export function acquireSyncLock(basePath, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
|
122
118
|
// Loop back to retry create.
|
|
123
119
|
continue;
|
|
124
120
|
}
|
|
125
|
-
// Lock is held and not stale (or owner is alive) —
|
|
126
|
-
|
|
127
|
-
return { acquired: false };
|
|
128
|
-
}
|
|
129
|
-
sleepSync(SPIN_INTERVAL_MS);
|
|
121
|
+
// Lock is held and not stale (or owner is alive) — skip non-fatally.
|
|
122
|
+
return { acquired: false };
|
|
130
123
|
}
|
|
131
124
|
}
|
|
132
125
|
/**
|