@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
|
@@ -8,16 +8,63 @@
|
|
|
8
8
|
//
|
|
9
9
|
// Critical invariant: rendered markdown must round-trip through
|
|
10
10
|
// parseRoadmap(), parsePlan(), parseSummary() in files.ts.
|
|
11
|
-
import { readFileSync, existsSync, mkdirSync, statSync } from "node:fs";
|
|
11
|
+
import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:fs";
|
|
12
12
|
import { logWarning } from "./workflow-logger.js";
|
|
13
13
|
import { isClosedStatus } from "./status-guards.js";
|
|
14
14
|
import { dirname, join, relative } from "node:path";
|
|
15
|
-
import { getAllMilestones, getMilestone, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, getGateResults, } from "./gsd-db.js";
|
|
16
|
-
import {
|
|
15
|
+
import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, } from "./gsd-db.js";
|
|
16
|
+
import { resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, gsdProjectionRoot, gsdRoot, buildMilestoneFileName, buildTaskFileName, } from "./paths.js";
|
|
17
17
|
import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
|
|
18
18
|
import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
|
|
19
19
|
import { invalidateStateCache } from "./state.js";
|
|
20
|
-
import { clearPathCache } from "./paths.js";
|
|
20
|
+
import { clearPathCache, milestonesDir, legacyMilestonesDir, isLegacyMilestonesLayout, resolveMilestonePath, relSliceFile, canonicalPhaseDirName } from "./paths.js";
|
|
21
|
+
import { readCompatMarker, writeCompatMarker, computeProjectionSha } from "./compat/compat-marker.js";
|
|
22
|
+
import { planFileName, milestoneIdToPhaseNum, sliceIdToPlanNum, } from "./layout-policy.js";
|
|
23
|
+
// ─── Compat marker invalidation ───────────────────────────────────────────
|
|
24
|
+
// Every successful projection write pushes its (basePath, projectionPath,
|
|
25
|
+
// entities) here; invalidateCaches() drains it and refreshes .gsd/.compat.json
|
|
26
|
+
// so the next reconcile pass sees gsd-pi's own writes as expected. This is the
|
|
27
|
+
// feedback-loop-prevention mechanism for cross-tool compatibility.
|
|
28
|
+
const _pendingProjectionWrites = [];
|
|
29
|
+
function recordProjectionWrite(basePath, projectionPath, entities) {
|
|
30
|
+
_pendingProjectionWrites.push({ basePath, projectionPath, entities });
|
|
31
|
+
}
|
|
32
|
+
function flushProjectionWritesToMarker() {
|
|
33
|
+
if (_pendingProjectionWrites.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
// Group by basePath (defensive — multiple projects are unusual but possible).
|
|
36
|
+
const byBase = new Map();
|
|
37
|
+
for (const w of _pendingProjectionWrites) {
|
|
38
|
+
let bucket = byBase.get(w.basePath);
|
|
39
|
+
if (!bucket) {
|
|
40
|
+
bucket = new Map();
|
|
41
|
+
byBase.set(w.basePath, bucket);
|
|
42
|
+
}
|
|
43
|
+
bucket.set(w.projectionPath, w.entities);
|
|
44
|
+
}
|
|
45
|
+
_pendingProjectionWrites.length = 0;
|
|
46
|
+
for (const [basePath, writes] of byBase) {
|
|
47
|
+
try {
|
|
48
|
+
const marker = readCompatMarker(basePath);
|
|
49
|
+
for (const [projectionPath, entities] of writes) {
|
|
50
|
+
const abs = join(basePath, ".gsd", projectionPath);
|
|
51
|
+
if (existsSync(abs)) {
|
|
52
|
+
marker.projections[projectionPath] = {
|
|
53
|
+
sha: computeProjectionSha(readFileSync(abs, "utf-8")),
|
|
54
|
+
entities,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
marker.lastWriter = "gsd-pi";
|
|
59
|
+
marker.lastProjectedAt = new Date().toISOString();
|
|
60
|
+
writeCompatMarker(basePath, marker);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
// Marker I/O must never break projection. Reconcile will heal on next run.
|
|
64
|
+
logWarning("renderer", `compat marker flush failed: ${e.message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
21
68
|
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
22
69
|
/**
|
|
23
70
|
* Convert an absolute file path to a .gsd-relative artifact path.
|
|
@@ -37,6 +84,7 @@ function toArtifactPath(absPath, basePath) {
|
|
|
37
84
|
* Invalidate all caches after a disk write.
|
|
38
85
|
*/
|
|
39
86
|
function invalidateCaches() {
|
|
87
|
+
flushProjectionWritesToMarker();
|
|
40
88
|
invalidateStateCache();
|
|
41
89
|
clearPathCache();
|
|
42
90
|
clearParseCache();
|
|
@@ -60,7 +108,9 @@ function taskSummaryForSlicePlan(description) {
|
|
|
60
108
|
const meaningful = meaningfulSection(description);
|
|
61
109
|
if (!meaningful)
|
|
62
110
|
return "";
|
|
63
|
-
|
|
111
|
+
// Strip XML tags (flat-phase <tasks> format) so they don't leak into summaries
|
|
112
|
+
const cleaned = meaningful.replace(/<\/?tasks>/g, "").trim();
|
|
113
|
+
const beforeHeading = cleaned.split(/\n#{1,6}\s+/)[0]?.trim() ?? "";
|
|
64
114
|
const firstBlock = beforeHeading.split(/\n\s*\n/)[0]?.trim() ?? "";
|
|
65
115
|
return firstBlock || beforeHeading;
|
|
66
116
|
}
|
|
@@ -79,17 +129,29 @@ function sanitizeInlineRoadmapText(value) {
|
|
|
79
129
|
.trim();
|
|
80
130
|
}
|
|
81
131
|
function resolveRoadmapProjectionPath(basePath, milestoneId) {
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
132
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
133
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
134
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
135
|
+
const isLegacyLayout = existing
|
|
136
|
+
? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
|
|
137
|
+
: isLegacyMilestonesLayout(basePath);
|
|
138
|
+
const phaseDir = existing ?? join(isLegacyLayout ? legacyBase : milestonesDir(basePath), isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
139
|
+
const roadmapFileName = isLegacyLayout
|
|
140
|
+
? `${milestoneId}-ROADMAP.md`
|
|
141
|
+
: `${String(phaseNum).padStart(2, "0")}-ROADMAP.md`;
|
|
142
|
+
return join(phaseDir, roadmapFileName);
|
|
143
|
+
}
|
|
144
|
+
function isMilestoneFlatPhaseLayout(basePath, milestoneId) {
|
|
145
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
146
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
147
|
+
return existing
|
|
148
|
+
? !(existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\"))
|
|
149
|
+
: !isLegacyMilestonesLayout(basePath);
|
|
88
150
|
}
|
|
89
151
|
/**
|
|
90
152
|
* Write rendered content to disk and update the artifacts table.
|
|
91
153
|
*/
|
|
92
|
-
async function writeAndStore(absPath, artifactPath, content, opts) {
|
|
154
|
+
async function writeAndStore(absPath, artifactPath, content, opts, basePath) {
|
|
93
155
|
await saveFile(absPath, content);
|
|
94
156
|
try {
|
|
95
157
|
insertArtifact({
|
|
@@ -105,6 +167,19 @@ async function writeAndStore(absPath, artifactPath, content, opts) {
|
|
|
105
167
|
// Non-fatal: file is on disk, DB is best-effort
|
|
106
168
|
logWarning("renderer", `failed to update artifact in DB: ${artifactPath}`);
|
|
107
169
|
}
|
|
170
|
+
// Record the projection write so invalidateCaches() can refresh the compat
|
|
171
|
+
// marker. basePath is optional only to avoid forcing every caller; when
|
|
172
|
+
// present, the marker gets updated. artifactPath is already .gsd/-relative.
|
|
173
|
+
if (basePath) {
|
|
174
|
+
const entities = [];
|
|
175
|
+
if (opts.milestone_id)
|
|
176
|
+
entities.push(opts.milestone_id);
|
|
177
|
+
if (opts.milestone_id && opts.slice_id)
|
|
178
|
+
entities.push(`${opts.milestone_id}/${opts.slice_id}`);
|
|
179
|
+
if (opts.milestone_id && opts.slice_id && opts.task_id)
|
|
180
|
+
entities.push(`${opts.milestone_id}/${opts.slice_id}/${opts.task_id}`);
|
|
181
|
+
recordProjectionWrite(basePath, artifactPath, entities);
|
|
182
|
+
}
|
|
108
183
|
invalidateCaches();
|
|
109
184
|
}
|
|
110
185
|
function renderRoadmapMarkdown(milestone, slices) {
|
|
@@ -284,12 +359,14 @@ function renderSlicePlanMarkdown(slice, tasks, gates = []) {
|
|
|
284
359
|
lines.push("- Run the task and slice verification checks for this slice.");
|
|
285
360
|
}
|
|
286
361
|
lines.push("");
|
|
287
|
-
|
|
288
|
-
|
|
362
|
+
// Flat-phase: tasks render as a <tasks> XML block (gsd-core native format)
|
|
363
|
+
// instead of a ## Tasks markdown section. This makes the plan file compatible
|
|
364
|
+
// with gsd-core's parseOldPlan which extracts <tasks> blocks.
|
|
365
|
+
lines.push("<tasks>");
|
|
289
366
|
for (const task of tasks) {
|
|
290
367
|
const done = isClosedStatus(task.status) ? "x" : " ";
|
|
291
|
-
const estimate = task.estimate.trim() ? `
|
|
292
|
-
lines.push(`- [${done}] **${task.id}
|
|
368
|
+
const estimate = task.estimate.trim() ? ` _(${task.estimate.trim()})_` : "";
|
|
369
|
+
lines.push(`- [${done}] **${task.id}**: ${task.title || task.id}${estimate}`);
|
|
293
370
|
const summary = taskSummaryForSlicePlan(task.description);
|
|
294
371
|
if (summary) {
|
|
295
372
|
pushIndented(lines, summary);
|
|
@@ -300,8 +377,9 @@ function renderSlicePlanMarkdown(slice, tasks, gates = []) {
|
|
|
300
377
|
if (task.verify.trim()) {
|
|
301
378
|
lines.push(` - Verify: ${task.verify.trim()}`);
|
|
302
379
|
}
|
|
303
|
-
lines.push("");
|
|
304
380
|
}
|
|
381
|
+
lines.push("</tasks>");
|
|
382
|
+
lines.push("");
|
|
305
383
|
const filesLikelyTouched = Array.from(new Set(tasks.flatMap((task) => task.files)));
|
|
306
384
|
if (filesLikelyTouched.length > 0) {
|
|
307
385
|
lines.push("## Files Likely Touched");
|
|
@@ -322,7 +400,14 @@ export async function renderPlanFromDb(basePath, milestoneId, sliceId, outputPat
|
|
|
322
400
|
if (tasks.length === 0) {
|
|
323
401
|
throw new Error(`no tasks found for ${milestoneId}/${sliceId}`);
|
|
324
402
|
}
|
|
325
|
-
|
|
403
|
+
// Layout-aware path: prefer an existing plan file's location so re-renders
|
|
404
|
+
// stay in place (legacy: milestones/MID/slices/SID/SID-PLAN.md;
|
|
405
|
+
// flat-phase: phases/NN-slug/NN-MM-PLAN.md).
|
|
406
|
+
// Pass the milestone title so the fallback flat-phase dir uses the human-readable
|
|
407
|
+
// slug ("05-milestone-five") rather than the bare ID slug ("05-m005").
|
|
408
|
+
const milestoneTitle = getMilestone(milestoneId)?.title;
|
|
409
|
+
const existingPlanPath = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
410
|
+
const defaultPlanPath = existingPlanPath ?? join(basePath, relSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle));
|
|
326
411
|
const absPath = outputPath ?? defaultPlanPath;
|
|
327
412
|
mkdirSync(dirname(absPath), { recursive: true });
|
|
328
413
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
@@ -332,12 +417,10 @@ export async function renderPlanFromDb(basePath, milestoneId, sliceId, outputPat
|
|
|
332
417
|
artifact_type: "PLAN",
|
|
333
418
|
milestone_id: milestoneId,
|
|
334
419
|
slice_id: sliceId,
|
|
335
|
-
});
|
|
420
|
+
}, basePath);
|
|
421
|
+
// Flat-phase: tasks are checkboxes inside the plan file, not separate files.
|
|
422
|
+
// No per-task render loop — task state is in the <tasks> block above.
|
|
336
423
|
const taskPlanPaths = [];
|
|
337
|
-
for (const task of tasks) {
|
|
338
|
-
const rendered = await renderTaskPlanFromDb(basePath, milestoneId, sliceId, task.id);
|
|
339
|
-
taskPlanPaths.push(rendered.taskPlanPath);
|
|
340
|
-
}
|
|
341
424
|
return { planPath: absPath, taskPlanPaths, content };
|
|
342
425
|
}
|
|
343
426
|
export async function renderTaskPlanFromDb(basePath, milestoneId, sliceId, taskId) {
|
|
@@ -345,9 +428,35 @@ export async function renderTaskPlanFromDb(basePath, milestoneId, sliceId, taskI
|
|
|
345
428
|
if (!task) {
|
|
346
429
|
throw new Error(`task ${milestoneId}/${sliceId}/${taskId} not found`);
|
|
347
430
|
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
const
|
|
431
|
+
// Flat-phase: task plans live inside the phase dir, not a tasks/ subdir.
|
|
432
|
+
// This function is legacy — tasks are now checkboxes inside the plan file.
|
|
433
|
+
const existingPlanPath = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
|
|
434
|
+
let absPath;
|
|
435
|
+
if (existingPlanPath) {
|
|
436
|
+
absPath = existingPlanPath;
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
440
|
+
if (slicePath) {
|
|
441
|
+
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
|
|
442
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
443
|
+
absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
447
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
448
|
+
const isLegacyLayout = existing
|
|
449
|
+
? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
|
|
450
|
+
: isLegacyMilestonesLayout(basePath);
|
|
451
|
+
const phaseDir = existing ?? join(isLegacyLayout ? legacyBase : milestonesDir(basePath), isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
452
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
453
|
+
const tasksDir = isLegacyLayout
|
|
454
|
+
? join(phaseDir, "slices", sliceId, "tasks")
|
|
455
|
+
: phaseDir;
|
|
456
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
457
|
+
absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
|
|
458
|
+
}
|
|
459
|
+
}
|
|
351
460
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
352
461
|
const taskGates = getGateResults(milestoneId, sliceId, "task").filter(g => g.task_id === taskId);
|
|
353
462
|
const content = task.full_plan_md.trim() ? task.full_plan_md : renderTaskPlanMarkdown(task, taskGates);
|
|
@@ -356,7 +465,7 @@ export async function renderTaskPlanFromDb(basePath, milestoneId, sliceId, taskI
|
|
|
356
465
|
milestone_id: milestoneId,
|
|
357
466
|
slice_id: sliceId,
|
|
358
467
|
task_id: taskId,
|
|
359
|
-
});
|
|
468
|
+
}, basePath);
|
|
360
469
|
return { taskPlanPath: absPath, content };
|
|
361
470
|
}
|
|
362
471
|
export async function renderRoadmapFromDb(basePath, milestoneId) {
|
|
@@ -365,13 +474,39 @@ export async function renderRoadmapFromDb(basePath, milestoneId) {
|
|
|
365
474
|
throw new Error(`milestone ${milestoneId} not found`);
|
|
366
475
|
}
|
|
367
476
|
const slices = getMilestoneSlices(milestoneId);
|
|
477
|
+
// Refuse to render a stub ROADMAP for an unplanned milestone (#852).
|
|
478
|
+
// A milestone row created by gsd_milestone_generate_id / ensureMilestoneDbRow
|
|
479
|
+
// starts with title="" / vision="" and zero slices. Rendering that produces a
|
|
480
|
+
// 38-byte stub (`# M015: M015\n\n**Vision:** \n\n## Slices`) which passes
|
|
481
|
+
// existsSync but fails the plan-milestone "zero slices" content check —
|
|
482
|
+
// trapping auto-mode in a finalize-retry loop. A real plan (written by
|
|
483
|
+
// gsd_plan_milestone via writePlanRows) always sets a non-empty vision AND at
|
|
484
|
+
// least one slice, so zero-slice + empty-vision is a reliable "never planned"
|
|
485
|
+
// signal. Skip the write so verification sees a genuinely missing file (a
|
|
486
|
+
// clear "write the ROADMAP" failure) instead of a misleading stub.
|
|
487
|
+
if (slices.length === 0 && !milestone.vision.trim()) {
|
|
488
|
+
logWarning("projection", `renderRoadmapFromDb skipped unplanned milestone ${milestoneId} (zero slices, empty vision) — refusing to write a stub ROADMAP`);
|
|
489
|
+
const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
|
|
490
|
+
if (existsSync(absPath)) {
|
|
491
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
492
|
+
unlinkSync(absPath);
|
|
493
|
+
try {
|
|
494
|
+
deleteArtifactByPath(artifactPath);
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
logWarning("renderer", `failed to remove artifact from DB: ${artifactPath}`);
|
|
498
|
+
}
|
|
499
|
+
invalidateCaches();
|
|
500
|
+
}
|
|
501
|
+
return { skipped: "unplanned-milestone" };
|
|
502
|
+
}
|
|
368
503
|
const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
|
|
369
504
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
370
505
|
const content = renderRoadmapMarkdown(milestone, slices);
|
|
371
506
|
await writeAndStore(absPath, artifactPath, content, {
|
|
372
507
|
artifact_type: "ROADMAP",
|
|
373
508
|
milestone_id: milestoneId,
|
|
374
|
-
});
|
|
509
|
+
}, basePath);
|
|
375
510
|
return { roadmapPath: absPath, content };
|
|
376
511
|
}
|
|
377
512
|
// ─── Roadmap Checkbox Rendering ───────────────────────────────────────────
|
|
@@ -391,6 +526,71 @@ export async function renderRoadmapCheckboxes(basePath, milestoneId) {
|
|
|
391
526
|
await renderRoadmapFromDb(basePath, milestoneId);
|
|
392
527
|
return true;
|
|
393
528
|
}
|
|
529
|
+
/**
|
|
530
|
+
* Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
|
|
531
|
+
* the artifacts table into the flat-phase phase directory. ROADMAP is skipped
|
|
532
|
+
* because renderRoadmapFromDb regenerates it from hierarchy rows.
|
|
533
|
+
*/
|
|
534
|
+
export async function renderMilestoneArtifactsFromDb(basePath, milestoneId) {
|
|
535
|
+
const artifacts = getMilestoneScopedArtifacts(milestoneId);
|
|
536
|
+
if (artifacts.length === 0)
|
|
537
|
+
return false;
|
|
538
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId) ??
|
|
539
|
+
join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
540
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
541
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
542
|
+
const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
|
|
543
|
+
let wrote = false;
|
|
544
|
+
for (const artifact of artifacts) {
|
|
545
|
+
if (artifact.artifact_type === "ROADMAP")
|
|
546
|
+
continue;
|
|
547
|
+
if (!artifact.full_content.trim())
|
|
548
|
+
continue;
|
|
549
|
+
const fileName = isLegacy
|
|
550
|
+
? `${milestoneId}-${artifact.artifact_type}.md`
|
|
551
|
+
: buildMilestoneFileName(milestoneId, artifact.artifact_type);
|
|
552
|
+
const absPath = join(phaseDir, fileName);
|
|
553
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
554
|
+
await writeAndStore(absPath, artifactPath, artifact.full_content, {
|
|
555
|
+
artifact_type: artifact.artifact_type,
|
|
556
|
+
milestone_id: milestoneId,
|
|
557
|
+
});
|
|
558
|
+
wrote = true;
|
|
559
|
+
}
|
|
560
|
+
return wrote;
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Slice-scoped artifacts (CONTEXT, RESEARCH, CONTINUE, etc.) must survive
|
|
564
|
+
* layout migration. PLAN is normally regenerated from task rows, but a real
|
|
565
|
+
* imported PLAN can still be replayed as a fallback; known recovery stubs are
|
|
566
|
+
* treated as missing.
|
|
567
|
+
*/
|
|
568
|
+
export async function renderSliceArtifactsFromDb(basePath, milestoneId, sliceId) {
|
|
569
|
+
const artifacts = getSliceScopedArtifacts(milestoneId, sliceId);
|
|
570
|
+
if (artifacts.length === 0)
|
|
571
|
+
return false;
|
|
572
|
+
let wrote = false;
|
|
573
|
+
for (const artifact of artifacts) {
|
|
574
|
+
const artifactType = artifact.artifact_type.toUpperCase();
|
|
575
|
+
if (!artifact.full_content.trim())
|
|
576
|
+
continue;
|
|
577
|
+
if (artifactType === "PLAN" && isAutoRecoveryPlaceholderPlan(artifact.full_content))
|
|
578
|
+
continue;
|
|
579
|
+
const absPath = join(basePath, relSliceFile(basePath, milestoneId, sliceId, artifactType));
|
|
580
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
581
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
582
|
+
await writeAndStore(absPath, artifactPath, artifact.full_content, {
|
|
583
|
+
artifact_type: artifactType,
|
|
584
|
+
milestone_id: milestoneId,
|
|
585
|
+
slice_id: sliceId,
|
|
586
|
+
}, basePath);
|
|
587
|
+
wrote = true;
|
|
588
|
+
}
|
|
589
|
+
return wrote;
|
|
590
|
+
}
|
|
591
|
+
function isAutoRecoveryPlaceholderPlan(content) {
|
|
592
|
+
return /(?:^|\n)\s*#\s*BLOCKER\b/i.test(content) && /auto-mode recovery failed/i.test(content);
|
|
593
|
+
}
|
|
394
594
|
// ─── Plan Checkbox Rendering ──────────────────────────────────────────────
|
|
395
595
|
/**
|
|
396
596
|
* Render plan checkbox states from DB.
|
|
@@ -433,7 +633,9 @@ export async function renderTaskSummary(basePath, milestoneId, sliceId, taskId)
|
|
|
433
633
|
process.stderr.write(`markdown-renderer: cannot resolve slice path for ${milestoneId}/${sliceId}\n`);
|
|
434
634
|
return false;
|
|
435
635
|
}
|
|
436
|
-
|
|
636
|
+
// Use the tasks/ subdir when it exists (legacy layout), otherwise use the
|
|
637
|
+
// slice path directly (flat-phase: task summaries live alongside plan files).
|
|
638
|
+
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
|
|
437
639
|
const fileName = buildTaskFileName(taskId, "SUMMARY");
|
|
438
640
|
const absPath = join(tasksDir, fileName);
|
|
439
641
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
@@ -442,7 +644,7 @@ export async function renderTaskSummary(basePath, milestoneId, sliceId, taskId)
|
|
|
442
644
|
milestone_id: milestoneId,
|
|
443
645
|
slice_id: sliceId,
|
|
444
646
|
task_id: taskId,
|
|
445
|
-
});
|
|
647
|
+
}, basePath);
|
|
446
648
|
return true;
|
|
447
649
|
}
|
|
448
650
|
// ─── Slice Summary Rendering ──────────────────────────────────────────────
|
|
@@ -457,34 +659,38 @@ export async function renderSliceSummary(basePath, milestoneId, sliceId) {
|
|
|
457
659
|
if (!slice) {
|
|
458
660
|
return false; // No slice data — skip silently
|
|
459
661
|
}
|
|
460
|
-
|
|
662
|
+
// Flat-phase: resolve or create the phase dir, since resolveSlicePath only
|
|
663
|
+
// finds existing dirs. In flat-phase the slice "path" is the phase dir.
|
|
664
|
+
let slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
461
665
|
if (!slicePath) {
|
|
462
|
-
|
|
463
|
-
|
|
666
|
+
const mDir = milestonesDir(basePath);
|
|
667
|
+
const dirName = canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title);
|
|
668
|
+
slicePath = join(mDir, dirName);
|
|
669
|
+
mkdirSync(slicePath, { recursive: true });
|
|
464
670
|
}
|
|
465
671
|
let wrote = false;
|
|
466
|
-
// Write SUMMARY
|
|
672
|
+
// Write SUMMARY — flat-phase: NN-MM-SUMMARY.md inside phase dir
|
|
467
673
|
if (slice.full_summary_md) {
|
|
468
|
-
const summaryName =
|
|
674
|
+
const summaryName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "SUMMARY");
|
|
469
675
|
const summaryAbs = join(slicePath, summaryName);
|
|
470
676
|
const summaryArtifact = toArtifactPath(summaryAbs, basePath);
|
|
471
677
|
await writeAndStore(summaryAbs, summaryArtifact, slice.full_summary_md, {
|
|
472
678
|
artifact_type: "SUMMARY",
|
|
473
679
|
milestone_id: milestoneId,
|
|
474
680
|
slice_id: sliceId,
|
|
475
|
-
});
|
|
681
|
+
}, basePath);
|
|
476
682
|
wrote = true;
|
|
477
683
|
}
|
|
478
|
-
// Write UAT
|
|
684
|
+
// Write UAT — flat-phase: NN-MM-UAT.md inside phase dir
|
|
479
685
|
if (slice.full_uat_md) {
|
|
480
|
-
const uatName =
|
|
686
|
+
const uatName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "UAT");
|
|
481
687
|
const uatAbs = join(slicePath, uatName);
|
|
482
688
|
const uatArtifact = toArtifactPath(uatAbs, basePath);
|
|
483
689
|
await writeAndStore(uatAbs, uatArtifact, slice.full_uat_md, {
|
|
484
690
|
artifact_type: "UAT",
|
|
485
691
|
milestone_id: milestoneId,
|
|
486
692
|
slice_id: sliceId,
|
|
487
|
-
});
|
|
693
|
+
}, basePath);
|
|
488
694
|
wrote = true;
|
|
489
695
|
}
|
|
490
696
|
return wrote;
|
|
@@ -508,9 +714,31 @@ export async function renderAllFromDb(basePath) {
|
|
|
508
714
|
catch (err) {
|
|
509
715
|
result.errors.push(`roadmap ${milestone.id}: ${err.message}`);
|
|
510
716
|
}
|
|
717
|
+
try {
|
|
718
|
+
const ok = await renderMilestoneArtifactsFromDb(basePath, milestone.id);
|
|
719
|
+
if (ok)
|
|
720
|
+
result.rendered++;
|
|
721
|
+
else
|
|
722
|
+
result.skipped++;
|
|
723
|
+
}
|
|
724
|
+
catch (err) {
|
|
725
|
+
result.errors.push(`milestone artifacts ${milestone.id}: ${err.message}`);
|
|
726
|
+
}
|
|
511
727
|
// Iterate slices
|
|
512
728
|
const slices = getMilestoneSlices(milestone.id);
|
|
513
729
|
for (const slice of slices) {
|
|
730
|
+
// Preserve slice-scoped artifacts imported from disk, including real PLAN
|
|
731
|
+
// fallback content when task rows cannot regenerate it.
|
|
732
|
+
try {
|
|
733
|
+
const ok = await renderSliceArtifactsFromDb(basePath, milestone.id, slice.id);
|
|
734
|
+
if (ok)
|
|
735
|
+
result.rendered++;
|
|
736
|
+
else
|
|
737
|
+
result.skipped++;
|
|
738
|
+
}
|
|
739
|
+
catch (err) {
|
|
740
|
+
result.errors.push(`slice artifacts ${milestone.id}/${slice.id}: ${err.message}`);
|
|
741
|
+
}
|
|
514
742
|
// Render plan checkboxes
|
|
515
743
|
try {
|
|
516
744
|
const ok = await renderPlanCheckboxes(basePath, milestone.id, slice.id);
|
|
@@ -561,6 +789,25 @@ export async function renderAllFromDb(basePath) {
|
|
|
561
789
|
catch (err) {
|
|
562
790
|
result.errors.push(`decisions: ${err.message}`);
|
|
563
791
|
}
|
|
792
|
+
// Project to .planning/ if the compat marker says it's active. Dynamic
|
|
793
|
+
// import for writePlanningDirectory avoids a static-import cycle. Gated on
|
|
794
|
+
// planning.active so the double-write cost only hits projects that use
|
|
795
|
+
// .planning/. writePlanningDirectory records per-file SHAs via
|
|
796
|
+
// applyPlanningProjectionWrites so the reconcile detector has a baseline.
|
|
797
|
+
// capturePlanningCompatIfNeeded seeds the layout and SHAs on first encounter.
|
|
798
|
+
try {
|
|
799
|
+
const { capturePlanningCompatIfNeeded } = await import("./compat/planning-compat.js");
|
|
800
|
+
await capturePlanningCompatIfNeeded(basePath);
|
|
801
|
+
const marker = readCompatMarker(basePath);
|
|
802
|
+
if (marker.planning?.active && marker.planning.layout) {
|
|
803
|
+
const { writePlanningDirectory } = await import("./migrate/planning-writer.js");
|
|
804
|
+
await writePlanningDirectory(basePath, marker.planning.layout);
|
|
805
|
+
result.rendered++;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
catch (err) {
|
|
809
|
+
result.errors.push(`planning projection: ${err.message}`);
|
|
810
|
+
}
|
|
564
811
|
return result;
|
|
565
812
|
}
|
|
566
813
|
const _projectionParseCache = new Map();
|
|
@@ -587,7 +834,17 @@ function parseProjectionByIdentity(path, parse) {
|
|
|
587
834
|
return parse(readFileSync(path, "utf-8"));
|
|
588
835
|
}
|
|
589
836
|
export function detectStaleRenders(basePath) {
|
|
590
|
-
//
|
|
837
|
+
// TODO(flat-phase): stale-render detection is temporarily fully disabled.
|
|
838
|
+
// The isLegacyMilestonesLayout gate is unreliable: git-service.ts creates
|
|
839
|
+
// milestones/<mid>/ directories for integration-branch metadata even in
|
|
840
|
+
// flat-phase projects, making the gate fire true and then producing false
|
|
841
|
+
// stale-render drift in the second reconcile cycle → ReconciliationFailedError
|
|
842
|
+
// → auto-mode blocked (exit 10) for multi-slice/remediation e2e scenarios.
|
|
843
|
+
// Re-enable after path construction is unified and the metadata dir is
|
|
844
|
+
// decoupled from the layout-detection signal.
|
|
845
|
+
return [];
|
|
846
|
+
}
|
|
847
|
+
function detectStaleRendersImpl(basePath) {
|
|
591
848
|
// per-call createRequire("./parsers-legacy") that used to live here ran on
|
|
592
849
|
// every dispatch. The static `./parsers-legacy.js` specifier resolves in
|
|
593
850
|
// both packaged (.js) and source (.ts via the strip-types loader) contexts —
|
|
@@ -596,86 +853,94 @@ export function detectStaleRenders(basePath) {
|
|
|
596
853
|
const milestones = getAllMilestones();
|
|
597
854
|
for (const milestone of milestones) {
|
|
598
855
|
const slices = getMilestoneSlices(milestone.id);
|
|
856
|
+
const isFlatPhase = isMilestoneFlatPhaseLayout(basePath, milestone.id);
|
|
599
857
|
// ── Check roadmap checkbox state ──────────────────────────────────
|
|
858
|
+
// TODO(flat-phase): roadmap checkbox parsing may not match flat-phase
|
|
859
|
+
// roadmap format, causing false-positive drift loops. Skip during transition.
|
|
860
|
+
/*
|
|
600
861
|
const roadmapPath = resolveRoadmapProjectionPath(basePath, milestone.id);
|
|
601
862
|
if (existsSync(roadmapPath)) {
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
catch (e) {
|
|
624
|
-
logWarning("renderer", `roadmap parse failed: ${e.message}`);
|
|
863
|
+
try {
|
|
864
|
+
const parsed = parseProjectionByIdentity(roadmapPath, parseRoadmap) as ReturnType<typeof parseRoadmap>;
|
|
865
|
+
|
|
866
|
+
for (const slice of slices) {
|
|
867
|
+
const isCompleteInDb = isClosedStatus(slice.status);
|
|
868
|
+
const roadmapSlice = parsed.slices.find((s: { id: string }) => s.id === slice.id);
|
|
869
|
+
if (!roadmapSlice) continue;
|
|
870
|
+
|
|
871
|
+
if (isCompleteInDb && !roadmapSlice!.done) {
|
|
872
|
+
stale.push({
|
|
873
|
+
path: roadmapPath,
|
|
874
|
+
reason: `${slice.id} is closed in DB but unchecked in roadmap`,
|
|
875
|
+
});
|
|
876
|
+
} else if (!isCompleteInDb && roadmapSlice!.done) {
|
|
877
|
+
stale.push({
|
|
878
|
+
path: roadmapPath,
|
|
879
|
+
reason: `${slice.id} is not closed in DB but checked in roadmap`,
|
|
880
|
+
});
|
|
881
|
+
}
|
|
625
882
|
}
|
|
883
|
+
} catch (e) {
|
|
884
|
+
logWarning("renderer", `roadmap parse failed: ${(e as Error).message}`);
|
|
885
|
+
}
|
|
626
886
|
}
|
|
887
|
+
*/
|
|
627
888
|
// ── Check plan checkbox state and summaries for each slice ────────
|
|
628
889
|
for (const slice of slices) {
|
|
629
890
|
const tasks = getSliceTasks(milestone.id, slice.id);
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
const
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
891
|
+
if (!isFlatPhase) {
|
|
892
|
+
// Check plan checkboxes
|
|
893
|
+
const planPath = resolveSliceFile(basePath, milestone.id, slice.id, "PLAN");
|
|
894
|
+
if (planPath && existsSync(planPath)) {
|
|
895
|
+
try {
|
|
896
|
+
const parsed = parseProjectionByIdentity(planPath, parsePlan);
|
|
897
|
+
for (const task of tasks) {
|
|
898
|
+
const isDoneInDb = isClosedStatus(task.status);
|
|
899
|
+
const planTask = parsed.tasks.find((t) => t.id === task.id);
|
|
900
|
+
if (!planTask) {
|
|
901
|
+
// DB has a task the plan markdown lacks: the projection is
|
|
902
|
+
// lossy (e.g. tasks added after the PLAN artifact was first
|
|
903
|
+
// written). Flag it so the plan is re-rendered from DB rows.
|
|
904
|
+
stale.push({
|
|
905
|
+
path: planPath,
|
|
906
|
+
reason: `${task.id} exists in DB but is missing in plan`,
|
|
907
|
+
});
|
|
908
|
+
continue;
|
|
909
|
+
}
|
|
910
|
+
if (isDoneInDb && !planTask.done) {
|
|
911
|
+
stale.push({
|
|
912
|
+
path: planPath,
|
|
913
|
+
reason: `${task.id} is done in DB but unchecked in plan`,
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
else if (!isDoneInDb && planTask.done) {
|
|
917
|
+
stale.push({
|
|
918
|
+
path: planPath,
|
|
919
|
+
reason: `${task.id} is not done in DB but checked in plan`,
|
|
920
|
+
});
|
|
921
|
+
}
|
|
659
922
|
}
|
|
660
923
|
}
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
924
|
+
catch (e) {
|
|
925
|
+
logWarning("renderer", `plan parse failed: ${e.message}`);
|
|
926
|
+
}
|
|
664
927
|
}
|
|
665
928
|
}
|
|
666
|
-
// Check missing task summary files
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
if (
|
|
671
|
-
const
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
929
|
+
// Check missing task summary files (legacy layout only — flat-phase keeps
|
|
930
|
+
// task state in plan <tasks> blocks and does not project Txx-SUMMARY.md)
|
|
931
|
+
if (!isFlatPhase) {
|
|
932
|
+
for (const task of tasks) {
|
|
933
|
+
if (isClosedStatus(task.status) && task.full_summary_md) {
|
|
934
|
+
const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
|
|
935
|
+
if (slicePath) {
|
|
936
|
+
const fileName = buildTaskFileName(task.id, "SUMMARY");
|
|
937
|
+
const summaryAbsPath = join(slicePath, fileName);
|
|
938
|
+
if (!existsSync(summaryAbsPath)) {
|
|
939
|
+
stale.push({
|
|
940
|
+
path: summaryAbsPath,
|
|
941
|
+
reason: `${task.id} is complete with summary in DB but SUMMARY.md missing on disk`,
|
|
942
|
+
});
|
|
943
|
+
}
|
|
679
944
|
}
|
|
680
945
|
}
|
|
681
946
|
}
|
|
@@ -683,10 +948,14 @@ export function detectStaleRenders(basePath) {
|
|
|
683
948
|
// Check missing slice summary/UAT files
|
|
684
949
|
const sliceRow = getSlice(milestone.id, slice.id);
|
|
685
950
|
if (sliceRow && sliceRow.status === "complete") {
|
|
951
|
+
// Use the SAME path construction as renderSliceSummary (planFileName format)
|
|
952
|
+
// so the detector and repair always agree on the file location.
|
|
686
953
|
const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
|
|
687
954
|
if (slicePath) {
|
|
955
|
+
const phaseNum = milestoneIdToPhaseNum(milestone.id);
|
|
956
|
+
const planNum = sliceIdToPlanNum(slice.id);
|
|
688
957
|
if (sliceRow.full_summary_md) {
|
|
689
|
-
const summaryName =
|
|
958
|
+
const summaryName = planFileName(phaseNum, planNum, "SUMMARY");
|
|
690
959
|
const summaryAbsPath = join(slicePath, summaryName);
|
|
691
960
|
if (!existsSync(summaryAbsPath)) {
|
|
692
961
|
stale.push({
|
|
@@ -696,7 +965,7 @@ export function detectStaleRenders(basePath) {
|
|
|
696
965
|
}
|
|
697
966
|
}
|
|
698
967
|
if (sliceRow.full_uat_md) {
|
|
699
|
-
const uatName =
|
|
968
|
+
const uatName = planFileName(phaseNum, planNum, "UAT");
|
|
700
969
|
const uatAbsPath = join(slicePath, uatName);
|
|
701
970
|
if (!existsSync(uatAbsPath)) {
|
|
702
971
|
stale.push({
|
|
@@ -728,9 +997,12 @@ export function roadmapRenderMarksSliceDone(roadmapContent, sliceId) {
|
|
|
728
997
|
return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
|
|
729
998
|
}
|
|
730
999
|
export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanData) {
|
|
1000
|
+
// Flat-phase: replan file lives in the phase dir
|
|
731
1001
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
|
|
732
|
-
?? join(
|
|
733
|
-
const
|
|
1002
|
+
?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
1003
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
1004
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
1005
|
+
const absPath = join(slicePath, planFileName(phaseNum, planNum, "REPLAN"));
|
|
734
1006
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
735
1007
|
const lines = [];
|
|
736
1008
|
lines.push(`# ${sliceId} Replan`);
|
|
@@ -753,13 +1025,16 @@ export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanD
|
|
|
753
1025
|
artifact_type: "REPLAN",
|
|
754
1026
|
milestone_id: milestoneId,
|
|
755
1027
|
slice_id: sliceId,
|
|
756
|
-
});
|
|
1028
|
+
}, basePath);
|
|
757
1029
|
return { replanPath: absPath, content };
|
|
758
1030
|
}
|
|
759
1031
|
export async function renderAssessmentFromDb(basePath, milestoneId, sliceId, assessmentData) {
|
|
1032
|
+
// Flat-phase: assessment file lives in the phase dir
|
|
760
1033
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
|
|
761
|
-
?? join(
|
|
762
|
-
const
|
|
1034
|
+
?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
1035
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
1036
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
1037
|
+
const absPath = join(slicePath, planFileName(phaseNum, planNum, "ASSESSMENT"));
|
|
763
1038
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
764
1039
|
const lines = [];
|
|
765
1040
|
lines.push(`# ${sliceId} Assessment`);
|
|
@@ -781,6 +1056,6 @@ export async function renderAssessmentFromDb(basePath, milestoneId, sliceId, ass
|
|
|
781
1056
|
artifact_type: "ASSESSMENT",
|
|
782
1057
|
milestone_id: milestoneId,
|
|
783
1058
|
slice_id: sliceId,
|
|
784
|
-
});
|
|
1059
|
+
}, basePath);
|
|
785
1060
|
return { assessmentPath: absPath, content };
|
|
786
1061
|
}
|