@opengsd/gsd-pi 1.3.0 → 1.4.0-dev.c18009cd
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 +11 -11
- package/dist/cli.js +32 -4
- package/dist/headless-answers.js +1 -1
- package/dist/headless-context.js +0 -1
- package/dist/headless-ui.d.ts +1 -1
- package/dist/headless-ui.js +1 -1
- package/dist/headless.js +1 -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 +11 -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 +35 -40
- package/dist/resources/extensions/claude-code-cli/index.js +7 -1
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +202 -75
- package/dist/resources/extensions/cursor-cli/index.js +16 -0
- package/dist/resources/extensions/cursor-cli/models.js +63 -0
- package/dist/resources/extensions/cursor-cli/package.json +11 -0
- package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
- package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
- package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
- package/dist/resources/extensions/gsd/activity-log.js +4 -1
- package/dist/resources/extensions/gsd/artifact-verification.js +443 -0
- package/dist/resources/extensions/gsd/auto/closeout.js +45 -42
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
- package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
- package/dist/resources/extensions/gsd/auto/loop.js +67 -2
- package/dist/resources/extensions/gsd/auto/orchestrator.js +29 -11
- package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
- package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +108 -19
- package/dist/resources/extensions/gsd/auto-budget.js +5 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +77 -32
- package/dist/resources/extensions/gsd/auto-model-selection.js +43 -22
- package/dist/resources/extensions/gsd/auto-post-unit.js +28 -22
- package/dist/resources/extensions/gsd/auto-prompts.js +144 -45
- package/dist/resources/extensions/gsd/auto-recovery.js +14 -483
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -5
- package/dist/resources/extensions/gsd/auto-start.js +60 -33
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -3
- package/dist/resources/extensions/gsd/auto-verification.js +10 -4
- package/dist/resources/extensions/gsd/auto-worktree.js +155 -102
- package/dist/resources/extensions/gsd/auto.js +63 -18
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +141 -65
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -5
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +23 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +227 -28
- package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +190 -43
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +104 -10
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +87 -17
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +95 -5
- package/dist/resources/extensions/gsd/codebase-generator.js +160 -25
- 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/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +70 -4
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +225 -1
- package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
- package/dist/resources/extensions/gsd/commands-context.js +19 -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 +176 -13
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
- package/dist/resources/extensions/gsd/commands-worktree.js +23 -12
- 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 +2 -2
- 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 +71 -6
- package/dist/resources/extensions/gsd/db/engine.js +31 -1
- package/dist/resources/extensions/gsd/db/queries.js +153 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
- package/dist/resources/extensions/gsd/db-workspace.js +68 -4
- package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +17 -8
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -4
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +387 -7
- package/dist/resources/extensions/gsd/doctor-git-checks.js +25 -3
- package/dist/resources/extensions/gsd/doctor-providers.js +130 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -15
- package/dist/resources/extensions/gsd/doctor.js +121 -10
- package/dist/resources/extensions/gsd/error-classifier.js +13 -1
- package/dist/resources/extensions/gsd/escalation.js +11 -4
- package/dist/resources/extensions/gsd/exec-sandbox.js +59 -13
- 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 +272 -0
- package/dist/resources/extensions/gsd/forensics.js +4 -33
- package/dist/resources/extensions/gsd/git-service.js +72 -16
- package/dist/resources/extensions/gsd/gitignore.js +10 -3
- package/dist/resources/extensions/gsd/gsd-db.js +52 -0
- package/dist/resources/extensions/gsd/guidance.js +8 -7
- package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
- package/dist/resources/extensions/gsd/guided-flow.js +50 -7
- package/dist/resources/extensions/gsd/health-widget.js +55 -29
- package/dist/resources/extensions/gsd/json-persistence.js +20 -0
- package/dist/resources/extensions/gsd/key-manager.js +1 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
- package/dist/resources/extensions/gsd/layout-policy.js +77 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +420 -129
- 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/memory-backfill.js +28 -21
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
- package/dist/resources/extensions/gsd/metrics.js +22 -14
- 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 +83 -12
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -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 +79 -18
- package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +3 -3
- 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/orphan-stash-audit.js +92 -16
- 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-diagnostics.js +24 -1
- package/dist/resources/extensions/gsd/preferences-models.js +25 -11
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
- package/dist/resources/extensions/gsd/preferences.js +91 -15
- 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 +39 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +21 -16
- 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/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-milestone.md +2 -2
- 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/plan-slice.md +5 -3
- 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/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/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/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/queue-order.js +3 -2
- package/dist/resources/extensions/gsd/quick.js +45 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
- package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
- package/dist/resources/extensions/gsd/repo-identity.js +16 -0
- package/dist/resources/extensions/gsd/repository-registry.js +6 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +11 -3
- package/dist/resources/extensions/gsd/safe-fs.js +23 -2
- package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/service-tier.js +2 -1
- package/dist/resources/extensions/gsd/session-forensics.js +11 -1
- package/dist/resources/extensions/gsd/session-lock.js +7 -6
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +10 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +52 -0
- package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
- package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
- package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
- package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
- package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +38 -4
- 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 +138 -19
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +84 -26
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +34 -18
- package/dist/resources/extensions/gsd/state.js +13 -581
- 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 +8 -4
- package/dist/resources/extensions/gsd/tools/complete-slice.js +14 -4
- package/dist/resources/extensions/gsd/tools/complete-task.js +58 -15
- package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +60 -47
- package/dist/resources/extensions/gsd/tools/plan-task.js +115 -9
- 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 +84 -5
- package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
- package/dist/resources/extensions/gsd/undo.js +51 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
- package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
- package/dist/resources/extensions/gsd/unit-registry.js +90 -11
- package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +91 -5
- package/dist/resources/extensions/gsd/validation-block-guard.js +54 -4
- package/dist/resources/extensions/gsd/verification-gate.js +7 -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-manifest.js +126 -13
- package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +44 -18
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
- package/dist/resources/extensions/gsd/workspace.js +26 -8
- 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-lifecycle.js +67 -5
- package/dist/resources/extensions/gsd/worktree-manager.js +155 -20
- package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
- package/dist/resources/extensions/mcp-client/manager.js +3 -3
- 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 +13 -13
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- 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/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- 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/middleware.js +3 -3
- 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/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.d0d9e0a955e441cb.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/8785.e29b3134cab1d153.js +1 -0
- package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
- 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/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.d.ts +3 -1
- package/dist/web-mode.js +7 -5
- package/dist/wizard.d.ts +8 -0
- package/dist/wizard.js +8 -1
- package/integrations/hermes/CONTEXT.md +47 -0
- package/integrations/hermes/README.md +69 -0
- package/integrations/hermes/__init__.py +31 -0
- package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
- package/integrations/hermes/docs/setup.md +276 -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 +327 -0
- package/integrations/hermes/open_gsd_hermes/config.py +61 -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 +832 -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 +80 -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 +42 -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 +42 -0
- package/integrations/hermes/tests/test_cron.py +34 -0
- package/integrations/hermes/tests/test_directory_loader.py +37 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +123 -0
- package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
- package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
- package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
- package/integrations/hermes/tests/test_memory.py +59 -0
- package/integrations/hermes/tests/test_milestone_client.py +447 -0
- package/integrations/hermes/tests/test_new_milestone_command.py +313 -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 +621 -0
- package/package.json +9 -8
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
- 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/dist/workflow.d.ts +1 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +2 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-runtime.js +25 -1
- package/packages/daemon/dist/cloud-runtime.js.map +1 -1
- package/packages/daemon/dist/cloud-runtime.test.js +51 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
- package/packages/daemon/dist/message-batcher.d.ts +7 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
- package/packages/daemon/dist/message-batcher.js +13 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -1
- package/packages/daemon/dist/message-batcher.test.js +48 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -1
- package/packages/daemon/dist/session-manager.js +1 -1
- package/packages/daemon/dist/session-manager.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +3 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts +2 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +2 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
- package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
- package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -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 +25 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
- 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 -829
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +259 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -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 +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-ui-state.d.ts +54 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
- 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 +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +24 -6
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.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 +18 -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 +11 -1
- 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 +45 -3
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +128 -8
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +35 -21
- package/packages/mcp-server/dist/workflow-tools.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 +3 -2
- 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/dist/env-api-keys.d.ts.map +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +3 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +46 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +38 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -2
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +3 -2
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +136 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +25 -459
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/dist/rpc-client.js +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme-schema.d.ts +75 -75
- package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/theme/theme-schema.js +1 -1
- package/pkg/dist/theme/theme-schema.js.map +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +11 -7
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/link-workspace-packages.cjs +14 -4
- package/src/resources/GSD-WORKFLOW.md +35 -40
- package/src/resources/extensions/claude-code-cli/index.ts +8 -1
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +233 -73
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +61 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +633 -49
- package/src/resources/extensions/cursor-cli/index.ts +18 -0
- package/src/resources/extensions/cursor-cli/models.ts +65 -0
- package/src/resources/extensions/cursor-cli/package.json +11 -0
- package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
- package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
- package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
- package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
- package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
- package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
- package/src/resources/extensions/gsd/activity-log.ts +4 -1
- package/src/resources/extensions/gsd/artifact-verification.ts +480 -0
- package/src/resources/extensions/gsd/auto/closeout.ts +54 -56
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
- package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +69 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +39 -14
- package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
- package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +129 -20
- package/src/resources/extensions/gsd/auto-budget.ts +12 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +85 -39
- package/src/resources/extensions/gsd/auto-model-selection.ts +56 -18
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -23
- package/src/resources/extensions/gsd/auto-prompts.ts +153 -45
- package/src/resources/extensions/gsd/auto-recovery.ts +21 -484
- package/src/resources/extensions/gsd/auto-runtime-state.ts +17 -5
- package/src/resources/extensions/gsd/auto-start.ts +67 -37
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +7 -2
- package/src/resources/extensions/gsd/auto-verification.ts +10 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +98 -26
- package/src/resources/extensions/gsd/auto.ts +68 -14
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +164 -71
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +14 -5
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +263 -28
- package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +219 -46
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +114 -10
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +109 -19
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +109 -4
- package/src/resources/extensions/gsd/codebase-generator.ts +183 -25
- 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/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +70 -3
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +225 -1
- package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
- package/src/resources/extensions/gsd/commands-context.ts +18 -1
- 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 +156 -11
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
- package/src/resources/extensions/gsd/commands-worktree.ts +25 -12
- 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 +3 -1
- 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 +73 -7
- package/src/resources/extensions/gsd/db/engine.ts +34 -1
- package/src/resources/extensions/gsd/db/queries.ts +197 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
- package/src/resources/extensions/gsd/db-workspace.ts +76 -3
- package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +19 -7
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -4
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +486 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +24 -2
- package/src/resources/extensions/gsd/doctor-providers.ts +142 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -15
- package/src/resources/extensions/gsd/doctor-types.ts +9 -1
- package/src/resources/extensions/gsd/doctor.ts +125 -10
- package/src/resources/extensions/gsd/error-classifier.ts +14 -1
- package/src/resources/extensions/gsd/escalation.ts +9 -4
- package/src/resources/extensions/gsd/exec-sandbox.ts +62 -13
- 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 +325 -0
- package/src/resources/extensions/gsd/forensics.ts +4 -34
- package/src/resources/extensions/gsd/git-constants.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +82 -16
- package/src/resources/extensions/gsd/gitignore.ts +11 -4
- package/src/resources/extensions/gsd/gsd-db.ts +72 -0
- package/src/resources/extensions/gsd/guidance.ts +9 -7
- package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
- package/src/resources/extensions/gsd/guided-flow.ts +56 -8
- package/src/resources/extensions/gsd/health-widget.ts +69 -32
- package/src/resources/extensions/gsd/json-persistence.ts +20 -0
- package/src/resources/extensions/gsd/key-manager.ts +1 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
- package/src/resources/extensions/gsd/layout-policy.ts +86 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +434 -119
- 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/memory-backfill.ts +26 -20
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
- package/src/resources/extensions/gsd/metrics.ts +26 -13
- 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 +78 -12
- package/src/resources/extensions/gsd/migration-auto-check.ts +27 -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 +78 -19
- package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +4 -4
- 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 +102 -23
- 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/orphan-stash-audit.ts +108 -20
- 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-diagnostics.ts +24 -0
- package/src/resources/extensions/gsd/preferences-models.ts +28 -9
- package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
- package/src/resources/extensions/gsd/preferences.ts +116 -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 +39 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +21 -16
- 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/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-milestone.md +2 -2
- 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/plan-slice.md +5 -3
- 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/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/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/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/queue-order.ts +3 -2
- package/src/resources/extensions/gsd/quick.ts +43 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
- package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
- package/src/resources/extensions/gsd/repo-identity.ts +17 -0
- package/src/resources/extensions/gsd/repository-registry.ts +7 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +16 -3
- package/src/resources/extensions/gsd/safe-fs.ts +22 -2
- package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/service-tier.ts +2 -0
- package/src/resources/extensions/gsd/session-forensics.ts +11 -1
- package/src/resources/extensions/gsd/session-lock.ts +7 -6
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +10 -9
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +52 -0
- package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
- package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
- package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
- package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
- package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +35 -4
- 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 +176 -30
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +86 -27
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +45 -18
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
- package/src/resources/extensions/gsd/state.ts +37 -695
- 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/artifact-retry-cap.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +420 -2
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +235 -5
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +15 -12
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
- 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 +182 -4
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +200 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +377 -8
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
- 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 +863 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
- 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-excerpt.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +18 -7
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +82 -7
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -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/destructive-guard.test.ts +44 -0
- 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-history.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +175 -43
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +245 -1
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +631 -2
- package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
- 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/exec-graceful-kill.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
- 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-change-validator.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +186 -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 +87 -19
- package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- 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/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
- 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/integration/queue-active-milestone-context-budget.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +386 -0
- package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -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 +336 -82
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +152 -22
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +204 -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/observability-validator-boundary.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
- 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/parallel-research-dispatch.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
- 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-prompt.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +161 -27
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +311 -5
- 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/post-mutation-hook.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/preferences.test.ts +197 -1
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +196 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +23 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -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/recovery-verify-logs.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +166 -4
- package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +50 -9
- package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
- 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/stalled-tool-recovery.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +329 -57
- package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
- 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/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +271 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
- 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/undo.test.ts +113 -37
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +212 -11
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +162 -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 +130 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +156 -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-manifest.test.ts +96 -15
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +42 -12
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +278 -14
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
- package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
- 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 +7 -9
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +68 -16
- package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
- package/src/resources/extensions/gsd/tools/plan-slice.ts +61 -50
- package/src/resources/extensions/gsd/tools/plan-task.ts +148 -9
- 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 +101 -4
- package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
- package/src/resources/extensions/gsd/undo.ts +55 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
- package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
- package/src/resources/extensions/gsd/unit-registry.ts +97 -11
- package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +101 -6
- package/src/resources/extensions/gsd/validation-block-guard.ts +59 -7
- package/src/resources/extensions/gsd/verification-gate.ts +8 -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-manifest.ts +141 -7
- package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +44 -18
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
- package/src/resources/extensions/gsd/workspace.ts +42 -8
- 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-lifecycle.ts +135 -11
- package/src/resources/extensions/gsd/worktree-manager.ts +214 -20
- package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
- package/src/resources/extensions/mcp-client/manager.ts +3 -3
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-a48b7c48333b31c8.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-f0285ce91d4ec9ef.js +0 -1
- /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → L2UMqXELiDH3oz-7yguXp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → L2UMqXELiDH3oz-7yguXp}/_ssgManifest.js +0 -0
|
@@ -9,19 +9,24 @@
|
|
|
9
9
|
// Critical invariant: rendered markdown must round-trip through
|
|
10
10
|
// parseRoadmap(), parsePlan(), parseSummary() in files.ts.
|
|
11
11
|
|
|
12
|
-
import { readFileSync, existsSync, mkdirSync, statSync } from "node:fs";
|
|
12
|
+
import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:fs";
|
|
13
13
|
import { logWarning } from "./workflow-logger.js";
|
|
14
14
|
import { isClosedStatus } from "./status-guards.js";
|
|
15
15
|
import { dirname, join, relative } from "node:path";
|
|
16
16
|
import {
|
|
17
17
|
getAllMilestones,
|
|
18
18
|
getMilestone,
|
|
19
|
+
getMilestoneScopedArtifacts,
|
|
20
|
+
getSliceScopedArtifacts,
|
|
19
21
|
getMilestoneSlices,
|
|
20
22
|
getSliceTasks,
|
|
23
|
+
getTasksBySliceIds,
|
|
21
24
|
getTask,
|
|
22
25
|
getSlice,
|
|
23
26
|
insertArtifact,
|
|
27
|
+
deleteArtifactByPath,
|
|
24
28
|
getGateResults,
|
|
29
|
+
isDbAvailable,
|
|
25
30
|
} from "./gsd-db.js";
|
|
26
31
|
import type { MilestoneRow, ArtifactRow } from "./db-milestone-artifact-rows.js";
|
|
27
32
|
import type { SliceRow, TaskRow } from "./db-task-slice-rows.js";
|
|
@@ -31,6 +36,8 @@ import {
|
|
|
31
36
|
resolveFile,
|
|
32
37
|
resolveSliceFile,
|
|
33
38
|
resolveSlicePath,
|
|
39
|
+
resolveTaskFile,
|
|
40
|
+
resolveTasksDir,
|
|
34
41
|
gsdProjectionRoot,
|
|
35
42
|
gsdRoot,
|
|
36
43
|
buildMilestoneFileName,
|
|
@@ -40,8 +47,60 @@ import {
|
|
|
40
47
|
import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
|
|
41
48
|
import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
|
|
42
49
|
import { invalidateStateCache } from "./state.js";
|
|
43
|
-
import { clearPathCache } from "./paths.js";
|
|
50
|
+
import { clearPathCache, milestonesDir, legacyMilestonesDir, isLegacyMilestonesLayout, resolveMilestonePath, relSliceFile, canonicalPhaseDirName } from "./paths.js";
|
|
51
|
+
import { readCompatMarker, writeCompatMarker, computeProjectionSha } from "./compat/compat-marker.js";
|
|
44
52
|
import type { RiskLevel } from "./types.js";
|
|
53
|
+
import {
|
|
54
|
+
phaseDirName,
|
|
55
|
+
planFileName,
|
|
56
|
+
milestoneIdToPhaseNum,
|
|
57
|
+
sliceIdToPlanNum,
|
|
58
|
+
derivePhaseSlug,
|
|
59
|
+
} from "./layout-policy.js";
|
|
60
|
+
|
|
61
|
+
// ─── Compat marker invalidation ───────────────────────────────────────────
|
|
62
|
+
// Every successful projection write pushes its (basePath, projectionPath,
|
|
63
|
+
// entities) here; invalidateCaches() drains it and refreshes .gsd/.compat.json
|
|
64
|
+
// so the next reconcile pass sees gsd-pi's own writes as expected. This is the
|
|
65
|
+
// feedback-loop-prevention mechanism for cross-tool compatibility.
|
|
66
|
+
const _pendingProjectionWrites: Array<{ basePath: string; projectionPath: string; entities: string[] }> = [];
|
|
67
|
+
|
|
68
|
+
function recordProjectionWrite(basePath: string, projectionPath: string, entities: string[]): void {
|
|
69
|
+
_pendingProjectionWrites.push({ basePath, projectionPath, entities });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function flushProjectionWritesToMarker(): void {
|
|
73
|
+
if (_pendingProjectionWrites.length === 0) return;
|
|
74
|
+
// Group by basePath (defensive — multiple projects are unusual but possible).
|
|
75
|
+
const byBase = new Map<string, Map<string, string[]>>();
|
|
76
|
+
for (const w of _pendingProjectionWrites) {
|
|
77
|
+
let bucket = byBase.get(w.basePath);
|
|
78
|
+
if (!bucket) { bucket = new Map(); byBase.set(w.basePath, bucket); }
|
|
79
|
+
bucket.set(w.projectionPath, w.entities);
|
|
80
|
+
}
|
|
81
|
+
_pendingProjectionWrites.length = 0;
|
|
82
|
+
|
|
83
|
+
for (const [basePath, writes] of byBase) {
|
|
84
|
+
try {
|
|
85
|
+
const marker = readCompatMarker(basePath);
|
|
86
|
+
for (const [projectionPath, entities] of writes) {
|
|
87
|
+
const abs = join(basePath, ".gsd", projectionPath);
|
|
88
|
+
if (existsSync(abs)) {
|
|
89
|
+
marker.projections[projectionPath] = {
|
|
90
|
+
sha: computeProjectionSha(readFileSync(abs, "utf-8")),
|
|
91
|
+
entities,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
marker.lastWriter = "gsd-pi";
|
|
96
|
+
marker.lastProjectedAt = new Date().toISOString();
|
|
97
|
+
writeCompatMarker(basePath, marker);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
// Marker I/O must never break projection. Reconcile will heal on next run.
|
|
100
|
+
logWarning("renderer", `compat marker flush failed: ${(e as Error).message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
45
104
|
|
|
46
105
|
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
47
106
|
|
|
@@ -64,6 +123,7 @@ function toArtifactPath(absPath: string, basePath: string): string {
|
|
|
64
123
|
* Invalidate all caches after a disk write.
|
|
65
124
|
*/
|
|
66
125
|
function invalidateCaches(): void {
|
|
126
|
+
flushProjectionWritesToMarker();
|
|
67
127
|
invalidateStateCache();
|
|
68
128
|
clearPathCache();
|
|
69
129
|
clearParseCache();
|
|
@@ -77,6 +137,12 @@ function meaningfulSection(value: string | null | undefined): string {
|
|
|
77
137
|
return trimmed;
|
|
78
138
|
}
|
|
79
139
|
|
|
140
|
+
function renderGateFindings(gate: GateRow): string {
|
|
141
|
+
const findings = gate.findings.trim() || `- **Verdict:** ${gate.verdict}\n- **Rationale:** ${gate.rationale}`;
|
|
142
|
+
if (gate.verdict !== "flag") return findings;
|
|
143
|
+
return `> **Warning:** Verdict: flag - concerns recorded below\n\n${findings}`;
|
|
144
|
+
}
|
|
145
|
+
|
|
80
146
|
function pushIndented(lines: string[], value: string, indent = " "): void {
|
|
81
147
|
for (const line of value.split("\n")) {
|
|
82
148
|
lines.push(`${indent}${line}`);
|
|
@@ -87,7 +153,9 @@ function taskSummaryForSlicePlan(description: string): string {
|
|
|
87
153
|
const meaningful = meaningfulSection(description);
|
|
88
154
|
if (!meaningful) return "";
|
|
89
155
|
|
|
90
|
-
|
|
156
|
+
// Strip XML tags (flat-phase <tasks> format) so they don't leak into summaries
|
|
157
|
+
const cleaned = meaningful.replace(/<\/?tasks>/g, "").trim();
|
|
158
|
+
const beforeHeading = cleaned.split(/\n#{1,6}\s+/)[0]?.trim() ?? "";
|
|
91
159
|
const firstBlock = beforeHeading.split(/\n\s*\n/)[0]?.trim() ?? "";
|
|
92
160
|
return firstBlock || beforeHeading;
|
|
93
161
|
}
|
|
@@ -109,12 +177,28 @@ function sanitizeInlineRoadmapText(value: string | null | undefined): string {
|
|
|
109
177
|
}
|
|
110
178
|
|
|
111
179
|
function resolveRoadmapProjectionPath(basePath: string, milestoneId: string): string {
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
180
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
181
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
182
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
183
|
+
const isLegacyLayout = existing
|
|
184
|
+
? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
|
|
185
|
+
: isLegacyMilestonesLayout(basePath);
|
|
186
|
+
const phaseDir = existing ?? join(
|
|
187
|
+
isLegacyLayout ? legacyBase : milestonesDir(basePath),
|
|
188
|
+
isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
|
|
189
|
+
);
|
|
190
|
+
const roadmapFileName = isLegacyLayout
|
|
191
|
+
? `${milestoneId}-ROADMAP.md`
|
|
192
|
+
: `${String(phaseNum).padStart(2, "0")}-ROADMAP.md`;
|
|
193
|
+
return join(phaseDir, roadmapFileName);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function isMilestoneFlatPhaseLayout(basePath: string, milestoneId: string): boolean {
|
|
197
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
198
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
199
|
+
return existing
|
|
200
|
+
? !(existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\"))
|
|
201
|
+
: !isLegacyMilestonesLayout(basePath);
|
|
118
202
|
}
|
|
119
203
|
|
|
120
204
|
/**
|
|
@@ -130,6 +214,7 @@ async function writeAndStore(
|
|
|
130
214
|
slice_id?: string;
|
|
131
215
|
task_id?: string;
|
|
132
216
|
},
|
|
217
|
+
basePath?: string,
|
|
133
218
|
): Promise<void> {
|
|
134
219
|
await saveFile(absPath, content);
|
|
135
220
|
|
|
@@ -147,6 +232,17 @@ async function writeAndStore(
|
|
|
147
232
|
logWarning("renderer", `failed to update artifact in DB: ${artifactPath}`);
|
|
148
233
|
}
|
|
149
234
|
|
|
235
|
+
// Record the projection write so invalidateCaches() can refresh the compat
|
|
236
|
+
// marker. basePath is optional only to avoid forcing every caller; when
|
|
237
|
+
// present, the marker gets updated. artifactPath is already .gsd/-relative.
|
|
238
|
+
if (basePath) {
|
|
239
|
+
const entities: string[] = [];
|
|
240
|
+
if (opts.milestone_id) entities.push(opts.milestone_id);
|
|
241
|
+
if (opts.milestone_id && opts.slice_id) entities.push(`${opts.milestone_id}/${opts.slice_id}`);
|
|
242
|
+
if (opts.milestone_id && opts.slice_id && opts.task_id) entities.push(`${opts.milestone_id}/${opts.slice_id}/${opts.task_id}`);
|
|
243
|
+
recordProjectionWrite(basePath, artifactPath, entities);
|
|
244
|
+
}
|
|
245
|
+
|
|
150
246
|
invalidateCaches();
|
|
151
247
|
}
|
|
152
248
|
|
|
@@ -267,7 +363,7 @@ function renderTaskPlanMarkdown(task: TaskRow, taskGates: GateRow[] = []): strin
|
|
|
267
363
|
if (gate && gate.verdict !== "omitted") {
|
|
268
364
|
lines.push(`## ${label}`);
|
|
269
365
|
lines.push("");
|
|
270
|
-
lines.push(
|
|
366
|
+
lines.push(renderGateFindings(gate));
|
|
271
367
|
lines.push("");
|
|
272
368
|
}
|
|
273
369
|
}
|
|
@@ -301,7 +397,7 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
|
|
|
301
397
|
if (q3 && q3.verdict !== "omitted") {
|
|
302
398
|
lines.push("## Threat Surface");
|
|
303
399
|
lines.push("");
|
|
304
|
-
lines.push(
|
|
400
|
+
lines.push(renderGateFindings(q3));
|
|
305
401
|
lines.push("");
|
|
306
402
|
}
|
|
307
403
|
|
|
@@ -309,7 +405,7 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
|
|
|
309
405
|
if (q4 && q4.verdict !== "omitted") {
|
|
310
406
|
lines.push("## Requirement Impact");
|
|
311
407
|
lines.push("");
|
|
312
|
-
lines.push(
|
|
408
|
+
lines.push(renderGateFindings(q4));
|
|
313
409
|
lines.push("");
|
|
314
410
|
}
|
|
315
411
|
|
|
@@ -345,12 +441,14 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
|
|
|
345
441
|
}
|
|
346
442
|
lines.push("");
|
|
347
443
|
|
|
348
|
-
|
|
349
|
-
|
|
444
|
+
// Flat-phase: tasks render as a <tasks> XML block (gsd-core native format)
|
|
445
|
+
// instead of a ## Tasks markdown section. This makes the plan file compatible
|
|
446
|
+
// with gsd-core's parseOldPlan which extracts <tasks> blocks.
|
|
447
|
+
lines.push("<tasks>");
|
|
350
448
|
for (const task of tasks) {
|
|
351
449
|
const done = isClosedStatus(task.status) ? "x" : " ";
|
|
352
|
-
const estimate = task.estimate.trim() ? `
|
|
353
|
-
lines.push(`- [${done}] **${task.id}
|
|
450
|
+
const estimate = task.estimate.trim() ? ` _(${task.estimate.trim()})_` : "";
|
|
451
|
+
lines.push(`- [${done}] **${task.id}**: ${task.title || task.id}${estimate}`);
|
|
354
452
|
const summary = taskSummaryForSlicePlan(task.description);
|
|
355
453
|
if (summary) {
|
|
356
454
|
pushIndented(lines, summary);
|
|
@@ -361,8 +459,9 @@ function renderSlicePlanMarkdown(slice: SliceRow, tasks: TaskRow[], gates: GateR
|
|
|
361
459
|
if (task.verify.trim()) {
|
|
362
460
|
lines.push(` - Verify: ${task.verify.trim()}`);
|
|
363
461
|
}
|
|
364
|
-
lines.push("");
|
|
365
462
|
}
|
|
463
|
+
lines.push("</tasks>");
|
|
464
|
+
lines.push("");
|
|
366
465
|
|
|
367
466
|
const filesLikelyTouched = Array.from(new Set(tasks.flatMap((task) => task.files)));
|
|
368
467
|
if (filesLikelyTouched.length > 0) {
|
|
@@ -393,14 +492,14 @@ export async function renderPlanFromDb(
|
|
|
393
492
|
throw new Error(`no tasks found for ${milestoneId}/${sliceId}`);
|
|
394
493
|
}
|
|
395
494
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
);
|
|
495
|
+
// Layout-aware path: prefer an existing plan file's location so re-renders
|
|
496
|
+
// stay in place (legacy: milestones/MID/slices/SID/SID-PLAN.md;
|
|
497
|
+
// flat-phase: phases/NN-slug/NN-MM-PLAN.md).
|
|
498
|
+
// Pass the milestone title so the fallback flat-phase dir uses the human-readable
|
|
499
|
+
// slug ("05-milestone-five") rather than the bare ID slug ("05-m005").
|
|
500
|
+
const milestoneTitle = getMilestone(milestoneId)?.title;
|
|
501
|
+
const existingPlanPath = resolveSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
502
|
+
const defaultPlanPath = existingPlanPath ?? join(basePath, relSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle));
|
|
404
503
|
const absPath = outputPath ?? defaultPlanPath;
|
|
405
504
|
mkdirSync(dirname(absPath), { recursive: true });
|
|
406
505
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
@@ -411,13 +510,11 @@ export async function renderPlanFromDb(
|
|
|
411
510
|
artifact_type: "PLAN",
|
|
412
511
|
milestone_id: milestoneId,
|
|
413
512
|
slice_id: sliceId,
|
|
414
|
-
});
|
|
513
|
+
}, basePath);
|
|
415
514
|
|
|
515
|
+
// Flat-phase: tasks are checkboxes inside the plan file, not separate files.
|
|
516
|
+
// No per-task render loop — task state is in the <tasks> block above.
|
|
416
517
|
const taskPlanPaths: string[] = [];
|
|
417
|
-
for (const task of tasks) {
|
|
418
|
-
const rendered = await renderTaskPlanFromDb(basePath, milestoneId, sliceId, task.id);
|
|
419
|
-
taskPlanPaths.push(rendered.taskPlanPath);
|
|
420
|
-
}
|
|
421
518
|
|
|
422
519
|
return { planPath: absPath, taskPlanPaths, content };
|
|
423
520
|
}
|
|
@@ -433,9 +530,36 @@ export async function renderTaskPlanFromDb(
|
|
|
433
530
|
throw new Error(`task ${milestoneId}/${sliceId}/${taskId} not found`);
|
|
434
531
|
}
|
|
435
532
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
const
|
|
533
|
+
// Flat-phase: task plans live inside the phase dir, not a tasks/ subdir.
|
|
534
|
+
// This function is legacy — tasks are now checkboxes inside the plan file.
|
|
535
|
+
const existingPlanPath = resolveTaskFile(basePath, milestoneId, sliceId, taskId, "PLAN");
|
|
536
|
+
let absPath: string;
|
|
537
|
+
if (existingPlanPath) {
|
|
538
|
+
absPath = existingPlanPath;
|
|
539
|
+
} else {
|
|
540
|
+
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
541
|
+
if (slicePath) {
|
|
542
|
+
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
|
|
543
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
544
|
+
absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
|
|
545
|
+
} else {
|
|
546
|
+
const existing = resolveMilestonePath(basePath, milestoneId);
|
|
547
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
548
|
+
const isLegacyLayout = existing
|
|
549
|
+
? existing.startsWith(legacyBase + "/") || existing.startsWith(legacyBase + "\\")
|
|
550
|
+
: isLegacyMilestonesLayout(basePath);
|
|
551
|
+
const phaseDir = existing ?? join(
|
|
552
|
+
isLegacyLayout ? legacyBase : milestonesDir(basePath),
|
|
553
|
+
isLegacyLayout ? milestoneId : canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
|
|
554
|
+
);
|
|
555
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
556
|
+
const tasksDir = isLegacyLayout
|
|
557
|
+
? join(phaseDir, "slices", sliceId, "tasks")
|
|
558
|
+
: phaseDir;
|
|
559
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
560
|
+
absPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
|
|
561
|
+
}
|
|
562
|
+
}
|
|
439
563
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
440
564
|
const taskGates = getGateResults(milestoneId, sliceId, "task").filter(g => g.task_id === taskId);
|
|
441
565
|
const content = task.full_plan_md.trim() ? task.full_plan_md : renderTaskPlanMarkdown(task, taskGates);
|
|
@@ -445,7 +569,7 @@ export async function renderTaskPlanFromDb(
|
|
|
445
569
|
milestone_id: milestoneId,
|
|
446
570
|
slice_id: sliceId,
|
|
447
571
|
task_id: taskId,
|
|
448
|
-
});
|
|
572
|
+
}, basePath);
|
|
449
573
|
|
|
450
574
|
return { taskPlanPath: absPath, content };
|
|
451
575
|
}
|
|
@@ -453,13 +577,43 @@ export async function renderTaskPlanFromDb(
|
|
|
453
577
|
export async function renderRoadmapFromDb(
|
|
454
578
|
basePath: string,
|
|
455
579
|
milestoneId: string,
|
|
456
|
-
): Promise<{ roadmapPath: string; content: string }> {
|
|
580
|
+
): Promise<{ roadmapPath: string; content: string } | { skipped: "unplanned-milestone" }> {
|
|
457
581
|
const milestone = getMilestone(milestoneId);
|
|
458
582
|
if (!milestone) {
|
|
459
583
|
throw new Error(`milestone ${milestoneId} not found`);
|
|
460
584
|
}
|
|
461
585
|
|
|
462
586
|
const slices = getMilestoneSlices(milestoneId);
|
|
587
|
+
|
|
588
|
+
// Refuse to render a stub ROADMAP for an unplanned milestone (#852).
|
|
589
|
+
// A milestone row created by gsd_milestone_generate_id / ensureMilestoneDbRow
|
|
590
|
+
// starts with title="" / vision="" and zero slices. Rendering that produces a
|
|
591
|
+
// 38-byte stub (`# M015: M015\n\n**Vision:** \n\n## Slices`) which passes
|
|
592
|
+
// existsSync but fails the plan-milestone "zero slices" content check —
|
|
593
|
+
// trapping auto-mode in a finalize-retry loop. A real plan (written by
|
|
594
|
+
// gsd_plan_milestone via writePlanRows) always sets a non-empty vision AND at
|
|
595
|
+
// least one slice, so zero-slice + empty-vision is a reliable "never planned"
|
|
596
|
+
// signal. Skip the write so verification sees a genuinely missing file (a
|
|
597
|
+
// clear "write the ROADMAP" failure) instead of a misleading stub.
|
|
598
|
+
if (slices.length === 0 && !milestone.vision.trim()) {
|
|
599
|
+
logWarning(
|
|
600
|
+
"projection",
|
|
601
|
+
`renderRoadmapFromDb skipped unplanned milestone ${milestoneId} (zero slices, empty vision) — refusing to write a stub ROADMAP`,
|
|
602
|
+
);
|
|
603
|
+
const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
|
|
604
|
+
if (existsSync(absPath)) {
|
|
605
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
606
|
+
unlinkSync(absPath);
|
|
607
|
+
try {
|
|
608
|
+
deleteArtifactByPath(artifactPath);
|
|
609
|
+
} catch {
|
|
610
|
+
logWarning("renderer", `failed to remove artifact from DB: ${artifactPath}`);
|
|
611
|
+
}
|
|
612
|
+
invalidateCaches();
|
|
613
|
+
}
|
|
614
|
+
return { skipped: "unplanned-milestone" };
|
|
615
|
+
}
|
|
616
|
+
|
|
463
617
|
const absPath = resolveRoadmapProjectionPath(basePath, milestoneId);
|
|
464
618
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
465
619
|
const content = renderRoadmapMarkdown(milestone, slices);
|
|
@@ -467,7 +621,7 @@ export async function renderRoadmapFromDb(
|
|
|
467
621
|
await writeAndStore(absPath, artifactPath, content, {
|
|
468
622
|
artifact_type: "ROADMAP",
|
|
469
623
|
milestone_id: milestoneId,
|
|
470
|
-
});
|
|
624
|
+
}, basePath);
|
|
471
625
|
|
|
472
626
|
return { roadmapPath: absPath, content };
|
|
473
627
|
}
|
|
@@ -485,16 +639,88 @@ export async function renderRoadmapCheckboxes(
|
|
|
485
639
|
basePath: string,
|
|
486
640
|
milestoneId: string,
|
|
487
641
|
): Promise<boolean> {
|
|
488
|
-
const
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
642
|
+
const rendered = await renderRoadmapFromDb(basePath, milestoneId);
|
|
643
|
+
return !("skipped" in rendered);
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
|
|
648
|
+
* the artifacts table into the flat-phase phase directory. ROADMAP is skipped
|
|
649
|
+
* because renderRoadmapFromDb regenerates it from hierarchy rows.
|
|
650
|
+
*/
|
|
651
|
+
export async function renderMilestoneArtifactsFromDb(
|
|
652
|
+
basePath: string,
|
|
653
|
+
milestoneId: string,
|
|
654
|
+
): Promise<boolean> {
|
|
655
|
+
const artifacts = getMilestoneScopedArtifacts(milestoneId);
|
|
656
|
+
if (artifacts.length === 0) return false;
|
|
657
|
+
|
|
658
|
+
const phaseDir = resolveMilestonePath(basePath, milestoneId) ??
|
|
659
|
+
join(
|
|
660
|
+
milestonesDir(basePath),
|
|
661
|
+
canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title),
|
|
492
662
|
);
|
|
493
|
-
|
|
663
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
664
|
+
|
|
665
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
666
|
+
const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
|
|
667
|
+
|
|
668
|
+
let wrote = false;
|
|
669
|
+
for (const artifact of artifacts) {
|
|
670
|
+
if (artifact.artifact_type === "ROADMAP") continue;
|
|
671
|
+
if (!artifact.full_content.trim()) continue;
|
|
672
|
+
|
|
673
|
+
const fileName = isLegacy
|
|
674
|
+
? `${milestoneId}-${artifact.artifact_type}.md`
|
|
675
|
+
: buildMilestoneFileName(milestoneId, artifact.artifact_type);
|
|
676
|
+
const absPath = join(phaseDir, fileName);
|
|
677
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
678
|
+
await writeAndStore(absPath, artifactPath, artifact.full_content, {
|
|
679
|
+
artifact_type: artifact.artifact_type,
|
|
680
|
+
milestone_id: milestoneId,
|
|
681
|
+
});
|
|
682
|
+
wrote = true;
|
|
494
683
|
}
|
|
495
684
|
|
|
496
|
-
|
|
497
|
-
|
|
685
|
+
return wrote;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
* Slice-scoped artifacts (CONTEXT, RESEARCH, CONTINUE, etc.) must survive
|
|
690
|
+
* layout migration. PLAN is normally regenerated from task rows, but a real
|
|
691
|
+
* imported PLAN can still be replayed as a fallback; known recovery stubs are
|
|
692
|
+
* treated as missing.
|
|
693
|
+
*/
|
|
694
|
+
export async function renderSliceArtifactsFromDb(
|
|
695
|
+
basePath: string,
|
|
696
|
+
milestoneId: string,
|
|
697
|
+
sliceId: string,
|
|
698
|
+
): Promise<boolean> {
|
|
699
|
+
const artifacts = getSliceScopedArtifacts(milestoneId, sliceId);
|
|
700
|
+
if (artifacts.length === 0) return false;
|
|
701
|
+
|
|
702
|
+
let wrote = false;
|
|
703
|
+
for (const artifact of artifacts) {
|
|
704
|
+
const artifactType = artifact.artifact_type.toUpperCase();
|
|
705
|
+
if (!artifact.full_content.trim()) continue;
|
|
706
|
+
if (artifactType === "PLAN" && isAutoRecoveryPlaceholderPlan(artifact.full_content)) continue;
|
|
707
|
+
|
|
708
|
+
const absPath = join(basePath, relSliceFile(basePath, milestoneId, sliceId, artifactType));
|
|
709
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
710
|
+
const artifactPath = toArtifactPath(absPath, basePath);
|
|
711
|
+
await writeAndStore(absPath, artifactPath, artifact.full_content, {
|
|
712
|
+
artifact_type: artifactType,
|
|
713
|
+
milestone_id: milestoneId,
|
|
714
|
+
slice_id: sliceId,
|
|
715
|
+
}, basePath);
|
|
716
|
+
wrote = true;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
return wrote;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
function isAutoRecoveryPlaceholderPlan(content: string): boolean {
|
|
723
|
+
return /(?:^|\n)\s*#\s*BLOCKER\b/i.test(content) && /auto-mode recovery failed/i.test(content);
|
|
498
724
|
}
|
|
499
725
|
|
|
500
726
|
// ─── Plan Checkbox Rendering ──────────────────────────────────────────────
|
|
@@ -511,7 +737,8 @@ export async function renderRoadmapCheckboxes(
|
|
|
511
737
|
* projection (the 4S/0T-vs-5S/13T drift class). The artifacts table is an
|
|
512
738
|
* output sink, never a render input.
|
|
513
739
|
*
|
|
514
|
-
* @returns true if the plan was written, false
|
|
740
|
+
* @returns true if the plan was written, false when the DB slice has no tasks
|
|
741
|
+
* @throws when the DB connection is unavailable or the render write fails
|
|
515
742
|
*/
|
|
516
743
|
export async function renderPlanCheckboxes(
|
|
517
744
|
basePath: string,
|
|
@@ -521,6 +748,9 @@ export async function renderPlanCheckboxes(
|
|
|
521
748
|
): Promise<boolean> {
|
|
522
749
|
const tasks = getSliceTasks(milestoneId, sliceId);
|
|
523
750
|
if (tasks.length === 0) {
|
|
751
|
+
if (!isDbAvailable()) {
|
|
752
|
+
throw new Error(`database unavailable while rendering plan checkboxes for ${milestoneId}/${sliceId}`);
|
|
753
|
+
}
|
|
524
754
|
process.stderr.write(
|
|
525
755
|
`markdown-renderer: no tasks found for ${milestoneId}/${sliceId}\n`,
|
|
526
756
|
);
|
|
@@ -559,7 +789,9 @@ export async function renderTaskSummary(
|
|
|
559
789
|
return false;
|
|
560
790
|
}
|
|
561
791
|
|
|
562
|
-
|
|
792
|
+
// Use the tasks/ subdir when it exists (legacy layout), otherwise use the
|
|
793
|
+
// slice path directly (flat-phase: task summaries live alongside plan files).
|
|
794
|
+
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
|
|
563
795
|
const fileName = buildTaskFileName(taskId, "SUMMARY");
|
|
564
796
|
const absPath = join(tasksDir, fileName);
|
|
565
797
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
@@ -569,7 +801,7 @@ export async function renderTaskSummary(
|
|
|
569
801
|
milestone_id: milestoneId,
|
|
570
802
|
slice_id: sliceId,
|
|
571
803
|
task_id: taskId,
|
|
572
|
-
});
|
|
804
|
+
}, basePath);
|
|
573
805
|
|
|
574
806
|
return true;
|
|
575
807
|
}
|
|
@@ -592,19 +824,21 @@ export async function renderSliceSummary(
|
|
|
592
824
|
return false; // No slice data — skip silently
|
|
593
825
|
}
|
|
594
826
|
|
|
595
|
-
|
|
827
|
+
// Flat-phase: resolve or create the phase dir, since resolveSlicePath only
|
|
828
|
+
// finds existing dirs. In flat-phase the slice "path" is the phase dir.
|
|
829
|
+
let slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
596
830
|
if (!slicePath) {
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
);
|
|
600
|
-
|
|
831
|
+
const mDir = milestonesDir(basePath);
|
|
832
|
+
const dirName = canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title);
|
|
833
|
+
slicePath = join(mDir, dirName);
|
|
834
|
+
mkdirSync(slicePath, { recursive: true });
|
|
601
835
|
}
|
|
602
836
|
|
|
603
837
|
let wrote = false;
|
|
604
838
|
|
|
605
|
-
// Write SUMMARY
|
|
839
|
+
// Write SUMMARY — flat-phase: NN-MM-SUMMARY.md inside phase dir
|
|
606
840
|
if (slice.full_summary_md) {
|
|
607
|
-
const summaryName =
|
|
841
|
+
const summaryName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "SUMMARY");
|
|
608
842
|
const summaryAbs = join(slicePath, summaryName);
|
|
609
843
|
const summaryArtifact = toArtifactPath(summaryAbs, basePath);
|
|
610
844
|
|
|
@@ -612,13 +846,13 @@ export async function renderSliceSummary(
|
|
|
612
846
|
artifact_type: "SUMMARY",
|
|
613
847
|
milestone_id: milestoneId,
|
|
614
848
|
slice_id: sliceId,
|
|
615
|
-
});
|
|
849
|
+
}, basePath);
|
|
616
850
|
wrote = true;
|
|
617
851
|
}
|
|
618
852
|
|
|
619
|
-
// Write UAT
|
|
853
|
+
// Write UAT — flat-phase: NN-MM-UAT.md inside phase dir
|
|
620
854
|
if (slice.full_uat_md) {
|
|
621
|
-
const uatName =
|
|
855
|
+
const uatName = planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), "UAT");
|
|
622
856
|
const uatAbs = join(slicePath, uatName);
|
|
623
857
|
const uatArtifact = toArtifactPath(uatAbs, basePath);
|
|
624
858
|
|
|
@@ -626,7 +860,7 @@ export async function renderSliceSummary(
|
|
|
626
860
|
artifact_type: "UAT",
|
|
627
861
|
milestone_id: milestoneId,
|
|
628
862
|
slice_id: sliceId,
|
|
629
|
-
});
|
|
863
|
+
}, basePath);
|
|
630
864
|
wrote = true;
|
|
631
865
|
}
|
|
632
866
|
|
|
@@ -649,6 +883,17 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
649
883
|
const result: RenderAllResult = { rendered: 0, skipped: 0, errors: [] };
|
|
650
884
|
const milestones = getAllMilestones();
|
|
651
885
|
|
|
886
|
+
// Pre-fetch slices once per milestone and batch-load all tasks in one query
|
|
887
|
+
// family, avoiding an N+1 (previously one task query per slice).
|
|
888
|
+
const slicesByMilestone = new Map<string, SliceRow[]>();
|
|
889
|
+
const slicePairs: Array<{ milestoneId: string; sliceId: string }> = [];
|
|
890
|
+
for (const milestone of milestones) {
|
|
891
|
+
const slices = getMilestoneSlices(milestone.id);
|
|
892
|
+
slicesByMilestone.set(milestone.id, slices);
|
|
893
|
+
for (const slice of slices) slicePairs.push({ milestoneId: milestone.id, sliceId: slice.id });
|
|
894
|
+
}
|
|
895
|
+
const tasksBySlice = getTasksBySliceIds(slicePairs);
|
|
896
|
+
|
|
652
897
|
for (const milestone of milestones) {
|
|
653
898
|
// Render roadmap checkboxes
|
|
654
899
|
try {
|
|
@@ -659,9 +904,29 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
659
904
|
result.errors.push(`roadmap ${milestone.id}: ${(err as Error).message}`);
|
|
660
905
|
}
|
|
661
906
|
|
|
662
|
-
|
|
663
|
-
|
|
907
|
+
try {
|
|
908
|
+
const ok = await renderMilestoneArtifactsFromDb(basePath, milestone.id);
|
|
909
|
+
if (ok) result.rendered++;
|
|
910
|
+
else result.skipped++;
|
|
911
|
+
} catch (err) {
|
|
912
|
+
result.errors.push(`milestone artifacts ${milestone.id}: ${(err as Error).message}`);
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
// Iterate slices (pre-fetched above)
|
|
916
|
+
const slices = slicesByMilestone.get(milestone.id) ?? [];
|
|
664
917
|
for (const slice of slices) {
|
|
918
|
+
// Preserve slice-scoped artifacts imported from disk, including real PLAN
|
|
919
|
+
// fallback content when task rows cannot regenerate it.
|
|
920
|
+
try {
|
|
921
|
+
const ok = await renderSliceArtifactsFromDb(basePath, milestone.id, slice.id);
|
|
922
|
+
if (ok) result.rendered++;
|
|
923
|
+
else result.skipped++;
|
|
924
|
+
} catch (err) {
|
|
925
|
+
result.errors.push(
|
|
926
|
+
`slice artifacts ${milestone.id}/${slice.id}: ${(err as Error).message}`,
|
|
927
|
+
);
|
|
928
|
+
}
|
|
929
|
+
|
|
665
930
|
// Render plan checkboxes
|
|
666
931
|
try {
|
|
667
932
|
const ok = await renderPlanCheckboxes(basePath, milestone.id, slice.id);
|
|
@@ -684,8 +949,8 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
684
949
|
);
|
|
685
950
|
}
|
|
686
951
|
|
|
687
|
-
// Iterate tasks
|
|
688
|
-
const tasks =
|
|
952
|
+
// Iterate tasks (batched above)
|
|
953
|
+
const tasks = tasksBySlice.get(`${milestone.id}\0${slice.id}`) ?? [];
|
|
689
954
|
for (const task of tasks) {
|
|
690
955
|
try {
|
|
691
956
|
const ok = await renderTaskSummary(
|
|
@@ -717,6 +982,25 @@ export async function renderAllFromDb(basePath: string): Promise<RenderAllResult
|
|
|
717
982
|
result.errors.push(`decisions: ${(err as Error).message}`);
|
|
718
983
|
}
|
|
719
984
|
|
|
985
|
+
// Project to .planning/ if the compat marker says it's active. Dynamic
|
|
986
|
+
// import for writePlanningDirectory avoids a static-import cycle. Gated on
|
|
987
|
+
// planning.active so the double-write cost only hits projects that use
|
|
988
|
+
// .planning/. writePlanningDirectory records per-file SHAs via
|
|
989
|
+
// applyPlanningProjectionWrites so the reconcile detector has a baseline.
|
|
990
|
+
// capturePlanningCompatIfNeeded seeds the layout and SHAs on first encounter.
|
|
991
|
+
try {
|
|
992
|
+
const { capturePlanningCompatIfNeeded } = await import("./compat/planning-compat.js");
|
|
993
|
+
await capturePlanningCompatIfNeeded(basePath);
|
|
994
|
+
const marker = readCompatMarker(basePath);
|
|
995
|
+
if (marker.planning?.active && marker.planning.layout) {
|
|
996
|
+
const { writePlanningDirectory } = await import("./migrate/planning-writer.js");
|
|
997
|
+
await writePlanningDirectory(basePath, marker.planning.layout);
|
|
998
|
+
result.rendered++;
|
|
999
|
+
}
|
|
1000
|
+
} catch (err) {
|
|
1001
|
+
result.errors.push(`planning projection: ${(err as Error).message}`);
|
|
1002
|
+
}
|
|
1003
|
+
|
|
720
1004
|
return result;
|
|
721
1005
|
}
|
|
722
1006
|
|
|
@@ -733,7 +1017,7 @@ export interface StaleEntry {
|
|
|
733
1017
|
* Checks:
|
|
734
1018
|
* 1. Roadmap checkbox states vs DB slice statuses
|
|
735
1019
|
* 2. Plan checkbox states vs DB task statuses
|
|
736
|
-
* 3. Missing SUMMARY.md files for complete tasks with full_summary_md
|
|
1020
|
+
* 3. Missing SUMMARY.md files for complete tasks with full_summary_md (legacy only)
|
|
737
1021
|
* 4. Missing SUMMARY.md/UAT.md files for complete slices with content
|
|
738
1022
|
*
|
|
739
1023
|
* Returns a list of stale entries with file path and reason.
|
|
@@ -769,7 +1053,18 @@ function parseProjectionByIdentity(path: string, parse: (content: string) => unk
|
|
|
769
1053
|
}
|
|
770
1054
|
|
|
771
1055
|
export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
772
|
-
//
|
|
1056
|
+
// TODO(flat-phase): stale-render detection is temporarily fully disabled.
|
|
1057
|
+
// The isLegacyMilestonesLayout gate is unreliable: git-service.ts creates
|
|
1058
|
+
// milestones/<mid>/ directories for integration-branch metadata even in
|
|
1059
|
+
// flat-phase projects, making the gate fire true and then producing false
|
|
1060
|
+
// stale-render drift in the second reconcile cycle → ReconciliationFailedError
|
|
1061
|
+
// → auto-mode blocked (exit 10) for multi-slice/remediation e2e scenarios.
|
|
1062
|
+
// Re-enable after path construction is unified and the metadata dir is
|
|
1063
|
+
// decoupled from the layout-detection signal.
|
|
1064
|
+
return [];
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
function detectStaleRendersImpl(basePath: string): StaleEntry[] {
|
|
773
1068
|
// per-call createRequire("./parsers-legacy") that used to live here ran on
|
|
774
1069
|
// every dispatch. The static `./parsers-legacy.js` specifier resolves in
|
|
775
1070
|
// both packaged (.js) and source (.ts via the strip-types loader) contexts —
|
|
@@ -779,8 +1074,12 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
779
1074
|
|
|
780
1075
|
for (const milestone of milestones) {
|
|
781
1076
|
const slices = getMilestoneSlices(milestone.id);
|
|
1077
|
+
const isFlatPhase = isMilestoneFlatPhaseLayout(basePath, milestone.id);
|
|
782
1078
|
|
|
783
1079
|
// ── Check roadmap checkbox state ──────────────────────────────────
|
|
1080
|
+
// TODO(flat-phase): roadmap checkbox parsing may not match flat-phase
|
|
1081
|
+
// roadmap format, causing false-positive drift loops. Skip during transition.
|
|
1082
|
+
/*
|
|
784
1083
|
const roadmapPath = resolveRoadmapProjectionPath(basePath, milestone.id);
|
|
785
1084
|
if (existsSync(roadmapPath)) {
|
|
786
1085
|
try {
|
|
@@ -791,12 +1090,12 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
791
1090
|
const roadmapSlice = parsed.slices.find((s: { id: string }) => s.id === slice.id);
|
|
792
1091
|
if (!roadmapSlice) continue;
|
|
793
1092
|
|
|
794
|
-
if (isCompleteInDb && !roadmapSlice
|
|
1093
|
+
if (isCompleteInDb && !roadmapSlice!.done) {
|
|
795
1094
|
stale.push({
|
|
796
1095
|
path: roadmapPath,
|
|
797
1096
|
reason: `${slice.id} is closed in DB but unchecked in roadmap`,
|
|
798
1097
|
});
|
|
799
|
-
} else if (!isCompleteInDb && roadmapSlice
|
|
1098
|
+
} else if (!isCompleteInDb && roadmapSlice!.done) {
|
|
800
1099
|
stale.push({
|
|
801
1100
|
path: roadmapPath,
|
|
802
1101
|
reason: `${slice.id} is not closed in DB but checked in roadmap`,
|
|
@@ -807,62 +1106,67 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
807
1106
|
logWarning("renderer", `roadmap parse failed: ${(e as Error).message}`);
|
|
808
1107
|
}
|
|
809
1108
|
}
|
|
1109
|
+
*/
|
|
810
1110
|
|
|
811
1111
|
// ── Check plan checkbox state and summaries for each slice ────────
|
|
812
1112
|
for (const slice of slices) {
|
|
813
1113
|
const tasks = getSliceTasks(milestone.id, slice.id);
|
|
814
1114
|
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
const
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
1115
|
+
if (!isFlatPhase) {
|
|
1116
|
+
// Check plan checkboxes
|
|
1117
|
+
const planPath = resolveSliceFile(basePath, milestone.id, slice.id, "PLAN");
|
|
1118
|
+
if (planPath && existsSync(planPath!)) {
|
|
1119
|
+
try {
|
|
1120
|
+
const parsed = parseProjectionByIdentity(planPath!, parsePlan) as ReturnType<typeof parsePlan>;
|
|
1121
|
+
|
|
1122
|
+
for (const task of tasks) {
|
|
1123
|
+
const isDoneInDb = isClosedStatus(task.status);
|
|
1124
|
+
const planTask = parsed.tasks.find((t: { id: string }) => t.id === task.id);
|
|
1125
|
+
if (!planTask) {
|
|
1126
|
+
// DB has a task the plan markdown lacks: the projection is
|
|
1127
|
+
// lossy (e.g. tasks added after the PLAN artifact was first
|
|
1128
|
+
// written). Flag it so the plan is re-rendered from DB rows.
|
|
1129
|
+
stale.push({
|
|
1130
|
+
path: planPath!,
|
|
1131
|
+
reason: `${task.id} exists in DB but is missing in plan`,
|
|
1132
|
+
});
|
|
1133
|
+
continue;
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
if (isDoneInDb && !planTask!.done) {
|
|
1137
|
+
stale.push({
|
|
1138
|
+
path: planPath!,
|
|
1139
|
+
reason: `${task.id} is done in DB but unchecked in plan`,
|
|
1140
|
+
});
|
|
1141
|
+
} else if (!isDoneInDb && planTask!.done) {
|
|
1142
|
+
stale.push({
|
|
1143
|
+
path: planPath!,
|
|
1144
|
+
reason: `${task.id} is not done in DB but checked in plan`,
|
|
1145
|
+
});
|
|
1146
|
+
}
|
|
845
1147
|
}
|
|
1148
|
+
} catch (e) {
|
|
1149
|
+
logWarning("renderer", `plan parse failed: ${(e as Error).message}`);
|
|
846
1150
|
}
|
|
847
|
-
} catch (e) {
|
|
848
|
-
logWarning("renderer", `plan parse failed: ${(e as Error).message}`);
|
|
849
1151
|
}
|
|
850
1152
|
}
|
|
851
1153
|
|
|
852
|
-
// Check missing task summary files
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
if (
|
|
857
|
-
const
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
1154
|
+
// Check missing task summary files (legacy layout only — flat-phase keeps
|
|
1155
|
+
// task state in plan <tasks> blocks and does not project Txx-SUMMARY.md)
|
|
1156
|
+
if (!isFlatPhase) {
|
|
1157
|
+
for (const task of tasks) {
|
|
1158
|
+
if (isClosedStatus(task.status) && task.full_summary_md) {
|
|
1159
|
+
const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
|
|
1160
|
+
if (slicePath) {
|
|
1161
|
+
const fileName = buildTaskFileName(task.id, "SUMMARY");
|
|
1162
|
+
const summaryAbsPath = join(slicePath, fileName);
|
|
1163
|
+
|
|
1164
|
+
if (!existsSync(summaryAbsPath)) {
|
|
1165
|
+
stale.push({
|
|
1166
|
+
path: summaryAbsPath,
|
|
1167
|
+
reason: `${task.id} is complete with summary in DB but SUMMARY.md missing on disk`,
|
|
1168
|
+
});
|
|
1169
|
+
}
|
|
866
1170
|
}
|
|
867
1171
|
}
|
|
868
1172
|
}
|
|
@@ -871,10 +1175,15 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
871
1175
|
// Check missing slice summary/UAT files
|
|
872
1176
|
const sliceRow = getSlice(milestone.id, slice.id);
|
|
873
1177
|
if (sliceRow && sliceRow.status === "complete") {
|
|
1178
|
+
// Use the SAME path construction as renderSliceSummary (planFileName format)
|
|
1179
|
+
// so the detector and repair always agree on the file location.
|
|
874
1180
|
const slicePath = resolveSlicePath(basePath, milestone.id, slice.id);
|
|
875
1181
|
if (slicePath) {
|
|
1182
|
+
const phaseNum = milestoneIdToPhaseNum(milestone.id);
|
|
1183
|
+
const planNum = sliceIdToPlanNum(slice.id);
|
|
1184
|
+
|
|
876
1185
|
if (sliceRow.full_summary_md) {
|
|
877
|
-
const summaryName =
|
|
1186
|
+
const summaryName = planFileName(phaseNum, planNum, "SUMMARY");
|
|
878
1187
|
const summaryAbsPath = join(slicePath, summaryName);
|
|
879
1188
|
if (!existsSync(summaryAbsPath)) {
|
|
880
1189
|
stale.push({
|
|
@@ -885,7 +1194,7 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
885
1194
|
}
|
|
886
1195
|
|
|
887
1196
|
if (sliceRow.full_uat_md) {
|
|
888
|
-
const uatName =
|
|
1197
|
+
const uatName = planFileName(phaseNum, planNum, "UAT");
|
|
889
1198
|
const uatAbsPath = join(slicePath, uatName);
|
|
890
1199
|
if (!existsSync(uatAbsPath)) {
|
|
891
1200
|
stale.push({
|
|
@@ -948,9 +1257,12 @@ export async function renderReplanFromDb(
|
|
|
948
1257
|
sliceId: string,
|
|
949
1258
|
replanData: ReplanData,
|
|
950
1259
|
): Promise<{ replanPath: string; content: string }> {
|
|
1260
|
+
// Flat-phase: replan file lives in the phase dir
|
|
951
1261
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
|
|
952
|
-
?? join(
|
|
953
|
-
const
|
|
1262
|
+
?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
1263
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
1264
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
1265
|
+
const absPath = join(slicePath, planFileName(phaseNum, planNum, "REPLAN"));
|
|
954
1266
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
955
1267
|
|
|
956
1268
|
const lines: string[] = [];
|
|
@@ -976,7 +1288,7 @@ export async function renderReplanFromDb(
|
|
|
976
1288
|
artifact_type: "REPLAN",
|
|
977
1289
|
milestone_id: milestoneId,
|
|
978
1290
|
slice_id: sliceId,
|
|
979
|
-
});
|
|
1291
|
+
}, basePath);
|
|
980
1292
|
|
|
981
1293
|
return { replanPath: absPath, content };
|
|
982
1294
|
}
|
|
@@ -987,9 +1299,12 @@ export async function renderAssessmentFromDb(
|
|
|
987
1299
|
sliceId: string,
|
|
988
1300
|
assessmentData: AssessmentData,
|
|
989
1301
|
): Promise<{ assessmentPath: string; content: string }> {
|
|
1302
|
+
// Flat-phase: assessment file lives in the phase dir
|
|
990
1303
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
|
|
991
|
-
?? join(
|
|
992
|
-
const
|
|
1304
|
+
?? join(milestonesDir(basePath), canonicalPhaseDirName(milestoneId, getMilestone(milestoneId)?.title));
|
|
1305
|
+
const phaseNum = milestoneIdToPhaseNum(milestoneId);
|
|
1306
|
+
const planNum = sliceIdToPlanNum(sliceId);
|
|
1307
|
+
const absPath = join(slicePath, planFileName(phaseNum, planNum, "ASSESSMENT"));
|
|
993
1308
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
994
1309
|
|
|
995
1310
|
const lines: string[] = [];
|
|
@@ -1014,7 +1329,7 @@ export async function renderAssessmentFromDb(
|
|
|
1014
1329
|
artifact_type: "ASSESSMENT",
|
|
1015
1330
|
milestone_id: milestoneId,
|
|
1016
1331
|
slice_id: sliceId,
|
|
1017
|
-
});
|
|
1332
|
+
}, basePath);
|
|
1018
1333
|
|
|
1019
1334
|
return { assessmentPath: absPath, content };
|
|
1020
1335
|
}
|