@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
|
@@ -228,11 +228,12 @@ function _parsePlanImpl(content: string): SlicePlan {
|
|
|
228
228
|
const mhSection = extractSection(body, 'Must-Haves');
|
|
229
229
|
const mustHaves = mhSection ? parseBullets(mhSection) : [];
|
|
230
230
|
|
|
231
|
-
// Parse tasks from ## Tasks section
|
|
232
|
-
// task checkboxes that were missed.
|
|
233
|
-
// headings (## Steps, ## Must-Haves) before T02's checkbox, which causes
|
|
234
|
-
// extractSection("Tasks") to stop at the first ## heading and miss T02+ (#3105).
|
|
231
|
+
// Parse tasks from ## Tasks section or <tasks> XML block, then scan the full
|
|
232
|
+
// body for any task checkboxes that were missed.
|
|
235
233
|
const tasksSection = extractSection(body, 'Tasks');
|
|
234
|
+
// Flat-phase: extract <tasks>...</tasks> block content
|
|
235
|
+
const tasksBlockMatch = body.match(/<tasks>([\s\S]*?)<\/tasks>/);
|
|
236
|
+
const tasksBlock = tasksBlockMatch ? tasksBlockMatch[1] : null;
|
|
236
237
|
const tasks: TaskPlanEntry[] = [];
|
|
237
238
|
|
|
238
239
|
// Parse task entries from a set of lines, appending to `tasks`.
|
|
@@ -240,7 +241,11 @@ function _parsePlanImpl(content: string): SlicePlan {
|
|
|
240
241
|
let currentTask: TaskPlanEntry | null = null;
|
|
241
242
|
|
|
242
243
|
for (const line of lines) {
|
|
243
|
-
|
|
244
|
+
// Match both formats:
|
|
245
|
+
// Legacy: - [x] **T01: Title** `est:30m`
|
|
246
|
+
// Flat-phase: - [x] **T01**: Title _(30m)_
|
|
247
|
+
const cbMatch = line.match(/^-\s+\[([ xX])\]\s+\*\*([\w.]+):\s+(.+?)\*\*\s*(.*)/)
|
|
248
|
+
|| line.match(/^-\s+\[([ xX])\]\s+\*\*([\w.]+)\*\*:\s+(.+?)\s*(?:_\(([^)]*)\)_\s*)?$/);
|
|
244
249
|
// Heading-style: ### T01 -- Title, ### T01: Title, ### T01 — Title
|
|
245
250
|
const hdMatch = !cbMatch
|
|
246
251
|
? line.match(/^#{2,4}\s+([A-Z]+\d+(?:\.[A-Z]+\d+)*)\s*(?:--|—|:)\s*(.+)/)
|
|
@@ -252,18 +257,31 @@ function _parsePlanImpl(content: string): SlicePlan {
|
|
|
252
257
|
currentTask = null;
|
|
253
258
|
continue;
|
|
254
259
|
}
|
|
260
|
+
knownIds.add(taskId);
|
|
255
261
|
if (currentTask) tasks.push(currentTask);
|
|
256
262
|
|
|
257
263
|
if (cbMatch) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
264
|
+
// Two regex alternatives — distinguish by the shape of group 4.
|
|
265
|
+
// Legacy: group 4 = trailing text (may contain `est:X`). Title in group 3.
|
|
266
|
+
// Flat-phase: group 4 = estimate value directly (e.g. "30m"). Title in group 3.
|
|
267
|
+
const group4 = cbMatch[4] || '';
|
|
268
|
+
const title = (cbMatch[3] || '').trim();
|
|
269
|
+
let estimate = '';
|
|
270
|
+
|
|
271
|
+
// Legacy `est:X` tag
|
|
272
|
+
const estMatch = group4.match(/`est:([^`]+)`/);
|
|
273
|
+
if (estMatch) {
|
|
274
|
+
estimate = estMatch[1]!;
|
|
275
|
+
} else if (group4) {
|
|
276
|
+
// Flat-phase: the estimate value was captured directly
|
|
277
|
+
estimate = group4;
|
|
278
|
+
}
|
|
261
279
|
|
|
262
280
|
currentTask = {
|
|
263
281
|
id: cbMatch[2],
|
|
264
|
-
title
|
|
282
|
+
title,
|
|
265
283
|
description: '',
|
|
266
|
-
done: cbMatch[1]
|
|
284
|
+
done: cbMatch[1]!.toLowerCase() === 'x',
|
|
267
285
|
estimate,
|
|
268
286
|
};
|
|
269
287
|
} else {
|
|
@@ -293,7 +311,7 @@ function _parsePlanImpl(content: string): SlicePlan {
|
|
|
293
311
|
if (verifyMatch) {
|
|
294
312
|
currentTask.verify = verifyMatch[1].trim();
|
|
295
313
|
}
|
|
296
|
-
} else if (currentTask && line.trim() && !line.startsWith('#')) {
|
|
314
|
+
} else if (currentTask && line.trim() && !line.startsWith('#') && !line.match(/<\/?tasks>/) && !line.match(/^\s*-\s+(Files|Verify):/)) {
|
|
297
315
|
const desc = line.trim();
|
|
298
316
|
if (desc) {
|
|
299
317
|
currentTask.description = currentTask.description
|
|
@@ -305,14 +323,23 @@ function _parsePlanImpl(content: string): SlicePlan {
|
|
|
305
323
|
if (currentTask) tasks.push(currentTask);
|
|
306
324
|
};
|
|
307
325
|
|
|
326
|
+
const knownTaskIds = new Set<string>();
|
|
308
327
|
if (tasksSection) {
|
|
309
|
-
parseTaskLines(tasksSection.split('\n'),
|
|
328
|
+
parseTaskLines(tasksSection.split('\n'), knownTaskIds);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Flat-phase: parse <tasks> block
|
|
332
|
+
if (tasksBlock) {
|
|
333
|
+
parseTaskLines(tasksBlock.split('\n'), knownTaskIds);
|
|
310
334
|
}
|
|
311
335
|
|
|
312
336
|
// Second pass: scan the full body for task checkboxes outside ## Tasks.
|
|
313
|
-
//
|
|
314
|
-
|
|
315
|
-
|
|
337
|
+
// Only do this for legacy plans (no <tasks> block) — flat-phase plans
|
|
338
|
+
// have all tasks inside <tasks> and the second pass would pick up noise.
|
|
339
|
+
if (!tasksBlock && !tasksSection) {
|
|
340
|
+
const foundIds = new Set(tasks.map(t => t.id));
|
|
341
|
+
parseTaskLines(body.split('\n'), foundIds);
|
|
342
|
+
}
|
|
316
343
|
|
|
317
344
|
const filesSection = extractSection(body, 'Files Likely Touched');
|
|
318
345
|
const filesLikelyTouched = filesSection ? parseBullets(filesSection) : [];
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* via prefix matching, so existing projects work without migration.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { readdirSync, existsSync, realpathSync, Dirent } from "node:fs";
|
|
13
|
+
import { readdirSync, existsSync, realpathSync, statSync, Dirent } from "node:fs";
|
|
14
14
|
import { join, dirname, normalize, resolve } from "node:path";
|
|
15
15
|
import { homedir } from "node:os";
|
|
16
16
|
import { spawnSync } from "node:child_process";
|
|
@@ -18,7 +18,15 @@ import { nativeScanGsdTree, type GsdTreeEntry } from "./native-parser-bridge.js"
|
|
|
18
18
|
import { DIR_CACHE_MAX } from "./constants.js";
|
|
19
19
|
import { gsdHome } from "./gsd-home.js";
|
|
20
20
|
import { findWorktreeSegment, isGsdWorktreePath, resolveExternalStateProjectGsdFromWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
21
|
-
|
|
21
|
+
import {
|
|
22
|
+
LAYOUT_SEGMENTS,
|
|
23
|
+
phaseDirName,
|
|
24
|
+
planFileName,
|
|
25
|
+
milestoneIdToPhaseNum,
|
|
26
|
+
milestoneIdUniqueSuffix,
|
|
27
|
+
sliceIdToPlanNum,
|
|
28
|
+
derivePhaseSlug,
|
|
29
|
+
} from "./layout-policy.js";
|
|
22
30
|
// ─── Directory Listing Cache ──────────────────────────────────────────────────
|
|
23
31
|
|
|
24
32
|
const dirEntryCache = new Map<string, Dirent[]>();
|
|
@@ -186,7 +194,9 @@ export const PLANNING_ARTIFACT_NAME_RE = new RegExp(
|
|
|
186
194
|
* ("M001", "CONTEXT") → "M001-CONTEXT.md"
|
|
187
195
|
*/
|
|
188
196
|
export function buildMilestoneFileName(milestoneId: string, suffix: string): string {
|
|
189
|
-
|
|
197
|
+
// Flat-phase: phase-level files are NN-SUFFIX.md (e.g. "01-CONTEXT.md")
|
|
198
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
199
|
+
return `${String(phaseNum).padStart(2, "0")}-${suffix}.md`;
|
|
190
200
|
}
|
|
191
201
|
|
|
192
202
|
/**
|
|
@@ -194,7 +204,12 @@ export function buildMilestoneFileName(milestoneId: string, suffix: string): str
|
|
|
194
204
|
* ("S01", "PLAN") → "S01-PLAN.md"
|
|
195
205
|
*/
|
|
196
206
|
export function buildSliceFileName(sliceId: string, suffix: string): string {
|
|
197
|
-
|
|
207
|
+
// Flat-phase: plan files need both phase and plan numbers (NN-MM-SUFFIX.md),
|
|
208
|
+
// but this helper only has the sliceId. Callers needing the full name should
|
|
209
|
+
// use planFileName() from layout-policy. This returns MM-SUFFIX.md for any
|
|
210
|
+
// incremental callers that haven't migrated yet.
|
|
211
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
212
|
+
return `${String(planNum).padStart(2, "0")}-${suffix}.md`;
|
|
198
213
|
}
|
|
199
214
|
|
|
200
215
|
/**
|
|
@@ -203,6 +218,8 @@ export function buildSliceFileName(sliceId: string, suffix: string): string {
|
|
|
203
218
|
* ("T03", "SUMMARY") → "T03-SUMMARY.md"
|
|
204
219
|
*/
|
|
205
220
|
export function buildTaskFileName(taskId: string, suffix: string): string {
|
|
221
|
+
// Flat-phase: tasks are checkboxes inside plan files, not separate files.
|
|
222
|
+
// This helper is deprecated but kept for backward-compat callers.
|
|
206
223
|
return `${taskId}-${suffix}.md`;
|
|
207
224
|
}
|
|
208
225
|
|
|
@@ -573,10 +590,181 @@ function probeGsdRoot(rawBasePath: string): string {
|
|
|
573
590
|
// 4. Fallback for init/creation
|
|
574
591
|
return local;
|
|
575
592
|
}
|
|
593
|
+
function legacyMilestonesHasSubdirs(basePath: string): boolean {
|
|
594
|
+
const legacy = join(gsdProjectionRoot(basePath), "milestones");
|
|
595
|
+
if (!existsSync(legacy)) return false;
|
|
596
|
+
try {
|
|
597
|
+
return readdirSync(legacy).some(e => statSync(join(legacy, e)).isDirectory() && dirIsContentBearingLegacyMilestone(join(legacy, e)));
|
|
598
|
+
} catch {
|
|
599
|
+
return false;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* A `milestones/<MID>/` directory is only a real legacy layout entry if it
|
|
605
|
+
* contains content files (CONTEXT/ROADMAP/SUMMARY/…). git-service.ts creates
|
|
606
|
+
* `milestones/<MID>/` to store the integration-branch metadata
|
|
607
|
+
* (`<MID>-META.json`) even in flat-phase projects, so a directory holding only
|
|
608
|
+
* `*-META.json` must NOT count as legacy — otherwise layout detection flips to
|
|
609
|
+
* legacy and artifact verification resolves to the wrong path
|
|
610
|
+
* (`milestones/<MID>/<MID>-CONTEXT.md` instead of `phases/NN-slug/NN-CONTEXT.md`),
|
|
611
|
+
* trapping the unit in a finalize-retry loop (#852 follow-up).
|
|
612
|
+
*
|
|
613
|
+
* See the matching TODO in markdown-renderer.ts detectStaleRenders, which
|
|
614
|
+
* disabled stale-render detection for the same reason.
|
|
615
|
+
*/
|
|
616
|
+
export function dirIsContentBearingLegacyMilestone(dir: string): boolean {
|
|
617
|
+
try {
|
|
618
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
619
|
+
// 1. Any non-META regular file → real legacy content.
|
|
620
|
+
if (entries.some(e => e.isFile() && !e.name.endsWith("-META.json"))) return true;
|
|
621
|
+
// 2. A non-empty subdirectory → real legacy content (e.g. slices/ with slice dirs).
|
|
622
|
+
// An *empty* subdir is treated as scaffolding (e.g. git-service.ts may create
|
|
623
|
+
// an empty slices/ alongside the integration META file) and must NOT flip the
|
|
624
|
+
// layout — that is the Bugbot finding this guard addresses.
|
|
625
|
+
return entries.some(e => {
|
|
626
|
+
if (!e.isDirectory()) return false;
|
|
627
|
+
try { return readdirSync(join(dir, e.name)).length > 0; } catch { return false; }
|
|
628
|
+
});
|
|
629
|
+
} catch {
|
|
630
|
+
return false;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Returns true iff the directory exists, is non-empty, and ALL entries are
|
|
636
|
+
* `*-META.json` files (git-service integration-branch metadata pollution in a
|
|
637
|
+
* flat-phase project). Used by resolveProjectMilestonePath to skip dirs that
|
|
638
|
+
* only hold metadata — not as a layout-detection guard.
|
|
639
|
+
*
|
|
640
|
+
* Deliberately distinct from dirIsContentBearingLegacyMilestone: an EMPTY dir
|
|
641
|
+
* (new milestone, no content written yet) returns false here because it is not
|
|
642
|
+
* META-only — it is a valid placeholder that a writer may target.
|
|
643
|
+
*/
|
|
644
|
+
export function dirIsMetaOnlyLegacyMilestone(dir: string): boolean {
|
|
645
|
+
try {
|
|
646
|
+
const entries = readdirSync(dir);
|
|
647
|
+
if (entries.length === 0) return false; // empty = not META-only
|
|
648
|
+
return entries.every(name => name.endsWith("-META.json"));
|
|
649
|
+
} catch {
|
|
650
|
+
return false;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
export function isLegacyMilestonesLayout(basePath: string): boolean {
|
|
655
|
+
return legacyMilestonesHasSubdirs(basePath);
|
|
656
|
+
}
|
|
657
|
+
|
|
576
658
|
export function milestonesDir(basePath: string): string {
|
|
659
|
+
// Layout-aware: return milestones/ when it has legacy content, otherwise phases/.
|
|
660
|
+
const root = gsdProjectionRoot(basePath);
|
|
661
|
+
if (legacyMilestonesHasSubdirs(basePath)) {
|
|
662
|
+
return join(root, "milestones");
|
|
663
|
+
}
|
|
664
|
+
return join(root, LAYOUT_SEGMENTS.level1);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* Legacy milestones directory (pre-flat-phase). Used as a fallback for
|
|
669
|
+
* projects that haven't been migrated yet. The migration (flat-phase-migration.ts)
|
|
670
|
+
* moves content from here to phases/ on startup.
|
|
671
|
+
*/
|
|
672
|
+
export function legacyMilestonesDir(basePath: string): string {
|
|
577
673
|
return join(gsdProjectionRoot(basePath), "milestones");
|
|
578
674
|
}
|
|
579
675
|
|
|
676
|
+
/**
|
|
677
|
+
* Resolve a phase directory by milestone id using the flat-phase layout.
|
|
678
|
+
* Scans phases/ for a dir whose zero-padded number prefix matches the milestone.
|
|
679
|
+
* Returns the full path or null if not found.
|
|
680
|
+
*/
|
|
681
|
+
function pickPreferredPhaseDir(phasesDir: string, matches: string[]): string {
|
|
682
|
+
if (matches.length === 1) return matches[0]!;
|
|
683
|
+
let best = matches[0]!;
|
|
684
|
+
let bestMtime = -1;
|
|
685
|
+
for (const name of matches) {
|
|
686
|
+
try {
|
|
687
|
+
const mtime = statSync(join(phasesDir, name)).mtimeMs;
|
|
688
|
+
if (mtime > bestMtime) {
|
|
689
|
+
bestMtime = mtime;
|
|
690
|
+
best = name;
|
|
691
|
+
}
|
|
692
|
+
} catch {
|
|
693
|
+
// unreadable — keep prior best
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
return best;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
function phaseDirMatchesMilestoneId(dirName: string, milestoneId: string, phaseNum: number): boolean {
|
|
700
|
+
const numMatch = dirName.match(/^(\d+)-(.*)$/);
|
|
701
|
+
if (!numMatch || parseInt(numMatch[1]!, 10) !== phaseNum) return false;
|
|
702
|
+
const slugPart = numMatch[2]!;
|
|
703
|
+
const suffix = milestoneIdUniqueSuffix(milestoneId);
|
|
704
|
+
if (suffix) {
|
|
705
|
+
return slugPart === suffix || slugPart.startsWith(`${suffix}-`);
|
|
706
|
+
}
|
|
707
|
+
// Plain sequential IDs must not resolve to unique-suffix phase dirs.
|
|
708
|
+
return !/^[a-z0-9]{6}(-|$)/.test(slugPart);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
function resolvePhaseDir(basePath: string, milestoneId: string): string | null {
|
|
712
|
+
// Try flat-phase layout first: phases/NN-slug/ (always scan phases/, even when
|
|
713
|
+
// legacy milestones/ coexists during partial migration).
|
|
714
|
+
const phasesDir = join(gsdProjectionRoot(basePath), LAYOUT_SEGMENTS.level1);
|
|
715
|
+
if (existsSync(phasesDir)) {
|
|
716
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
717
|
+
const canonical = canonicalPhaseDirName(milestoneId);
|
|
718
|
+
if (existsSync(join(phasesDir, canonical))) {
|
|
719
|
+
return join(phasesDir, canonical);
|
|
720
|
+
}
|
|
721
|
+
const matches: string[] = [];
|
|
722
|
+
try {
|
|
723
|
+
for (const entry of readdirSync(phasesDir, { withFileTypes: true })) {
|
|
724
|
+
if (!entry.isDirectory()) continue;
|
|
725
|
+
if (phaseDirMatchesMilestoneId(entry.name, milestoneId, phaseNum)) {
|
|
726
|
+
matches.push(entry.name);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
} catch {
|
|
730
|
+
// unreadable — fall through
|
|
731
|
+
}
|
|
732
|
+
if (matches.length > 0) {
|
|
733
|
+
const preferred = matches.includes(canonical)
|
|
734
|
+
? canonical
|
|
735
|
+
: pickPreferredPhaseDir(phasesDir, matches);
|
|
736
|
+
return join(phasesDir, preferred);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
// Legacy fallback: milestones/M001/ (pre-flat-phase layout). Only consider a
|
|
740
|
+
// milestone dir legacy if it actually carries content — git-service.ts creates
|
|
741
|
+
// milestones/<MID>/ for integration-branch metadata even in flat-phase
|
|
742
|
+
// projects, so a metadata-only dir must not flip the layout (#852 follow-up).
|
|
743
|
+
const legacyDir = legacyMilestonesDir(basePath);
|
|
744
|
+
if (existsSync(legacyDir)) {
|
|
745
|
+
const candidate = resolveDir(legacyDir, milestoneId);
|
|
746
|
+
if (candidate && dirIsContentBearingLegacyMilestone(join(legacyDir, candidate))) {
|
|
747
|
+
return join(legacyDir, candidate);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
return null;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/**
|
|
754
|
+
* Derive the canonical phase dir name for a milestone when it doesn't exist yet.
|
|
755
|
+
* Used by the renderer to create new phase dirs, and by ensurePreconditions to
|
|
756
|
+
* scaffold the correct NN-slug directory on disk before the first render.
|
|
757
|
+
*/
|
|
758
|
+
export function canonicalPhaseDirName(milestoneId: string, title?: string): string {
|
|
759
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
760
|
+
const slug = derivePhaseSlug(title || milestoneId);
|
|
761
|
+
const suffix = milestoneIdUniqueSuffix(milestoneId);
|
|
762
|
+
if (suffix) {
|
|
763
|
+
return phaseDirName(phaseNum, `${suffix}-${slug}`);
|
|
764
|
+
}
|
|
765
|
+
return phaseDirName(phaseNum, slug);
|
|
766
|
+
}
|
|
767
|
+
|
|
580
768
|
export function resolveRuntimeFile(basePath: string): string {
|
|
581
769
|
return join(gsdRoot(basePath), "RUNTIME.md");
|
|
582
770
|
}
|
|
@@ -599,8 +787,21 @@ export function relGsdRootFile(key: GSDRootFileKey): string {
|
|
|
599
787
|
* Returns null if the milestone doesn't exist.
|
|
600
788
|
*/
|
|
601
789
|
export function resolveMilestonePath(basePath: string, milestoneId: string): string | null {
|
|
602
|
-
|
|
603
|
-
|
|
790
|
+
// Flat-phase: scan phases/ for NN-slug dir matching the milestone number.
|
|
791
|
+
const phaseDir = resolvePhaseDir(basePath, milestoneId);
|
|
792
|
+
if (phaseDir) return phaseDir;
|
|
793
|
+
// Legacy fallback: try old milestones/ dir (pre-flat-phase layout). Same
|
|
794
|
+
// content-bearing guard as resolvePhaseDir — a metadata-only milestones/<MID>/
|
|
795
|
+
// (created by git-service.ts for the integration branch) must not be treated
|
|
796
|
+
// as a real legacy milestone dir (#852 follow-up).
|
|
797
|
+
const oldMilestonesDir = join(gsdProjectionRoot(basePath), "milestones");
|
|
798
|
+
if (existsSync(oldMilestonesDir)) {
|
|
799
|
+
const legacyDir = resolveDir(oldMilestonesDir, milestoneId);
|
|
800
|
+
if (legacyDir && dirIsContentBearingLegacyMilestone(join(oldMilestonesDir, legacyDir))) {
|
|
801
|
+
return join(oldMilestonesDir, legacyDir);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
return null;
|
|
604
805
|
}
|
|
605
806
|
|
|
606
807
|
/**
|
|
@@ -611,6 +812,13 @@ export function resolveMilestoneFile(
|
|
|
611
812
|
): string | null {
|
|
612
813
|
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
613
814
|
if (!mDir) return null;
|
|
815
|
+
// Flat-phase: phase-level files are NN-SUFFIX.md (e.g. 01-CONTEXT.md)
|
|
816
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
817
|
+
const prefix = `${String(phaseNum).padStart(2, "0")}`;
|
|
818
|
+
const flatName = `${prefix}-${suffix}.md`;
|
|
819
|
+
const flatPath = join(mDir, flatName);
|
|
820
|
+
if (existsSync(flatPath)) return flatPath;
|
|
821
|
+
// Legacy fallback: M001-SUFFIX.md
|
|
614
822
|
const file = resolveFile(mDir, milestoneId, suffix);
|
|
615
823
|
return file ? join(mDir, file) : null;
|
|
616
824
|
}
|
|
@@ -623,9 +831,12 @@ export function resolveSlicePath(
|
|
|
623
831
|
): string | null {
|
|
624
832
|
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
625
833
|
if (!mDir) return null;
|
|
834
|
+
// Legacy: slice files live under slices/SID/ when that subdir exists.
|
|
626
835
|
const slicesDir = join(mDir, "slices");
|
|
627
836
|
const dir = resolveDir(slicesDir, sliceId);
|
|
628
|
-
|
|
837
|
+
if (dir) return join(slicesDir, dir);
|
|
838
|
+
// Flat-phase: plans are files inside the phase dir, not subdirs.
|
|
839
|
+
return mDir;
|
|
629
840
|
}
|
|
630
841
|
|
|
631
842
|
/**
|
|
@@ -634,10 +845,36 @@ export function resolveSlicePath(
|
|
|
634
845
|
export function resolveSliceFile(
|
|
635
846
|
basePath: string, milestoneId: string, sliceId: string, suffix: string
|
|
636
847
|
): string | null {
|
|
848
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId);
|
|
849
|
+
if (!phaseDir) return null;
|
|
850
|
+
// Flat-phase: plan files are NN-MM-SUFFIX.md inside the phase dir
|
|
851
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
852
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
853
|
+
const flatName = planFileName(phaseNum, planNum, suffix);
|
|
854
|
+
const flatPath = join(phaseDir, flatName);
|
|
855
|
+
if (existsSync(flatPath)) return flatPath;
|
|
856
|
+
// Also check plan-number-only format MM-SUFFIX.md (written by buildSliceFileName)
|
|
857
|
+
const planOnlyName = `${String(planNum).padStart(2, "0")}-${suffix}.md`;
|
|
858
|
+
const planOnlyPath = join(phaseDir, planOnlyName);
|
|
859
|
+
if (existsSync(planOnlyPath)) return planOnlyPath;
|
|
860
|
+
// Try prefix match for the phase+plan number (handles suffix variations)
|
|
861
|
+
const planPrefix = `${String(phaseNum).padStart(2, "0")}-${String(planNum).padStart(2, "0")}-`;
|
|
862
|
+
try {
|
|
863
|
+
for (const entry of readdirSync(phaseDir, { withFileTypes: true })) {
|
|
864
|
+
if (entry.isFile() && entry.name.startsWith(planPrefix) && entry.name.endsWith(`-${suffix}.md`)) {
|
|
865
|
+
return join(phaseDir, entry.name);
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
} catch {
|
|
869
|
+
// unreadable
|
|
870
|
+
}
|
|
871
|
+
// Legacy fallback: try old slices/SID/ dir structure
|
|
637
872
|
const sDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
638
|
-
if (
|
|
639
|
-
|
|
640
|
-
|
|
873
|
+
if (sDir && sDir !== phaseDir) {
|
|
874
|
+
const file = resolveFile(sDir, sliceId, suffix);
|
|
875
|
+
if (file) return join(sDir, file);
|
|
876
|
+
}
|
|
877
|
+
return null;
|
|
641
878
|
}
|
|
642
879
|
|
|
643
880
|
/**
|
|
@@ -646,6 +883,8 @@ export function resolveSliceFile(
|
|
|
646
883
|
export function resolveTasksDir(
|
|
647
884
|
basePath: string, milestoneId: string, sliceId: string
|
|
648
885
|
): string | null {
|
|
886
|
+
// Flat-phase: no tasks/ subdir. Tasks live as checkboxes inside plan files.
|
|
887
|
+
// Legacy fallback for old layouts:
|
|
649
888
|
const sDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
650
889
|
if (!sDir) return null;
|
|
651
890
|
const tDir = join(sDir, "tasks");
|
|
@@ -669,72 +908,142 @@ export function resolveTaskFile(
|
|
|
669
908
|
|
|
670
909
|
/**
|
|
671
910
|
* Build relative .gsd/ path to a milestone directory.
|
|
672
|
-
* Uses the actual directory name on disk if it exists, otherwise
|
|
911
|
+
* Uses the actual directory name on disk if it exists, otherwise the canonical
|
|
912
|
+
* flat-phase dir name the renderer will create (NN-slug).
|
|
913
|
+
*
|
|
914
|
+
* Pass `title` when the milestone title is available so the fallback slug
|
|
915
|
+
* matches what the renderer will create. Without a title the phase number is
|
|
916
|
+
* used as a placeholder (no DB import is allowed here — db/engine uses
|
|
917
|
+
* import.meta.url which breaks the Next.js SSR build path).
|
|
673
918
|
*/
|
|
674
|
-
export function relMilestonePath(basePath: string, milestoneId: string): string {
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
919
|
+
export function relMilestonePath(basePath: string, milestoneId: string, title?: string): string {
|
|
920
|
+
// resolvePhaseDir handles both flat-phase (phases/NN-*) and legacy (milestones/M001).
|
|
921
|
+
const phaseDir = resolvePhaseDir(basePath, milestoneId);
|
|
922
|
+
if (phaseDir) {
|
|
923
|
+
const name = phaseDir.split(/[/\\]/).pop()!;
|
|
924
|
+
// Use the correct segment based on which layout the resolved dir lives under.
|
|
925
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
926
|
+
if (phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\")) {
|
|
927
|
+
return `.gsd/milestones/${name}`;
|
|
928
|
+
}
|
|
929
|
+
return `.gsd/${LAYOUT_SEGMENTS.level1}/${name}`;
|
|
930
|
+
}
|
|
931
|
+
// No dir on disk yet — derive canonical flat-phase name.
|
|
932
|
+
// If the caller provides the milestone title, the slug will match what the
|
|
933
|
+
// renderer creates (e.g. "01-foundation"). Without a title, falls back to
|
|
934
|
+
// the milestone ID as the slug placeholder (e.g. "01-m001").
|
|
935
|
+
return `.gsd/${LAYOUT_SEGMENTS.level1}/${canonicalPhaseDirName(milestoneId, title)}`;
|
|
678
936
|
}
|
|
679
937
|
|
|
680
938
|
/**
|
|
681
939
|
* Build relative .gsd/ path to a milestone file.
|
|
940
|
+
* Layout-aware: uses resolveMilestoneFile to find NN-SUFFIX.md (flat-phase)
|
|
941
|
+
* or M001-SUFFIX.md (legacy). Falls back to a layout-appropriate canonical
|
|
942
|
+
* name when the file doesn't exist yet.
|
|
682
943
|
*/
|
|
683
944
|
export function relMilestoneFile(
|
|
684
945
|
basePath: string, milestoneId: string, suffix: string
|
|
685
946
|
): string {
|
|
686
947
|
const mRel = relMilestonePath(basePath, milestoneId);
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
948
|
+
// resolveMilestoneFile checks NN-SUFFIX.md (flat-phase) and MID-SUFFIX.md (legacy).
|
|
949
|
+
const absFile = resolveMilestoneFile(basePath, milestoneId, suffix);
|
|
950
|
+
if (absFile) {
|
|
951
|
+
const fileName = absFile.split(/[/\\]/).pop()!;
|
|
952
|
+
return `${mRel}/${fileName}`;
|
|
691
953
|
}
|
|
692
|
-
|
|
954
|
+
// File doesn't exist yet — use layout-aware fallback filename.
|
|
955
|
+
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
956
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
957
|
+
const isLegacy = mDir
|
|
958
|
+
? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
|
|
959
|
+
: false;
|
|
960
|
+
const fileName = isLegacy
|
|
961
|
+
? `${milestoneId}-${suffix}.md`
|
|
962
|
+
: `${String(milestoneIdToPhaseNum(milestoneId)).padStart(2, "0")}-${suffix}.md`;
|
|
963
|
+
return `${mRel}/${fileName}`;
|
|
693
964
|
}
|
|
694
965
|
|
|
695
966
|
/**
|
|
696
967
|
* Build relative .gsd/ path to a slice directory.
|
|
968
|
+
* Layout-aware: legacy projects include a slices/S01/ subdir;
|
|
969
|
+
* flat-phase projects use the phase dir directly.
|
|
970
|
+
*
|
|
971
|
+
* @param milestoneTitle - Optional milestone title passed through to
|
|
972
|
+
* relMilestonePath so the flat-phase fallback dir name uses the human-readable
|
|
973
|
+
* slug ("05-milestone-five") rather than the bare ID slug ("05-m005").
|
|
974
|
+
* Only consulted when no phase directory exists on disk yet.
|
|
697
975
|
*/
|
|
698
976
|
export function relSlicePath(
|
|
699
|
-
basePath: string, milestoneId: string, sliceId: string
|
|
977
|
+
basePath: string, milestoneId: string, sliceId: string, milestoneTitle?: string
|
|
700
978
|
): string {
|
|
701
|
-
const mRel = relMilestonePath(basePath, milestoneId);
|
|
702
979
|
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
703
980
|
if (mDir) {
|
|
704
|
-
const
|
|
705
|
-
|
|
706
|
-
|
|
981
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
982
|
+
if (mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")) {
|
|
983
|
+
// Legacy: slices live under milestones/M001/slices/S01/
|
|
984
|
+
const mRel = relMilestonePath(basePath, milestoneId);
|
|
985
|
+
const slicesDir = join(mDir, "slices");
|
|
986
|
+
const dir = resolveDir(slicesDir, sliceId);
|
|
987
|
+
return `${mRel}/slices/${dir ?? sliceId}`;
|
|
988
|
+
}
|
|
707
989
|
}
|
|
708
|
-
|
|
990
|
+
// Flat-phase: plans are files inside the phase dir, no slices/ subdir.
|
|
991
|
+
return relMilestonePath(basePath, milestoneId, milestoneTitle);
|
|
709
992
|
}
|
|
710
993
|
|
|
711
994
|
/**
|
|
712
995
|
* Build relative .gsd/ path to a slice file.
|
|
996
|
+
* Layout-aware: legacy uses S01-SUFFIX.md; flat-phase uses NN-MM-SUFFIX.md.
|
|
997
|
+
*
|
|
998
|
+
* @param milestoneTitle - Optional milestone title forwarded to relSlicePath /
|
|
999
|
+
* relMilestonePath for title-aware flat-phase fallback dir naming. Only used
|
|
1000
|
+
* when the phase directory does not yet exist on disk.
|
|
713
1001
|
*/
|
|
714
1002
|
export function relSliceFile(
|
|
715
|
-
basePath: string, milestoneId: string, sliceId: string, suffix: string
|
|
1003
|
+
basePath: string, milestoneId: string, sliceId: string, suffix: string, milestoneTitle?: string
|
|
716
1004
|
): string {
|
|
717
|
-
const sRel = relSlicePath(basePath, milestoneId, sliceId);
|
|
718
|
-
const
|
|
719
|
-
if (
|
|
720
|
-
const
|
|
721
|
-
|
|
1005
|
+
const sRel = relSlicePath(basePath, milestoneId, sliceId, milestoneTitle);
|
|
1006
|
+
const absPath = resolveSliceFile(basePath, milestoneId, sliceId, suffix);
|
|
1007
|
+
if (absPath) {
|
|
1008
|
+
const fileName = absPath.split(/[/\\]/).pop()!;
|
|
1009
|
+
return `${sRel}/${fileName}`;
|
|
1010
|
+
}
|
|
1011
|
+
// Fallback when file doesn't exist yet — use layout-aware filename.
|
|
1012
|
+
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
1013
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
1014
|
+
const isLegacy = mDir
|
|
1015
|
+
? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
|
|
1016
|
+
: false;
|
|
1017
|
+
if (isLegacy) {
|
|
1018
|
+
return `${sRel}/${sliceId}-${suffix}.md`;
|
|
722
1019
|
}
|
|
723
|
-
|
|
1020
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
1021
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
1022
|
+
return `${sRel}/${planFileName(phaseNum, planNum, suffix)}`;
|
|
724
1023
|
}
|
|
725
1024
|
|
|
726
1025
|
/**
|
|
727
1026
|
* Build relative .gsd/ path to a task file.
|
|
1027
|
+
*
|
|
1028
|
+
* Legacy layout: slices/SID/tasks/TID-SUFFIX.md (inside a slices/ subdir)
|
|
1029
|
+
* Flat-phase: PLAN → slice plan path (tasks as checkboxes); other suffixes
|
|
1030
|
+
* (e.g. SUMMARY) → phase dir / TID-SUFFIX.md
|
|
728
1031
|
*/
|
|
729
1032
|
export function relTaskFile(
|
|
730
1033
|
basePath: string, milestoneId: string, sliceId: string,
|
|
731
1034
|
taskId: string, suffix: string
|
|
732
1035
|
): string {
|
|
733
|
-
const
|
|
734
|
-
const
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
1036
|
+
const sDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
1037
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId);
|
|
1038
|
+
// Legacy: slice path is a slices/SID/ subdir inside the milestone dir
|
|
1039
|
+
if (sDir && phaseDir && sDir !== phaseDir) {
|
|
1040
|
+
const relS = relSlicePath(basePath, milestoneId, sliceId);
|
|
1041
|
+
return `${relS}/tasks/${taskId}-${suffix}.md`;
|
|
1042
|
+
}
|
|
1043
|
+
// Flat-phase: task plans are checkboxes inside the slice plan file
|
|
1044
|
+
if (suffix === "PLAN") {
|
|
1045
|
+
return relSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
738
1046
|
}
|
|
739
|
-
|
|
1047
|
+
const relS = relSlicePath(basePath, milestoneId, sliceId);
|
|
1048
|
+
return `${relS}/${buildTaskFileName(taskId, suffix)}`;
|
|
740
1049
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { existsSync, readFileSync } from "node:fs";
|
|
9
9
|
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
10
10
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
11
|
-
import { getProjectGSDPreferencesPath } from "./preferences.js";
|
|
11
|
+
import { clearGSDPreferencesCache, getProjectGSDPreferencesPath } from "./preferences.js";
|
|
12
12
|
import { logWarning } from "./workflow-logger.js";
|
|
13
13
|
import {
|
|
14
14
|
researchDecisionPath,
|
|
@@ -95,6 +95,7 @@ function writeProjectPreferencesParts(
|
|
|
95
95
|
: `---\n${yamlBlock}\n---\n`;
|
|
96
96
|
|
|
97
97
|
atomicWriteSync(path, newContent, "utf-8");
|
|
98
|
+
clearGSDPreferencesCache();
|
|
98
99
|
}
|
|
99
100
|
|
|
100
101
|
function applyDeepWorkflowPreferenceDefaults(frontmatter: Record<string, unknown>): void {
|