@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
|
@@ -13,7 +13,7 @@ import { isClosedStatus } from "./status-guards.js";
|
|
|
13
13
|
import { deriveState } from "./state.js";
|
|
14
14
|
import { renderPlanFromDb, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
15
15
|
import { readManifest } from "./workflow-manifest.js";
|
|
16
|
-
import { gsdRoot } from "./paths.js";
|
|
16
|
+
import { gsdRoot, resolveSliceFile, resolveMilestonePath, resolveSlicePath, gsdProjectionRoot } from "./paths.js";
|
|
17
17
|
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
18
18
|
/**
|
|
19
19
|
* Strip a leading ID prefix (e.g. "M001: " or "S04: ") from a title
|
|
@@ -276,7 +276,24 @@ export function renderSummaryProjection(basePath, milestoneId, sliceId, taskId)
|
|
|
276
276
|
return;
|
|
277
277
|
const evidenceRows = getVerificationEvidence(milestoneId, sliceId, taskId);
|
|
278
278
|
const content = renderSummaryContent(taskRow, sliceId, milestoneId, evidenceRows);
|
|
279
|
-
|
|
279
|
+
// Layout-aware: avoid creating a milestones/ directory as a side effect for
|
|
280
|
+
// flat-phase projects. If milestonesDir() sees a freshly-created milestones/
|
|
281
|
+
// dir it treats the project as legacy, breaking all subsequent path resolution.
|
|
282
|
+
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
283
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId);
|
|
284
|
+
let dir;
|
|
285
|
+
if (slicePath && phaseDir && slicePath !== phaseDir) {
|
|
286
|
+
// Legacy layout: slice has its own slices/SID/ subdir → tasks/ subdir
|
|
287
|
+
dir = join(slicePath, "tasks");
|
|
288
|
+
}
|
|
289
|
+
else if (phaseDir) {
|
|
290
|
+
// Flat-phase: task summaries go in the phase dir (no tasks/ subdir needed)
|
|
291
|
+
dir = phaseDir;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
// Fallback: legacy hardcoded path (milestone dir not on disk yet)
|
|
295
|
+
dir = join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks");
|
|
296
|
+
}
|
|
280
297
|
mkdirSync(dir, { recursive: true });
|
|
281
298
|
atomicWriteSync(join(dir, `${taskId}-SUMMARY.md`), content);
|
|
282
299
|
}
|
|
@@ -447,7 +464,9 @@ export async function regenerateIfMissing(basePath, milestoneId, sliceId, fileTy
|
|
|
447
464
|
let filePath;
|
|
448
465
|
switch (fileType) {
|
|
449
466
|
case "PLAN":
|
|
450
|
-
|
|
467
|
+
// Use resolveSliceFile so both flat-phase and legacy layouts are detected.
|
|
468
|
+
// Falls back to "" (non-existent) when the file hasn't been rendered yet.
|
|
469
|
+
filePath = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN") ?? "";
|
|
451
470
|
break;
|
|
452
471
|
case "ROADMAP":
|
|
453
472
|
filePath = join(basePath, ".gsd", "milestones", milestoneId, `${milestoneId}-ROADMAP.md`);
|
|
@@ -497,7 +516,9 @@ export async function regenerateIfMissing(basePath, milestoneId, sliceId, fileTy
|
|
|
497
516
|
switch (fileType) {
|
|
498
517
|
case "PLAN":
|
|
499
518
|
await renderPlanFromDb(basePath, milestoneId, sliceId);
|
|
500
|
-
|
|
519
|
+
// Re-resolve after render: the rendered file may be at a different path
|
|
520
|
+
// from the pre-check (flat-phase vs legacy). resolveSliceFile finds it.
|
|
521
|
+
return !!(resolveSliceFile(basePath, milestoneId, sliceId, "PLAN"));
|
|
501
522
|
case "ROADMAP":
|
|
502
523
|
await renderRoadmapFromDb(basePath, milestoneId);
|
|
503
524
|
return existsSync(filePath);
|
|
@@ -454,11 +454,11 @@ async function handleMerge(basePath, name, ctx, pi, targetBranch) {
|
|
|
454
454
|
return;
|
|
455
455
|
}
|
|
456
456
|
// Gather merge context — full repo diff, not just .gsd/
|
|
457
|
-
const diffSummary = diffWorktreeAll(basePath, name);
|
|
458
|
-
const numstat = diffWorktreeNumstat(basePath, name);
|
|
459
|
-
const gsdDiff = getWorktreeGSDDiff(basePath, name);
|
|
460
|
-
const codeDiff = getWorktreeCodeDiff(basePath, name);
|
|
461
|
-
const commitLog = getWorktreeLog(basePath, name);
|
|
457
|
+
const diffSummary = diffWorktreeAll(basePath, name, undefined, mainBranch);
|
|
458
|
+
const numstat = diffWorktreeNumstat(basePath, name, undefined, mainBranch);
|
|
459
|
+
const gsdDiff = getWorktreeGSDDiff(basePath, name, mainBranch);
|
|
460
|
+
const codeDiff = getWorktreeCodeDiff(basePath, name, mainBranch);
|
|
461
|
+
const commitLog = getWorktreeLog(basePath, name, mainBranch);
|
|
462
462
|
const totalChanges = diffSummary.added.length + diffSummary.modified.length + diffSummary.removed.length;
|
|
463
463
|
if (totalChanges === 0 && !commitLog.trim()) {
|
|
464
464
|
ctx.ui.notify(`Worktree ${CLR.name(name)} has no changes to merge.`, "info");
|
|
@@ -541,7 +541,7 @@ async function handleMerge(basePath, name, ctx, pi, targetBranch) {
|
|
|
541
541
|
catch { /* non-fatal */ }
|
|
542
542
|
}
|
|
543
543
|
try {
|
|
544
|
-
mergeWorktreeToMain(basePath, name, commitMessage);
|
|
544
|
+
mergeWorktreeToMain(basePath, name, commitMessage, undefined, mainBranch);
|
|
545
545
|
ctx.ui.notify([
|
|
546
546
|
`${CLR.ok("✓")} Merged ${CLR.name(name)} → ${CLR.branch(mainBranch)} ${CLR.muted("(deterministic squash)")}`,
|
|
547
547
|
"",
|
|
@@ -19,9 +19,9 @@ const DEFAULT_STALE_DAYS = 14;
|
|
|
19
19
|
* @param basePath — the main project root (not the worktree path)
|
|
20
20
|
* @param wt — worktree info from listWorktrees()
|
|
21
21
|
* @param staleDays — days without commits to consider stale (default: 14)
|
|
22
|
+
* @param mainBranch — pre-detected main branch for batched health checks
|
|
22
23
|
*/
|
|
23
|
-
export function getWorktreeHealth(basePath, wt, staleDays = DEFAULT_STALE_DAYS) {
|
|
24
|
-
const mainBranch = nativeDetectMainBranch(basePath);
|
|
24
|
+
export function getWorktreeHealth(basePath, wt, staleDays = DEFAULT_STALE_DAYS, mainBranch = nativeDetectMainBranch(basePath)) {
|
|
25
25
|
// Merge status: is the worktree branch fully contained in main?
|
|
26
26
|
let mergedIntoMain = false;
|
|
27
27
|
try {
|
|
@@ -84,7 +84,10 @@ export function getWorktreeHealth(basePath, wt, staleDays = DEFAULT_STALE_DAYS)
|
|
|
84
84
|
*/
|
|
85
85
|
export function getAllWorktreeHealth(basePath, staleDays = DEFAULT_STALE_DAYS) {
|
|
86
86
|
const worktrees = listWorktrees(basePath);
|
|
87
|
-
|
|
87
|
+
if (worktrees.length === 0)
|
|
88
|
+
return [];
|
|
89
|
+
const mainBranch = nativeDetectMainBranch(basePath);
|
|
90
|
+
return worktrees.map(wt => getWorktreeHealth(basePath, wt, staleDays, mainBranch));
|
|
88
91
|
}
|
|
89
92
|
/**
|
|
90
93
|
* Format a human-readable status line for a worktree health entry.
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* 3. merge() — LLM-guided reconciliation of .gsd/ artifacts back to main
|
|
18
18
|
* 4. remove() — git worktree remove + branch cleanup
|
|
19
19
|
*/
|
|
20
|
-
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
|
|
20
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
|
|
21
21
|
import { execFileSync } from "node:child_process";
|
|
22
22
|
import { join, resolve, sep } from "node:path";
|
|
23
23
|
import { GSDError, GSD_PARSE_ERROR, GSD_STALE_STATE, GSD_LOCK_HELD, GSD_GIT_ERROR, GSD_MERGE_CONFLICT } from "./errors.js";
|
|
@@ -25,6 +25,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
25
25
|
import { nativeBranchList, nativeBranchDelete, nativeBranchExists, nativeBranchForceReset, nativeCommit, nativeDetectMainBranch, nativeDiffContent, nativeDiffNameStatus, nativeDiffNumstat, nativeGetCurrentBranch, nativeIsAncestor, nativeLogOneline, nativeMergeSquash, nativeWorktreeAdd, nativeWorktreeList, nativeWorktreePrune, nativeWorktreeRemove, } from "./native-git-bridge.js";
|
|
26
26
|
import { emitCanonicalRootRedirect } from "./worktree-telemetry.js";
|
|
27
27
|
import { isGsdWorktreePath, normalizeWorktreePathForCompare, resolveWorktreeProjectRoot, } from "./worktree-root.js";
|
|
28
|
+
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
28
29
|
import { canonicalWorktreesDir, worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
29
30
|
function deleteBranchIfPresent(basePath, branch, warningPrefix) {
|
|
30
31
|
try {
|
|
@@ -132,7 +133,99 @@ function isRegisteredGitWorktreeAtPath(basePath, wtPath) {
|
|
|
132
133
|
return false;
|
|
133
134
|
}
|
|
134
135
|
}
|
|
135
|
-
|
|
136
|
+
/** True when `wtPath` has a git worktree checkout marker (`.git` file with gitdir pointer). */
|
|
137
|
+
export function isLiveGitWorktreeCheckout(wtPath) {
|
|
138
|
+
const gitPath = join(wtPath, ".git");
|
|
139
|
+
if (!existsSync(gitPath))
|
|
140
|
+
return false;
|
|
141
|
+
try {
|
|
142
|
+
return lstatSync(gitPath).isFile();
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/** True when a worktree directory should count toward idle milestone residue detection. */
|
|
149
|
+
export function isMilestoneWorktreeResidueCandidate(basePath, wtPath) {
|
|
150
|
+
return isRegisteredGitWorktreeAtPath(basePath, wtPath) || isLiveGitWorktreeCheckout(wtPath);
|
|
151
|
+
}
|
|
152
|
+
const EPHEMERAL_GHOST_WORKTREE_ENTRIES = new Set([".bg-shell", ".DS_Store"]);
|
|
153
|
+
function isEphemeralGhostWorktreeContents(dirPath) {
|
|
154
|
+
let entries;
|
|
155
|
+
try {
|
|
156
|
+
entries = readdirSync(dirPath);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
if (entries.length === 0)
|
|
162
|
+
return true;
|
|
163
|
+
for (const entry of entries) {
|
|
164
|
+
if (EPHEMERAL_GHOST_WORKTREE_ENTRIES.has(entry))
|
|
165
|
+
continue;
|
|
166
|
+
if (entry === ".gsd") {
|
|
167
|
+
try {
|
|
168
|
+
const gsdEntries = readdirSync(join(dirPath, ".gsd"));
|
|
169
|
+
if (gsdEntries.length <= 1 && gsdEntries.every((e) => e === "doctor-history.jsonl")) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Remove milestone worktree directories that are not registered with git and
|
|
184
|
+
* contain only ephemeral runtime content (e.g. bg-shell manifests recreated
|
|
185
|
+
* after teardown). Returns removed directory paths.
|
|
186
|
+
*/
|
|
187
|
+
export function pruneEphemeralGhostWorktreeDirectories(basePath) {
|
|
188
|
+
const removed = [];
|
|
189
|
+
for (const container of allWorktreesDirs(basePath)) {
|
|
190
|
+
if (!existsSync(container))
|
|
191
|
+
continue;
|
|
192
|
+
let entries;
|
|
193
|
+
try {
|
|
194
|
+
entries = readdirSync(container);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
for (const entry of entries) {
|
|
200
|
+
if (!MILESTONE_ID_RE.test(entry))
|
|
201
|
+
continue;
|
|
202
|
+
const fullPath = join(container, entry);
|
|
203
|
+
try {
|
|
204
|
+
if (!statSync(fullPath).isDirectory())
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (isRegisteredGitWorktreeAtPath(basePath, fullPath))
|
|
211
|
+
continue;
|
|
212
|
+
if (isLiveGitWorktreeCheckout(fullPath))
|
|
213
|
+
continue;
|
|
214
|
+
if (!isEphemeralGhostWorktreeContents(fullPath))
|
|
215
|
+
continue;
|
|
216
|
+
try {
|
|
217
|
+
rmSync(fullPath, { recursive: true, force: true });
|
|
218
|
+
logWarning("reconcile", `Removed ephemeral ghost worktree directory (not registered with git): ${fullPath}`, { worktree: entry });
|
|
219
|
+
removed.push(fullPath);
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
logWarning("worktree", `ghost worktree directory removal failed for ${fullPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return removed;
|
|
227
|
+
}
|
|
228
|
+
export function removeStaleWorktreeDirectory(wtPath, name) {
|
|
136
229
|
logWarning("reconcile", `Removing stale worktree directory (not registered with git): ${wtPath}`, { worktree: name });
|
|
137
230
|
try {
|
|
138
231
|
rmSync(wtPath, { recursive: true, force: true });
|
|
@@ -728,10 +821,10 @@ function parseDiffNameStatus(entries) {
|
|
|
728
821
|
* Diff the .gsd/ directory between the worktree branch and main branch.
|
|
729
822
|
* Returns a summary of added, modified, and removed GSD artifacts.
|
|
730
823
|
*/
|
|
731
|
-
export function diffWorktreeGSD(basePath, name) {
|
|
824
|
+
export function diffWorktreeGSD(basePath, name, mainBranchOverride) {
|
|
732
825
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
733
826
|
const branch = worktreeBranchName(name);
|
|
734
|
-
const mainBranch = nativeDetectMainBranch(basePath);
|
|
827
|
+
const mainBranch = mainBranchOverride ?? nativeDetectMainBranch(basePath);
|
|
735
828
|
const entries = nativeDiffNameStatus(basePath, mainBranch, branch, ".gsd/", true);
|
|
736
829
|
return parseDiffNameStatus(entries);
|
|
737
830
|
}
|
|
@@ -741,10 +834,10 @@ export function diffWorktreeGSD(basePath, name) {
|
|
|
741
834
|
* on main when the merge is applied. If both branches have identical
|
|
742
835
|
* content, this correctly returns an empty diff.
|
|
743
836
|
*/
|
|
744
|
-
export function diffWorktreeAll(basePath, name, branchOverride) {
|
|
837
|
+
export function diffWorktreeAll(basePath, name, branchOverride, mainBranchOverride) {
|
|
745
838
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
746
839
|
const branch = branchOverride ?? worktreeBranchName(name);
|
|
747
|
-
const mainBranch = nativeDetectMainBranch(basePath);
|
|
840
|
+
const mainBranch = mainBranchOverride ?? nativeDetectMainBranch(basePath);
|
|
748
841
|
const entries = nativeDiffNameStatus(basePath, mainBranch, branch);
|
|
749
842
|
return parseDiffNameStatus(entries);
|
|
750
843
|
}
|
|
@@ -752,10 +845,10 @@ export function diffWorktreeAll(basePath, name, branchOverride) {
|
|
|
752
845
|
* Get per-file line addition/deletion stats for what will change on main.
|
|
753
846
|
* Uses direct diff (not merge-base) so the preview matches the actual merge outcome.
|
|
754
847
|
*/
|
|
755
|
-
export function diffWorktreeNumstat(basePath, name, branchOverride) {
|
|
848
|
+
export function diffWorktreeNumstat(basePath, name, branchOverride, mainBranchOverride) {
|
|
756
849
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
757
850
|
const branch = branchOverride ?? worktreeBranchName(name);
|
|
758
|
-
const mainBranch = nativeDetectMainBranch(basePath);
|
|
851
|
+
const mainBranch = mainBranchOverride ?? nativeDetectMainBranch(basePath);
|
|
759
852
|
const rawStats = nativeDiffNumstat(basePath, mainBranch, branch);
|
|
760
853
|
const stats = [];
|
|
761
854
|
for (const entry of rawStats) {
|
|
@@ -769,29 +862,29 @@ export function diffWorktreeNumstat(basePath, name, branchOverride) {
|
|
|
769
862
|
* Get the full diff content for .gsd/ between the worktree branch and main.
|
|
770
863
|
* Returns the raw unified diff for LLM consumption.
|
|
771
864
|
*/
|
|
772
|
-
export function getWorktreeGSDDiff(basePath, name) {
|
|
865
|
+
export function getWorktreeGSDDiff(basePath, name, mainBranchOverride) {
|
|
773
866
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
774
867
|
const branch = worktreeBranchName(name);
|
|
775
|
-
const mainBranch = nativeDetectMainBranch(basePath);
|
|
868
|
+
const mainBranch = mainBranchOverride ?? nativeDetectMainBranch(basePath);
|
|
776
869
|
return nativeDiffContent(basePath, mainBranch, branch, ".gsd/", undefined, true);
|
|
777
870
|
}
|
|
778
871
|
/**
|
|
779
872
|
* Get the full diff content for non-.gsd/ files between the worktree branch and main.
|
|
780
873
|
* Returns the raw unified diff for LLM consumption.
|
|
781
874
|
*/
|
|
782
|
-
export function getWorktreeCodeDiff(basePath, name) {
|
|
875
|
+
export function getWorktreeCodeDiff(basePath, name, mainBranchOverride) {
|
|
783
876
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
784
877
|
const branch = worktreeBranchName(name);
|
|
785
|
-
const mainBranch = nativeDetectMainBranch(basePath);
|
|
878
|
+
const mainBranch = mainBranchOverride ?? nativeDetectMainBranch(basePath);
|
|
786
879
|
return nativeDiffContent(basePath, mainBranch, branch, undefined, ".gsd/", true);
|
|
787
880
|
}
|
|
788
881
|
/**
|
|
789
882
|
* Get commit log for the worktree branch since it diverged from main.
|
|
790
883
|
*/
|
|
791
|
-
export function getWorktreeLog(basePath, name) {
|
|
884
|
+
export function getWorktreeLog(basePath, name, mainBranchOverride) {
|
|
792
885
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
793
886
|
const branch = worktreeBranchName(name);
|
|
794
|
-
const mainBranch = nativeDetectMainBranch(basePath);
|
|
887
|
+
const mainBranch = mainBranchOverride ?? nativeDetectMainBranch(basePath);
|
|
795
888
|
const entries = nativeLogOneline(basePath, mainBranch, branch);
|
|
796
889
|
return entries.map(e => `${e.sha} ${e.message}`).join("\n");
|
|
797
890
|
}
|
|
@@ -800,10 +893,10 @@ export function getWorktreeLog(basePath, name) {
|
|
|
800
893
|
* Must be called from the main working tree (not the worktree itself).
|
|
801
894
|
* Returns the merge commit message.
|
|
802
895
|
*/
|
|
803
|
-
export function mergeWorktreeToMain(basePath, name, commitMessage, branchOverride) {
|
|
896
|
+
export function mergeWorktreeToMain(basePath, name, commitMessage, branchOverride, mainBranchOverride) {
|
|
804
897
|
basePath = normalizeBasePathForWorktreeOps(basePath);
|
|
805
898
|
const branch = branchOverride ?? worktreeBranchName(name);
|
|
806
|
-
const mainBranch = nativeDetectMainBranch(basePath);
|
|
899
|
+
const mainBranch = mainBranchOverride ?? nativeDetectMainBranch(basePath);
|
|
807
900
|
const current = nativeGetCurrentBranch(basePath);
|
|
808
901
|
if (current !== mainBranch) {
|
|
809
902
|
throw new GSDError(GSD_GIT_ERROR, `Must be on ${mainBranch} to merge. Currently on ${current}.`);
|
|
@@ -5,7 +5,7 @@ import { execFileSync } from "node:child_process";
|
|
|
5
5
|
import { join, resolve } from "node:path";
|
|
6
6
|
import { normalizeWorktreePathForCompare } from "./worktree-root.js";
|
|
7
7
|
import { worktreesDirs } from "./worktree-placement.js";
|
|
8
|
-
import { listWorktrees } from "./worktree-manager.js";
|
|
8
|
+
import { listWorktrees, removeStaleWorktreeDirectory } from "./worktree-manager.js";
|
|
9
9
|
import { getCurrentBranch } from "./worktree.js";
|
|
10
10
|
const fsOnlyDeps = {
|
|
11
11
|
existsSync,
|
|
@@ -25,6 +25,7 @@ const defaultDeps = {
|
|
|
25
25
|
stdio: "pipe",
|
|
26
26
|
});
|
|
27
27
|
},
|
|
28
|
+
removeStaleWorktreeDirectory,
|
|
28
29
|
getCurrentBranch,
|
|
29
30
|
};
|
|
30
31
|
function isValidMilestoneId(milestoneId) {
|
|
@@ -40,7 +41,6 @@ function errorMessage(error) {
|
|
|
40
41
|
return error instanceof Error ? error.message : String(error);
|
|
41
42
|
}
|
|
42
43
|
export function createWorktreeSafetyModule(deps = defaultDeps) {
|
|
43
|
-
const unregisteredRecoveryFailed = new Set();
|
|
44
44
|
return {
|
|
45
45
|
validateUnitRoot(input) {
|
|
46
46
|
if (input.writeScope === "planning-only") {
|
|
@@ -98,30 +98,39 @@ export function createWorktreeSafetyModule(deps = defaultDeps) {
|
|
|
98
98
|
return failure("worktree-git-probe-failed", `Unable to list registered worktrees for project root ${projectRoot}.`, "Recover or recreate the milestone worktree before dispatching the source-writing Unit.", { projectRoot, error: errorMessage(error) });
|
|
99
99
|
}
|
|
100
100
|
if (registered && !registered.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
101
|
-
const wasPreviouslyTracked = unregisteredRecoveryFailed.has(unitRoot);
|
|
102
101
|
let attemptedPrune = false;
|
|
103
|
-
if (
|
|
102
|
+
if (deps.pruneRegisteredWorktrees) {
|
|
104
103
|
attemptedPrune = true;
|
|
105
104
|
try {
|
|
106
105
|
deps.pruneRegisteredWorktrees(projectRoot);
|
|
107
106
|
const rechecked = deps.listRegisteredWorktrees?.(projectRoot);
|
|
108
107
|
if (rechecked?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
109
|
-
unregisteredRecoveryFailed.delete(unitRoot);
|
|
110
108
|
registered = rechecked;
|
|
111
109
|
}
|
|
112
|
-
else {
|
|
113
|
-
unregisteredRecoveryFailed.add(unitRoot);
|
|
114
|
-
}
|
|
115
110
|
}
|
|
116
111
|
catch (error) {
|
|
117
|
-
unregisteredRecoveryFailed.add(unitRoot);
|
|
118
112
|
return failure("worktree-git-probe-failed", `Unable to recover unregistered worktree root ${unitRoot}.`, "Run 'git worktree prune', then recreate or re-register the milestone worktree before dispatching the source-writing Unit.", { projectRoot, unitRoot, error: errorMessage(error) });
|
|
119
113
|
}
|
|
120
114
|
}
|
|
121
115
|
if (!registered?.some((worktree) => samePath(worktree.path, unitRoot))) {
|
|
122
|
-
|
|
116
|
+
// The directory exists on disk with a .git marker but git no longer
|
|
117
|
+
// tracks it as a worktree (e.g. a prior removeWorktree crash left the
|
|
118
|
+
// directory while `git worktree prune` cleaned the registry). Remove
|
|
119
|
+
// the orphaned directory — the same cleanup createWorktree performs —
|
|
120
|
+
// so the next dispatch recreates the milestone worktree from scratch
|
|
121
|
+
// instead of looping forever on worktree-unregistered (#803, #590).
|
|
122
|
+
if (deps.removeStaleWorktreeDirectory) {
|
|
123
|
+
try {
|
|
124
|
+
deps.removeStaleWorktreeDirectory(unitRoot, milestoneId);
|
|
125
|
+
return failure("worktree-missing", `Worktree root ${unitRoot} was not registered with git; removed the orphaned directory so it can be recreated.`, "Recreate the milestone worktree before dispatching the source-writing Unit. Auto-mode recreates it automatically on the next dispatch.", { unitRoot, attemptedPrune, removedStaleDirectory: true });
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return failure("worktree-unregistered", `Worktree root ${unitRoot} is not registered with git worktree list and the orphaned directory could not be removed.`, "Remove the orphaned worktree directory manually (it may be locked by another process), then recreate or re-register the milestone worktree before dispatching the source-writing Unit.", { unitRoot, attemptedPrune, removedStaleDirectory: false, error: errorMessage(error) });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return failure("worktree-unregistered", `Worktree root ${unitRoot} is not registered with git worktree list.`, attemptedPrune
|
|
123
132
|
? "Worktree recovery was attempted but the root is still unregistered. Recreate or re-register the milestone worktree before dispatching the source-writing Unit."
|
|
124
|
-
: "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.", { unitRoot, attemptedPrune
|
|
133
|
+
: "Run 'git worktree prune'. If still unregistered, recreate or re-register the milestone worktree before dispatching the source-writing Unit.", { unitRoot, attemptedPrune });
|
|
125
134
|
}
|
|
126
135
|
}
|
|
127
136
|
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Detect shell commands that reference the project root from a milestone worktree.
|
|
3
|
+
import { realpathSync } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { projectRootFromWorktreePath } from "./worktree-root.js";
|
|
6
|
+
function escapeRegExp(value) {
|
|
7
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
8
|
+
}
|
|
9
|
+
function normalizeScanPath(value) {
|
|
10
|
+
const normalized = value.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
11
|
+
return normalized.startsWith("/private/var/")
|
|
12
|
+
? normalized.slice("/private".length)
|
|
13
|
+
: normalized;
|
|
14
|
+
}
|
|
15
|
+
function parseWorktreeBase(baseDir) {
|
|
16
|
+
const normalizedBase = normalizeScanPath(baseDir);
|
|
17
|
+
const originalRoot = projectRootFromWorktreePath(normalizedBase);
|
|
18
|
+
if (!originalRoot)
|
|
19
|
+
return null;
|
|
20
|
+
return { originalRoot, worktreeRoot: normalizedBase };
|
|
21
|
+
}
|
|
22
|
+
function pathInside(parent, target) {
|
|
23
|
+
const parentWithSep = parent.endsWith("/") ? parent : `${parent}/`;
|
|
24
|
+
return target === parent || target.startsWith(parentWithSep);
|
|
25
|
+
}
|
|
26
|
+
function comparablePathVariants(value) {
|
|
27
|
+
const variants = new Set();
|
|
28
|
+
const normalized = normalizeScanPath(path.resolve(value));
|
|
29
|
+
variants.add(normalized);
|
|
30
|
+
try {
|
|
31
|
+
variants.add(normalizeScanPath(realpathSync(normalized)));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Nonexistent paths are still compared lexically.
|
|
35
|
+
}
|
|
36
|
+
if (normalized.startsWith("/private/var/")) {
|
|
37
|
+
variants.add(normalized.replace(/^\/private\/var\//, "/var/"));
|
|
38
|
+
}
|
|
39
|
+
else if (normalized.startsWith("/var/")) {
|
|
40
|
+
variants.add(`/private${normalized}`);
|
|
41
|
+
}
|
|
42
|
+
return [...variants];
|
|
43
|
+
}
|
|
44
|
+
function pathInsideAny(parents, targets) {
|
|
45
|
+
return targets.some((target) => parents.some((parent) => pathInside(parent, target)));
|
|
46
|
+
}
|
|
47
|
+
function stripWrappingQuotes(value) {
|
|
48
|
+
const trimmed = value.trim();
|
|
49
|
+
if (trimmed.length < 2)
|
|
50
|
+
return trimmed;
|
|
51
|
+
const first = trimmed[0];
|
|
52
|
+
const last = trimmed[trimmed.length - 1];
|
|
53
|
+
if ((first === "'" || first === '"' || first === "`") && last === first) {
|
|
54
|
+
return trimmed.slice(1, -1).trim();
|
|
55
|
+
}
|
|
56
|
+
return trimmed;
|
|
57
|
+
}
|
|
58
|
+
function extractPathLikeValues(script) {
|
|
59
|
+
const values = [];
|
|
60
|
+
const push = (candidate) => {
|
|
61
|
+
const cleaned = stripWrappingQuotes(candidate).trim();
|
|
62
|
+
if (!cleaned)
|
|
63
|
+
return;
|
|
64
|
+
values.push(cleaned);
|
|
65
|
+
};
|
|
66
|
+
const pushQuotedLiterals = (source, depth = 0) => {
|
|
67
|
+
for (const match of source.matchAll(/(["'`])((?:\\.|(?!\1).)*)\1/g)) {
|
|
68
|
+
push(match[2]);
|
|
69
|
+
if (depth < 2 && /["'`]/.test(match[2])) {
|
|
70
|
+
pushQuotedLiterals(match[2], depth + 1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
for (const match of script.matchAll(/(?:^|[;\n\r]|\&\&|\|\|)\s*cd\s+([^\n\r;|&]+)/g)) {
|
|
75
|
+
push(match[1]);
|
|
76
|
+
}
|
|
77
|
+
for (const match of script.matchAll(/process\.chdir\(\s*([^\n\r;]+?)\s*\)/g)) {
|
|
78
|
+
push(match[1]);
|
|
79
|
+
pushQuotedLiterals(match[1]);
|
|
80
|
+
}
|
|
81
|
+
pushQuotedLiterals(script);
|
|
82
|
+
return values;
|
|
83
|
+
}
|
|
84
|
+
export function resolvesToOriginalRootOutsideWorktree(script, baseDir) {
|
|
85
|
+
const parsed = parseWorktreeBase(baseDir);
|
|
86
|
+
if (!parsed)
|
|
87
|
+
return false;
|
|
88
|
+
const normalizedWorktree = normalizeScanPath(path.resolve(parsed.worktreeRoot));
|
|
89
|
+
const normalizedOriginalRoot = normalizeScanPath(path.resolve(parsed.originalRoot));
|
|
90
|
+
const worktreeRoots = comparablePathVariants(normalizedWorktree);
|
|
91
|
+
const originalRoots = comparablePathVariants(normalizedOriginalRoot);
|
|
92
|
+
for (const value of extractPathLikeValues(script)) {
|
|
93
|
+
const resolved = comparablePathVariants(path.resolve(normalizedWorktree, value));
|
|
94
|
+
if (pathInsideAny(originalRoots, resolved) && !pathInsideAny(worktreeRoots, resolved)) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
export function scriptReferencesOriginalRootFromWorktree(script, baseDir) {
|
|
101
|
+
const parsed = parseWorktreeBase(baseDir);
|
|
102
|
+
if (!parsed)
|
|
103
|
+
return false;
|
|
104
|
+
const normalizedScript = script.replace(/\\/g, "/");
|
|
105
|
+
return comparablePathVariants(parsed.originalRoot).some((originalRoot) => {
|
|
106
|
+
const originalRootPattern = new RegExp(`${escapeRegExp(originalRoot)}(?=$|[\\s'"\\\`;)&|<>]|/(?!\\.gsd(?:-worktrees|/worktrees)(?:/|$)))`);
|
|
107
|
+
return originalRootPattern.test(normalizedScript);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
export function bashReferencesProjectRootOutsideWorktree(script, baseDir) {
|
|
111
|
+
return resolvesToOriginalRootOutsideWorktree(script, baseDir)
|
|
112
|
+
|| scriptReferencesOriginalRootFromWorktree(script, baseDir);
|
|
113
|
+
}
|
|
@@ -355,14 +355,14 @@ function normalizeRawServerConfig(name, config, source) {
|
|
|
355
355
|
cwd: typeof config.cwd === "string" ? config.cwd : undefined,
|
|
356
356
|
headers,
|
|
357
357
|
oauth: config.oauth && typeof config.oauth === "object" ? config.oauth : undefined,
|
|
358
|
-
envWarnings:
|
|
358
|
+
envWarnings: collectMcpEnvWarnings([
|
|
359
359
|
["url", url],
|
|
360
360
|
...Object.entries(env ?? {}).map(([key, value]) => [`env.${key}`, value]),
|
|
361
361
|
...Object.entries(headers ?? {}).map(([key, value]) => [`headers.${key}`, value]),
|
|
362
362
|
]),
|
|
363
363
|
};
|
|
364
364
|
}
|
|
365
|
-
function detectTransport(config) {
|
|
365
|
+
export function detectTransport(config) {
|
|
366
366
|
const type = typeof config.type === "string" ? config.type.toLowerCase() : undefined;
|
|
367
367
|
if (type && type !== "stdio" && type !== "http")
|
|
368
368
|
return "unsupported";
|
|
@@ -397,7 +397,7 @@ function serializeServerInput(input) {
|
|
|
397
397
|
_gsdImportedFrom: input.importedFrom,
|
|
398
398
|
});
|
|
399
399
|
}
|
|
400
|
-
function
|
|
400
|
+
export function collectMcpEnvWarnings(values) {
|
|
401
401
|
const warnings = [];
|
|
402
402
|
for (const [label, value] of values) {
|
|
403
403
|
if (!value)
|
|
@@ -3,30 +3,62 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Native Anthropic hooks stay eager. Heavy tool registration is deferred in
|
|
5
5
|
* interactive mode so startup is not blocked on the full search tool stack.
|
|
6
|
+
*
|
|
7
|
+
* Provider gating: the Brave/Tavily/Ollama-backed tools (search-the-web,
|
|
8
|
+
* search_and_read) are only registered when a provider API key is actually
|
|
9
|
+
* configured (resolveSearchProvider() !== null). Without a key these tools can
|
|
10
|
+
* only return an auth error, so presenting them to the model is pure confusion
|
|
11
|
+
* — the agent reaches for a tool that cannot work. fetch_page is always
|
|
12
|
+
* registered because it works key-free via Jina Reader.
|
|
6
13
|
*/
|
|
7
14
|
import { importExtensionModule } from "@gsd/pi-coding-agent";
|
|
8
15
|
import { registerSearchProviderCommand } from "./command-search-provider.js";
|
|
9
16
|
import { registerNativeSearchHooks } from "./native-search.js";
|
|
10
|
-
|
|
17
|
+
import { resolveSearchProvider } from "./provider.js";
|
|
18
|
+
// fetch_page registration — always available (key-free via Jina Reader).
|
|
19
|
+
let fetchToolPromise = null;
|
|
20
|
+
// search-the-web + search_and_read registration — gated on provider key.
|
|
21
|
+
let searchToolsPromise = null;
|
|
11
22
|
let resetSearchLoopGuardStateRef = null;
|
|
12
|
-
async function
|
|
13
|
-
if (!
|
|
14
|
-
|
|
15
|
-
const
|
|
23
|
+
async function registerFetchTool(pi) {
|
|
24
|
+
if (!fetchToolPromise) {
|
|
25
|
+
fetchToolPromise = (async () => {
|
|
26
|
+
const { registerFetchPageTool } = await importExtensionModule(import.meta.url, "./tool-fetch-page.js");
|
|
27
|
+
registerFetchPageTool(pi);
|
|
28
|
+
})().catch((error) => {
|
|
29
|
+
fetchToolPromise = null;
|
|
30
|
+
throw error;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return fetchToolPromise;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Register the provider-backed search tools, but only when a search provider
|
|
37
|
+
* key is configured. Memoized so it registers at most once per process; the
|
|
38
|
+
* guard is re-evaluated on each session_start so a key added before a later
|
|
39
|
+
* session is picked up without a restart.
|
|
40
|
+
*/
|
|
41
|
+
async function registerProviderSearchTools(pi) {
|
|
42
|
+
if (resolveSearchProvider() === null)
|
|
43
|
+
return;
|
|
44
|
+
if (!searchToolsPromise) {
|
|
45
|
+
searchToolsPromise = (async () => {
|
|
46
|
+
const [{ registerSearchTool, resetSearchLoopGuardState }, { registerLLMContextTool },] = await Promise.all([
|
|
16
47
|
importExtensionModule(import.meta.url, "./tool-search.js"),
|
|
17
|
-
importExtensionModule(import.meta.url, "./tool-fetch-page.js"),
|
|
18
48
|
importExtensionModule(import.meta.url, "./tool-llm-context.js"),
|
|
19
49
|
]);
|
|
20
50
|
resetSearchLoopGuardStateRef = resetSearchLoopGuardState;
|
|
21
51
|
registerSearchTool(pi);
|
|
22
|
-
registerFetchPageTool(pi);
|
|
23
52
|
registerLLMContextTool(pi);
|
|
24
53
|
})().catch((error) => {
|
|
25
|
-
|
|
54
|
+
searchToolsPromise = null;
|
|
26
55
|
throw error;
|
|
27
56
|
});
|
|
28
57
|
}
|
|
29
|
-
return
|
|
58
|
+
return searchToolsPromise;
|
|
59
|
+
}
|
|
60
|
+
async function registerSearchTools(pi) {
|
|
61
|
+
await Promise.all([registerFetchTool(pi), registerProviderSearchTools(pi)]);
|
|
30
62
|
}
|
|
31
63
|
export default function (pi) {
|
|
32
64
|
registerSearchProviderCommand(pi);
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { isAnthropicApi } from "@gsd/pi-ai";
|
|
8
8
|
import { resolveSearchProviderFromPreferences } from "../gsd/preferences.js";
|
|
9
|
+
import { resolveSearchProvider } from "./provider.js";
|
|
9
10
|
/** Tool names for the Brave-backed custom search tools */
|
|
10
11
|
export const BRAVE_TOOL_NAMES = ["search-the-web", "search_and_read"];
|
|
11
12
|
/** All custom search tool names that should be disabled when native search is active */
|
|
@@ -166,11 +167,24 @@ export function registerNativeSearchHooks(pi) {
|
|
|
166
167
|
pi.setActiveTools(active.filter((t) => !CUSTOM_SEARCH_TOOL_NAMES.includes(t)));
|
|
167
168
|
}
|
|
168
169
|
else if (!isAnthropicProvider && wasAnthropic) {
|
|
169
|
-
// Switching away from Anthropic — re-enable custom search tools
|
|
170
|
-
//
|
|
171
|
-
//
|
|
170
|
+
// Switching away from Anthropic — re-enable custom search tools that were
|
|
171
|
+
// disabled while native search was active. Only re-add the Brave/Tavily/
|
|
172
|
+
// Ollama-backed tools when a provider key is actually configured: without
|
|
173
|
+
// a key they can only return an auth error, and re-adding their names
|
|
174
|
+
// would advertise a tool the model cannot use (and, when unregistered,
|
|
175
|
+
// leak a schema-less phantom name into the tool surface). google_search
|
|
176
|
+
// is owned by its own extension (which now gates its registration on
|
|
177
|
+
// Gemini creds); re-adding its name here is harmless either way — it
|
|
178
|
+
// activates if registered, or is dropped as a no-op if not.
|
|
172
179
|
const active = pi.getActiveTools();
|
|
173
|
-
const
|
|
180
|
+
const providerConfigured = resolveSearchProvider() !== null;
|
|
181
|
+
const toAdd = CUSTOM_SEARCH_TOOL_NAMES.filter((t) => {
|
|
182
|
+
if (active.includes(t))
|
|
183
|
+
return false;
|
|
184
|
+
if (BRAVE_TOOL_NAMES.includes(t))
|
|
185
|
+
return providerConfigured;
|
|
186
|
+
return true;
|
|
187
|
+
});
|
|
174
188
|
if (toAdd.length > 0) {
|
|
175
189
|
pi.setActiveTools([...active, ...toAdd]);
|
|
176
190
|
}
|