@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
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { isToolUnavailableError } from "./auto-tool-tracking.js";
|
|
4
4
|
import { classifyError, isTransient } from "./error-classifier.js";
|
|
5
5
|
import { recoveryRemediation } from "./guidance.js";
|
|
6
|
+
import { isTerminalToolSurfaceError } from "./tool-surface-readiness.js";
|
|
6
7
|
import { ReconciliationFailedError } from "./state-reconciliation.js";
|
|
7
8
|
import { IllegalPhaseTransitionError } from "./state-transition-matrix.js";
|
|
8
9
|
export function classifyFailure(input) {
|
|
@@ -51,6 +52,13 @@ const FAILURE_TAXONOMY = {
|
|
|
51
52
|
"runtime-unknown": { action: "escalate", label: null },
|
|
52
53
|
};
|
|
53
54
|
function inferFailureKind(message) {
|
|
55
|
+
// A terminal tool-surface failure (workflow MCP server in failed/needs-auth/
|
|
56
|
+
// disabled) will not self-heal, so it must escalate rather than retry the
|
|
57
|
+
// same model into the per-unit cost cap. Checked before the generic
|
|
58
|
+
// tool-unavailable branch, which matches the same readiness prefix and
|
|
59
|
+
// would otherwise route it to retry. See #783.
|
|
60
|
+
if (isTerminalToolSurfaceError(message))
|
|
61
|
+
return "runtime-unknown";
|
|
54
62
|
if (isToolUnavailableError(message))
|
|
55
63
|
return "tool-unavailable";
|
|
56
64
|
if (/tool contract|auto-unit tool scope|phase-boundary gate|not permitted.*own/i.test(message))
|
|
@@ -202,7 +202,7 @@ export function parseRoadmapSlices(content) {
|
|
|
202
202
|
const checkboxItems = slicesSection.split("\n");
|
|
203
203
|
let currentSlice = null;
|
|
204
204
|
for (const line of checkboxItems) {
|
|
205
|
-
const cbMatch = line.match(/^\s*-\s+\[([ xX])\]\s+\*\*([\w
|
|
205
|
+
const cbMatch = line.match(/^\s*-\s+\[([ xX])\]\s+\*\*([\w.-]+):\s+(.+?)\*\*\s*(.*)/);
|
|
206
206
|
if (cbMatch) {
|
|
207
207
|
if (currentSlice)
|
|
208
208
|
slices.push(currentSlice);
|
|
@@ -29,7 +29,8 @@ export function validateContent(unitType, artifactPath) {
|
|
|
29
29
|
return [];
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
// Matches both legacy "**T01: title**" and flat-phase "**T01**: title" checkbox formats.
|
|
33
|
+
const TASK_MARKER_RE = /^\s*(?:-\s+\[[ xX]\]\s+\*\*T\d+(?:\*\*)?:|#{2,4}\s+T\d+\b)/gm;
|
|
33
34
|
const SLICE_MARKER_RE = /^\s*(?:-\s+\[[ xX]\]\s+\*\*S\d+:|#{2,4}\s+S\d+\b)/gm;
|
|
34
35
|
const VALIDATORS = {
|
|
35
36
|
"plan-slice": validatePlanSlice,
|
|
@@ -38,8 +38,26 @@ export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
|
|
|
38
38
|
});
|
|
39
39
|
continue;
|
|
40
40
|
}
|
|
41
|
+
// A shell-spawn/infra failure means the command never ran (e.g. on Windows
|
|
42
|
+
// `gsd_exec runtime=bash` resolves to a WSL with no /bin/bash). The LLM
|
|
43
|
+
// typically recovers by re-running via another runtime, and that genuine
|
|
44
|
+
// run may not even be in the match set. Such a failure is inconclusive, not
|
|
45
|
+
// a falsified pass — exclude it before judging the exit code.
|
|
46
|
+
const commandRuns = matches.filter((m) => !isInfraSpawnFailure(m));
|
|
47
|
+
if (commandRuns.length === 0) {
|
|
48
|
+
if (claimed.exitCode === 0) {
|
|
49
|
+
mismatches.push({
|
|
50
|
+
severity: "warning",
|
|
51
|
+
claimed,
|
|
52
|
+
actual: latestMatch(matches),
|
|
53
|
+
reason: `Matched execution failed to spawn (infrastructure error, not a command failure); ` +
|
|
54
|
+
`treating as inconclusive`,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
41
59
|
// Exit code mismatch: LLM claims success but actual command failed
|
|
42
|
-
const match = latestMatch(
|
|
60
|
+
const match = latestMatch(commandRuns);
|
|
43
61
|
if (claimed.exitCode === 0 && match.exitCode !== 0) {
|
|
44
62
|
mismatches.push({
|
|
45
63
|
severity: "error",
|
|
@@ -51,6 +69,30 @@ export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
|
|
|
51
69
|
}
|
|
52
70
|
return mismatches;
|
|
53
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Runtime-spawn / shell-infra failure signatures. When a bash-runtime call
|
|
74
|
+
* fails to *spawn* (rather than the command running and exiting non-zero), the
|
|
75
|
+
* recorded exitCode is an ordinary non-zero but the output carries one of these
|
|
76
|
+
* markers. Such a call is not evidence that a verification failed.
|
|
77
|
+
*/
|
|
78
|
+
const INFRA_SPAWN_FAILURE_SIGNATURES = [
|
|
79
|
+
/execvpe\([^)]*\)\s+failed/i, // WSL: execvpe(/bin/bash) failed: No such file or directory
|
|
80
|
+
/WSL \(.*\) ERROR/i, // WSL relay error banner
|
|
81
|
+
/command not found:\s*(?:bash|sh|zsh|dash|fish|ash|ksh|wsl)\b/i, // missing shell interpreter only
|
|
82
|
+
];
|
|
83
|
+
/**
|
|
84
|
+
* True when a non-zero bash call looks like a shell-spawn/infra failure (the
|
|
85
|
+
* command never started) rather than a real command failure. A successful run
|
|
86
|
+
* (exitCode 0) is never an infra failure.
|
|
87
|
+
*/
|
|
88
|
+
function isInfraSpawnFailure(call) {
|
|
89
|
+
if (call.exitCode === 0)
|
|
90
|
+
return false;
|
|
91
|
+
const snippet = call.outputSnippet ?? "";
|
|
92
|
+
if (snippet.length === 0)
|
|
93
|
+
return false;
|
|
94
|
+
return INFRA_SPAWN_FAILURE_SIGNATURES.some((re) => re.test(snippet));
|
|
95
|
+
}
|
|
54
96
|
// ─── Internals ──────────────────────────────────────────────────────────────
|
|
55
97
|
/**
|
|
56
98
|
* Verification evidence rows are append-only across retries, but a task
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readFileSync } from "node:fs";
|
|
11
11
|
import { saveFile } from "./files.js";
|
|
12
|
-
import { getGlobalGSDPreferencesPath, loadEffectiveGSDPreferences, loadGlobalGSDPreferences, } from "./preferences.js";
|
|
12
|
+
import { clearGSDPreferencesCache, getGlobalGSDPreferencesPath, loadEffectiveGSDPreferences, loadGlobalGSDPreferences, } from "./preferences.js";
|
|
13
13
|
import { ensurePreferencesFile, serializePreferencesToFrontmatter } from "./commands-prefs-wizard.js";
|
|
14
14
|
const SERVICE_TIER_SCOPE_NOTE = "Only affects gpt-5.4 models, regardless of provider.";
|
|
15
15
|
// ─── Gating ──────────────────────────────────────────────────────────────────
|
|
@@ -125,6 +125,7 @@ async function writeGlobalServiceTier(ctx, tier) {
|
|
|
125
125
|
body = preserved;
|
|
126
126
|
}
|
|
127
127
|
await saveFile(path, `---\n${frontmatter}---${body}`);
|
|
128
|
+
clearGSDPreferencesCache();
|
|
128
129
|
await ctx.waitForIdle();
|
|
129
130
|
await ctx.reload();
|
|
130
131
|
}
|
|
@@ -21,6 +21,7 @@ import { join, dirname } from "node:path";
|
|
|
21
21
|
import { gsdRoot, normalizeRealPath } from "./paths.js";
|
|
22
22
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
23
23
|
import { markWorkerStoppingByPid } from "./db/auto-workers.js";
|
|
24
|
+
import { logWarning } from "./workflow-logger.js";
|
|
24
25
|
const _require = createRequire(import.meta.url);
|
|
25
26
|
// ─── Module State ───────────────────────────────────────────────────────────
|
|
26
27
|
/** Release function from proper-lockfile — calling it releases the OS lock. */
|
|
@@ -175,12 +176,12 @@ function createLockCompromisedHandler(lockFilePath) {
|
|
|
175
176
|
return () => {
|
|
176
177
|
const elapsed = Date.now() - _lockAcquiredAt;
|
|
177
178
|
if (elapsed < 1_800_000) {
|
|
178
|
-
|
|
179
|
+
logWarning("session", `Lock heartbeat caught up after ${Math.round(elapsed / 1000)}s — long LLM call, no action needed.`);
|
|
179
180
|
return;
|
|
180
181
|
}
|
|
181
182
|
const existing = readExistingLockDataWithRetry(lockFilePath);
|
|
182
183
|
if (existing && existing.pid === process.pid) {
|
|
183
|
-
|
|
184
|
+
logWarning("session", `Lock heartbeat mismatch after ${Math.round(elapsed / 1000)}s — lock file still owned by PID ${process.pid}, treating as false positive.`);
|
|
184
185
|
return;
|
|
185
186
|
}
|
|
186
187
|
_lockCompromised = true;
|
|
@@ -404,7 +405,7 @@ export function getSessionLockStatus(basePath) {
|
|
|
404
405
|
try {
|
|
405
406
|
const result = acquireSessionLock(basePath);
|
|
406
407
|
if (result.acquired) {
|
|
407
|
-
|
|
408
|
+
logWarning("session", "Lock recovered after onCompromised — lock file PID matched, re-acquired.");
|
|
408
409
|
return { valid: true, recovered: true };
|
|
409
410
|
}
|
|
410
411
|
}
|
|
@@ -603,6 +604,12 @@ function isLockFileOwnedByCurrentProcess(lp) {
|
|
|
603
604
|
const existing = readExistingLockData(lp);
|
|
604
605
|
return existing?.pid === process.pid;
|
|
605
606
|
}
|
|
607
|
+
const _retrySleepView = new Int32Array(new SharedArrayBuffer(4));
|
|
608
|
+
function sleepSync(ms) {
|
|
609
|
+
if (!(ms > 0))
|
|
610
|
+
return;
|
|
611
|
+
Atomics.wait(_retrySleepView, 0, 0, ms);
|
|
612
|
+
}
|
|
606
613
|
export function readExistingLockDataWithRetry(lp, options) {
|
|
607
614
|
const maxAttempts = options?.maxAttempts ?? 3;
|
|
608
615
|
const delayMs = options?.delayMs ?? 200;
|
|
@@ -611,12 +618,7 @@ export function readExistingLockDataWithRetry(lp, options) {
|
|
|
611
618
|
if (data !== null)
|
|
612
619
|
return data;
|
|
613
620
|
if (attempt < maxAttempts) {
|
|
614
|
-
|
|
615
|
-
// and the delays are short (200ms default).
|
|
616
|
-
const start = Date.now();
|
|
617
|
-
while (Date.now() - start < delayMs) {
|
|
618
|
-
// busy-wait
|
|
619
|
-
}
|
|
621
|
+
sleepSync(delayMs);
|
|
620
622
|
}
|
|
621
623
|
}
|
|
622
624
|
return null;
|
|
@@ -240,3 +240,6 @@ Quick reference — see [references/commands.md](references/commands.md) for the
|
|
|
240
240
|
| `skip` / `undo` | Unit control |
|
|
241
241
|
| `doctor` | Health check + auto-fix |
|
|
242
242
|
| `steer <desc>` | Hard-steer plan mid-execution |
|
|
243
|
+
| `explore` / `spike` / `sketch` | Prompt-driven ideation and experiment workflows |
|
|
244
|
+
| `map-codebase` / `docs-update` / `graphify` | Codebase documentation and knowledge workflows |
|
|
245
|
+
| `code-review` / `review` / `audit-*` / `verify-work` | Review, audit, and UAT workflows |
|
|
@@ -50,6 +50,57 @@ All commands can be run via `gsd headless [command]`.
|
|
|
50
50
|
| `inspect` | Show SQLite DB diagnostics (schema, row counts) |
|
|
51
51
|
| `forensics` | Post-mortem investigation of auto-mode failures |
|
|
52
52
|
|
|
53
|
+
## Additional Prompt-Driven Workflows
|
|
54
|
+
|
|
55
|
+
These commands dispatch native GSD prompts adapted to the milestone, slice, and `.gsd/` model. Use them as `gsd headless <command> [args...]`.
|
|
56
|
+
|
|
57
|
+
| Command | Description |
|
|
58
|
+
|---------|-------------|
|
|
59
|
+
| `explore` | Socratic ideation before committing an idea |
|
|
60
|
+
| `spike` | Focused throwaway experiment (`--quick`, `--text`, or frontier mode) |
|
|
61
|
+
| `sketch` | UI/design exploration with throwaway HTML mockups |
|
|
62
|
+
| `map-codebase` | Generate structured codebase docs under `.gsd/codebase/` |
|
|
63
|
+
| `docs-update` | Generate, update, or verify docs against live code |
|
|
64
|
+
| `graphify` | Build, query, inspect, or diff `.gsd/knowledge/` |
|
|
65
|
+
| `stats` | Show project statistics, milestone state, git metrics, and timeline |
|
|
66
|
+
| `progress` | Summarize recent work; can route `--next` or `--do "..."` |
|
|
67
|
+
| `health` | Check `.gsd/` integrity (`--repair`, `--context`) |
|
|
68
|
+
| `surface` | Manage surfaced skills and extensions |
|
|
69
|
+
| `code-review` | Review changed source for bugs, security, and quality |
|
|
70
|
+
| `review` | Peer-review recent work across reviewer perspectives |
|
|
71
|
+
| `audit-milestone` | Verify a milestone met its definition of done |
|
|
72
|
+
| `audit-uat` | Audit outstanding UAT/verification items |
|
|
73
|
+
| `audit-fix` | Classify and remediate audit findings |
|
|
74
|
+
| `ui-review` | Run a six-pillar frontend visual audit |
|
|
75
|
+
| `secure-phase` | Verify threat mitigations |
|
|
76
|
+
| `validate-phase` | Fill validation and test coverage gaps |
|
|
77
|
+
| `verify-work` | Run conversational UAT |
|
|
78
|
+
| `plan-review-convergence` | Iterate a plan through review cycles |
|
|
79
|
+
| `discuss-phase` | Gather milestone or slice context through questions |
|
|
80
|
+
| `plan-phase` | Create a detailed slice plan |
|
|
81
|
+
| `execute-phase` | Execute slice tasks with wave support |
|
|
82
|
+
| `spec-phase` | Clarify what a milestone delivers |
|
|
83
|
+
| `mvp-phase` | Plan a vertical MVP milestone |
|
|
84
|
+
| `ui-phase` | Produce a `UI-SPEC` |
|
|
85
|
+
| `ai-integration-phase` | Produce an `AI-SPEC` |
|
|
86
|
+
| `ultraplan-phase` | Run extended planning and review |
|
|
87
|
+
| `autonomous` | Run remaining lifecycle work continuously |
|
|
88
|
+
| `pause-work` | Create a pause handoff |
|
|
89
|
+
| `resume-work` | Resume work with restored context |
|
|
90
|
+
| `manager` | Manage multiple milestones from a command-center workflow |
|
|
91
|
+
| `phase` | Manage milestone queue ordering |
|
|
92
|
+
| `thread` | Manage persistent context threads |
|
|
93
|
+
| `workstreams` | Route workstream actions through `parallel` |
|
|
94
|
+
| `workspace` | Route workspace actions through `worktree` |
|
|
95
|
+
| `milestone-summary` | Generate a project or milestone summary |
|
|
96
|
+
| `review-backlog` | Review and promote backlog items |
|
|
97
|
+
| `inbox` | Triage GitHub issues and PRs |
|
|
98
|
+
| `import` | Ingest external plans with conflict detection |
|
|
99
|
+
| `ingest-docs` | Bootstrap or merge `.gsd/` state from docs |
|
|
100
|
+
| `profile-user` | Generate and persist a developer profile |
|
|
101
|
+
| `settings` | Configure workflow toggles and model profile |
|
|
102
|
+
| `ns-context`, `ns-ideate`, `ns-manage`, `ns-project`, `ns-review`, `ns-workflow` | Namespace-grouping names that redirect to `help` |
|
|
103
|
+
|
|
53
104
|
## Phases
|
|
54
105
|
|
|
55
106
|
GSD workflows progress through these phases:
|
|
@@ -140,7 +140,16 @@ function detectArtifactDbStatusDriftForMilestone(basePath, milestoneId) {
|
|
|
140
140
|
for (const task of tasks) {
|
|
141
141
|
if (isClosedStatus(task.status))
|
|
142
142
|
continue;
|
|
143
|
-
|
|
143
|
+
// Flat-phase: task summaries live in the phase dir as TID-SUMMARY.md
|
|
144
|
+
let diskTaskSummary = resolveTaskFile(basePath, milestoneId, slice.id, task.id, "SUMMARY");
|
|
145
|
+
if (!diskTaskSummary) {
|
|
146
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId);
|
|
147
|
+
if (phaseDir) {
|
|
148
|
+
const flatSummary = join(phaseDir, `${task.id}-SUMMARY.md`);
|
|
149
|
+
if (existsSync(flatSummary))
|
|
150
|
+
diskTaskSummary = flatSummary;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
144
153
|
if (!diskTaskSummary || !existsSync(diskTaskSummary))
|
|
145
154
|
continue;
|
|
146
155
|
addUniqueDrift(drifts, seen, {
|
|
@@ -218,11 +227,36 @@ function detectDiskSliceIdDivergenceForMilestone(basePath, milestoneId) {
|
|
|
218
227
|
const milestonePath = resolveMilestonePath(basePath, milestoneId);
|
|
219
228
|
if (!milestonePath)
|
|
220
229
|
return [];
|
|
221
|
-
const slicesDir = join(milestonePath, "slices");
|
|
222
|
-
if (!existsSync(slicesDir))
|
|
223
|
-
return [];
|
|
224
230
|
const knownSliceIds = new Set(getMilestoneSlices(milestoneId).map((slice) => slice.id));
|
|
225
231
|
const drifts = [];
|
|
232
|
+
// Flat-phase: scan phase dir for plan files (NN-MM-PLAN.md) where MM
|
|
233
|
+
// doesn't match any known slice. Each plan file's slice id is S<MM>.
|
|
234
|
+
try {
|
|
235
|
+
for (const entry of readdirSync(milestonePath)) {
|
|
236
|
+
const planMatch = entry.match(/^\d+-(\d+)-PLAN\.md$/i);
|
|
237
|
+
if (!planMatch)
|
|
238
|
+
continue;
|
|
239
|
+
const planNum = parseInt(planMatch[1], 10);
|
|
240
|
+
const sliceId = `S${String(planNum).padStart(2, "0")}`;
|
|
241
|
+
if (knownSliceIds.has(sliceId))
|
|
242
|
+
continue;
|
|
243
|
+
drifts.push({
|
|
244
|
+
kind: "disk-slice-id-divergence",
|
|
245
|
+
milestoneId,
|
|
246
|
+
sliceId,
|
|
247
|
+
sliceDir: join(milestonePath, entry),
|
|
248
|
+
disposition: "block-meaningful",
|
|
249
|
+
reason: `plan file ${entry} references unknown ${sliceId}`,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
// unreadable phase dir
|
|
255
|
+
}
|
|
256
|
+
// Legacy: scan slices/ subdir for unknown slice dirs
|
|
257
|
+
const slicesDir = join(milestonePath, "slices");
|
|
258
|
+
if (!existsSync(slicesDir))
|
|
259
|
+
return drifts;
|
|
226
260
|
for (const entry of readdirSync(slicesDir)) {
|
|
227
261
|
const sliceDir = join(slicesDir, entry);
|
|
228
262
|
try {
|
|
@@ -300,6 +334,17 @@ function quarantineSliceDir(record, basePath) {
|
|
|
300
334
|
const target = join(quarantineDir, `${basename(record.sliceDir)}-${stamp}`);
|
|
301
335
|
renameSync(record.sliceDir, target);
|
|
302
336
|
}
|
|
337
|
+
export function completedMilestoneReopenedGuidance(record) {
|
|
338
|
+
const when = record.completedDispatchAt ?? "time unknown";
|
|
339
|
+
const intro = `Milestone ${record.milestoneId} has completed closeout dispatch history (${when}) ` +
|
|
340
|
+
`but DB status is still ${record.dbStatus}.`;
|
|
341
|
+
if (isClosedStatus(record.dbStatus)) {
|
|
342
|
+
return (`${intro} Use gsd_milestone_reopen for ${record.milestoneId} to redo this milestone, then run /gsd next.`);
|
|
343
|
+
}
|
|
344
|
+
return (`${intro} Finish closeout with \`/gsd dispatch complete-milestone ${record.milestoneId}\`, ` +
|
|
345
|
+
`review with \`/gsd status ${record.milestoneId}\`, then run /gsd next. ` +
|
|
346
|
+
"Running /gsd next again before fixing this will pause immediately.");
|
|
347
|
+
}
|
|
303
348
|
function diskSliceIdDivergenceGuidance(record) {
|
|
304
349
|
const quarantineExample = `.gsd/quarantine/milestones/${record.milestoneId}/slices/${record.sliceId}-manual-review`;
|
|
305
350
|
return (`Slice ID drift in ${record.milestoneId}: ${record.reason}. ` +
|
|
@@ -326,9 +371,7 @@ export function repairArtifactDbDrift(record, ctx) {
|
|
|
326
371
|
return;
|
|
327
372
|
}
|
|
328
373
|
if (record.kind === "completed-milestone-reopened") {
|
|
329
|
-
throw new Error(
|
|
330
|
-
` (${record.completedDispatchAt ?? "time unknown"}) but the DB status is ${record.dbStatus}. ` +
|
|
331
|
-
"Refusing to plan it again without an explicit reopen or recovery.");
|
|
374
|
+
throw new Error(completedMilestoneReopenedGuidance(record));
|
|
332
375
|
}
|
|
333
376
|
throw new Error(`Artifact/DB status drift in ${record.milestoneId}` +
|
|
334
377
|
`${record.sliceId ? `/${record.sliceId}` : ""}` +
|
|
@@ -343,9 +386,7 @@ export function describeArtifactDbDriftBlocker(record) {
|
|
|
343
386
|
return diskSliceIdDivergenceGuidance(record);
|
|
344
387
|
}
|
|
345
388
|
if (record.kind === "completed-milestone-reopened") {
|
|
346
|
-
return (
|
|
347
|
-
` (${record.completedDispatchAt ?? "time unknown"}) but the DB status is ${record.dbStatus}. ` +
|
|
348
|
-
"Refusing to plan it again without an explicit reopen or recovery.");
|
|
389
|
+
return completedMilestoneReopenedGuidance(record);
|
|
349
390
|
}
|
|
350
391
|
return (`Artifact/DB status drift in ${record.milestoneId}` +
|
|
351
392
|
`${record.sliceId ? `/${record.sliceId}` : ""}` +
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
// same value).
|
|
8
8
|
import { existsSync, statSync } from "node:fs";
|
|
9
9
|
import { getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, isDbAvailable, updateMilestoneStatus, updateSliceStatus, updateTaskStatus, } from "../../gsd-db.js";
|
|
10
|
-
import { resolveMilestoneFile, resolveSliceFile, resolveTaskFile, } from "../../paths.js";
|
|
10
|
+
import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, } from "../../paths.js";
|
|
11
|
+
import { join } from "node:path";
|
|
11
12
|
const COMPLETE_STATUSES = new Set(["complete", "done"]);
|
|
12
13
|
function summaryMtimeIso(path) {
|
|
13
14
|
try {
|
|
@@ -67,7 +68,18 @@ function collectMilestoneCompletionDrift(mid, ctx, drifts) {
|
|
|
67
68
|
continue;
|
|
68
69
|
if (task.completed_at !== null)
|
|
69
70
|
continue;
|
|
70
|
-
|
|
71
|
+
// Flat-phase: task summaries live in the phase dir as TID-SUMMARY.md.
|
|
72
|
+
// Legacy: resolveTaskFile returns the tasks/TID/TID-SUMMARY.md path.
|
|
73
|
+
let taskSummary = resolveTaskFile(ctx.basePath, mid, slice.id, task.id, "SUMMARY");
|
|
74
|
+
// Flat-phase fallback: check the phase dir directly
|
|
75
|
+
if (!taskSummary) {
|
|
76
|
+
const phaseDir = resolveMilestonePath(ctx.basePath, mid);
|
|
77
|
+
if (phaseDir) {
|
|
78
|
+
const flatSummary = join(phaseDir, `${task.id}-SUMMARY.md`);
|
|
79
|
+
if (existsSync(flatSummary))
|
|
80
|
+
taskSummary = flatSummary;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
71
83
|
if (taskSummary && existsSync(taskSummary)) {
|
|
72
84
|
drifts.push({
|
|
73
85
|
kind: "missing-completion-timestamp",
|
|
@@ -124,7 +136,16 @@ export function repairMissingCompletionTimestamp(record, ctx) {
|
|
|
124
136
|
task.completed_at !== null ||
|
|
125
137
|
!COMPLETE_STATUSES.has(task.status))
|
|
126
138
|
return;
|
|
127
|
-
|
|
139
|
+
// Flat-phase: task summaries live in the phase dir as TID-SUMMARY.md
|
|
140
|
+
let summary = resolveTaskFile(ctx.basePath, mid, sid, tid, "SUMMARY");
|
|
141
|
+
if (!summary) {
|
|
142
|
+
const phaseDir = resolveMilestonePath(ctx.basePath, mid);
|
|
143
|
+
if (phaseDir) {
|
|
144
|
+
const flatSummary = join(phaseDir, `${tid}-SUMMARY.md`);
|
|
145
|
+
if (existsSync(flatSummary))
|
|
146
|
+
summary = flatSummary;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
128
149
|
const ts = summary ? summaryMtimeIso(summary) : null;
|
|
129
150
|
if (!ts)
|
|
130
151
|
return;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: ADR-017 drift handler for external (gsd-core) markdown edits.
|
|
3
|
+
//
|
|
4
|
+
// gsd-pi's DB is canonical, but .gsd/*.md is the inter-tool contract. When
|
|
5
|
+
// gsd-core edits a projection file, this handler detects the sha drift vs the
|
|
6
|
+
// recorded baseline in .gsd/.compat.json and re-imports the affected entities
|
|
7
|
+
// into the DB. The next renderAllFromDb pass re-projects; the write-time
|
|
8
|
+
// invalidation hook then refreshes the marker entry, closing the loop.
|
|
9
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { computeProjectionSha, readCompatMarker, writeCompatMarker, } from "../../compat/compat-marker.js";
|
|
12
|
+
import { logWarning } from "../../workflow-logger.js";
|
|
13
|
+
/**
|
|
14
|
+
* Detect sha drift between the marker baseline and current file contents.
|
|
15
|
+
*
|
|
16
|
+
* - Missing marker → no records (the broader /gsd recover flow handles a
|
|
17
|
+
* cold-start; this handler only fires when we have a baseline to compare).
|
|
18
|
+
* - Missing file on disk → no record (other handlers cover missing artifacts).
|
|
19
|
+
* - Sha match → no record (gsd-pi's own write or no change).
|
|
20
|
+
* - Sha mismatch → one record per drifted file, scoped to its recorded entities.
|
|
21
|
+
*/
|
|
22
|
+
function detectExternalMarkdownEdit(_state, ctx) {
|
|
23
|
+
const marker = readCompatMarker(ctx.basePath);
|
|
24
|
+
const entries = Object.entries(marker.projections);
|
|
25
|
+
if (entries.length === 0)
|
|
26
|
+
return [];
|
|
27
|
+
const records = [];
|
|
28
|
+
for (const [projectionPath, entry] of entries) {
|
|
29
|
+
const abs = join(ctx.basePath, ".gsd", projectionPath);
|
|
30
|
+
if (!existsSync(abs))
|
|
31
|
+
continue;
|
|
32
|
+
const actual = computeProjectionSha(readFileSync(abs, "utf-8"));
|
|
33
|
+
if (actual === entry.sha)
|
|
34
|
+
continue;
|
|
35
|
+
records.push({
|
|
36
|
+
kind: "external-markdown-edit",
|
|
37
|
+
projectionPath,
|
|
38
|
+
expectedSha: entry.sha,
|
|
39
|
+
actualSha: actual,
|
|
40
|
+
entities: entry.entities,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return records;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Idempotent repair: re-import hierarchy for the affected entities from
|
|
47
|
+
* markdown into the DB, then update the marker entry so the next detect pass
|
|
48
|
+
* sees the file as expected. migrateHierarchyToDb is itself idempotent
|
|
49
|
+
* (upsert), so re-running this repair after a successful one is a no-op.
|
|
50
|
+
*/
|
|
51
|
+
async function repairExternalMarkdownEdit(record, ctx) {
|
|
52
|
+
try {
|
|
53
|
+
// Dynamic imports break a module-init cycle: this handler ← registry ←
|
|
54
|
+
// state.ts ← guided-flow.ts ← md-importer.ts ← (this handler's old static
|
|
55
|
+
// import). Deferring to repair time keeps module load cycle-free.
|
|
56
|
+
const { migrateHierarchyToDb } = await import("../../md-importer.js");
|
|
57
|
+
const { invalidateStateCache } = await import("../../state.js");
|
|
58
|
+
// Scoped re-import. migrateHierarchyToDb walks the whole tree but is a
|
|
59
|
+
// cheap upsert; per-entity scoping would require decomposing it, which is
|
|
60
|
+
// out of scope for v1. The cost is bounded by tree size and runs at most
|
|
61
|
+
// once per reconcile pass (MAX_PASSES=2).
|
|
62
|
+
migrateHierarchyToDb(ctx.basePath);
|
|
63
|
+
invalidateStateCache();
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
logWarning("reconcile", `external-markdown-edit repair failed for ${record.projectionPath}: ${err.message}`);
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
// Refresh the marker so a second pass (cap=2 reconcile) doesn't re-fire.
|
|
70
|
+
const marker = readCompatMarker(ctx.basePath);
|
|
71
|
+
marker.projections[record.projectionPath] = {
|
|
72
|
+
sha: record.actualSha,
|
|
73
|
+
entities: record.entities,
|
|
74
|
+
};
|
|
75
|
+
marker.lastProjectedAt = new Date().toISOString();
|
|
76
|
+
writeCompatMarker(ctx.basePath, marker);
|
|
77
|
+
}
|
|
78
|
+
export const externalMarkdownEditHandler = {
|
|
79
|
+
kind: "external-markdown-edit",
|
|
80
|
+
detect: detectExternalMarkdownEdit,
|
|
81
|
+
repair: repairExternalMarkdownEdit,
|
|
82
|
+
};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: ADR-017 drift handler for external (gsd-core) edits to .planning/.
|
|
3
|
+
// Parallel to external-markdown-edit.ts. Detects sha drift between the compat
|
|
4
|
+
// marker's planning.projections/passthrough and current .planning/ files.
|
|
5
|
+
//
|
|
6
|
+
// Modeled files (projections): re-imported via parsePlanningDirectory → DB.
|
|
7
|
+
// Passthrough files (un-modeled docs): sha refreshed, content untouched.
|
|
8
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { computeProjectionSha, readCompatMarker, writeCompatMarker, } from "../../compat/compat-marker.js";
|
|
11
|
+
import { isPlanningPassthroughRelPath, walkPlanningRelPaths, } from "../../compat/planning-compat.js";
|
|
12
|
+
import { logWarning } from "../../workflow-logger.js";
|
|
13
|
+
function detectOne(ctx, entries, passthrough) {
|
|
14
|
+
const records = [];
|
|
15
|
+
for (const [projectionPath, entry] of Object.entries(entries)) {
|
|
16
|
+
const abs = join(ctx.basePath, ".planning", projectionPath);
|
|
17
|
+
if (!existsSync(abs))
|
|
18
|
+
continue; // missing-file drift is covered by other handlers
|
|
19
|
+
const actual = computeProjectionSha(readFileSync(abs, "utf-8"));
|
|
20
|
+
if (actual === entry.sha)
|
|
21
|
+
continue;
|
|
22
|
+
records.push({
|
|
23
|
+
kind: "external-planning-edit",
|
|
24
|
+
projectionPath,
|
|
25
|
+
expectedSha: entry.sha,
|
|
26
|
+
actualSha: actual,
|
|
27
|
+
entities: entry.entities,
|
|
28
|
+
passthrough,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return records;
|
|
32
|
+
}
|
|
33
|
+
function detectUnseededPlanningFiles(ctx, projections, passthrough) {
|
|
34
|
+
const planningDir = join(ctx.basePath, ".planning");
|
|
35
|
+
if (!existsSync(planningDir))
|
|
36
|
+
return [];
|
|
37
|
+
const records = [];
|
|
38
|
+
for (const relPath of walkPlanningRelPaths(planningDir)) {
|
|
39
|
+
const isPassthrough = isPlanningPassthroughRelPath(relPath);
|
|
40
|
+
const map = isPassthrough ? passthrough : projections;
|
|
41
|
+
if (map[relPath])
|
|
42
|
+
continue;
|
|
43
|
+
const abs = join(planningDir, relPath);
|
|
44
|
+
const actual = computeProjectionSha(readFileSync(abs, "utf-8"));
|
|
45
|
+
records.push({
|
|
46
|
+
kind: "external-planning-edit",
|
|
47
|
+
projectionPath: relPath,
|
|
48
|
+
expectedSha: "",
|
|
49
|
+
actualSha: actual,
|
|
50
|
+
entities: [],
|
|
51
|
+
passthrough: isPassthrough,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return records;
|
|
55
|
+
}
|
|
56
|
+
async function detectExternalPlanningEdit(_state, ctx) {
|
|
57
|
+
const marker = readCompatMarker(ctx.basePath);
|
|
58
|
+
if (!marker.planning?.active) {
|
|
59
|
+
// Not yet activated. Activation (layout parse + DB import) is owned by
|
|
60
|
+
// capturePlanningCompatIfNeeded, called from reconcileBeforeDispatch when
|
|
61
|
+
// !dryRun. detect() must never write the marker — it is called in both
|
|
62
|
+
// dry-run and non-dry-run contexts. In dry-run, preview unseeded files
|
|
63
|
+
// without persisting activation.
|
|
64
|
+
if (!ctx.dryRun)
|
|
65
|
+
return [];
|
|
66
|
+
const planningDir = join(ctx.basePath, ".planning");
|
|
67
|
+
if (!existsSync(planningDir))
|
|
68
|
+
return [];
|
|
69
|
+
try {
|
|
70
|
+
const { parsePlanningDirectory } = await import("../../migrate/parser.js");
|
|
71
|
+
const { detectPlanningLayout } = await import("../../migrate/layout-detect.js");
|
|
72
|
+
const parsed = await parsePlanningDirectory(planningDir);
|
|
73
|
+
const layout = detectPlanningLayout(parsed);
|
|
74
|
+
if (!layout)
|
|
75
|
+
return [];
|
|
76
|
+
return detectUnseededPlanningFiles(ctx, {}, {});
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
logWarning("reconcile", `planning layout auto-detection failed: ${e.message}`);
|
|
80
|
+
}
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
const projections = marker.planning.projections;
|
|
84
|
+
const passthrough = marker.planning.passthrough;
|
|
85
|
+
const hasBaselines = Object.keys(projections).length > 0 || Object.keys(passthrough).length > 0;
|
|
86
|
+
return [
|
|
87
|
+
...detectOne(ctx, projections, false),
|
|
88
|
+
...detectOne(ctx, passthrough, true),
|
|
89
|
+
// No baseline yet (post-capture, pre-writePlanningDirectory): skip unseeded
|
|
90
|
+
// detection so every on-disk file is not treated as drift in the same pass.
|
|
91
|
+
...(hasBaselines ? detectUnseededPlanningFiles(ctx, projections, passthrough) : []),
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
async function repairExternalPlanningEdit(record, ctx) {
|
|
95
|
+
// Passthrough: never re-import (no DB model). Just refresh the sha.
|
|
96
|
+
if (record.passthrough) {
|
|
97
|
+
const marker = readCompatMarker(ctx.basePath);
|
|
98
|
+
marker.planning.passthrough[record.projectionPath] = {
|
|
99
|
+
sha: record.actualSha,
|
|
100
|
+
entities: record.entities,
|
|
101
|
+
};
|
|
102
|
+
marker.lastProjectedAt = new Date().toISOString();
|
|
103
|
+
writeCompatMarker(ctx.basePath, marker);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Modeled: re-import via the migrate read path. Dynamic imports break the
|
|
107
|
+
// module-init cycle (this handler ← registry ← state.ts ← guided-flow.ts
|
|
108
|
+
// ← md-importer.ts). parsePlanningDirectory reads .planning/; always
|
|
109
|
+
// transform + writeGSDDirectory so .gsd/ reflects the edited .planning/ file
|
|
110
|
+
// before migrateHierarchyToDb ingests it. In coexistence, .planning/ is the
|
|
111
|
+
// gsd-core native format and takes precedence: writing .gsd/ here propagates
|
|
112
|
+
// the edit that must survive future projections. external-markdown-edit (index
|
|
113
|
+
// 0) runs before this handler, so .gsd/-only drift is already imported first.
|
|
114
|
+
try {
|
|
115
|
+
const { parsePlanningDirectory } = await import("../../migrate/parser.js");
|
|
116
|
+
const { transformToGSD } = await import("../../migrate/transformer.js");
|
|
117
|
+
const { writeGSDDirectory } = await import("../../migrate/writer.js");
|
|
118
|
+
const { migrateHierarchyToDb } = await import("../../md-importer.js");
|
|
119
|
+
const { invalidateStateCache } = await import("../../state.js");
|
|
120
|
+
const parsed = await parsePlanningDirectory(join(ctx.basePath, ".planning"));
|
|
121
|
+
const gsdProject = transformToGSD(parsed);
|
|
122
|
+
await writeGSDDirectory(gsdProject, ctx.basePath);
|
|
123
|
+
migrateHierarchyToDb(ctx.basePath);
|
|
124
|
+
invalidateStateCache();
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
logWarning("reconcile", `external-planning-edit repair failed for ${record.projectionPath}: ${err.message}`);
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
const marker = readCompatMarker(ctx.basePath);
|
|
131
|
+
marker.planning.projections[record.projectionPath] = {
|
|
132
|
+
sha: record.actualSha,
|
|
133
|
+
entities: record.entities,
|
|
134
|
+
};
|
|
135
|
+
marker.lastProjectedAt = new Date().toISOString();
|
|
136
|
+
writeCompatMarker(ctx.basePath, marker);
|
|
137
|
+
}
|
|
138
|
+
export const externalPlanningEditHandler = {
|
|
139
|
+
kind: "external-planning-edit",
|
|
140
|
+
detect: detectExternalPlanningEdit,
|
|
141
|
+
repair: repairExternalPlanningEdit,
|
|
142
|
+
};
|