@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
|
@@ -12,6 +12,7 @@ import { compileSubagentPermissionContract, type ToolsPolicy } from "../unit-con
|
|
|
12
12
|
import { logWarning } from "../workflow-logger.js";
|
|
13
13
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
14
14
|
import { worktreesDirs } from "../worktree-placement.js";
|
|
15
|
+
import { bashReferencesProjectRootOutsideWorktree } from "../worktree-shell-guard.js";
|
|
15
16
|
import { evaluateGateAnswer } from "../consent-verdict.js";
|
|
16
17
|
|
|
17
18
|
/**
|
|
@@ -24,6 +25,12 @@ export const MILESTONE_CONTEXT_RE = /M\d+(?:-[a-z0-9]{6})?-CONTEXT\.md$/;
|
|
|
24
25
|
const CONTEXT_MILESTONE_RE = /(?:^|[/\\])(M\d+(?:-[a-z0-9]{6})?)-CONTEXT\.md$/i;
|
|
25
26
|
const DEPTH_VERIFICATION_MILESTONE_RE = /depth_verification[_-](M\d+(?:-[a-z0-9]{6})?)/i;
|
|
26
27
|
|
|
28
|
+
function normalizeMilestoneId(milestoneId: string): string {
|
|
29
|
+
const match = milestoneId.match(/^(M)(\d+)(?:-([a-z0-9]{6}))?$/i);
|
|
30
|
+
if (!match) return milestoneId;
|
|
31
|
+
return `M${match[2]}${match[3] ? `-${match[3].toLowerCase()}` : ""}`;
|
|
32
|
+
}
|
|
33
|
+
|
|
27
34
|
/**
|
|
28
35
|
* Path segment that identifies .gsd/ planning artifacts.
|
|
29
36
|
* Writes to these paths are allowed during queue mode.
|
|
@@ -227,7 +234,9 @@ function clearPersistedWriteGateSnapshot(basePath: string): void {
|
|
|
227
234
|
function normalizeWriteGateSnapshot(value: unknown): WriteGateSnapshot {
|
|
228
235
|
const record = value && typeof value === "object" ? value as Record<string, unknown> : {};
|
|
229
236
|
const verified = Array.isArray(record.verifiedDepthMilestones)
|
|
230
|
-
? record.verifiedDepthMilestones
|
|
237
|
+
? record.verifiedDepthMilestones
|
|
238
|
+
.filter((item): item is string => typeof item === "string")
|
|
239
|
+
.map(normalizeMilestoneId)
|
|
231
240
|
: [];
|
|
232
241
|
const verifiedGates = Array.isArray(record.verifiedApprovalGates)
|
|
233
242
|
? record.verifiedApprovalGates.filter((item): item is string => typeof item === "string")
|
|
@@ -288,7 +297,7 @@ export function loadWriteGateSnapshot(basePath: string): WriteGateSnapshot {
|
|
|
288
297
|
* guard that previously protected only the tool_execution_start window.
|
|
289
298
|
*/
|
|
290
299
|
function mergeSnapshotIntoState(state: InMemoryWriteGateState, disk: WriteGateSnapshot): void {
|
|
291
|
-
for (const milestone of disk.verifiedDepthMilestones) state.verifiedDepthMilestones.add(milestone);
|
|
300
|
+
for (const milestone of disk.verifiedDepthMilestones) state.verifiedDepthMilestones.add(normalizeMilestoneId(milestone));
|
|
292
301
|
for (const gate of disk.verifiedApprovalGates ?? []) state.verifiedApprovalGates.add(gate);
|
|
293
302
|
state.activeQueuePhase = disk.activeQueuePhase;
|
|
294
303
|
state.pendingGateId = disk.pendingGateId;
|
|
@@ -394,7 +403,7 @@ export function isMilestoneDepthVerified(
|
|
|
394
403
|
): boolean {
|
|
395
404
|
if (!milestoneId) return false;
|
|
396
405
|
refreshWriteGateStateFromDisk(basePath);
|
|
397
|
-
return getWriteGateState(basePath).verifiedDepthMilestones.has(milestoneId);
|
|
406
|
+
return getWriteGateState(basePath).verifiedDepthMilestones.has(normalizeMilestoneId(milestoneId));
|
|
398
407
|
}
|
|
399
408
|
|
|
400
409
|
export function isMilestoneDepthVerifiedInSnapshot(
|
|
@@ -402,7 +411,7 @@ export function isMilestoneDepthVerifiedInSnapshot(
|
|
|
402
411
|
milestoneId: string | null | undefined,
|
|
403
412
|
): boolean {
|
|
404
413
|
if (!milestoneId) return false;
|
|
405
|
-
return snapshot.verifiedDepthMilestones.includes(milestoneId);
|
|
414
|
+
return snapshot.verifiedDepthMilestones.includes(normalizeMilestoneId(milestoneId));
|
|
406
415
|
}
|
|
407
416
|
|
|
408
417
|
export function isQueuePhaseActive(basePath: string = process.cwd()): boolean {
|
|
@@ -465,7 +474,7 @@ export function isGateQuestionId(questionId: string): boolean {
|
|
|
465
474
|
*/
|
|
466
475
|
export function extractDepthVerificationMilestoneId(questionId: string): string | null {
|
|
467
476
|
const match = questionId.match(DEPTH_VERIFICATION_MILESTONE_RE);
|
|
468
|
-
return match?.[1]
|
|
477
|
+
return match?.[1] ? normalizeMilestoneId(match[1]) : null;
|
|
469
478
|
}
|
|
470
479
|
|
|
471
480
|
/**
|
|
@@ -473,7 +482,7 @@ export function extractDepthVerificationMilestoneId(questionId: string): string
|
|
|
473
482
|
*/
|
|
474
483
|
function extractContextMilestoneId(inputPath: string): string | null {
|
|
475
484
|
const match = inputPath.match(CONTEXT_MILESTONE_RE);
|
|
476
|
-
return match?.[1]
|
|
485
|
+
return match?.[1] ? normalizeMilestoneId(match[1]) : null;
|
|
477
486
|
}
|
|
478
487
|
|
|
479
488
|
/**
|
|
@@ -559,7 +568,7 @@ export const hostWriteGateAdapter: WriteGateStateAdapter = {
|
|
|
559
568
|
markDepthVerified(milestoneId, basePath): void {
|
|
560
569
|
if (!milestoneId) return;
|
|
561
570
|
mutateWriteGateState(basePath, (state) => {
|
|
562
|
-
state.verifiedDepthMilestones.add(milestoneId);
|
|
571
|
+
state.verifiedDepthMilestones.add(normalizeMilestoneId(milestoneId));
|
|
563
572
|
}, { writer: "host" });
|
|
564
573
|
},
|
|
565
574
|
markApprovalGateVerified(gateId, basePath): void {
|
|
@@ -600,7 +609,7 @@ export const childWriteGateAdapter: WriteGateStateAdapter = {
|
|
|
600
609
|
markDepthVerified(milestoneId, basePath): void {
|
|
601
610
|
if (!milestoneId) return;
|
|
602
611
|
childMutate(basePath, (state) => {
|
|
603
|
-
state.verifiedDepthMilestones.add(milestoneId);
|
|
612
|
+
state.verifiedDepthMilestones.add(normalizeMilestoneId(milestoneId));
|
|
604
613
|
});
|
|
605
614
|
},
|
|
606
615
|
markApprovalGateVerified(gateId, basePath): void {
|
|
@@ -734,6 +743,13 @@ export interface AskUserQuestionsGateQuestion {
|
|
|
734
743
|
export interface AskUserQuestionsGateDetails {
|
|
735
744
|
cancelled?: boolean;
|
|
736
745
|
interrupted?: boolean;
|
|
746
|
+
/**
|
|
747
|
+
* True when the host elicitation channel timed out before the user answered.
|
|
748
|
+
* Distinct from `cancelled` (deliberate dismissal): the gate verdict maps
|
|
749
|
+
* this to "timeout" so callers pause-and-wait instead of letting the model
|
|
750
|
+
* re-ask into the same timeout loop (#852).
|
|
751
|
+
*/
|
|
752
|
+
timed_out?: boolean;
|
|
737
753
|
response?: {
|
|
738
754
|
answers?: Record<string, { selected?: unknown } | undefined>;
|
|
739
755
|
} | null;
|
|
@@ -743,7 +759,8 @@ export type AskUserQuestionsGateResult =
|
|
|
743
759
|
| { status: "not-gate" }
|
|
744
760
|
| { status: "waiting"; pendingGateId: string; interrupted: boolean }
|
|
745
761
|
| { status: "verified"; gateId: string; milestoneId: string | null }
|
|
746
|
-
| { status: "declined"; gateId: string }
|
|
762
|
+
| { status: "declined"; gateId: string }
|
|
763
|
+
| { status: "timeout"; pendingGateId: string; interrupted: boolean };
|
|
747
764
|
|
|
748
765
|
function findGateQuestion(
|
|
749
766
|
questions: AskUserQuestionsGateQuestion[],
|
|
@@ -767,11 +784,22 @@ function verifyAnsweredGate(
|
|
|
767
784
|
|
|
768
785
|
/** Map an unresolved (non-verified) gate verdict to the caller-facing result. */
|
|
769
786
|
function unresolvedGateResult(
|
|
770
|
-
verdict: "declined" | "waiting" | "cancelled",
|
|
787
|
+
verdict: "declined" | "waiting" | "cancelled" | "timeout",
|
|
771
788
|
gateId: string,
|
|
772
789
|
details: AskUserQuestionsGateDetails,
|
|
773
790
|
): AskUserQuestionsGateResult {
|
|
774
791
|
if (verdict === "declined") return { status: "declined", gateId };
|
|
792
|
+
if (verdict === "timeout") {
|
|
793
|
+
// Host elicitation expired before the user answered. The gate stays
|
|
794
|
+
// pending (fail-closed — a timeout is never approval), but the status is
|
|
795
|
+
// "timeout" so the caller pauses-and-waits instead of re-asking into the
|
|
796
|
+
// same timeout loop (#852).
|
|
797
|
+
return {
|
|
798
|
+
status: "timeout",
|
|
799
|
+
pendingGateId: gateId,
|
|
800
|
+
interrupted: details.interrupted === true,
|
|
801
|
+
};
|
|
802
|
+
}
|
|
775
803
|
// "waiting" (and the unreachable post-cancel case): an empty selection is
|
|
776
804
|
// not an answer — keep the gate pending and make the caller pause.
|
|
777
805
|
return {
|
|
@@ -802,6 +830,16 @@ export function applyAskUserQuestionsGateResult(options: {
|
|
|
802
830
|
const { basePath, questions, details, fallbackMilestoneId } = options;
|
|
803
831
|
const currentPendingGate = getPendingGate(basePath);
|
|
804
832
|
if (currentPendingGate) {
|
|
833
|
+
if (details.timed_out) {
|
|
834
|
+
// Host elicitation timed out before the user answered. Keep the gate
|
|
835
|
+
// pending (fail-closed) but report "timeout" so the caller pauses-and-
|
|
836
|
+
// waits instead of re-asking into the same timeout loop (#852).
|
|
837
|
+
return {
|
|
838
|
+
status: "timeout",
|
|
839
|
+
pendingGateId: currentPendingGate,
|
|
840
|
+
interrupted: details.interrupted === true,
|
|
841
|
+
};
|
|
842
|
+
}
|
|
805
843
|
if (details.cancelled || !details.response) {
|
|
806
844
|
return {
|
|
807
845
|
status: "waiting",
|
|
@@ -820,6 +858,7 @@ export function applyAskUserQuestionsGateResult(options: {
|
|
|
820
858
|
}
|
|
821
859
|
}
|
|
822
860
|
|
|
861
|
+
if (details.timed_out) return { status: "not-gate" };
|
|
823
862
|
if (details.cancelled || !details.response) return { status: "not-gate" };
|
|
824
863
|
|
|
825
864
|
for (const question of questions) {
|
|
@@ -854,6 +893,24 @@ export function formatPendingAskUserQuestionsGateMessage(
|
|
|
854
893
|
].join(" ");
|
|
855
894
|
}
|
|
856
895
|
|
|
896
|
+
/**
|
|
897
|
+
* Format the LLM-facing message returned when a depth-confirmation gate
|
|
898
|
+
* elicitation times out. Distinct from {@link formatPendingAskUserQuestionsGateMessage}:
|
|
899
|
+
* a timeout must NOT tell the model to immediately re-ask (that re-triggers
|
|
900
|
+
* the same timeout loop). Instead it tells the model to stop, that auto-mode
|
|
901
|
+
* is paused, and that the user will respond on their own (#852).
|
|
902
|
+
*/
|
|
903
|
+
export function formatTimedOutAskUserQuestionsGateMessage(
|
|
904
|
+
pendingGateId: string,
|
|
905
|
+
): string {
|
|
906
|
+
return [
|
|
907
|
+
`Depth confirmation on gate "${pendingGateId}" timed out waiting for a response.`,
|
|
908
|
+
"The user did not answer within the host elicitation window — do not re-ask in this turn, it will time out again.",
|
|
909
|
+
"Auto-mode is paused. Stop calling tools and wait for the user to respond on a new turn.",
|
|
910
|
+
"When the user replies with confirmation, the gate will be satisfied and work will resume.",
|
|
911
|
+
].join(" ");
|
|
912
|
+
}
|
|
913
|
+
|
|
857
914
|
export function shouldBlockContextWrite(
|
|
858
915
|
toolName: string,
|
|
859
916
|
inputPath: string,
|
|
@@ -864,7 +921,7 @@ export function shouldBlockContextWrite(
|
|
|
864
921
|
if (toolName !== "write") return { block: false };
|
|
865
922
|
if (!MILESTONE_CONTEXT_RE.test(inputPath)) return { block: false };
|
|
866
923
|
|
|
867
|
-
const targetMilestoneId = extractContextMilestoneId(inputPath) ?? milestoneId;
|
|
924
|
+
const targetMilestoneId = extractContextMilestoneId(inputPath) ?? (milestoneId ? normalizeMilestoneId(milestoneId) : null);
|
|
868
925
|
if (!targetMilestoneId) {
|
|
869
926
|
return {
|
|
870
927
|
block: true,
|
|
@@ -883,8 +940,8 @@ export function shouldBlockContextWrite(
|
|
|
883
940
|
reason: [
|
|
884
941
|
`HARD BLOCK: Cannot write to milestone CONTEXT.md without depth verification.`,
|
|
885
942
|
`This is a mechanical gate — you MUST NOT proceed, retry, or rationalize past this block.`,
|
|
886
|
-
`Required action: call ask_user_questions with question id
|
|
887
|
-
`The user MUST select the "(Recommended)" confirmation option to unlock this gate.`,
|
|
943
|
+
`Required action: call ask_user_questions with question id "depth_verification_${targetMilestoneId}_confirm".`,
|
|
944
|
+
`The user MUST select the first "(Recommended)" confirmation option to unlock this gate.`,
|
|
888
945
|
`If the user declines, cancels, or the tool fails, you must re-ask — not bypass.`,
|
|
889
946
|
].join(" "),
|
|
890
947
|
};
|
|
@@ -1373,6 +1430,37 @@ function isPathContained(target: string, container: string): boolean {
|
|
|
1373
1430
|
return target.startsWith(container.endsWith(sep) ? container : container + sep);
|
|
1374
1431
|
}
|
|
1375
1432
|
|
|
1433
|
+
function formatWorktreeIsolationBlockReason(
|
|
1434
|
+
tool: string,
|
|
1435
|
+
displayTarget: string,
|
|
1436
|
+
isAutoLive: boolean,
|
|
1437
|
+
effectiveBasePath: string,
|
|
1438
|
+
): string {
|
|
1439
|
+
if (isGsdWorktreePath(effectiveBasePath)) {
|
|
1440
|
+
return [
|
|
1441
|
+
`HARD BLOCK: ${tool} target "${displayTarget}" is outside the active milestone worktree`,
|
|
1442
|
+
`while \`git.isolation: worktree\` is configured. Source edits must stay inside`,
|
|
1443
|
+
`\`.gsd-worktrees/<MID>/\` (or \`.gsd/\` planning artifacts) so the auto-mode commit`,
|
|
1444
|
+
`pipeline captures them. Writing to the project root leaks changes that block milestone merge.`,
|
|
1445
|
+
`Use a relative path under the worktree cwd or an absolute path inside the worktree directory.`,
|
|
1446
|
+
...(isAutoLive ? [] : [
|
|
1447
|
+
"This guard also applies to subagent children spawned from the worktree — do not",
|
|
1448
|
+
"`cd` to the project root or reference its paths in shell commands.",
|
|
1449
|
+
]),
|
|
1450
|
+
].join(" ");
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
return [
|
|
1454
|
+
`HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
|
|
1455
|
+
`not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
|
|
1456
|
+
`Code edits at the project root would be lost — only the auto-mode commit pipeline`,
|
|
1457
|
+
`(auto-post-unit) commits work, and it never runs outside the loop.`,
|
|
1458
|
+
`Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
|
|
1459
|
+
`then write inside it. To disable this guard for self-hosting development, set`,
|
|
1460
|
+
`GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
|
|
1461
|
+
].join(" ");
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1376
1464
|
/**
|
|
1377
1465
|
* Block planning-write tool calls that would land code at the project root
|
|
1378
1466
|
* while `git.isolation: worktree` is in effect and auto-mode hasn't created
|
|
@@ -1390,10 +1478,9 @@ function isPathContained(target: string, container: string): boolean {
|
|
|
1390
1478
|
* 5. Target is inside `<projectRoot>/.gsd/worktrees/` (a real worktree).
|
|
1391
1479
|
* 6. Target is inside `<projectRoot>/.gsd/` and isn't masquerading as a
|
|
1392
1480
|
* worktrees sibling (rejects the `.gsd/worktrees-extra/…` prefix trick).
|
|
1393
|
-
* 7. Auto is live AND `effectiveBasePath` is itself a `.gsd/worktrees/…` path.
|
|
1394
1481
|
*
|
|
1395
|
-
* Otherwise: block with a message that points the agent at
|
|
1396
|
-
* auto-mode.
|
|
1482
|
+
* Otherwise: block with a message that points the agent at the active worktree
|
|
1483
|
+
* or `/gsd` to start auto-mode.
|
|
1397
1484
|
*/
|
|
1398
1485
|
export function shouldBlockWorktreeWrite(
|
|
1399
1486
|
toolName: string,
|
|
@@ -1442,24 +1529,46 @@ export function shouldBlockWorktreeWrite(
|
|
|
1442
1529
|
// fall through: looks like worktrees<something> sibling — block
|
|
1443
1530
|
}
|
|
1444
1531
|
|
|
1445
|
-
// Auto is live and the caller is operating inside a worktree path —
|
|
1446
|
-
// host tool's write happens in worktree context; let it through.
|
|
1447
|
-
if (isAutoLive && isGsdWorktreePath(effectiveBasePath)) return { block: false };
|
|
1448
|
-
|
|
1449
1532
|
// Block. Provide enough context that the agent can self-correct.
|
|
1450
1533
|
const displayTarget = isPathContained(realTarget, realRoot)
|
|
1451
1534
|
? relative(realRoot, realTarget) || "."
|
|
1452
1535
|
: realTarget;
|
|
1453
1536
|
return {
|
|
1454
1537
|
block: true,
|
|
1455
|
-
reason:
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1538
|
+
reason: formatWorktreeIsolationBlockReason(tool, displayTarget, isAutoLive, effectiveBasePath),
|
|
1539
|
+
};
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
/**
|
|
1543
|
+
* Block bash commands that reference the project root while executing inside an
|
|
1544
|
+
* active milestone worktree under `git.isolation: worktree`.
|
|
1545
|
+
*
|
|
1546
|
+
* Mirrors the gsd_exec sandbox rule so native bash cannot bypass write/edit gates.
|
|
1547
|
+
*/
|
|
1548
|
+
export function shouldBlockWorktreeBash(
|
|
1549
|
+
command: string,
|
|
1550
|
+
effectiveBasePath: string,
|
|
1551
|
+
isAutoLive: boolean,
|
|
1552
|
+
currentUnitType?: string | null,
|
|
1553
|
+
): { block: boolean; reason?: string } {
|
|
1554
|
+
if (process.env.GSD_DISABLE_WORKTREE_WRITE_GUARD === "1") return { block: false };
|
|
1555
|
+
if (getIsolationMode(effectiveBasePath) !== "worktree") return { block: false };
|
|
1556
|
+
if (currentUnitType && WORKTREE_GATE_BOOTSTRAP_UNITS.has(currentUnitType)) return { block: false };
|
|
1557
|
+
// Block whenever the effective cwd is inside a milestone worktree — not only
|
|
1558
|
+
// during live auto-mode. Reactive-execute subagents run as fresh pi children
|
|
1559
|
+
// without an auto session, but still inherit the worktree cwd and must not
|
|
1560
|
+
// shell out to the project root (the native bash bypass that caused root-write leaks).
|
|
1561
|
+
if (!isGsdWorktreePath(effectiveBasePath)) return { block: false };
|
|
1562
|
+
if (!command.trim()) return { block: false };
|
|
1563
|
+
if (!bashReferencesProjectRootOutsideWorktree(command, effectiveBasePath)) return { block: false };
|
|
1564
|
+
|
|
1565
|
+
return {
|
|
1566
|
+
block: true,
|
|
1567
|
+
reason: formatWorktreeIsolationBlockReason(
|
|
1568
|
+
"bash",
|
|
1569
|
+
"project root path reference in shell command",
|
|
1570
|
+
isAutoLive,
|
|
1571
|
+
effectiveBasePath,
|
|
1572
|
+
),
|
|
1464
1573
|
};
|
|
1465
1574
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Shared DB-backed guard for milestone closeout finalization.
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
5
6
|
|
|
6
7
|
import {
|
|
7
8
|
getLatestAssessmentByScope,
|
|
@@ -9,7 +10,9 @@ import {
|
|
|
9
10
|
getMilestoneSlices,
|
|
10
11
|
getPendingGates,
|
|
11
12
|
getSliceTasks,
|
|
13
|
+
insertAssessment,
|
|
12
14
|
isDbAvailable,
|
|
15
|
+
transaction,
|
|
13
16
|
} from "./gsd-db.js";
|
|
14
17
|
import {
|
|
15
18
|
getWorkflowDatabasePath,
|
|
@@ -17,6 +20,9 @@ import {
|
|
|
17
20
|
} from "./db-workspace.js";
|
|
18
21
|
import { isClosedStatus } from "./status-guards.js";
|
|
19
22
|
import { closeQualityGatesFromEvidence } from "./quality-gate-closure.js";
|
|
23
|
+
import { insertMilestoneValidationGates } from "./milestone-validation-gates.js";
|
|
24
|
+
import { relMilestoneFile, resolveSliceFile } from "./paths.js";
|
|
25
|
+
import { invalidateAllCaches } from "./cache.js";
|
|
20
26
|
|
|
21
27
|
export const CLOSEOUT_CONSISTENCY_BLOCKED_REASON = "closeout-consistency-blocked";
|
|
22
28
|
|
|
@@ -44,6 +50,7 @@ export interface CloseoutConsistencyOptions {
|
|
|
44
50
|
refreshFromDisk?: boolean;
|
|
45
51
|
allowOpenMilestone?: boolean;
|
|
46
52
|
artifactBasePath?: string;
|
|
53
|
+
allowPassThroughValidation?: boolean;
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
function blocked(reason: CloseoutConsistencyFailureReason, message: string): CloseoutConsistencyResult {
|
|
@@ -65,6 +72,87 @@ function artifactBasePathFromDb(): string | undefined {
|
|
|
65
72
|
return dirname(dirname(dbPath!));
|
|
66
73
|
}
|
|
67
74
|
|
|
75
|
+
function allSlicesHaveCloseoutSummaryEvidence(milestoneId: string, artifactBasePath: string): boolean {
|
|
76
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
77
|
+
if (slices.length === 0) return false;
|
|
78
|
+
|
|
79
|
+
return slices.every((slice) => {
|
|
80
|
+
if (!isClosedStatus(slice.status)) return false;
|
|
81
|
+
for (const task of getSliceTasks(milestoneId, slice.id)) {
|
|
82
|
+
if (!isClosedStatus(task.status)) return false;
|
|
83
|
+
}
|
|
84
|
+
const summaryPath = resolveSliceFile(artifactBasePath, milestoneId, slice.id, "SUMMARY");
|
|
85
|
+
return Boolean(summaryPath && existsSync(summaryPath));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function renderCloseoutPassThroughValidation(milestoneId: string): string {
|
|
90
|
+
return [
|
|
91
|
+
"---",
|
|
92
|
+
"verdict: pass",
|
|
93
|
+
"skip_validation: true",
|
|
94
|
+
"skip_validation_reason: closeout-recovery",
|
|
95
|
+
"remediation_round: 0",
|
|
96
|
+
"---",
|
|
97
|
+
"",
|
|
98
|
+
"# Milestone Validation (skipped)",
|
|
99
|
+
"",
|
|
100
|
+
`Milestone validation was recorded during closeout for ${milestoneId} because all slices already had SUMMARY evidence and no milestone-validation assessment was present.`,
|
|
101
|
+
"",
|
|
102
|
+
].join("\n");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function recordCloseoutPassThroughValidationIfReady(
|
|
106
|
+
milestoneId: string,
|
|
107
|
+
artifactBasePath?: string,
|
|
108
|
+
): boolean {
|
|
109
|
+
const basePath = artifactBasePath ?? artifactBasePathFromDb();
|
|
110
|
+
if (!basePath) return false;
|
|
111
|
+
|
|
112
|
+
const existing = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
113
|
+
if (existing?.status === "pass") return true;
|
|
114
|
+
if (existing) return false;
|
|
115
|
+
if (!allSlicesHaveCloseoutSummaryEvidence(milestoneId, basePath)) return false;
|
|
116
|
+
|
|
117
|
+
const validationPath = join(basePath, relMilestoneFile(basePath, milestoneId, "VALIDATION"));
|
|
118
|
+
const content = renderCloseoutPassThroughValidation(milestoneId);
|
|
119
|
+
mkdirSync(dirname(validationPath), { recursive: true });
|
|
120
|
+
writeFileSync(validationPath, content, "utf-8");
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
transaction(() => {
|
|
124
|
+
insertAssessment({
|
|
125
|
+
path: validationPath,
|
|
126
|
+
milestoneId,
|
|
127
|
+
sliceId: null,
|
|
128
|
+
taskId: null,
|
|
129
|
+
status: "pass",
|
|
130
|
+
scope: "milestone-validation",
|
|
131
|
+
fullContent: content,
|
|
132
|
+
});
|
|
133
|
+
const gateSliceId = getMilestoneSlices(milestoneId)[0]?.id;
|
|
134
|
+
if (gateSliceId) {
|
|
135
|
+
insertMilestoneValidationGates(
|
|
136
|
+
milestoneId,
|
|
137
|
+
gateSliceId,
|
|
138
|
+
"pass",
|
|
139
|
+
new Date().toISOString(),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
} catch (err) {
|
|
144
|
+
try {
|
|
145
|
+
unlinkSync(validationPath);
|
|
146
|
+
} catch {
|
|
147
|
+
// best effort cleanup
|
|
148
|
+
}
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
invalidateAllCaches();
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
68
156
|
export function checkCloseoutConsistencyGate(
|
|
69
157
|
milestoneId: string,
|
|
70
158
|
options: CloseoutConsistencyOptions = {},
|
|
@@ -97,14 +185,30 @@ export function checkCloseoutConsistencyGate(
|
|
|
97
185
|
);
|
|
98
186
|
}
|
|
99
187
|
|
|
100
|
-
|
|
188
|
+
let validation = milestone.status === "skipped"
|
|
101
189
|
? null
|
|
102
190
|
: getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
191
|
+
if (
|
|
192
|
+
milestone.status !== "skipped" &&
|
|
193
|
+
validation?.status !== "pass" &&
|
|
194
|
+
options.allowPassThroughValidation &&
|
|
195
|
+
recordCloseoutPassThroughValidationIfReady(
|
|
196
|
+
milestoneId,
|
|
197
|
+
options.artifactBasePath ?? artifactBasePathFromDb(),
|
|
198
|
+
)
|
|
199
|
+
) {
|
|
200
|
+
validation = getLatestAssessmentByScope(milestoneId, "milestone-validation");
|
|
201
|
+
}
|
|
103
202
|
if (milestone.status !== "skipped") {
|
|
104
203
|
if (validation?.status !== "pass") {
|
|
204
|
+
const validationStatus = validation?.status ?? "absent";
|
|
205
|
+
const recovery =
|
|
206
|
+
validationStatus === "absent"
|
|
207
|
+
? ` Run \`/gsd validate-milestone ${milestoneId}\` to create the validation, or set \`phases.skip_milestone_validation: true\` in .gsd/PREFERENCES.md to skip it.`
|
|
208
|
+
: "";
|
|
105
209
|
return blocked(
|
|
106
210
|
"validation-not-pass",
|
|
107
|
-
`Closeout consistency blocked for ${milestoneId}: latest milestone validation is "${
|
|
211
|
+
`Closeout consistency blocked for ${milestoneId}: latest milestone validation is "${validationStatus}".${recovery}`,
|
|
108
212
|
);
|
|
109
213
|
}
|
|
110
214
|
}
|
|
@@ -22,7 +22,11 @@ import {
|
|
|
22
22
|
} from "./unmerged-milestone-guard.js";
|
|
23
23
|
import { appendRequirementsBacklogToSummary } from "./requirements-backlog.js";
|
|
24
24
|
import { nativeBranchList, nativeIsRepo } from "./native-git-bridge.js";
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
allWorktreesDirs,
|
|
27
|
+
isMilestoneWorktreeResidueCandidate,
|
|
28
|
+
pruneEphemeralGhostWorktreeDirectories,
|
|
29
|
+
} from "./worktree-manager.js";
|
|
26
30
|
|
|
27
31
|
export type CloseoutActionId = "finish_quick" | "finish_milestone";
|
|
28
32
|
|
|
@@ -50,8 +54,11 @@ function listMilestoneWorktreeIds(basePath: string): string[] {
|
|
|
50
54
|
if (!existsSync(wtDir)) continue;
|
|
51
55
|
for (const entry of readdirSync(wtDir)) {
|
|
52
56
|
if (!MILESTONE_ID_RE.test(entry)) continue;
|
|
57
|
+
const fullPath = join(wtDir, entry);
|
|
53
58
|
try {
|
|
54
|
-
if (statSync(
|
|
59
|
+
if (!statSync(fullPath).isDirectory()) continue;
|
|
60
|
+
if (!isMilestoneWorktreeResidueCandidate(basePath, fullPath)) continue;
|
|
61
|
+
ids.add(entry);
|
|
55
62
|
} catch {
|
|
56
63
|
// skip unreadable entries
|
|
57
64
|
}
|
|
@@ -90,6 +97,8 @@ function isStrandedMilestoneId(milestoneId: string): boolean {
|
|
|
90
97
|
export function detectIdleMilestoneResidueHint(basePath: string): IdleMilestoneResidueHint | null {
|
|
91
98
|
if (!nativeIsRepo(basePath)) return null;
|
|
92
99
|
|
|
100
|
+
pruneEphemeralGhostWorktreeDirectories(basePath);
|
|
101
|
+
|
|
93
102
|
const gsdDir = join(basePath, ".gsd");
|
|
94
103
|
const dbPath = join(gsdDir, "gsd.db");
|
|
95
104
|
if (!existsSync(gsdDir) || !existsSync(dbPath)) {
|
|
@@ -472,21 +472,18 @@ export function ensureCodebaseMapFresh(
|
|
|
472
472
|
const force = ensureOptions?.force === true;
|
|
473
473
|
const now = Date.now();
|
|
474
474
|
|
|
475
|
-
//
|
|
476
|
-
// file changes are always detected, even within the TTL window.
|
|
477
|
-
const existing = readCodebaseMap(basePath);
|
|
478
|
-
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
479
|
-
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
480
|
-
|
|
481
|
-
// TTL short-circuit: only bypass regeneration when the fingerprint matches,
|
|
482
|
-
// confirming that no tracked files changed since the last check.
|
|
475
|
+
// TTL short-circuit: avoid spawning git on the per-turn freshness path.
|
|
483
476
|
if (!force && ttlMs > 0) {
|
|
484
477
|
const cached = freshnessCache.get(cacheKey);
|
|
485
|
-
if (cached && now - cached.checkedAt < ttlMs
|
|
478
|
+
if (cached && now - cached.checkedAt < ttlMs) {
|
|
486
479
|
return cached.result;
|
|
487
480
|
}
|
|
488
481
|
}
|
|
489
482
|
|
|
483
|
+
const existing = readCodebaseMap(basePath);
|
|
484
|
+
const listed = enumerateFiles(basePath, resolved.excludes, resolved.maxFiles);
|
|
485
|
+
const fingerprint = computeCodebaseFingerprint(listed.files, resolved, listed.truncated);
|
|
486
|
+
|
|
490
487
|
const cacheAndReturn = (result: EnsureCodebaseMapResult): EnsureCodebaseMapResult => {
|
|
491
488
|
freshnessCache.set(cacheKey, { checkedAt: now, result });
|
|
492
489
|
return result;
|
|
@@ -5,6 +5,8 @@ import { loadRegistry } from "../workflow-templates.js";
|
|
|
5
5
|
import { gsdHome } from "../gsd-home.js";
|
|
6
6
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
7
7
|
import { VISUAL_BRIEF_MODES } from "../../visual-brief/prompts.js";
|
|
8
|
+
import { GSD_CORE_ALIAS_CATALOG } from "./gsd-core-aliases.js";
|
|
9
|
+
import { GSD_CORE_IMPLEMENTED_CATALOG } from "../commands-gsd-core.js";
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
export interface GsdCommandDefinition {
|
|
@@ -96,6 +98,10 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
|
96
98
|
{ cmd: "language", desc: "Set or clear the global response language (e.g. /gsd language Chinese)" },
|
|
97
99
|
{ cmd: "worktree", desc: "Manage worktrees from the TUI (list, merge, clean, remove)" },
|
|
98
100
|
{ cmd: "eval-review", desc: "Audit a slice's AI evaluation strategy and write a scored EVAL-REVIEW.md (--force, --show)" },
|
|
101
|
+
// Additional commands (commands-gsd-core.ts) run real prompt-driven workflows;
|
|
102
|
+
// namespace aliases (gsd-core-aliases.ts) redirect to /gsd help.
|
|
103
|
+
...GSD_CORE_IMPLEMENTED_CATALOG,
|
|
104
|
+
...GSD_CORE_ALIAS_CATALOG,
|
|
99
105
|
];
|
|
100
106
|
|
|
101
107
|
const NESTED_COMPLETIONS: CompletionMap = {
|
|
@@ -9,6 +9,7 @@ import { handleCoreCommand } from "./handlers/core.js";
|
|
|
9
9
|
import { handleOpsCommand } from "./handlers/ops.js";
|
|
10
10
|
import { handleParallelCommand } from "./handlers/parallel.js";
|
|
11
11
|
import { handleWorkflowCommand } from "./handlers/workflow.js";
|
|
12
|
+
import { handleGsdCoreAlias } from "./gsd-core-aliases-handler.js";
|
|
12
13
|
import {
|
|
13
14
|
getValidationBlockMessageForBase,
|
|
14
15
|
isValidationBlockAllowedCommand,
|
|
@@ -44,6 +45,8 @@ export async function handleGSDCommand(
|
|
|
44
45
|
const trimmed = (typeof args === "string" ? args : "").trim();
|
|
45
46
|
|
|
46
47
|
const handlers = [
|
|
48
|
+
// Namespace alias redirects (ns-*) run first so they resolve before the standard handlers.
|
|
49
|
+
() => handleGsdCoreAlias(trimmed, ctx, pi),
|
|
47
50
|
() => handleCoreCommand(trimmed, ctx, pi),
|
|
48
51
|
() => handleAutoCommand(trimmed, ctx, pi),
|
|
49
52
|
() => handleParallelCommand(trimmed, ctx, pi),
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Handler that resolves namespace alias redirects (ns-*).
|
|
3
|
+
//
|
|
4
|
+
// Returns true (handled) when the input matches a namespace alias. Redirects
|
|
5
|
+
// re-dispatch through the main dispatcher so safety guards apply to the target
|
|
6
|
+
// command too. Unavailable aliases print a helpful message and stop.
|
|
7
|
+
|
|
8
|
+
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
9
|
+
|
|
10
|
+
import { matchGsdCoreAlias, type GsdCoreAlias } from "./gsd-core-aliases.js";
|
|
11
|
+
|
|
12
|
+
function formatUnavailable(cmd: string, alias: Extract<GsdCoreAlias, { kind: "unavailable" }>): string {
|
|
13
|
+
const lines: string[] = [
|
|
14
|
+
`/gsd ${cmd} is not available.`,
|
|
15
|
+
`Previously it: ${alias.legacy}`,
|
|
16
|
+
];
|
|
17
|
+
if (alias.alternative) lines.push(`Alternative: ${alias.alternative}`);
|
|
18
|
+
lines.push("Run /gsd help for the command reference.");
|
|
19
|
+
return lines.join("\n");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function handleGsdCoreAlias(
|
|
23
|
+
trimmed: string,
|
|
24
|
+
ctx: ExtensionCommandContext,
|
|
25
|
+
pi: ExtensionAPI,
|
|
26
|
+
): Promise<boolean> {
|
|
27
|
+
const match = matchGsdCoreAlias(trimmed);
|
|
28
|
+
if (!match) return false;
|
|
29
|
+
|
|
30
|
+
const { alias, cmd, rest } = match;
|
|
31
|
+
|
|
32
|
+
if (alias.kind === "unavailable") {
|
|
33
|
+
ctx.ui.notify(formatUnavailable(cmd, alias), "warning");
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Redirect: rebuild the target command with any trailing args, then re-dispatch
|
|
38
|
+
// through the main dispatcher so guards + handlers run against the target.
|
|
39
|
+
const targetWithArgs = rest ? `${alias.target} ${rest}` : alias.target;
|
|
40
|
+
if (alias.note) {
|
|
41
|
+
ctx.ui.notify(`${cmd} → /gsd ${alias.target} (${alias.note})`, "info");
|
|
42
|
+
} else {
|
|
43
|
+
ctx.ui.notify(`${cmd} → /gsd ${alias.target}`, "info");
|
|
44
|
+
}
|
|
45
|
+
const { handleGSDCommand } = await import("./dispatcher.js");
|
|
46
|
+
await handleGSDCommand(targetWithArgs, ctx, pi);
|
|
47
|
+
return true;
|
|
48
|
+
}
|