@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,18 +9,21 @@
|
|
|
9
9
|
// Critical invariant: rendered markdown must round-trip through
|
|
10
10
|
// parseRoadmap(), parsePlan(), parseSummary() in files.ts.
|
|
11
11
|
|
|
12
|
-
import { readFileSync, existsSync, mkdirSync, statSync } from "node:fs";
|
|
12
|
+
import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:fs";
|
|
13
13
|
import { logWarning } from "./workflow-logger.js";
|
|
14
14
|
import { isClosedStatus } from "./status-guards.js";
|
|
15
15
|
import { dirname, join, relative } from "node:path";
|
|
16
16
|
import {
|
|
17
17
|
getAllMilestones,
|
|
18
18
|
getMilestone,
|
|
19
|
+
getMilestoneScopedArtifacts,
|
|
20
|
+
getSliceScopedArtifacts,
|
|
19
21
|
getMilestoneSlices,
|
|
20
22
|
getSliceTasks,
|
|
21
23
|
getTask,
|
|
22
24
|
getSlice,
|
|
23
25
|
insertArtifact,
|
|
26
|
+
deleteArtifactByPath,
|
|
24
27
|
getGateResults,
|
|
25
28
|
} from "./gsd-db.js";
|
|
26
29
|
import type { MilestoneRow, ArtifactRow } from "./db-milestone-artifact-rows.js";
|
|
@@ -31,6 +34,8 @@ import {
|
|
|
31
34
|
resolveFile,
|
|
32
35
|
resolveSliceFile,
|
|
33
36
|
resolveSlicePath,
|
|
37
|
+
resolveTaskFile,
|
|
38
|
+
resolveTasksDir,
|
|
34
39
|
gsdProjectionRoot,
|
|
35
40
|
gsdRoot,
|
|
36
41
|
buildMilestoneFileName,
|
|
@@ -40,8 +45,60 @@ import {
|
|
|
40
45
|
import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
|
|
41
46
|
import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
|
|
42
47
|
import { invalidateStateCache } from "./state.js";
|
|
43
|
-
import { clearPathCache } from "./paths.js";
|
|
48
|
+
import { clearPathCache, milestonesDir, legacyMilestonesDir, isLegacyMilestonesLayout, resolveMilestonePath, relSliceFile, canonicalPhaseDirName } from "./paths.js";
|
|
49
|
+
import { readCompatMarker, writeCompatMarker, computeProjectionSha } from "./compat/compat-marker.js";
|
|
44
50
|
import type { RiskLevel } from "./types.js";
|
|
51
|
+
import {
|
|
52
|
+
phaseDirName,
|
|
53
|
+
planFileName,
|
|
54
|
+
milestoneIdToPhaseNum,
|
|
55
|
+
sliceIdToPlanNum,
|
|
56
|
+
derivePhaseSlug,
|
|
57
|
+
} from "./layout-policy.js";
|
|
58
|
+
|
|
59
|
+
// ─── Compat marker invalidation ───────────────────────────────────────────
|
|
60
|
+
// Every successful projection write pushes its (basePath, projectionPath,
|
|
61
|
+
// entities) here; invalidateCaches() drains it and refreshes .gsd/.compat.json
|
|
62
|
+
// so the next reconcile pass sees gsd-pi's own writes as expected. This is the
|
|
63
|
+
// feedback-loop-prevention mechanism for cross-tool compatibility.
|
|
64
|
+
const _pendingProjectionWrites: Array<{ basePath: string; projectionPath: string; entities: string[] }> = [];
|
|
65
|
+
|
|
66
|
+
function recordProjectionWrite(basePath: string, projectionPath: string, entities: string[]): void {
|
|
67
|
+
_pendingProjectionWrites.push({ basePath, projectionPath, entities });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function flushProjectionWritesToMarker(): void {
|
|
71
|
+
if (_pendingProjectionWrites.length === 0) return;
|
|
72
|
+
// Group by basePath (defensive — multiple projects are unusual but possible).
|
|
73
|
+
const byBase = new Map<string, Map<string, string[]>>();
|
|
74
|
+
for (const w of _pendingProjectionWrites) {
|
|
75
|
+
let bucket = byBase.get(w.basePath);
|
|
76
|
+
if (!bucket) { bucket = new Map(); byBase.set(w.basePath, bucket); }
|
|
77
|
+
bucket.set(w.projectionPath, w.entities);
|
|
78
|
+
}
|
|
79
|
+
_pendingProjectionWrites.length = 0;
|
|
80
|
+
|
|
81
|
+
for (const [basePath, writes] of byBase) {
|
|
82
|
+
try {
|
|
83
|
+
const marker = readCompatMarker(basePath);
|
|
84
|
+
for (const [projectionPath, entities] of writes) {
|
|
85
|
+
const abs = join(basePath, ".gsd", projectionPath);
|
|
86
|
+
if (existsSync(abs)) {
|
|
87
|
+
marker.projections[projectionPath] = {
|
|
88
|
+
sha: computeProjectionSha(readFileSync(abs, "utf-8")),
|
|
89
|
+
entities,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
marker.lastWriter = "gsd-pi";
|
|
94
|
+
marker.lastProjectedAt = new Date().toISOString();
|
|
95
|
+
writeCompatMarker(basePath, marker);
|
|
96
|
+
} catch (e) {
|
|
97
|
+
// Marker I/O must never break projection. Reconcile will heal on next run.
|
|
98
|
+
logWarning("renderer", `compat marker flush failed: ${(e as Error).message}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
45
102
|
|
|
46
103
|
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
47
104
|
|
|
@@ -64,6 +121,7 @@ function toArtifactPath(absPath: string, basePath: string): string {
|
|
|
64
121
|
* Invalidate all caches after a disk write.
|
|
65
122
|
*/
|
|
66
123
|
function invalidateCaches(): void {
|
|
124
|
+
flushProjectionWritesToMarker();
|
|
67
125
|
invalidateStateCache();
|
|
68
126
|
clearPathCache();
|
|
69
127
|
clearParseCache();
|
|
@@ -87,7 +145,9 @@ function taskSummaryForSlicePlan(description: string): string {
|
|
|
87
145
|
const meaningful = meaningfulSection(description);
|
|
88
146
|
if (!meaningful) return "";
|
|
89
147
|
|
|
90
|
-
|
|
148
|
+
// Strip XML tags (flat-phase <tasks> format) so they don't leak into summaries
|
|
149
|
+
const cleaned = meaningful.replace(/<\/?tasks>/g, "").trim();
|
|
150
|
+
const beforeHeading = cleaned.split(/\n#{1,6}\s+/)[0]?.trim() ?? "";
|
|
91
151
|
const firstBlock = beforeHeading.split(/\n\s*\n/)[0]?.trim() ?? "";
|
|
92
152
|
return firstBlock || beforeHeading;
|
|
93
153
|
}
|
|
@@ -109,12 +169,28 @@ function sanitizeInlineRoadmapText(value: string | null | undefined): string {
|
|
|
109
169
|
}
|
|
110
170
|
|
|
111
171
|
function resolveRoadmapProjectionPath(basePath: string, milestoneId: string): string {
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
172
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
173
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
174
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
175
|
+
const isLegacyLayout = existing
|
|
176
|
+
? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
|
|
177
|
+
: isLegacyMilestonesLayout(basePath);
|
|
178
|
+
const phaseDir = existing ?? join(
|
|
179
|
+
isLegacyLayout ? legacyBase : milestonesDir(basePath),
|
|
180
|
+
isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
|
|
181
|
+
);
|
|
182
|
+
const roadmapFileName = isLegacyLayout
|
|
183
|
+
? `${milestoneId}-ROADMAP.md`
|
|
184
|
+
: `${String(phaseNum).padStart(2, "0")}-ROADMAP.md`;
|
|
185
|
+
return join(phaseDir, roadmapFileName);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function isMilestoneFlatPhaseLayout(basePath: string, milestoneId: string): boolean {
|
|
189
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
190
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
191
|
+
return existing
|
|
192
|
+
? !(existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\"))
|
|
193
|
+
: !isLegacyMilestonesLayout(basePath);
|
|
118
194
|
}
|
|
119
195
|
|
|
120
196
|
/**
|
|
@@ -130,6 +206,7 @@ async function writeAndStore(
|
|
|
130
206
|
slice_id?: string;
|
|
131
207
|
task_id?: string;
|
|
132
208
|
},
|
|
209
|
+
basePath?: string,
|
|
133
210
|
): Promise<void> {
|
|
134
211
|
await saveFile(absPath, content);
|
|
135
212
|
|
|
@@ -147,6 +224,17 @@ async function writeAndStore(
|
|
|
147
224
|
logWarning("renderer", `failed to update artifact in DB: ${artifactPath}`);
|
|
148
225
|
}
|
|
149
226
|
|
|
227
|
+
// Record the projection write so invalidateCaches() can refresh the compat
|
|
228
|
+
// marker. basePath is optional only to avoid forcing every caller; when
|
|
229
|
+
// present, the marker gets updated. artifactPath is already .gsd/-relative.
|
|
230
|
+
if (basePath) {
|
|
231
|
+
const entities: string[] = [];
|
|
232
|
+
if (opts.milestone_id) entities.push(opts.milestone_id);
|
|
233
|
+
if (opts.milestone_id && opts.slice_id) entities.push(`${opts.milestone_id}/${opts.slice_id}`);
|
|
234
|
+
if (opts.milestone_id && opts.slice_id && opts.task_id) entities.push(`${opts.milestone_id}/${opts.slice_id}/${opts.task_id}`);
|
|
235
|
+
recordProjectionWrite(basePath, artifactPath, entities);
|
|
236
|
+
}
|
|
237
|
+
|
|
150
238
|
invalidateCaches();
|
|
151
239
|
}
|
|
152
240
|
|
|
@@ -345,12 +433,14 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
|
|
|
345
433
|
}
|
|
346
434
|
lines.push("");
|
|
347
435
|
|
|
348
|
-
|
|
349
|
-
|
|
436
|
+
// Flat-phase: tasks render as a <tasks> XML block (gsd-core native format)
|
|
437
|
+
// instead of a ## Tasks markdown section. This makes the plan file compatible
|
|
438
|
+
// with gsd-core's parseOldPlan which extracts <tasks> blocks.
|
|
439
|
+
lines.push("<tasks>");
|
|
350
440
|
for (const task of tasks) {
|
|
351
441
|
const done = isClosedStatus(task.status) ? "x" : " ";
|
|
352
|
-
const estimate = task.estimate.trim() ? `
|
|
353
|
-
lines.push(`- [${done}] **${task.id}
|
|
442
|
+
const estimate = task.estimate.trim() ? ` _(${task.estimate.trim()})_` : "";
|
|
443
|
+
lines.push(`- [${done}] **${task.id}**: ${task.title || task.id}${estimate}`);
|
|
354
444
|
const summary = taskSummaryForSlicePlan(task.description);
|
|
355
445
|
if (summary) {
|
|
356
446
|
pushIndented(lines, summary);
|
|
@@ -361,8 +451,9 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
|
|
|
361
451
|
if (task.verify.trim()) {
|
|
362
452
|
lines.push(` - Verify: ${task.verify.trim()}`);
|
|
363
453
|
}
|
|
364
|
-
lines.push("");
|
|
365
454
|
}
|
|
455
|
+
lines.push("</tasks>");
|
|
456
|
+
lines.push("");
|
|
366
457
|
|
|
367
458
|
const filesLikelyTouched = Array.from(new Set(tasks.flatMap((task) => task.files)));
|
|
368
459
|
if (filesLikelyTouched.length > 0) {
|
|
@@ -393,14 +484,14 @@ export async function renderPlanFromDb(
|
|
|
393
484
|
throw new Error(`no tasks found for ${milestoneId}/${sliceId}`);
|
|
394
485
|
}
|
|
395
486
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
);
|
|
487
|
+
// Layout-aware path: prefer an existing plan file's location so re-renders
|
|
488
|
+
// stay in place (legacy: milestones/MID/slices/SID/SID-PLAN.md;
|
|
489
|
+
// flat-phase: phases/NN-slug/NN-MM-PLAN.md).
|
|
490
|
+
// Pass the milestone title so the fallback flat-phase dir uses the human-readable
|
|
491
|
+
// slug ("05-milestone-five") rather than the bare ID slug ("05-m005").
|
|
492
|
+
const milestoneTitle = getMilestone(milestoneId)?.title;
|
|
493
|
+
const existingPlanPath = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
494
|
+
const defaultPlanPath = existingPlanPath ?? join(basePath, relSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle));
|
|
404
495
|
const absPath = outputPath ?? defaultPlanPath;
|
|
405
496
|
mkdirSync(dirname(absPath), { recursive: true });
|
|
406
497
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
@@ -411,13 +502,11 @@ export async function renderPlanFromDb(
|
|
|
411
502
|
artifact_type: "PLAN",
|
|
412
503
|
milestone_id: milestoneId,
|
|
413
504
|
slice_id: sliceId,
|
|
414
|
-
});
|
|
505
|
+
}, basePath);
|
|
415
506
|
|
|
507
|
+
// Flat-phase: tasks are checkboxes inside the plan file, not separate files.
|
|
508
|
+
// No per-task render loop — task state is in the <tasks> block above.
|
|
416
509
|
const taskPlanPaths: string[] = [];
|
|
417
|
-
for (const task of tasks) {
|
|
418
|
-
const rendered = await renderTaskPlanFromDb(basePath, milestoneId, sliceId, task.id);
|
|
419
|
-
taskPlanPaths.push(rendered.taskPlanPath);
|
|
420
|
-
}
|
|
421
510
|
|
|
422
511
|
return { planPath: absPath, taskPlanPaths, content };
|
|
423
512
|
}
|
|
@@ -433,9 +522,36 @@ export async function renderTaskPlanFromDb(
|
|
|
433
522
|
throw new Error(`task ${milestoneId}/${sliceId}/${taskId} not found`);
|
|
434
523
|
}
|
|
435
524
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
const
|
|
525
|
+
// Flat-phase: task plans live inside the phase dir, not a tasks/ subdir.
|
|
526
|
+
// This function is legacy — tasks are now checkboxes inside the plan file.
|
|
527
|
+
const existingPlanPath = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
|
|
528
|
+
let absPath: string;
|
|
529
|
+
if (existingPlanPath) {
|
|
530
|
+
absPath = existingPlanPath;
|
|
531
|
+
} else {
|
|
532
|
+
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
533
|
+
if (slicePath) {
|
|
534
|
+
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
|
|
535
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
536
|
+
absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
|
|
537
|
+
} else {
|
|
538
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
539
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
540
|
+
const isLegacyLayout = existing
|
|
541
|
+
? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
|
|
542
|
+
: isLegacyMilestonesLayout(basePath);
|
|
543
|
+
const phaseDir = existing ?? join(
|
|
544
|
+
isLegacyLayout ? legacyBase : milestonesDir(basePath),
|
|
545
|
+
isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
|
|
546
|
+
);
|
|
547
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
548
|
+
const tasksDir = isLegacyLayout
|
|
549
|
+
? join(phaseDir, "slices", sliceId, "tasks")
|
|
550
|
+
: phaseDir;
|
|
551
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
552
|
+
absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
|
|
553
|
+
}
|
|
554
|
+
}
|
|
439
555
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
440
556
|
const taskGates = getGateResults(milestoneId, sliceId, "task").filter(g => g.task_id === taskId);
|
|
441
557
|
const content = task.full_plan_md.trim() ? task.full_plan_md : renderTaskPlanMarkdown(task, taskGates);
|
|
@@ -445,7 +561,7 @@ export async function renderTaskPlanFromDb(
|
|
|
445
561
|
milestone_id: milestoneId,
|
|
446
562
|
slice_id: sliceId,
|
|
447
563
|
task_id: taskId,
|
|
448
|
-
});
|
|
564
|
+
}, basePath);
|
|
449
565
|
|
|
450
566
|
return { taskPlanPath: absPath, content };
|
|
451
567
|
}
|
|
@@ -453,13 +569,43 @@ export async function renderTaskPlanFromDb(
|
|
|
453
569
|
export async function renderRoadmapFromDb(
|
|
454
570
|
basePath: string,
|
|
455
571
|
milestoneId: string,
|
|
456
|
-
): Promise<{ roadmapPath: string; content: string }> {
|
|
572
|
+
): Promise<{ roadmapPath: string; content: string } | { skipped: "unplanned-milestone" }> {
|
|
457
573
|
const milestone = getMilestone(milestoneId);
|
|
458
574
|
if (!milestone) {
|
|
459
575
|
throw new Error(`milestone ${milestoneId} not found`);
|
|
460
576
|
}
|
|
461
577
|
|
|
462
578
|
const slices = getMilestoneSlices(milestoneId);
|
|
579
|
+
|
|
580
|
+
// Refuse to render a stub ROADMAP for an unplanned milestone (#852).
|
|
581
|
+
// A milestone row created by gsd_milestone_generate_id / ensureMilestoneDbRow
|
|
582
|
+
// starts with title="" / vision="" and zero slices. Rendering that produces a
|
|
583
|
+
// 38-byte stub (`# M015: M015\n\n**Vision:** \n\n## Slices`) which passes
|
|
584
|
+
// existsSync but fails the plan-milestone "zero slices" content check —
|
|
585
|
+
// trapping auto-mode in a finalize-retry loop. A real plan (written by
|
|
586
|
+
// gsd_plan_milestone via writePlanRows) always sets a non-empty vision AND at
|
|
587
|
+
// least one slice, so zero-slice + empty-vision is a reliable "never planned"
|
|
588
|
+
// signal. Skip the write so verification sees a genuinely missing file (a
|
|
589
|
+
// clear "write the ROADMAP" failure) instead of a misleading stub.
|
|
590
|
+
if (slices.length === 0 && !milestone.vision.trim()) {
|
|
591
|
+
logWarning(
|
|
592
|
+
"projection",
|
|
593
|
+
`renderRoadmapFromDb skipped unplanned milestone ${milestoneId} (zero slices, empty vision) — refusing to write a stub ROADMAP`,
|
|
594
|
+
);
|
|
595
|
+
const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
|
|
596
|
+
if (existsSync(absPath)) {
|
|
597
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
598
|
+
unlinkSync(absPath);
|
|
599
|
+
try {
|
|
600
|
+
deleteArtifactByPath(artifactPath);
|
|
601
|
+
} catch {
|
|
602
|
+
logWarning("renderer", `failed to remove artifact from DB: ${artifactPath}`);
|
|
603
|
+
}
|
|
604
|
+
invalidateCaches();
|
|
605
|
+
}
|
|
606
|
+
return { skipped: "unplanned-milestone" };
|
|
607
|
+
}
|
|
608
|
+
|
|
463
609
|
const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
|
|
464
610
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
465
611
|
const content = renderRoadmapMarkdown(milestone, slices);
|
|
@@ -467,7 +613,7 @@ export async function renderRoadmapFromDb(
|
|
|
467
613
|
await writeAndStore(absPath, artifactPath, content, {
|
|
468
614
|
artifact_type: "ROADMAP",
|
|
469
615
|
milestone_id: milestoneId,
|
|
470
|
-
});
|
|
616
|
+
}, basePath);
|
|
471
617
|
|
|
472
618
|
return { roadmapPath: absPath, content };
|
|
473
619
|
}
|
|
@@ -497,6 +643,86 @@ export async function renderRoadmapCheckboxes(
|
|
|
497
643
|
return true;
|
|
498
644
|
}
|
|
499
645
|
|
|
646
|
+
/**
|
|
647
|
+
* Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
|
|
648
|
+
* the artifacts table into the flat-phase phase directory. ROADMAP is skipped
|
|
649
|
+
* because renderRoadmapFromDb regenerates it from hierarchy rows.
|
|
650
|
+
*/
|
|
651
|
+
export async function renderMilestoneArtifactsFromDb(
|
|
652
|
+
basePath: string,
|
|
653
|
+
milestoneId: string,
|
|
654
|
+
): Promise<boolean> {
|
|
655
|
+
const artifacts = getMilestoneScopedArtifacts(milestoneId);
|
|
656
|
+
if (artifacts.length === 0) return false;
|
|
657
|
+
|
|
658
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId) ??
|
|
659
|
+
join(
|
|
660
|
+
milestonesDir(basePath),
|
|
661
|
+
canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
|
|
662
|
+
);
|
|
663
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
664
|
+
|
|
665
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
666
|
+
const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
|
|
667
|
+
|
|
668
|
+
let wrote = false;
|
|
669
|
+
for (const artifact of artifacts) {
|
|
670
|
+
if (artifact.artifact_type === "ROADMAP") continue;
|
|
671
|
+
if (!artifact.full_content.trim()) continue;
|
|
672
|
+
|
|
673
|
+
const fileName = isLegacy
|
|
674
|
+
? `${milestoneId}-${artifact.artifact_type}.md`
|
|
675
|
+
: buildMilestoneFileName(milestoneId, artifact.artifact_type);
|
|
676
|
+
const absPath = join(phaseDir, fileName);
|
|
677
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
678
|
+
await writeAndStore(absPath, artifactPath, artifact.full_content, {
|
|
679
|
+
artifact_type: artifact.artifact_type,
|
|
680
|
+
milestone_id: milestoneId,
|
|
681
|
+
});
|
|
682
|
+
wrote = true;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
return wrote;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
* Slice-scoped artifacts (CONTEXT, RESEARCH, CONTINUE, etc.) must survive
|
|
690
|
+
* layout migration. PLAN is normally regenerated from task rows, but a real
|
|
691
|
+
* imported PLAN can still be replayed as a fallback; known recovery stubs are
|
|
692
|
+
* treated as missing.
|
|
693
|
+
*/
|
|
694
|
+
export async function renderSliceArtifactsFromDb(
|
|
695
|
+
basePath: string,
|
|
696
|
+
milestoneId: string,
|
|
697
|
+
sliceId: string,
|
|
698
|
+
): Promise<boolean> {
|
|
699
|
+
const artifacts = getSliceScopedArtifacts(milestoneId, sliceId);
|
|
700
|
+
if (artifacts.length === 0) return false;
|
|
701
|
+
|
|
702
|
+
let wrote = false;
|
|
703
|
+
for (const artifact of artifacts) {
|
|
704
|
+
const artifactType = artifact.artifact_type.toUpperCase();
|
|
705
|
+
if (!artifact.full_content.trim()) continue;
|
|
706
|
+
if (artifactType === "PLAN" && isAutoRecoveryPlaceholderPlan(artifact.full_content)) continue;
|
|
707
|
+
|
|
708
|
+
const absPath = join(basePath, relSliceFile(basePath, milestoneId, sliceId, artifactType));
|
|
709
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
710
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
711
|
+
await writeAndStore(absPath, artifactPath, artifact.full_content, {
|
|
712
|
+
artifact_type: artifactType,
|
|
713
|
+
milestone_id: milestoneId,
|
|
714
|
+
slice_id: sliceId,
|
|
715
|
+
}, basePath);
|
|
716
|
+
wrote = true;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
return wrote;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
function isAutoRecoveryPlaceholderPlan(content: string): boolean {
|
|
723
|
+
return /(?:^|\n)\s*#\s*BLOCKER\b/i.test(content) && /auto-mode recovery failed/i.test(content);
|
|
724
|
+
}
|
|
725
|
+
|
|
500
726
|
// ─── Plan Checkbox Rendering ──────────────────────────────────────────────
|
|
501
727
|
|
|
502
728
|
/**
|
|
@@ -559,7 +785,9 @@ export async function renderTaskSummary(
|
|
|
559
785
|
return false;
|
|
560
786
|
}
|
|
561
787
|
|
|
562
|
-
|
|
788
|
+
// Use the tasks/ subdir when it exists (legacy layout), otherwise use the
|
|
789
|
+
// slice path directly (flat-phase: task summaries live alongside plan files).
|
|
790
|
+
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
|
|
563
791
|
const fileName = buildTaskFileName(taskId, "SUMMARY");
|
|
564
792
|
const absPath = join(tasksDir, fileName);
|
|
565
793
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
@@ -569,7 +797,7 @@ export async function renderTaskSummary(
|
|
|
569
797
|
milestone_id: milestoneId,
|
|
570
798
|
slice_id: sliceId,
|
|
571
799
|
task_id: taskId,
|
|
572
|
-
});
|
|
800
|
+
}, basePath);
|
|
573
801
|
|
|
574
802
|
return true;
|
|
575
803
|
}
|
|
@@ -592,19 +820,21 @@ export async function renderSliceSummary(
|
|
|
592
820
|
return false; // No slice data — skip silently
|
|
593
821
|
}
|
|
594
822
|
|
|
595
|
-
|
|
823
|
+
// Flat-phase: resolve or create the phase dir, since resolveSlicePath only
|
|
824
|
+
// finds existing dirs. In flat-phase the slice "path" is the phase dir.
|
|
825
|
+
let slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
596
826
|
if (!slicePath) {
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
);
|
|
600
|
-
|
|
827
|
+
const mDir = milestonesDir(basePath);
|
|
828
|
+
const dirName = canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title);
|
|
829
|
+
slicePath = join(mDir, dirName);
|
|
830
|
+
mkdirSync(slicePath, { recursive: true });
|
|
601
831
|
}
|
|
602
832
|
|
|
603
833
|
let wrote = false;
|
|
604
834
|
|
|
605
|
-
// Write SUMMARY
|
|
835
|
+
// Write SUMMARY — flat-phase: NN-MM-SUMMARY.md inside phase dir
|
|
606
836
|
if (slice.full_summary_md) {
|
|
607
|
-
const summaryName =
|
|
837
|
+
const summaryName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "SUMMARY");
|
|
608
838
|
const summaryAbs = join(slicePath, summaryName);
|
|
609
839
|
const summaryArtifact = toArtifactPath(summaryAbs, basePath);
|
|
610
840
|
|
|
@@ -612,13 +842,13 @@ export async function renderSliceSummary(
|
|
|
612
842
|
artifact_type: "SUMMARY",
|
|
613
843
|
milestone_id: milestoneId,
|
|
614
844
|
slice_id: sliceId,
|
|
615
|
-
});
|
|
845
|
+
}, basePath);
|
|
616
846
|
wrote = true;
|
|
617
847
|
}
|
|
618
848
|
|
|
619
|
-
// Write UAT
|
|
849
|
+
// Write UAT — flat-phase: NN-MM-UAT.md inside phase dir
|
|
620
850
|
if (slice.full_uat_md) {
|
|
621
|
-
const uatName =
|
|
851
|
+
const uatName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "UAT");
|
|
622
852
|
const uatAbs = join(slicePath, uatName);
|
|
623
853
|
const uatArtifact = toArtifactPath(uatAbs, basePath);
|
|
624
854
|
|
|
@@ -626,7 +856,7 @@ export async function renderSliceSummary(
|
|
|
626
856
|
artifact_type: "UAT",
|
|
627
857
|
milestone_id: milestoneId,
|
|
628
858
|
slice_id: sliceId,
|
|
629
|
-
});
|
|
859
|
+
}, basePath);
|
|
630
860
|
wrote = true;
|
|
631
861
|
}
|
|
632
862
|
|
|
@@ -659,9 +889,29 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
659
889
|
result.errors.push(`roadmap ${milestone.id}: ${(err as Error).message}`);
|
|
660
890
|
}
|
|
661
891
|
|
|
892
|
+
try {
|
|
893
|
+
const ok = await renderMilestoneArtifactsFromDb(basePath, milestone.id);
|
|
894
|
+
if (ok) result.rendered++;
|
|
895
|
+
else result.skipped++;
|
|
896
|
+
} catch (err) {
|
|
897
|
+
result.errors.push(`milestone artifacts ${milestone.id}: ${(err as Error).message}`);
|
|
898
|
+
}
|
|
899
|
+
|
|
662
900
|
// Iterate slices
|
|
663
901
|
const slices = getMilestoneSlices(milestone.id);
|
|
664
902
|
for (const slice of slices) {
|
|
903
|
+
// Preserve slice-scoped artifacts imported from disk, including real PLAN
|
|
904
|
+
// fallback content when task rows cannot regenerate it.
|
|
905
|
+
try {
|
|
906
|
+
const ok = await renderSliceArtifactsFromDb(basePath, milestone.id, slice.id);
|
|
907
|
+
if (ok) result.rendered++;
|
|
908
|
+
else result.skipped++;
|
|
909
|
+
} catch (err) {
|
|
910
|
+
result.errors.push(
|
|
911
|
+
`slice artifacts ${milestone.id}/${slice.id}: ${(err as Error).message}`,
|
|
912
|
+
);
|
|
913
|
+
}
|
|
914
|
+
|
|
665
915
|
// Render plan checkboxes
|
|
666
916
|
try {
|
|
667
917
|
const ok = await renderPlanCheckboxes(basePath, milestone.id, slice.id);
|
|
@@ -717,6 +967,25 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
717
967
|
result.errors.push(`decisions: ${(err as Error).message}`);
|
|
718
968
|
}
|
|
719
969
|
|
|
970
|
+
// Project to .planning/ if the compat marker says it's active. Dynamic
|
|
971
|
+
// import for writePlanningDirectory avoids a static-import cycle. Gated on
|
|
972
|
+
// planning.active so the double-write cost only hits projects that use
|
|
973
|
+
// .planning/. writePlanningDirectory records per-file SHAs via
|
|
974
|
+
// applyPlanningProjectionWrites so the reconcile detector has a baseline.
|
|
975
|
+
// capturePlanningCompatIfNeeded seeds the layout and SHAs on first encounter.
|
|
976
|
+
try {
|
|
977
|
+
const { capturePlanningCompatIfNeeded } = await import("./compat/planning-compat.js");
|
|
978
|
+
await capturePlanningCompatIfNeeded(basePath);
|
|
979
|
+
const marker = readCompatMarker(basePath);
|
|
980
|
+
if (marker.planning?.active && marker.planning.layout) {
|
|
981
|
+
const { writePlanningDirectory } = await import("./migrate/planning-writer.js");
|
|
982
|
+
await writePlanningDirectory(basePath, marker.planning.layout);
|
|
983
|
+
result.rendered++;
|
|
984
|
+
}
|
|
985
|
+
} catch (err) {
|
|
986
|
+
result.errors.push(`planning projection: ${(err as Error).message}`);
|
|
987
|
+
}
|
|
988
|
+
|
|
720
989
|
return result;
|
|
721
990
|
}
|
|
722
991
|
|
|
@@ -733,7 +1002,7 @@ export interface StaleEntry {
|
|
|
733
1002
|
* Checks:
|
|
734
1003
|
* 1. Roadmap checkbox states vs DB slice statuses
|
|
735
1004
|
* 2. Plan checkbox states vs DB task statuses
|
|
736
|
-
* 3. Missing SUMMARY.md files for complete tasks with full_summary_md
|
|
1005
|
+
* 3. Missing SUMMARY.md files for complete tasks with full_summary_md (legacy only)
|
|
737
1006
|
* 4. Missing SUMMARY.md/UAT.md files for complete slices with content
|
|
738
1007
|
*
|
|
739
1008
|
* Returns a list of stale entries with file path and reason.
|
|
@@ -769,7 +1038,18 @@ function parseProjectionByIdentity(path: string, parse: (content: string) => unk
|
|
|
769
1038
|
}
|
|
770
1039
|
|
|
771
1040
|
export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
772
|
-
//
|
|
1041
|
+
// TODO(flat-phase): stale-render detection is temporarily fully disabled.
|
|
1042
|
+
// The isLegacyMilestonesLayout gate is unreliable: git-service.ts creates
|
|
1043
|
+
// milestones/<mid>/ directories for integration-branch metadata even in
|
|
1044
|
+
// flat-phase projects, making the gate fire true and then producing false
|
|
1045
|
+
// stale-render drift in the second reconcile cycle → ReconciliationFailedError
|
|
1046
|
+
// → auto-mode blocked (exit 10) for multi-slice/remediation e2e scenarios.
|
|
1047
|
+
// Re-enable after path construction is unified and the metadata dir is
|
|
1048
|
+
// decoupled from the layout-detection signal.
|
|
1049
|
+
return [];
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
function detectStaleRendersImpl(basePath: string): StaleEntry[] {
|
|
773
1053
|
// per-call createRequire("./parsers-legacy") that used to live here ran on
|
|
774
1054
|
// every dispatch. The static `./parsers-legacy.js` specifier resolves in
|
|
775
1055
|
// both packaged (.js) and source (.ts via the strip-types loader) contexts —
|
|
@@ -779,8 +1059,12 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
779
1059
|
|
|
780
1060
|
for (const milestone of milestones) {
|
|
781
1061
|
const slices = getMilestoneSlices(milestone.id);
|
|
1062
|
+
const isFlatPhase = isMilestoneFlatPhaseLayout(basePath, milestone.id);
|
|
782
1063
|
|
|
783
1064
|
// ── Check roadmap checkbox state ──────────────────────────────────
|
|
1065
|
+
// TODO(flat-phase): roadmap checkbox parsing may not match flat-phase
|
|
1066
|
+
// roadmap format, causing false-positive drift loops. Skip during transition.
|
|
1067
|
+
/*
|
|
784
1068
|
const roadmapPath = resolveRoadmapProjectionPath(basePath, milestone.id);
|
|
785
1069
|
if (existsSync(roadmapPath)) {
|
|
786
1070
|
try {
|
|
@@ -791,12 +1075,12 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
791
1075
|
const roadmapSlice = parsed.slices.find((s: { id: string }) => s.id === slice.id);
|
|
792
1076
|
if (!roadmapSlice) continue;
|
|
793
1077
|
|
|
794
|
-
if (isCompleteInDb && !roadmapSlice
|
|
1078
|
+
if (isCompleteInDb && !roadmapSlice!.done) {
|
|
795
1079
|
stale.push({
|
|
796
1080
|
path: roadmapPath,
|
|
797
1081
|
reason: `${slice.id} is closed in DB but unchecked in roadmap`,
|
|
798
1082
|
});
|
|
799
|
-
} else if (!isCompleteInDb && roadmapSlice
|
|
1083
|
+
} else if (!isCompleteInDb && roadmapSlice!.done) {
|
|
800
1084
|
stale.push({
|
|
801
1085
|
path: roadmapPath,
|
|
802
1086
|
reason: `${slice.id} is not closed in DB but checked in roadmap`,
|
|
@@ -807,62 +1091,67 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
807
1091
|
logWarning("renderer", `roadmap parse failed: ${(e as Error).message}`);
|
|
808
1092
|
}
|
|
809
1093
|
}
|
|
1094
|
+
*/
|
|
810
1095
|
|
|
811
1096
|
// ── Check plan checkbox state and summaries for each slice ────────
|
|
812
1097
|
for (const slice of slices) {
|
|
813
1098
|
const tasks = getSliceTasks(milestone.id, slice.id);
|
|
814
1099
|
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
const
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
1100
|
+
if (!isFlatPhase) {
|
|
1101
|
+
// Check plan checkboxes
|
|
1102
|
+
const planPath = resolveSliceFile(basePath, milestone.id, slice.id, "PLAN");
|
|
1103
|
+
if (planPath && existsSync(planPath!)) {
|
|
1104
|
+
try {
|
|
1105
|
+
const parsed = parseProjectionByIdentity(planPath!, parsePlan) as ReturnType<typeof parsePlan>;
|
|
1106
|
+
|
|
1107
|
+
for (const task of tasks) {
|
|
1108
|
+
const isDoneInDb = isClosedStatus(task.status);
|
|
1109
|
+
const planTask = parsed.tasks.find((t: { id: string }) => t.id === task.id);
|
|
1110
|
+
if (!planTask) {
|
|
1111
|
+
// DB has a task the plan markdown lacks: the projection is
|
|
1112
|
+
// lossy (e.g. tasks added after the PLAN artifact was first
|
|
1113
|
+
// written). Flag it so the plan is re-rendered from DB rows.
|
|
1114
|
+
stale.push({
|
|
1115
|
+
path: planPath!,
|
|
1116
|
+
reason: `${task.id} exists in DB but is missing in plan`,
|
|
1117
|
+
});
|
|
1118
|
+
continue;
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
if (isDoneInDb && !planTask!.done) {
|
|
1122
|
+
stale.push({
|
|
1123
|
+
path: planPath!,
|
|
1124
|
+
reason: `${task.id} is done in DB but unchecked in plan`,
|
|
1125
|
+
});
|
|
1126
|
+
} else if (!isDoneInDb && planTask!.done) {
|
|
1127
|
+
stale.push({
|
|
1128
|
+
path: planPath!,
|
|
1129
|
+
reason: `${task.id} is not done in DB but checked in plan`,
|
|
1130
|
+
});
|
|
1131
|
+
}
|
|
845
1132
|
}
|
|
1133
|
+
} catch (e) {
|
|
1134
|
+
logWarning("renderer", `plan parse failed: ${(e as Error).message}`);
|
|
846
1135
|
}
|
|
847
|
-
} catch (e) {
|
|
848
|
-
logWarning("renderer", `plan parse failed: ${(e as Error).message}`);
|
|
849
1136
|
}
|
|
850
1137
|
}
|
|
851
1138
|
|
|
852
|
-
// Check missing task summary files
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
if (
|
|
857
|
-
const
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
1139
|
+
// Check missing task summary files (legacy layout only — flat-phase keeps
|
|
1140
|
+
// task state in plan <tasks> blocks and does not project Txx-SUMMARY.md)
|
|
1141
|
+
if (!isFlatPhase) {
|
|
1142
|
+
for (const task of tasks) {
|
|
1143
|
+
if (isClosedStatus(task.status) && task.full_summary_md) {
|
|
1144
|
+
const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
|
|
1145
|
+
if (slicePath) {
|
|
1146
|
+
const fileName = buildTaskFileName(task.id, "SUMMARY");
|
|
1147
|
+
const summaryAbsPath = join(slicePath, fileName);
|
|
1148
|
+
|
|
1149
|
+
if (!existsSync(summaryAbsPath)) {
|
|
1150
|
+
stale.push({
|
|
1151
|
+
path: summaryAbsPath,
|
|
1152
|
+
reason: `${task.id} is complete with summary in DB but SUMMARY.md missing on disk`,
|
|
1153
|
+
});
|
|
1154
|
+
}
|
|
866
1155
|
}
|
|
867
1156
|
}
|
|
868
1157
|
}
|
|
@@ -871,10 +1160,15 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
871
1160
|
// Check missing slice summary/UAT files
|
|
872
1161
|
const sliceRow = getSlice(milestone.id, slice.id);
|
|
873
1162
|
if (sliceRow && sliceRow.status === "complete") {
|
|
1163
|
+
// Use the SAME path construction as renderSliceSummary (planFileName format)
|
|
1164
|
+
// so the detector and repair always agree on the file location.
|
|
874
1165
|
const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
|
|
875
1166
|
if (slicePath) {
|
|
1167
|
+
const phaseNum = milestoneIdToPhaseNum(milestone.id);
|
|
1168
|
+
const planNum = sliceIdToPlanNum(slice.id);
|
|
1169
|
+
|
|
876
1170
|
if (sliceRow.full_summary_md) {
|
|
877
|
-
const summaryName =
|
|
1171
|
+
const summaryName = planFileName(phaseNum, planNum, "SUMMARY");
|
|
878
1172
|
const summaryAbsPath = join(slicePath, summaryName);
|
|
879
1173
|
if (!existsSync(summaryAbsPath)) {
|
|
880
1174
|
stale.push({
|
|
@@ -885,7 +1179,7 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
885
1179
|
}
|
|
886
1180
|
|
|
887
1181
|
if (sliceRow.full_uat_md) {
|
|
888
|
-
const uatName =
|
|
1182
|
+
const uatName = planFileName(phaseNum, planNum, "UAT");
|
|
889
1183
|
const uatAbsPath = join(slicePath, uatName);
|
|
890
1184
|
if (!existsSync(uatAbsPath)) {
|
|
891
1185
|
stale.push({
|
|
@@ -948,9 +1242,12 @@ export async function renderReplanFromDb(
|
|
|
948
1242
|
sliceId: string,
|
|
949
1243
|
replanData: ReplanData,
|
|
950
1244
|
): Promise<{ replanPath: string; content: string }> {
|
|
1245
|
+
// Flat-phase: replan file lives in the phase dir
|
|
951
1246
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
|
|
952
|
-
?? join(
|
|
953
|
-
const
|
|
1247
|
+
?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
1248
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
1249
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
1250
|
+
const absPath = join(slicePath, planFileName(phaseNum, planNum, "REPLAN"));
|
|
954
1251
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
955
1252
|
|
|
956
1253
|
const lines: string[] = [];
|
|
@@ -976,7 +1273,7 @@ export async function renderReplanFromDb(
|
|
|
976
1273
|
artifact_type: "REPLAN",
|
|
977
1274
|
milestone_id: milestoneId,
|
|
978
1275
|
slice_id: sliceId,
|
|
979
|
-
});
|
|
1276
|
+
}, basePath);
|
|
980
1277
|
|
|
981
1278
|
return { replanPath: absPath, content };
|
|
982
1279
|
}
|
|
@@ -987,9 +1284,12 @@ export async function renderAssessmentFromDb(
|
|
|
987
1284
|
sliceId: string,
|
|
988
1285
|
assessmentData: AssessmentData,
|
|
989
1286
|
): Promise<{ assessmentPath: string; content: string }> {
|
|
1287
|
+
// Flat-phase: assessment file lives in the phase dir
|
|
990
1288
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
|
|
991
|
-
?? join(
|
|
992
|
-
const
|
|
1289
|
+
?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
1290
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
1291
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
1292
|
+
const absPath = join(slicePath, planFileName(phaseNum, planNum, "ASSESSMENT"));
|
|
993
1293
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
994
1294
|
|
|
995
1295
|
const lines: string[] = [];
|
|
@@ -1014,7 +1314,7 @@ export async function renderAssessmentFromDb(
|
|
|
1014
1314
|
artifact_type: "ASSESSMENT",
|
|
1015
1315
|
milestone_id: milestoneId,
|
|
1016
1316
|
slice_id: sliceId,
|
|
1017
|
-
});
|
|
1317
|
+
}, basePath);
|
|
1018
1318
|
|
|
1019
1319
|
return { assessmentPath: absPath, content };
|
|
1020
1320
|
}
|