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