@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
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* (e.g. M001-FLIGHT-SIMULATOR/, T03-INSTALL-PACKAGES-PLAN.md)
|
|
10
10
|
* via prefix matching, so existing projects work without migration.
|
|
11
11
|
*/
|
|
12
|
-
import { readdirSync, existsSync, realpathSync, Dirent } from "node:fs";
|
|
12
|
+
import { readdirSync, existsSync, realpathSync, statSync, Dirent } from "node:fs";
|
|
13
13
|
import { join, dirname, normalize, resolve } from "node:path";
|
|
14
14
|
import { homedir } from "node:os";
|
|
15
15
|
import { spawnSync } from "node:child_process";
|
|
@@ -17,6 +17,7 @@ import { nativeScanGsdTree } from "./native-parser-bridge.js";
|
|
|
17
17
|
import { DIR_CACHE_MAX } from "./constants.js";
|
|
18
18
|
import { gsdHome } from "./gsd-home.js";
|
|
19
19
|
import { findWorktreeSegment, isGsdWorktreePath, resolveExternalStateProjectGsdFromWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
20
|
+
import { LAYOUT_SEGMENTS, phaseDirName, planFileName, milestoneIdToPhaseNum, milestoneIdUniqueSuffix, sliceIdToPlanNum, derivePhaseSlug, } from "./layout-policy.js";
|
|
20
21
|
// ─── Directory Listing Cache ──────────────────────────────────────────────────
|
|
21
22
|
const dirEntryCache = new Map();
|
|
22
23
|
const dirListCache = new Map();
|
|
@@ -171,14 +172,21 @@ export const PLANNING_ARTIFACT_NAME_RE = new RegExp(`^[MST]\\d+-(${PLANNING_ARTI
|
|
|
171
172
|
* ("M001", "CONTEXT") → "M001-CONTEXT.md"
|
|
172
173
|
*/
|
|
173
174
|
export function buildMilestoneFileName(milestoneId, suffix) {
|
|
174
|
-
|
|
175
|
+
// Flat-phase: phase-level files are NN-SUFFIX.md (e.g. "01-CONTEXT.md")
|
|
176
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
177
|
+
return `${String(phaseNum).padStart(2, "0")}-${suffix}.md`;
|
|
175
178
|
}
|
|
176
179
|
/**
|
|
177
180
|
* Build a slice-level file name.
|
|
178
181
|
* ("S01", "PLAN") → "S01-PLAN.md"
|
|
179
182
|
*/
|
|
180
183
|
export function buildSliceFileName(sliceId, suffix) {
|
|
181
|
-
|
|
184
|
+
// Flat-phase: plan files need both phase and plan numbers (NN-MM-SUFFIX.md),
|
|
185
|
+
// but this helper only has the sliceId. Callers needing the full name should
|
|
186
|
+
// use planFileName() from layout-policy. This returns MM-SUFFIX.md for any
|
|
187
|
+
// incremental callers that haven't migrated yet.
|
|
188
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
189
|
+
return `${String(planNum).padStart(2, "0")}-${suffix}.md`;
|
|
182
190
|
}
|
|
183
191
|
/**
|
|
184
192
|
* Build a task file name.
|
|
@@ -186,6 +194,8 @@ export function buildSliceFileName(sliceId, suffix) {
|
|
|
186
194
|
* ("T03", "SUMMARY") → "T03-SUMMARY.md"
|
|
187
195
|
*/
|
|
188
196
|
export function buildTaskFileName(taskId, suffix) {
|
|
197
|
+
// Flat-phase: tasks are checkboxes inside plan files, not separate files.
|
|
198
|
+
// This helper is deprecated but kept for backward-compat callers.
|
|
189
199
|
return `${taskId}-${suffix}.md`;
|
|
190
200
|
}
|
|
191
201
|
// ─── Resolvers ─────────────────────────────────────────────────────────────
|
|
@@ -546,9 +556,188 @@ function probeGsdRoot(rawBasePath) {
|
|
|
546
556
|
// 4. Fallback for init/creation
|
|
547
557
|
return local;
|
|
548
558
|
}
|
|
559
|
+
function legacyMilestonesHasSubdirs(basePath) {
|
|
560
|
+
const legacy = join(gsdProjectionRoot(basePath), "milestones");
|
|
561
|
+
if (!existsSync(legacy))
|
|
562
|
+
return false;
|
|
563
|
+
try {
|
|
564
|
+
return readdirSync(legacy).some(e => statSync(join(legacy, e)).isDirectory() && dirIsContentBearingLegacyMilestone(join(legacy, e)));
|
|
565
|
+
}
|
|
566
|
+
catch {
|
|
567
|
+
return false;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* A `milestones/<MID>/` directory is only a real legacy layout entry if it
|
|
572
|
+
* contains content files (CONTEXT/ROADMAP/SUMMARY/…). git-service.ts creates
|
|
573
|
+
* `milestones/<MID>/` to store the integration-branch metadata
|
|
574
|
+
* (`<MID>-META.json`) even in flat-phase projects, so a directory holding only
|
|
575
|
+
* `*-META.json` must NOT count as legacy — otherwise layout detection flips to
|
|
576
|
+
* legacy and artifact verification resolves to the wrong path
|
|
577
|
+
* (`milestones/<MID>/<MID>-CONTEXT.md` instead of `phases/NN-slug/NN-CONTEXT.md`),
|
|
578
|
+
* trapping the unit in a finalize-retry loop (#852 follow-up).
|
|
579
|
+
*
|
|
580
|
+
* See the matching TODO in markdown-renderer.ts detectStaleRenders, which
|
|
581
|
+
* disabled stale-render detection for the same reason.
|
|
582
|
+
*/
|
|
583
|
+
export function dirIsContentBearingLegacyMilestone(dir) {
|
|
584
|
+
try {
|
|
585
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
586
|
+
// 1. Any non-META regular file → real legacy content.
|
|
587
|
+
if (entries.some(e => e.isFile() && !e.name.endsWith("-META.json")))
|
|
588
|
+
return true;
|
|
589
|
+
// 2. A non-empty subdirectory → real legacy content (e.g. slices/ with slice dirs).
|
|
590
|
+
// An *empty* subdir is treated as scaffolding (e.g. git-service.ts may create
|
|
591
|
+
// an empty slices/ alongside the integration META file) and must NOT flip the
|
|
592
|
+
// layout — that is the Bugbot finding this guard addresses.
|
|
593
|
+
return entries.some(e => {
|
|
594
|
+
if (!e.isDirectory())
|
|
595
|
+
return false;
|
|
596
|
+
try {
|
|
597
|
+
return readdirSync(join(dir, e.name)).length > 0;
|
|
598
|
+
}
|
|
599
|
+
catch {
|
|
600
|
+
return false;
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
catch {
|
|
605
|
+
return false;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Returns true iff the directory exists, is non-empty, and ALL entries are
|
|
610
|
+
* `*-META.json` files (git-service integration-branch metadata pollution in a
|
|
611
|
+
* flat-phase project). Used by resolveProjectMilestonePath to skip dirs that
|
|
612
|
+
* only hold metadata — not as a layout-detection guard.
|
|
613
|
+
*
|
|
614
|
+
* Deliberately distinct from dirIsContentBearingLegacyMilestone: an EMPTY dir
|
|
615
|
+
* (new milestone, no content written yet) returns false here because it is not
|
|
616
|
+
* META-only — it is a valid placeholder that a writer may target.
|
|
617
|
+
*/
|
|
618
|
+
export function dirIsMetaOnlyLegacyMilestone(dir) {
|
|
619
|
+
try {
|
|
620
|
+
const entries = readdirSync(dir);
|
|
621
|
+
if (entries.length === 0)
|
|
622
|
+
return false; // empty = not META-only
|
|
623
|
+
return entries.every(name => name.endsWith("-META.json"));
|
|
624
|
+
}
|
|
625
|
+
catch {
|
|
626
|
+
return false;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
export function isLegacyMilestonesLayout(basePath) {
|
|
630
|
+
return legacyMilestonesHasSubdirs(basePath);
|
|
631
|
+
}
|
|
549
632
|
export function milestonesDir(basePath) {
|
|
633
|
+
// Layout-aware: return milestones/ when it has legacy content, otherwise phases/.
|
|
634
|
+
const root = gsdProjectionRoot(basePath);
|
|
635
|
+
if (legacyMilestonesHasSubdirs(basePath)) {
|
|
636
|
+
return join(root, "milestones");
|
|
637
|
+
}
|
|
638
|
+
return join(root, LAYOUT_SEGMENTS.level1);
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* Legacy milestones directory (pre-flat-phase). Used as a fallback for
|
|
642
|
+
* projects that haven't been migrated yet. The migration (flat-phase-migration.ts)
|
|
643
|
+
* moves content from here to phases/ on startup.
|
|
644
|
+
*/
|
|
645
|
+
export function legacyMilestonesDir(basePath) {
|
|
550
646
|
return join(gsdProjectionRoot(basePath), "milestones");
|
|
551
647
|
}
|
|
648
|
+
/**
|
|
649
|
+
* Resolve a phase directory by milestone id using the flat-phase layout.
|
|
650
|
+
* Scans phases/ for a dir whose zero-padded number prefix matches the milestone.
|
|
651
|
+
* Returns the full path or null if not found.
|
|
652
|
+
*/
|
|
653
|
+
function pickPreferredPhaseDir(phasesDir, matches) {
|
|
654
|
+
if (matches.length === 1)
|
|
655
|
+
return matches[0];
|
|
656
|
+
let best = matches[0];
|
|
657
|
+
let bestMtime = -1;
|
|
658
|
+
for (const name of matches) {
|
|
659
|
+
try {
|
|
660
|
+
const mtime = statSync(join(phasesDir, name)).mtimeMs;
|
|
661
|
+
if (mtime > bestMtime) {
|
|
662
|
+
bestMtime = mtime;
|
|
663
|
+
best = name;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
catch {
|
|
667
|
+
// unreadable — keep prior best
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
return best;
|
|
671
|
+
}
|
|
672
|
+
function phaseDirMatchesMilestoneId(dirName, milestoneId, phaseNum) {
|
|
673
|
+
const numMatch = dirName.match(/^(\d+)-(.*)$/);
|
|
674
|
+
if (!numMatch || parseInt(numMatch[1], 10) !== phaseNum)
|
|
675
|
+
return false;
|
|
676
|
+
const slugPart = numMatch[2];
|
|
677
|
+
const suffix = milestoneIdUniqueSuffix(milestoneId);
|
|
678
|
+
if (suffix) {
|
|
679
|
+
return slugPart === suffix || slugPart.startsWith(`${suffix}-`);
|
|
680
|
+
}
|
|
681
|
+
// Plain sequential IDs must not resolve to unique-suffix phase dirs.
|
|
682
|
+
return !/^[a-z0-9]{6}(-|$)/.test(slugPart);
|
|
683
|
+
}
|
|
684
|
+
function resolvePhaseDir(basePath, milestoneId) {
|
|
685
|
+
// Try flat-phase layout first: phases/NN-slug/ (always scan phases/, even when
|
|
686
|
+
// legacy milestones/ coexists during partial migration).
|
|
687
|
+
const phasesDir = join(gsdProjectionRoot(basePath), LAYOUT_SEGMENTS.level1);
|
|
688
|
+
if (existsSync(phasesDir)) {
|
|
689
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
690
|
+
const canonical = canonicalPhaseDirName(milestoneId);
|
|
691
|
+
if (existsSync(join(phasesDir, canonical))) {
|
|
692
|
+
return join(phasesDir, canonical);
|
|
693
|
+
}
|
|
694
|
+
const matches = [];
|
|
695
|
+
try {
|
|
696
|
+
for (const entry of readdirSync(phasesDir, { withFileTypes: true })) {
|
|
697
|
+
if (!entry.isDirectory())
|
|
698
|
+
continue;
|
|
699
|
+
if (phaseDirMatchesMilestoneId(entry.name, milestoneId, phaseNum)) {
|
|
700
|
+
matches.push(entry.name);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
catch {
|
|
705
|
+
// unreadable — fall through
|
|
706
|
+
}
|
|
707
|
+
if (matches.length > 0) {
|
|
708
|
+
const preferred = matches.includes(canonical)
|
|
709
|
+
? canonical
|
|
710
|
+
: pickPreferredPhaseDir(phasesDir, matches);
|
|
711
|
+
return join(phasesDir, preferred);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
// Legacy fallback: milestones/M001/ (pre-flat-phase layout). Only consider a
|
|
715
|
+
// milestone dir legacy if it actually carries content — git-service.ts creates
|
|
716
|
+
// milestones/<MID>/ for integration-branch metadata even in flat-phase
|
|
717
|
+
// projects, so a metadata-only dir must not flip the layout (#852 follow-up).
|
|
718
|
+
const legacyDir = legacyMilestonesDir(basePath);
|
|
719
|
+
if (existsSync(legacyDir)) {
|
|
720
|
+
const candidate = resolveDir(legacyDir, milestoneId);
|
|
721
|
+
if (candidate && dirIsContentBearingLegacyMilestone(join(legacyDir, candidate))) {
|
|
722
|
+
return join(legacyDir, candidate);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
return null;
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Derive the canonical phase dir name for a milestone when it doesn't exist yet.
|
|
729
|
+
* Used by the renderer to create new phase dirs, and by ensurePreconditions to
|
|
730
|
+
* scaffold the correct NN-slug directory on disk before the first render.
|
|
731
|
+
*/
|
|
732
|
+
export function canonicalPhaseDirName(milestoneId, title) {
|
|
733
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
734
|
+
const slug = derivePhaseSlug(title || milestoneId);
|
|
735
|
+
const suffix = milestoneIdUniqueSuffix(milestoneId);
|
|
736
|
+
if (suffix) {
|
|
737
|
+
return phaseDirName(phaseNum, `${suffix}-${slug}`);
|
|
738
|
+
}
|
|
739
|
+
return phaseDirName(phaseNum, slug);
|
|
740
|
+
}
|
|
552
741
|
export function resolveRuntimeFile(basePath) {
|
|
553
742
|
return join(gsdRoot(basePath), "RUNTIME.md");
|
|
554
743
|
}
|
|
@@ -570,8 +759,22 @@ export function relGsdRootFile(key) {
|
|
|
570
759
|
* Returns null if the milestone doesn't exist.
|
|
571
760
|
*/
|
|
572
761
|
export function resolveMilestonePath(basePath, milestoneId) {
|
|
573
|
-
|
|
574
|
-
|
|
762
|
+
// Flat-phase: scan phases/ for NN-slug dir matching the milestone number.
|
|
763
|
+
const phaseDir = resolvePhaseDir(basePath, milestoneId);
|
|
764
|
+
if (phaseDir)
|
|
765
|
+
return phaseDir;
|
|
766
|
+
// Legacy fallback: try old milestones/ dir (pre-flat-phase layout). Same
|
|
767
|
+
// content-bearing guard as resolvePhaseDir — a metadata-only milestones/<MID>/
|
|
768
|
+
// (created by git-service.ts for the integration branch) must not be treated
|
|
769
|
+
// as a real legacy milestone dir (#852 follow-up).
|
|
770
|
+
const oldMilestonesDir = join(gsdProjectionRoot(basePath), "milestones");
|
|
771
|
+
if (existsSync(oldMilestonesDir)) {
|
|
772
|
+
const legacyDir = resolveDir(oldMilestonesDir, milestoneId);
|
|
773
|
+
if (legacyDir && dirIsContentBearingLegacyMilestone(join(oldMilestonesDir, legacyDir))) {
|
|
774
|
+
return join(oldMilestonesDir, legacyDir);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
return null;
|
|
575
778
|
}
|
|
576
779
|
/**
|
|
577
780
|
* Resolve the full path to a milestone file (e.g. ROADMAP, CONTEXT, RESEARCH).
|
|
@@ -580,6 +783,14 @@ export function resolveMilestoneFile(basePath, milestoneId, suffix) {
|
|
|
580
783
|
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
581
784
|
if (!mDir)
|
|
582
785
|
return null;
|
|
786
|
+
// Flat-phase: phase-level files are NN-SUFFIX.md (e.g. 01-CONTEXT.md)
|
|
787
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
788
|
+
const prefix = `${String(phaseNum).padStart(2, "0")}`;
|
|
789
|
+
const flatName = `${prefix}-${suffix}.md`;
|
|
790
|
+
const flatPath = join(mDir, flatName);
|
|
791
|
+
if (existsSync(flatPath))
|
|
792
|
+
return flatPath;
|
|
793
|
+
// Legacy fallback: M001-SUFFIX.md
|
|
583
794
|
const file = resolveFile(mDir, milestoneId, suffix);
|
|
584
795
|
return file ? join(mDir, file) : null;
|
|
585
796
|
}
|
|
@@ -590,24 +801,60 @@ export function resolveSlicePath(basePath, milestoneId, sliceId) {
|
|
|
590
801
|
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
591
802
|
if (!mDir)
|
|
592
803
|
return null;
|
|
804
|
+
// Legacy: slice files live under slices/SID/ when that subdir exists.
|
|
593
805
|
const slicesDir = join(mDir, "slices");
|
|
594
806
|
const dir = resolveDir(slicesDir, sliceId);
|
|
595
|
-
|
|
807
|
+
if (dir)
|
|
808
|
+
return join(slicesDir, dir);
|
|
809
|
+
// Flat-phase: plans are files inside the phase dir, not subdirs.
|
|
810
|
+
return mDir;
|
|
596
811
|
}
|
|
597
812
|
/**
|
|
598
813
|
* Resolve the full path to a slice file (e.g. PLAN, RESEARCH, CONTEXT, SUMMARY).
|
|
599
814
|
*/
|
|
600
815
|
export function resolveSliceFile(basePath, milestoneId, sliceId, suffix) {
|
|
601
|
-
const
|
|
602
|
-
if (!
|
|
816
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId);
|
|
817
|
+
if (!phaseDir)
|
|
603
818
|
return null;
|
|
604
|
-
|
|
605
|
-
|
|
819
|
+
// Flat-phase: plan files are NN-MM-SUFFIX.md inside the phase dir
|
|
820
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
821
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
822
|
+
const flatName = planFileName(phaseNum, planNum, suffix);
|
|
823
|
+
const flatPath = join(phaseDir, flatName);
|
|
824
|
+
if (existsSync(flatPath))
|
|
825
|
+
return flatPath;
|
|
826
|
+
// Also check plan-number-only format MM-SUFFIX.md (written by buildSliceFileName)
|
|
827
|
+
const planOnlyName = `${String(planNum).padStart(2, "0")}-${suffix}.md`;
|
|
828
|
+
const planOnlyPath = join(phaseDir, planOnlyName);
|
|
829
|
+
if (existsSync(planOnlyPath))
|
|
830
|
+
return planOnlyPath;
|
|
831
|
+
// Try prefix match for the phase+plan number (handles suffix variations)
|
|
832
|
+
const planPrefix = `${String(phaseNum).padStart(2, "0")}-${String(planNum).padStart(2, "0")}-`;
|
|
833
|
+
try {
|
|
834
|
+
for (const entry of readdirSync(phaseDir, { withFileTypes: true })) {
|
|
835
|
+
if (entry.isFile() && entry.name.startsWith(planPrefix) && entry.name.endsWith(`-${suffix}.md`)) {
|
|
836
|
+
return join(phaseDir, entry.name);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
catch {
|
|
841
|
+
// unreadable
|
|
842
|
+
}
|
|
843
|
+
// Legacy fallback: try old slices/SID/ dir structure
|
|
844
|
+
const sDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
845
|
+
if (sDir && sDir !== phaseDir) {
|
|
846
|
+
const file = resolveFile(sDir, sliceId, suffix);
|
|
847
|
+
if (file)
|
|
848
|
+
return join(sDir, file);
|
|
849
|
+
}
|
|
850
|
+
return null;
|
|
606
851
|
}
|
|
607
852
|
/**
|
|
608
853
|
* Resolve the tasks directory within a slice.
|
|
609
854
|
*/
|
|
610
855
|
export function resolveTasksDir(basePath, milestoneId, sliceId) {
|
|
856
|
+
// Flat-phase: no tasks/ subdir. Tasks live as checkboxes inside plan files.
|
|
857
|
+
// Legacy fallback for old layouts:
|
|
611
858
|
const sDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
612
859
|
if (!sDir)
|
|
613
860
|
return null;
|
|
@@ -627,64 +874,129 @@ export function resolveTaskFile(basePath, milestoneId, sliceId, taskId, suffix)
|
|
|
627
874
|
// ─── Relative Path Builders (for prompts — .gsd/milestones/...) ────────────
|
|
628
875
|
/**
|
|
629
876
|
* Build relative .gsd/ path to a milestone directory.
|
|
630
|
-
* Uses the actual directory name on disk if it exists, otherwise
|
|
877
|
+
* Uses the actual directory name on disk if it exists, otherwise the canonical
|
|
878
|
+
* flat-phase dir name the renderer will create (NN-slug).
|
|
879
|
+
*
|
|
880
|
+
* Pass `title` when the milestone title is available so the fallback slug
|
|
881
|
+
* matches what the renderer will create. Without a title the phase number is
|
|
882
|
+
* used as a placeholder (no DB import is allowed here — db/engine uses
|
|
883
|
+
* import.meta.url which breaks the Next.js SSR build path).
|
|
631
884
|
*/
|
|
632
|
-
export function relMilestonePath(basePath, milestoneId) {
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
885
|
+
export function relMilestonePath(basePath, milestoneId, title) {
|
|
886
|
+
// resolvePhaseDir handles both flat-phase (phases/NN-*) and legacy (milestones/M001).
|
|
887
|
+
const phaseDir = resolvePhaseDir(basePath, milestoneId);
|
|
888
|
+
if (phaseDir) {
|
|
889
|
+
const name = phaseDir.split(/[/\\]/).pop();
|
|
890
|
+
// Use the correct segment based on which layout the resolved dir lives under.
|
|
891
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
892
|
+
if (phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\")) {
|
|
893
|
+
return `.gsd/milestones/${name}`;
|
|
894
|
+
}
|
|
895
|
+
return `.gsd/${LAYOUT_SEGMENTS.level1}/${name}`;
|
|
896
|
+
}
|
|
897
|
+
// No dir on disk yet — derive canonical flat-phase name.
|
|
898
|
+
// If the caller provides the milestone title, the slug will match what the
|
|
899
|
+
// renderer creates (e.g. "01-foundation"). Without a title, falls back to
|
|
900
|
+
// the milestone ID as the slug placeholder (e.g. "01-m001").
|
|
901
|
+
return `.gsd/${LAYOUT_SEGMENTS.level1}/${canonicalPhaseDirName(milestoneId, title)}`;
|
|
637
902
|
}
|
|
638
903
|
/**
|
|
639
904
|
* Build relative .gsd/ path to a milestone file.
|
|
905
|
+
* Layout-aware: uses resolveMilestoneFile to find NN-SUFFIX.md (flat-phase)
|
|
906
|
+
* or M001-SUFFIX.md (legacy). Falls back to a layout-appropriate canonical
|
|
907
|
+
* name when the file doesn't exist yet.
|
|
640
908
|
*/
|
|
641
909
|
export function relMilestoneFile(basePath, milestoneId, suffix) {
|
|
642
910
|
const mRel = relMilestonePath(basePath, milestoneId);
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
911
|
+
// resolveMilestoneFile checks NN-SUFFIX.md (flat-phase) and MID-SUFFIX.md (legacy).
|
|
912
|
+
const absFile = resolveMilestoneFile(basePath, milestoneId, suffix);
|
|
913
|
+
if (absFile) {
|
|
914
|
+
const fileName = absFile.split(/[/\\]/).pop();
|
|
915
|
+
return `${mRel}/${fileName}`;
|
|
648
916
|
}
|
|
649
|
-
|
|
917
|
+
// File doesn't exist yet — use layout-aware fallback filename.
|
|
918
|
+
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
919
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
920
|
+
const isLegacy = mDir
|
|
921
|
+
? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
|
|
922
|
+
: false;
|
|
923
|
+
const fileName = isLegacy
|
|
924
|
+
? `${milestoneId}-${suffix}.md`
|
|
925
|
+
: `${String(milestoneIdToPhaseNum(milestoneId)).padStart(2, "0")}-${suffix}.md`;
|
|
926
|
+
return `${mRel}/${fileName}`;
|
|
650
927
|
}
|
|
651
928
|
/**
|
|
652
929
|
* Build relative .gsd/ path to a slice directory.
|
|
930
|
+
* Layout-aware: legacy projects include a slices/S01/ subdir;
|
|
931
|
+
* flat-phase projects use the phase dir directly.
|
|
932
|
+
*
|
|
933
|
+
* @param milestoneTitle - Optional milestone title passed through to
|
|
934
|
+
* relMilestonePath so the flat-phase fallback dir name uses the human-readable
|
|
935
|
+
* slug ("05-milestone-five") rather than the bare ID slug ("05-m005").
|
|
936
|
+
* Only consulted when no phase directory exists on disk yet.
|
|
653
937
|
*/
|
|
654
|
-
export function relSlicePath(basePath, milestoneId, sliceId) {
|
|
655
|
-
const mRel = relMilestonePath(basePath, milestoneId);
|
|
938
|
+
export function relSlicePath(basePath, milestoneId, sliceId, milestoneTitle) {
|
|
656
939
|
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
657
940
|
if (mDir) {
|
|
658
|
-
const
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
941
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
942
|
+
if (mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")) {
|
|
943
|
+
// Legacy: slices live under milestones/M001/slices/S01/
|
|
944
|
+
const mRel = relMilestonePath(basePath, milestoneId);
|
|
945
|
+
const slicesDir = join(mDir, "slices");
|
|
946
|
+
const dir = resolveDir(slicesDir, sliceId);
|
|
947
|
+
return `${mRel}/slices/${dir ?? sliceId}`;
|
|
948
|
+
}
|
|
662
949
|
}
|
|
663
|
-
|
|
950
|
+
// Flat-phase: plans are files inside the phase dir, no slices/ subdir.
|
|
951
|
+
return relMilestonePath(basePath, milestoneId, milestoneTitle);
|
|
664
952
|
}
|
|
665
953
|
/**
|
|
666
954
|
* Build relative .gsd/ path to a slice file.
|
|
955
|
+
* Layout-aware: legacy uses S01-SUFFIX.md; flat-phase uses NN-MM-SUFFIX.md.
|
|
956
|
+
*
|
|
957
|
+
* @param milestoneTitle - Optional milestone title forwarded to relSlicePath /
|
|
958
|
+
* relMilestonePath for title-aware flat-phase fallback dir naming. Only used
|
|
959
|
+
* when the phase directory does not yet exist on disk.
|
|
667
960
|
*/
|
|
668
|
-
export function relSliceFile(basePath, milestoneId, sliceId, suffix) {
|
|
669
|
-
const sRel = relSlicePath(basePath, milestoneId, sliceId);
|
|
670
|
-
const
|
|
671
|
-
if (
|
|
672
|
-
const
|
|
673
|
-
|
|
674
|
-
|
|
961
|
+
export function relSliceFile(basePath, milestoneId, sliceId, suffix, milestoneTitle) {
|
|
962
|
+
const sRel = relSlicePath(basePath, milestoneId, sliceId, milestoneTitle);
|
|
963
|
+
const absPath = resolveSliceFile(basePath, milestoneId, sliceId, suffix);
|
|
964
|
+
if (absPath) {
|
|
965
|
+
const fileName = absPath.split(/[/\\]/).pop();
|
|
966
|
+
return `${sRel}/${fileName}`;
|
|
967
|
+
}
|
|
968
|
+
// Fallback when file doesn't exist yet — use layout-aware filename.
|
|
969
|
+
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
970
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
971
|
+
const isLegacy = mDir
|
|
972
|
+
? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
|
|
973
|
+
: false;
|
|
974
|
+
if (isLegacy) {
|
|
975
|
+
return `${sRel}/${sliceId}-${suffix}.md`;
|
|
675
976
|
}
|
|
676
|
-
|
|
977
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
978
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
979
|
+
return `${sRel}/${planFileName(phaseNum, planNum, suffix)}`;
|
|
677
980
|
}
|
|
678
981
|
/**
|
|
679
982
|
* Build relative .gsd/ path to a task file.
|
|
983
|
+
*
|
|
984
|
+
* Legacy layout: slices/SID/tasks/TID-SUFFIX.md (inside a slices/ subdir)
|
|
985
|
+
* Flat-phase: PLAN → slice plan path (tasks as checkboxes); other suffixes
|
|
986
|
+
* (e.g. SUMMARY) → phase dir / TID-SUFFIX.md
|
|
680
987
|
*/
|
|
681
988
|
export function relTaskFile(basePath, milestoneId, sliceId, taskId, suffix) {
|
|
682
|
-
const
|
|
683
|
-
const
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
989
|
+
const sDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
990
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId);
|
|
991
|
+
// Legacy: slice path is a slices/SID/ subdir inside the milestone dir
|
|
992
|
+
if (sDir && phaseDir && sDir !== phaseDir) {
|
|
993
|
+
const relS = relSlicePath(basePath, milestoneId, sliceId);
|
|
994
|
+
return `${relS}/tasks/${taskId}-${suffix}.md`;
|
|
995
|
+
}
|
|
996
|
+
// Flat-phase: task plans are checkboxes inside the slice plan file
|
|
997
|
+
if (suffix === "PLAN") {
|
|
998
|
+
return relSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
688
999
|
}
|
|
689
|
-
|
|
1000
|
+
const relS = relSlicePath(basePath, milestoneId, sliceId);
|
|
1001
|
+
return `${relS}/${buildTaskFileName(taskId, suffix)}`;
|
|
690
1002
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { existsSync, readFileSync } from "node:fs";
|
|
8
8
|
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
9
9
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
10
|
-
import { getProjectGSDPreferencesPath } from "./preferences.js";
|
|
10
|
+
import { clearGSDPreferencesCache, getProjectGSDPreferencesPath } from "./preferences.js";
|
|
11
11
|
import { logWarning } from "./workflow-logger.js";
|
|
12
12
|
import { researchDecisionPath, writeDefaultResearchSkipDecision, } from "./deep-project-setup-policy.js";
|
|
13
13
|
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
@@ -73,6 +73,7 @@ function writeProjectPreferencesParts(path, frontmatter, body) {
|
|
|
73
73
|
? `---\n${yamlBlock}\n---\n\n${body.replace(/^\n+/, "")}`
|
|
74
74
|
: `---\n${yamlBlock}\n---\n`;
|
|
75
75
|
atomicWriteSync(path, newContent, "utf-8");
|
|
76
|
+
clearGSDPreferencesCache();
|
|
76
77
|
}
|
|
77
78
|
function applyDeepWorkflowPreferenceDefaults(frontmatter) {
|
|
78
79
|
if (frontmatter.commit_policy === undefined) {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* - Import checks are blocking failures; pattern checks are warnings
|
|
15
15
|
* - No AST parsers — uses regex heuristics
|
|
16
16
|
*/
|
|
17
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
17
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
18
18
|
import { resolve, dirname, extname } from "node:path";
|
|
19
19
|
// ─── Import Resolution Check ─────────────────────────────────────────────────
|
|
20
20
|
/**
|
|
@@ -263,6 +263,8 @@ export function checkImportResolution(taskRow, _priorTasks, basePath) {
|
|
|
263
263
|
}
|
|
264
264
|
return results;
|
|
265
265
|
}
|
|
266
|
+
let signatureCacheScope = null;
|
|
267
|
+
const signatureCache = new Map();
|
|
266
268
|
/**
|
|
267
269
|
* Extract function signatures from TypeScript/JavaScript source code.
|
|
268
270
|
*/
|
|
@@ -294,6 +296,27 @@ function extractFunctionSignatures(source, fileName) {
|
|
|
294
296
|
}
|
|
295
297
|
return signatures;
|
|
296
298
|
}
|
|
299
|
+
function signatureCacheFor(taskRow, basePath) {
|
|
300
|
+
const scope = `${resolve(basePath)}\0${taskRow.milestone_id}\0${taskRow.slice_id}`;
|
|
301
|
+
if (signatureCacheScope !== scope) {
|
|
302
|
+
signatureCacheScope = scope;
|
|
303
|
+
signatureCache.clear();
|
|
304
|
+
}
|
|
305
|
+
return signatureCache;
|
|
306
|
+
}
|
|
307
|
+
function getCachedFunctionSignatures(cache, absolutePath, fileName) {
|
|
308
|
+
const stat = statSync(absolutePath);
|
|
309
|
+
const mtimeMs = stat.mtimeMs;
|
|
310
|
+
const size = stat.size;
|
|
311
|
+
const cached = cache.get(absolutePath);
|
|
312
|
+
if (cached && cached.mtimeMs === mtimeMs && cached.size === size) {
|
|
313
|
+
return cached.signatures.map((sig) => ({ ...sig, file: fileName }));
|
|
314
|
+
}
|
|
315
|
+
const source = readFileSync(absolutePath, "utf-8");
|
|
316
|
+
const signatures = extractFunctionSignatures(source, fileName);
|
|
317
|
+
cache.set(absolutePath, { mtimeMs, size, signatures });
|
|
318
|
+
return signatures;
|
|
319
|
+
}
|
|
297
320
|
/**
|
|
298
321
|
* Normalize parameter list for comparison.
|
|
299
322
|
*/
|
|
@@ -320,6 +343,7 @@ export function checkCrossTaskSignatures(taskRow, priorTasks, basePath) {
|
|
|
320
343
|
const results = [];
|
|
321
344
|
// Build map of functions from prior tasks' key_files
|
|
322
345
|
const priorSignatures = new Map();
|
|
346
|
+
const cache = signatureCacheFor(taskRow, basePath);
|
|
323
347
|
for (const task of priorTasks) {
|
|
324
348
|
for (const file of task.key_files) {
|
|
325
349
|
const ext = extname(file);
|
|
@@ -329,8 +353,7 @@ export function checkCrossTaskSignatures(taskRow, priorTasks, basePath) {
|
|
|
329
353
|
if (!existsSync(absolutePath))
|
|
330
354
|
continue;
|
|
331
355
|
try {
|
|
332
|
-
const
|
|
333
|
-
const sigs = extractFunctionSignatures(source, file);
|
|
356
|
+
const sigs = getCachedFunctionSignatures(cache, absolutePath, file);
|
|
334
357
|
for (const sig of sigs) {
|
|
335
358
|
const existing = priorSignatures.get(sig.name) || [];
|
|
336
359
|
existing.push(sig);
|