@opengsd/gsd-core 1.15.0 → 1.16.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +85 -5
- package/agents/gsd-code-fixer.compact.md +1 -1
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-code-reviewer.compact.md +5 -3
- package/agents/gsd-code-reviewer.md +8 -6
- package/agents/gsd-debug-session-manager.compact.md +1 -1
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +2 -2
- package/agents/gsd-eval-auditor.compact.md +1 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +4 -4
- package/agents/gsd-intel-updater.compact.md +1 -1
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +2 -2
- package/agents/gsd-phase-researcher.md +1 -1
- package/agents/gsd-plan-checker.md +7 -2
- package/agents/gsd-planner.md +3 -3
- package/agents/gsd-project-researcher.compact.md +1 -1
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.compact.md +1 -1
- package/agents/gsd-research-synthesizer.md +1 -1
- package/agents/gsd-ui-auditor.compact.md +21 -30
- package/agents/gsd-ui-auditor.md +42 -51
- package/agents/gsd-ui-researcher.compact.md +1 -1
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-verifier.md +31 -9
- package/bin/install.js +126 -196
- package/commands/gsd/add-tests.md +6 -1
- package/commands/gsd/ai-integration-phase.md +6 -1
- package/commands/gsd/audit-fix.md +5 -0
- package/commands/gsd/audit-milestone.md +6 -1
- package/commands/gsd/autonomous.md +5 -0
- package/commands/gsd/capture.md +8 -4
- package/commands/gsd/code-review.md +7 -2
- package/commands/gsd/complete-milestone.md +4 -0
- package/commands/gsd/config.md +7 -3
- package/commands/gsd/debug.md +11 -7
- package/commands/gsd/discuss-phase.md +7 -3
- package/commands/gsd/docs-update.md +12 -7
- package/commands/gsd/eval-review.md +6 -1
- package/commands/gsd/execute-phase.md +12 -7
- package/commands/gsd/extract-learnings.md +5 -0
- package/commands/gsd/fast.md +4 -0
- package/commands/gsd/forensics.md +5 -1
- package/commands/gsd/graphify.md +10 -6
- package/commands/gsd/health.md +5 -0
- package/commands/gsd/help.md +7 -2
- package/commands/gsd/import.md +7 -3
- package/commands/gsd/inbox.md +5 -0
- package/commands/gsd/ingest-docs.md +5 -1
- package/commands/gsd/manager.md +6 -1
- package/commands/gsd/map-codebase.md +7 -3
- package/commands/gsd/mempalace-capture.md +5 -1
- package/commands/gsd/mempalace-recall.md +5 -1
- package/commands/gsd/milestone-summary.md +5 -1
- package/commands/gsd/mvp-phase.md +8 -3
- package/commands/gsd/new-milestone.md +6 -1
- package/commands/gsd/new-project.md +5 -0
- package/commands/gsd/next.md +6 -1
- package/commands/gsd/ns-context.md +4 -0
- package/commands/gsd/ns-ideate.md +4 -0
- package/commands/gsd/ns-manage.md +4 -0
- package/commands/gsd/ns-project.md +4 -0
- package/commands/gsd/ns-review.md +4 -0
- package/commands/gsd/ns-workflow.md +4 -0
- package/commands/gsd/onboard.md +6 -1
- package/commands/gsd/pause-work.md +5 -1
- package/commands/gsd/phase.md +8 -4
- package/commands/gsd/plan-phase.md +6 -1
- package/commands/gsd/plan-review-convergence.md +5 -1
- package/commands/gsd/pr-branch.md +4 -0
- package/commands/gsd/profile-user.md +5 -1
- package/commands/gsd/progress.md +6 -1
- package/commands/gsd/quick-batch.md +20 -8
- package/commands/gsd/quick.md +12 -7
- package/commands/gsd/review.md +5 -1
- package/commands/gsd/secure-phase.md +6 -1
- package/commands/gsd/ship.md +5 -0
- package/commands/gsd/sketch.md +7 -2
- package/commands/gsd/spec-phase.md +5 -1
- package/commands/gsd/spike.md +8 -3
- package/commands/gsd/surface.md +5 -1
- package/commands/gsd/thread.md +4 -0
- package/commands/gsd/ui-phase.md +6 -1
- package/commands/gsd/ui-review.md +6 -1
- package/commands/gsd/ultraplan-phase.md +5 -1
- package/commands/gsd/undo.md +5 -1
- package/commands/gsd/update.md +6 -2
- package/commands/gsd/validate-phase.md +6 -1
- package/commands/gsd/verify-work.md +6 -1
- package/commands/gsd/workspace.md +7 -3
- package/gsd-core/bin/gsd-tools.cjs +142 -56
- package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
- package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
- package/gsd-core/bin/lib/audit.cjs +78 -44
- package/gsd-core/bin/lib/broken-windows.cjs +13 -13
- package/gsd-core/bin/lib/capability-activation.cjs +9 -4
- package/gsd-core/bin/lib/capability-registry.cjs +183 -103
- package/gsd-core/bin/lib/capability-validator.cjs +16 -0
- package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
- package/gsd-core/bin/lib/check-command-router.cjs +164 -1712
- package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +13 -2
- package/gsd-core/bin/lib/cli-exit.cjs +12 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +11 -8
- package/gsd-core/bin/lib/command-aliases.cjs +7 -0
- package/gsd-core/bin/lib/command-routing-hub.cjs +48 -1
- package/gsd-core/bin/lib/commands.cjs +173 -170
- package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
- package/gsd-core/bin/lib/config.cjs +43 -12
- package/gsd-core/bin/lib/core-utils.cjs +6 -1
- package/gsd-core/bin/lib/coverage.cjs +4 -8
- package/gsd-core/bin/lib/decision-coverage-support.cjs +259 -0
- package/gsd-core/bin/lib/drift.cjs +177 -42
- package/gsd-core/bin/lib/frontmatter-fence.cjs +90 -0
- package/gsd-core/bin/lib/frontmatter-splice.cjs +494 -0
- package/gsd-core/bin/lib/frontmatter.cjs +413 -234
- package/gsd-core/bin/lib/gap-checker.cjs +72 -29
- package/gsd-core/bin/lib/gate-api-coverage-verify-pre.cjs +381 -0
- package/gsd-core/bin/lib/gate-args.cjs +53 -0
- package/gsd-core/bin/lib/gate-codebase-drift.cjs +285 -0
- package/gsd-core/bin/lib/gate-config.cjs +46 -0
- package/gsd-core/bin/lib/gate-context-drift.cjs +141 -0
- package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +169 -0
- package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +126 -0
- package/gsd-core/bin/lib/gate-evaluation-scope.cjs +555 -0
- package/gsd-core/bin/lib/gate-evidence.cjs +138 -0
- package/gsd-core/bin/lib/gate-exit.cjs +27 -0
- package/gsd-core/bin/lib/gate-gap-analysis-plan-post.cjs +61 -0
- package/gsd-core/bin/lib/gate-phase-context.cjs +170 -0
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +1 -1
- package/gsd-core/bin/lib/gate-predicate.cjs +165 -0
- package/gsd-core/bin/lib/gate-prohibition-enforcement.cjs +94 -0
- package/gsd-core/bin/lib/gate-schema-drift.cjs +165 -0
- package/gsd-core/bin/lib/gate-tdd-red-evidence.cjs +100 -0
- package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +182 -0
- package/gsd-core/bin/lib/gate-ui-plan.cjs +86 -0
- package/gsd-core/bin/lib/gate-ui-safety.cjs +80 -0
- package/gsd-core/bin/lib/gate-verdict.cjs +64 -0
- package/gsd-core/bin/lib/gate-verify-command-paths.cjs +78 -0
- package/gsd-core/bin/lib/gate-verify-failure-directions.cjs +41 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +43 -47
- package/gsd-core/bin/lib/health-diagnostic.cjs +45 -8
- package/gsd-core/bin/lib/init.cjs +162 -96
- package/gsd-core/bin/lib/install-engine.cjs +19 -35
- package/gsd-core/bin/lib/install-profiles.cjs +7 -4
- package/gsd-core/bin/lib/io.cjs +122 -3
- package/gsd-core/bin/lib/loop-resolver.cjs +95 -0
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +75 -1
- package/gsd-core/bin/lib/milestone.cjs +19 -1
- package/gsd-core/bin/lib/model-resolver.cjs +18 -18
- package/gsd-core/bin/lib/observability/event.cjs +1 -1
- package/gsd-core/bin/lib/observability/logger.cjs +46 -1
- package/gsd-core/bin/lib/pattern.cjs +10 -0
- package/gsd-core/bin/lib/phase-command-router.cjs +11 -4
- package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
- package/gsd-core/bin/lib/phase-id.cjs +1 -1
- package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
- package/gsd-core/bin/lib/phase-status.cjs +360 -0
- package/gsd-core/bin/lib/phase.cjs +280 -80
- package/gsd-core/bin/lib/plan-document.cjs +93 -19
- package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
- package/gsd-core/bin/lib/planning-document.cjs +273 -40
- package/gsd-core/bin/lib/planning-inspect.cjs +42 -8
- package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +76 -53
- package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
- package/gsd-core/bin/lib/profile-output.cjs +6 -3
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +0 -55
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +35 -9
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +11 -8
- package/gsd-core/bin/lib/real-home-guard.cjs +9 -1
- package/gsd-core/bin/lib/report-parser.cjs +269 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +13 -15
- package/gsd-core/bin/lib/roadmap-parser.cjs +82 -15
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +127 -65
- package/gsd-core/bin/lib/roadmap.cjs +169 -72
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +91 -157
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +2 -1
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
- package/gsd-core/bin/lib/runtime-homes.cjs +13 -10
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +307 -591
- package/gsd-core/bin/lib/runtime-name-policy.cjs +142 -27
- package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
- package/gsd-core/bin/lib/shell-command-projection.cjs +37 -2
- package/gsd-core/bin/lib/smart-entry.cjs +19 -3
- package/gsd-core/bin/lib/stale-bake-guard.cjs +32 -48
- package/gsd-core/bin/lib/state-contract.cjs +15 -18
- package/gsd-core/bin/lib/state-document.cjs +100 -22
- package/gsd-core/bin/lib/state.cjs +214 -105
- package/gsd-core/bin/lib/surface.cjs +2 -1
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -152
- package/gsd-core/bin/lib/uat-predicate.cjs +313 -35
- package/gsd-core/bin/lib/uat.cjs +424 -7
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +94 -58
- package/gsd-core/bin/lib/vendor/README.md +31 -9
- package/gsd-core/bin/lib/vendor/saxes.cjs +1934 -0
- package/gsd-core/bin/lib/vendor/saxes.cjs.LICENSE.txt +92 -0
- package/gsd-core/bin/lib/vendor/tap-parser.cjs +8927 -0
- package/gsd-core/bin/lib/vendor/tap-parser.cjs.LICENSE.txt +152 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +1165 -314
- package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
- package/gsd-core/bin/lib/verify.cjs +286 -567
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +14 -6
- package/gsd-core/bin/lib/workstream-inventory.cjs +31 -21
- package/gsd-core/bin/lib/workstream-name-policy.cjs +31 -1
- package/gsd-core/bin/lib/workstream.cjs +11 -2
- package/gsd-core/bin/shared/config-defaults.manifest.json +5 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +4 -0
- package/gsd-core/references/autonomous-smart-discuss.md +2 -1
- package/gsd-core/references/autonomous-ui-design-contract.md +3 -3
- package/gsd-core/references/execute-mvp-tdd.md +5 -10
- package/gsd-core/references/execute-phase-between-wave-reset.md +3 -0
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +7 -1
- package/gsd-core/references/offer-next.md +1 -1
- package/gsd-core/references/planning-config.md +1 -1
- package/gsd-core/references/spidr-splitting.md +1 -1
- package/gsd-core/references/tdd.md +10 -4
- package/gsd-core/references/verifier-phase-gates.md +5 -2
- package/gsd-core/references/verify-mvp-mode.md +2 -2
- package/gsd-core/references/workstream-flag.md +33 -3
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/UAT.md +17 -1
- package/gsd-core/templates/config.json +2 -11
- package/gsd-core/templates/verification-report.md +1 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +8 -7
- package/gsd-core/workflows/add-tests.md +3 -2
- package/gsd-core/workflows/add-todo.md +4 -3
- package/gsd-core/workflows/ai-integration-phase.md +3 -2
- package/gsd-core/workflows/audit-fix.md +1 -1
- package/gsd-core/workflows/audit-milestone.md +4 -3
- package/gsd-core/workflows/audit-uat.md +1 -1
- package/gsd-core/workflows/autonomous.md +28 -18
- package/gsd-core/workflows/check-todos.md +6 -5
- package/gsd-core/workflows/cleanup.md +1 -1
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
- package/gsd-core/workflows/code-review-fix.md +5 -4
- package/gsd-core/workflows/code-review.md +84 -90
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
- package/gsd-core/workflows/complete-milestone.md +12 -7
- package/gsd-core/workflows/debug.md +30 -5
- package/gsd-core/workflows/diagnose-issues.md +3 -2
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
- package/gsd-core/workflows/discuss-phase.md +4 -3
- package/gsd-core/workflows/do.md +1 -1
- package/gsd-core/workflows/docs-update.md +4 -3
- package/gsd-core/workflows/edit-phase.md +4 -3
- package/gsd-core/workflows/eval-review.md +5 -3
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +4 -2
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +15 -4
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +10 -7
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +3 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +187 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +2 -3
- package/gsd-core/workflows/execute-phase.md +78 -170
- package/gsd-core/workflows/execute-plan.md +13 -19
- package/gsd-core/workflows/explore.md +2 -2
- package/gsd-core/workflows/extract-learnings.md +3 -2
- package/gsd-core/workflows/fast.md +1 -1
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +2 -1
- package/gsd-core/workflows/import.md +3 -2
- package/gsd-core/workflows/inbox.md +1 -1
- package/gsd-core/workflows/ingest-docs.md +1 -1
- package/gsd-core/workflows/insert-phase.md +4 -3
- package/gsd-core/workflows/list-seeds.md +1 -1
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +5 -3
- package/gsd-core/workflows/map-codebase.md +4 -3
- package/gsd-core/workflows/milestone-summary.md +3 -2
- package/gsd-core/workflows/mvp-phase.md +14 -14
- package/gsd-core/workflows/new-milestone.md +10 -10
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +1 -1
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +1 -1
- package/gsd-core/workflows/pause-work.md +2 -2
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +1 -1
- package/gsd-core/workflows/plan-phase.md +27 -18
- package/gsd-core/workflows/plan-review-convergence.md +1 -1
- package/gsd-core/workflows/plant-seed.md +1 -1
- package/gsd-core/workflows/pr-branch.md +1 -1
- package/gsd-core/workflows/profile-user.md +1 -1
- package/gsd-core/workflows/progress.md +19 -49
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +4 -2
- package/gsd-core/workflows/quick/steps/quick-verification.md +4 -4
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +30 -11
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +9 -3
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
- package/gsd-core/workflows/quick-batch.md +15 -10
- package/gsd-core/workflows/quick.md +42 -31
- package/gsd-core/workflows/remove-phase.md +3 -2
- package/gsd-core/workflows/remove-workspace.md +1 -1
- package/gsd-core/workflows/resume-project.md +3 -2
- package/gsd-core/workflows/review.md +3 -2
- package/gsd-core/workflows/scan.md +3 -2
- package/gsd-core/workflows/secure-phase.md +11 -12
- package/gsd-core/workflows/settings-advanced.md +1 -1
- package/gsd-core/workflows/settings-integrations.md +1 -1
- package/gsd-core/workflows/settings.md +1 -1
- package/gsd-core/workflows/ship.md +12 -12
- package/gsd-core/workflows/sketch-wrap-up.md +1 -1
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +1 -1
- package/gsd-core/workflows/spec-phase.md +1 -1
- package/gsd-core/workflows/spike-wrap-up.md +1 -1
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +1 -1
- package/gsd-core/workflows/sync-skills.md +1 -1
- package/gsd-core/workflows/thread.md +2 -2
- package/gsd-core/workflows/transition.md +13 -23
- package/gsd-core/workflows/ui-phase.md +5 -4
- package/gsd-core/workflows/ui-review.md +4 -3
- package/gsd-core/workflows/ultraplan-phase.md +3 -2
- package/gsd-core/workflows/undo.md +1 -1
- package/gsd-core/workflows/validate-phase.md +10 -12
- package/gsd-core/workflows/verify-work/detail/elaboration.md +43 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -3
- package/gsd-core/workflows/verify-work.md +68 -59
- package/hooks/dist/gsd-agent-isolation-guard.js +8 -0
- package/hooks/dist/gsd-check-update-worker.js +8 -0
- package/hooks/dist/gsd-check-update.js +8 -0
- package/hooks/dist/gsd-context-monitor.js +31 -8
- package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
- package/hooks/dist/gsd-secret-read-guard.js +147 -16
- package/hooks/dist/gsd-statusline.js +15 -7
- package/hooks/dist/gsd-update-banner.js +8 -0
- package/hooks/dist/gsd-windsurf-pre-write.js +11 -2
- package/hooks/dist/gsd-workflow-guard.js +5 -4
- package/hooks/dist/gsd-worktree-path-guard.js +6 -2
- package/hooks/dist/lib/cli-exit.js +12 -0
- package/hooks/dist/lib/git-probe.js +17 -1
- package/hooks/dist/lib/isolation-sentinel.js +2 -2
- package/hooks/gsd-agent-isolation-guard.js +8 -0
- package/hooks/gsd-check-update-worker.js +8 -0
- package/hooks/gsd-check-update.js +8 -0
- package/hooks/gsd-context-monitor.js +31 -8
- package/hooks/gsd-cursor-subagent-start.js +8 -0
- package/hooks/gsd-secret-read-guard.js +147 -16
- package/hooks/gsd-statusline.js +15 -7
- package/hooks/gsd-update-banner.js +8 -0
- package/hooks/gsd-windsurf-pre-write.js +11 -2
- package/hooks/gsd-workflow-guard.js +5 -4
- package/hooks/gsd-worktree-path-guard.js +6 -2
- package/hooks/hooks.json +5 -5
- package/hooks/lib/cli-exit.js +12 -0
- package/hooks/lib/git-probe.js +17 -1
- package/hooks/lib/isolation-sentinel.js +2 -2
- package/package.json +21 -4
- package/scripts/changeset/parse.cjs +52 -4
- package/scripts/ci-timeout-report.cjs +770 -4
- package/scripts/command-contract-helpers.cjs +12 -8
- package/scripts/docs-guard-registry.cjs +6 -0
- package/scripts/gen-features.cjs +13 -8
- package/scripts/gen-hooks-cli-exit.cjs +12 -28
- package/scripts/gen-loop-host-contract.cjs +10 -1
- package/scripts/gen-platform-conformance-tier.cjs +187 -1
- package/scripts/gen-plugin-skills.cjs +87 -1
- package/scripts/gen-research-agents.cjs +24 -31
- package/scripts/gen-scripts-cli-exit.cjs +30 -3
- package/scripts/gen-test-timings.cjs +32 -7
- package/scripts/lib/cli-exit.cjs +12 -0
- package/scripts/lib/macos-conformance-tier.generated.cjs +20 -2
- package/scripts/lib/ndjson-reporter.cjs +28 -3
- package/scripts/lib/platform-conformance-tier.generated.cjs +34 -5
- package/scripts/lib/registration-ledger-preload.cjs +155 -0
- package/scripts/lib/vendor-bundle.cjs +59 -0
- package/scripts/lib/vendor-licenses/saxes-6.0.0.txt +64 -0
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-completion-predicate-drift.cjs +18 -19
- package/scripts/lint-descriptions.cjs +7 -3
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +10 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +20 -0
- package/scripts/lint-frontmatter-fence-drift.cjs +313 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +122 -16
- package/scripts/lint-phase-enumeration-drift.cjs +12 -8
- package/scripts/lint-phase-id-drift.cjs +29 -0
- package/scripts/lint-planning-document-positive-control.cjs +329 -0
- package/scripts/lint-response-language-coverage.cjs +3 -0
- package/scripts/lint-skill-deps.cjs +7 -3
- package/scripts/lint-test-file-count.allowlist.json +11 -1
- package/scripts/lint-test-file-count.cjs +34 -1
- package/scripts/lint-vendored-deps.cjs +41 -5
- package/scripts/lint-workflow-shellcheck-baseline.json +10 -10
- package/scripts/mutation-matrix.cjs +50 -5
- package/scripts/require-issue-link-policy.cjs +6 -2
- package/scripts/sync-runtime-launcher.cjs +184 -2
- package/scripts/verify-npm-publish.cjs +76 -20
- package/skills/gsd-add-tests/SKILL.md +6 -1
- package/skills/gsd-ai-integration-phase/SKILL.md +6 -1
- package/skills/gsd-audit-fix/SKILL.md +5 -0
- package/skills/gsd-audit-milestone/SKILL.md +6 -1
- package/skills/gsd-autonomous/SKILL.md +5 -0
- package/skills/gsd-capture/SKILL.md +8 -4
- package/skills/gsd-code-review/SKILL.md +7 -2
- package/skills/gsd-complete-milestone/SKILL.md +4 -0
- package/skills/gsd-config/SKILL.md +8 -4
- package/skills/gsd-debug/SKILL.md +11 -7
- package/skills/gsd-discuss-phase/SKILL.md +7 -3
- package/skills/gsd-docs-update/SKILL.md +12 -7
- package/skills/gsd-eval-review/SKILL.md +6 -1
- package/skills/gsd-execute-phase/SKILL.md +12 -7
- package/skills/gsd-extract-learnings/SKILL.md +5 -0
- package/skills/gsd-fast/SKILL.md +4 -0
- package/skills/gsd-forensics/SKILL.md +5 -1
- package/skills/gsd-graphify/SKILL.md +10 -6
- package/skills/gsd-health/SKILL.md +5 -0
- package/skills/gsd-help/SKILL.md +7 -2
- package/skills/gsd-import/SKILL.md +7 -3
- package/skills/gsd-inbox/SKILL.md +5 -0
- package/skills/gsd-ingest-docs/SKILL.md +5 -1
- package/skills/gsd-manager/SKILL.md +6 -1
- package/skills/gsd-map-codebase/SKILL.md +7 -3
- package/skills/gsd-mempalace-capture/SKILL.md +5 -1
- package/skills/gsd-mempalace-recall/SKILL.md +5 -1
- package/skills/gsd-milestone-summary/SKILL.md +5 -1
- package/skills/gsd-mvp-phase/SKILL.md +8 -3
- package/skills/gsd-new-milestone/SKILL.md +6 -1
- package/skills/gsd-new-project/SKILL.md +5 -0
- package/skills/gsd-next/SKILL.md +6 -1
- package/skills/gsd-ns-context/SKILL.md +4 -0
- package/skills/gsd-ns-ideate/SKILL.md +4 -0
- package/skills/gsd-ns-manage/SKILL.md +4 -0
- package/skills/gsd-ns-project/SKILL.md +4 -0
- package/skills/gsd-ns-review/SKILL.md +4 -0
- package/skills/gsd-ns-workflow/SKILL.md +4 -0
- package/skills/gsd-onboard/SKILL.md +6 -1
- package/skills/gsd-pause-work/SKILL.md +5 -1
- package/skills/gsd-phase/SKILL.md +8 -4
- package/skills/gsd-plan-phase/SKILL.md +6 -1
- package/skills/gsd-plan-review-convergence/SKILL.md +5 -1
- package/skills/gsd-pr-branch/SKILL.md +4 -0
- package/skills/gsd-profile-user/SKILL.md +5 -1
- package/skills/gsd-progress/SKILL.md +6 -1
- package/skills/gsd-quick/SKILL.md +16 -10
- package/skills/gsd-quick-batch/SKILL.md +20 -8
- package/skills/gsd-review/SKILL.md +5 -1
- package/skills/gsd-review-backlog/SKILL.md +3 -2
- package/skills/gsd-secure-phase/SKILL.md +6 -1
- package/skills/gsd-ship/SKILL.md +5 -0
- package/skills/gsd-sketch/SKILL.md +7 -2
- package/skills/gsd-spec-phase/SKILL.md +5 -1
- package/skills/gsd-spike/SKILL.md +8 -3
- package/skills/gsd-surface/SKILL.md +5 -1
- package/skills/gsd-thread/SKILL.md +4 -0
- package/skills/gsd-ui-phase/SKILL.md +6 -1
- package/skills/gsd-ui-review/SKILL.md +6 -1
- package/skills/gsd-ultraplan-phase/SKILL.md +5 -1
- package/skills/gsd-undo/SKILL.md +5 -1
- package/skills/gsd-update/SKILL.md +6 -2
- package/skills/gsd-validate-phase/SKILL.md +6 -1
- package/skills/gsd-verify-work/SKILL.md +6 -1
- package/skills/gsd-workspace/SKILL.md +7 -3
- package/skills/gsd-workstreams/SKILL.md +6 -6
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/execute-phase/steps/stale-reverification.md +0 -24
|
@@ -34,6 +34,9 @@ const coreUtilsMod = require("./core-utils.cjs");
|
|
|
34
34
|
const markdownSectionizerMod = require("./markdown-sectionizer.cjs");
|
|
35
35
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
36
36
|
const planScanMod = require("./plan-scan.cjs");
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
38
|
+
const stateMod = require("./state.cjs");
|
|
39
|
+
const planning_document_cjs_1 = require("./planning-document.cjs");
|
|
37
40
|
const { planningDir } = planningWorkspace;
|
|
38
41
|
const { listAllPhaseDirs } = phaseLocatorMod;
|
|
39
42
|
const { SCOPE } = planningScopeMod;
|
|
@@ -41,7 +44,22 @@ const { SCOPE } = planningScopeMod;
|
|
|
41
44
|
// (src/frontmatter.cts) rather than a bespoke YAML touch — `spliceFrontmatter`
|
|
42
45
|
// already solves "change exactly one key, preserve every other key's raw text
|
|
43
46
|
// byte-for-byte", which is exactly the contract a `depends_on` rewrite needs.
|
|
44
|
-
const { extractFrontmatter, spliceFrontmatter } = frontmatterMod;
|
|
47
|
+
const { extractFrontmatter, spliceFrontmatter, isFrontmatterWriteRefusal } = frontmatterMod;
|
|
48
|
+
/**
|
|
49
|
+
* The migration's fail-closed error for a phase artifact whose frontmatter the shared
|
|
50
|
+
* writer refuses to rewrite: it names the artifact's full path and, for a write refusal,
|
|
51
|
+
* the refusal code (also set as `code` on the error) — so the user can find the file and
|
|
52
|
+
* see why (found while implementing #5105).
|
|
53
|
+
*/
|
|
54
|
+
function frontmatterRewriteError(what, filePath, sourceToken, targetToken, err) {
|
|
55
|
+
const code = isFrontmatterWriteRefusal(err) ? err.code : undefined;
|
|
56
|
+
const rewriteErr = new Error(`Cannot rewrite ${what} in ${JSON.stringify(filePath)} for phase token change `
|
|
57
|
+
+ `${JSON.stringify(sourceToken)} -> ${JSON.stringify(targetToken)}`
|
|
58
|
+
+ `${code ? ` [${code}]` : ''}: ${err.message}`);
|
|
59
|
+
if (code)
|
|
60
|
+
rewriteErr.code = code;
|
|
61
|
+
return rewriteErr;
|
|
62
|
+
}
|
|
45
63
|
const { milestoneSections, isPhaseHeadingText } = roadmapParserMod;
|
|
46
64
|
const { normalizeDependencyToken } = phaseMod;
|
|
47
65
|
// #4144 round 5 Blocker 3: the single owner of the canonical short-alias
|
|
@@ -51,7 +69,11 @@ const { extractCanonicalPlanId } = coreUtilsMod;
|
|
|
51
69
|
// #4144 round 5 Blocker 4: the readers' own fence-scanning engine
|
|
52
70
|
// (tokenizeHeadings is built on this same seam) — reused here instead of a
|
|
53
71
|
// third independent fence parser.
|
|
54
|
-
const { scanFencedBlocks } = markdownSectionizerMod;
|
|
72
|
+
const { scanFencedBlocks, updateBullet, updateHeading } = markdownSectionizerMod;
|
|
73
|
+
// ADR-5057 §6 (Phase 13, #5217): every mutation of a planning artifact goes
|
|
74
|
+
// through its seam — headings/bullets through the sectionizer, PROJECT.md
|
|
75
|
+
// prose through PlanningDoc, STATE.md through its own write seam.
|
|
76
|
+
const { readModifyWriteStateMd } = stateMod;
|
|
55
77
|
// #4144 round 5 follow-up (lint-plan-count-drift): the plan-scan owner's own
|
|
56
78
|
// root-plan-file predicate (src/plan-scan.cts) — reused in
|
|
57
79
|
// computeDependsOnRewrites instead of a private `/-PLAN\.md$/i` filename
|
|
@@ -113,7 +135,7 @@ const PROJECT_CODE_RE = new RegExp(`^${BRACKET_PROJECT_CODE_SRC}$`);
|
|
|
113
135
|
// `.` never matches `\r` (it is its own LineTerminator, ECMA-262), so a CRLF
|
|
114
136
|
// roadmap's `\r` sat just past the `(.*)` group's end — present in the LINE
|
|
115
137
|
// but absent from `headingTail`, which the heading rebuild below is built
|
|
116
|
-
// from. Since `
|
|
138
|
+
// from. Since the roadmap rewrite (`rewriteRoadmapLines`) replaces a touched line's FULL text with
|
|
117
139
|
// the rebuilt one, every converted heading silently lost its `\r` while
|
|
118
140
|
// every untouched line (and every checklist bullet, whose rewrite instead
|
|
119
141
|
// slices the line's own remainder rather than reassembling captured groups)
|
|
@@ -698,8 +720,7 @@ function computeDependsOnRewrites(oldDirPath, sourceToken, targetToken, fileRena
|
|
|
698
720
|
// must never be silently dropped — refuse before any write, the same
|
|
699
721
|
// contract every other unrepresentable case in this file already
|
|
700
722
|
// follows (e.g. computeArtifactRenames' collision refusal above).
|
|
701
|
-
throw
|
|
702
|
-
+ `${JSON.stringify(sourceToken)} -> ${JSON.stringify(targetToken)}: ${err.message}`);
|
|
723
|
+
throw frontmatterRewriteError('depends_on', filePath, sourceToken, targetToken, err);
|
|
703
724
|
}
|
|
704
725
|
rewrites.push({
|
|
705
726
|
oldName: entry.name,
|
|
@@ -800,8 +821,7 @@ function computePhaseFrontmatterRewrites(oldDirPath, dirName, sourceToken, targe
|
|
|
800
821
|
catch (err) {
|
|
801
822
|
// Same refuse-before-any-write contract every other unrepresentable
|
|
802
823
|
// frontmatter rewrite in this file already follows.
|
|
803
|
-
throw
|
|
804
|
-
+ `${JSON.stringify(sourceToken)} -> ${JSON.stringify(targetToken)}: ${err.message}`);
|
|
824
|
+
throw frontmatterRewriteError('phase frontmatter', filePath, sourceToken, targetToken, err);
|
|
805
825
|
}
|
|
806
826
|
const finalName = renameByOldName.get(entry.name) ?? entry.name;
|
|
807
827
|
if (existing) {
|
|
@@ -1817,40 +1837,71 @@ function computeMigrationPlan(cwd, options = {}) {
|
|
|
1817
1837
|
crossRefEdits,
|
|
1818
1838
|
};
|
|
1819
1839
|
}
|
|
1840
|
+
// ─── Seam-routed planning writes (ADR-5057 §6, Phase 13, #5217) ───────────────
|
|
1820
1841
|
/**
|
|
1821
|
-
* Apply
|
|
1822
|
-
*
|
|
1823
|
-
*
|
|
1824
|
-
*
|
|
1825
|
-
*
|
|
1826
|
-
*
|
|
1827
|
-
*
|
|
1828
|
-
*
|
|
1829
|
-
*
|
|
1830
|
-
*
|
|
1831
|
-
*
|
|
1842
|
+
* Apply the plan's ROADMAP.md line edits through the sectionizer seam: a
|
|
1843
|
+
* heading edit through `updateHeading`, a checklist edit through
|
|
1844
|
+
* `updateBullet`. Both match on the plan's own `lineIndex` AND exact line text
|
|
1845
|
+
* (`split('\n')` indexing, a trailing `\r` is part of the line), so two
|
|
1846
|
+
* headings with identical text in different milestones stay distinct, a stale
|
|
1847
|
+
* edit is left untouched, and every untouched byte is copied verbatim.
|
|
1848
|
+
*
|
|
1849
|
+
* An edit whose target line is still its `from` text after both seams ran was
|
|
1850
|
+
* refused by the seam (a line the sectionizer does not read as a heading or
|
|
1851
|
+
* bullet — fenced, or not CommonMark-shaped). That is thrown, never skipped:
|
|
1852
|
+
* a silently-skipped edit leaves ROADMAP.md half-migrated, and the mixed-state
|
|
1853
|
+
* guard then refuses every retry. `applyMigration` rolls back on the throw.
|
|
1832
1854
|
*/
|
|
1833
|
-
function
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
const
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1855
|
+
function rewriteRoadmapLines(content, plannedEdits) {
|
|
1856
|
+
// The planner reads raw lines, so it also plans edits for phase-shaped lines
|
|
1857
|
+
// inside a fenced example block. Fenced content is never a heading or a
|
|
1858
|
+
// bullet (the sectionizer's own view), so those edits are dropped here —
|
|
1859
|
+
// not thrown: a fenced example must neither be rewritten nor block the
|
|
1860
|
+
// migration.
|
|
1861
|
+
const fencedLines = new Set();
|
|
1862
|
+
const physicalLines = content.split('\n');
|
|
1863
|
+
for (const block of scanFencedBlocks(physicalLines)) {
|
|
1864
|
+
const last = block.closeLineIdx === -1 ? physicalLines.length - 1 : block.closeLineIdx;
|
|
1865
|
+
for (let i = block.openLineIdx; i <= last; i++)
|
|
1866
|
+
fencedLines.add(i);
|
|
1867
|
+
}
|
|
1868
|
+
const edits = plannedEdits.filter((edit) => !fencedLines.has(edit.lineIndex));
|
|
1869
|
+
let result = content;
|
|
1870
|
+
for (const edit of edits) {
|
|
1871
|
+
const atTarget = (rawLine, lineIndex) => lineIndex === edit.lineIndex && rawLine === edit.from;
|
|
1872
|
+
const swap = () => edit.to;
|
|
1873
|
+
result = updateHeading(result, (_heading, rawLine, lineIndex) => atTarget(rawLine, lineIndex), swap);
|
|
1874
|
+
result = updateBullet(result, (_text, rawLine, lineIndex) => atTarget(rawLine, lineIndex), swap);
|
|
1875
|
+
}
|
|
1876
|
+
const lines = result.split('\n');
|
|
1877
|
+
for (const edit of edits) {
|
|
1878
|
+
if (edit.from !== edit.to && lines[edit.lineIndex] === edit.from) {
|
|
1879
|
+
throw new Error(`ROADMAP.md line ${edit.lineIndex + 1} (${JSON.stringify(edit.from)}) is not a heading or checklist `
|
|
1880
|
+
+ 'line the planning seam can rewrite');
|
|
1881
|
+
}
|
|
1851
1882
|
}
|
|
1852
1883
|
return result;
|
|
1853
1884
|
}
|
|
1885
|
+
/**
|
|
1886
|
+
* Apply the cross-reference substitutions to one planning artifact's content
|
|
1887
|
+
* through `PlanningDoc` (`replaceProse`), in plan order. A document the seam
|
|
1888
|
+
* cannot read (an unterminated frontmatter fence) is refused — thrown, so the
|
|
1889
|
+
* migration rolls back — rather than rewritten blind.
|
|
1890
|
+
*/
|
|
1891
|
+
function substituteCrossRefs(content, fileName, edits) {
|
|
1892
|
+
const parsed = (0, planning_document_cjs_1.parsePlanningDoc)(content, fileName);
|
|
1893
|
+
if (!parsed.ok) {
|
|
1894
|
+
throw new Error(`${fileName} cannot be read as a planning document: ${parsed.reason}`);
|
|
1895
|
+
}
|
|
1896
|
+
let doc = parsed.value;
|
|
1897
|
+
for (const edit of edits) {
|
|
1898
|
+
const next = (0, planning_document_cjs_1.replaceProse)(doc, edit.from, edit.to);
|
|
1899
|
+
if (!next.ok)
|
|
1900
|
+
throw new Error(`${fileName} cross-reference rewrite refused: ${next.reason}`);
|
|
1901
|
+
doc = next.value;
|
|
1902
|
+
}
|
|
1903
|
+
return doc.source;
|
|
1904
|
+
}
|
|
1854
1905
|
// ─── applyMigration ───────────────────────────────────────────────────────────
|
|
1855
1906
|
/**
|
|
1856
1907
|
* Apply the migration plan computed by computeMigrationPlan().
|
|
@@ -1944,6 +1995,18 @@ function applyMigration(cwd, plan, options = {}) {
|
|
|
1944
1995
|
const currentPath = node_path_1.default.join(newPath, rewrite.finalName);
|
|
1945
1996
|
if (node_fs_1.default.existsSync(currentPath)) {
|
|
1946
1997
|
const originalPath = node_path_1.default.join(oldPath, rewrite.oldName);
|
|
1998
|
+
// `rewrite.to` is the frontmatter seam's own output
|
|
1999
|
+
// (`spliceFrontmatter`, computed in computeDependsOnRewrites); it is
|
|
2000
|
+
// only persisted over the exact content it was computed from, so a
|
|
2001
|
+
// plan file edited since the plan was made is refused, never
|
|
2002
|
+
// clobbered with a stale whole-file image. The check runs BEFORE
|
|
2003
|
+
// the backup is recorded: the backup holds `rewrite.from`, which is
|
|
2004
|
+
// only the file's real content once this check has passed — recording
|
|
2005
|
+
// it first would make the rollback restore stale content over the
|
|
2006
|
+
// edited file.
|
|
2007
|
+
if (node_fs_1.default.readFileSync(currentPath, 'utf8') !== rewrite.from) {
|
|
2008
|
+
throw new Error(`${JSON.stringify(node_path_1.default.join('phases', phaseEntry.newDir, rewrite.finalName))} changed since the migration plan was computed`);
|
|
2009
|
+
}
|
|
1947
2010
|
if (!fileBackups.has(originalPath)) {
|
|
1948
2011
|
fileBackups.set(originalPath, { existed: true, content: rewrite.from });
|
|
1949
2012
|
}
|
|
@@ -1956,36 +2019,36 @@ function applyMigration(cwd, plan, options = {}) {
|
|
|
1956
2019
|
// 2. Rewrite ROADMAP.md phase headings
|
|
1957
2020
|
if (plan.roadmapEdits.length > 0) {
|
|
1958
2021
|
const roadmapContent = node_fs_1.default.readFileSync(roadmapPath, 'utf8');
|
|
1959
|
-
const newRoadmapContent =
|
|
2022
|
+
const newRoadmapContent = rewriteRoadmapLines(roadmapContent, plan.roadmapEdits);
|
|
1960
2023
|
snapshotFile(roadmapPath);
|
|
1961
2024
|
node_fs_1.default.writeFileSync(roadmapPath, newRoadmapContent, 'utf8');
|
|
1962
2025
|
editedFiles.push('ROADMAP.md');
|
|
1963
2026
|
}
|
|
1964
2027
|
// 3. Rewrite cross-refs in STATE.md and PROJECT.md
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
2028
|
+
// Two targets, two writes, one per seam (ADR-5057 §6): PROJECT.md's
|
|
2029
|
+
// content is rewritten by PlanningDoc, STATE.md goes through its own
|
|
2030
|
+
// read-modify-write seam (ADR-3408: lock, frontmatter sync and
|
|
2031
|
+
// preservation; body-only edit).
|
|
2032
|
+
const crossRefsFor = (fileName) => plan.crossRefEdits.filter((edit) => edit.file === fileName);
|
|
2033
|
+
const projectEdits = crossRefsFor('PROJECT.md');
|
|
2034
|
+
const projectPath = node_path_1.default.join(pDir, 'PROJECT.md');
|
|
2035
|
+
if (projectEdits.length > 0 && node_fs_1.default.existsSync(projectPath)) {
|
|
2036
|
+
const original = node_fs_1.default.readFileSync(projectPath, 'utf8');
|
|
2037
|
+
const rewritten = substituteCrossRefs(original, 'PROJECT.md', projectEdits);
|
|
2038
|
+
if (rewritten !== original) {
|
|
2039
|
+
snapshotFile(projectPath);
|
|
2040
|
+
node_fs_1.default.writeFileSync(projectPath, rewritten, 'utf8');
|
|
2041
|
+
editedFiles.push('PROJECT.md');
|
|
1969
2042
|
}
|
|
1970
|
-
crossRefsByFile.get(edit.file).push(edit);
|
|
1971
2043
|
}
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
// Replace all occurrences
|
|
1981
|
-
content = content.split(edit.from).join(edit.to);
|
|
1982
|
-
changed = true;
|
|
1983
|
-
}
|
|
1984
|
-
}
|
|
1985
|
-
if (changed) {
|
|
1986
|
-
snapshotFile(filePath);
|
|
1987
|
-
node_fs_1.default.writeFileSync(filePath, content, 'utf8');
|
|
1988
|
-
editedFiles.push(fileName);
|
|
2044
|
+
const stateEdits = crossRefsFor('STATE.md');
|
|
2045
|
+
const stateMdPath = node_path_1.default.join(pDir, 'STATE.md');
|
|
2046
|
+
if (stateEdits.length > 0 && node_fs_1.default.existsSync(stateMdPath)) {
|
|
2047
|
+
const original = node_fs_1.default.readFileSync(stateMdPath, 'utf8');
|
|
2048
|
+
if (substituteCrossRefs(original, 'STATE.md', stateEdits) !== original) {
|
|
2049
|
+
snapshotFile(stateMdPath);
|
|
2050
|
+
readModifyWriteStateMd(stateMdPath, (current) => substituteCrossRefs(current, 'STATE.md', stateEdits), cwd, { resync: false });
|
|
2051
|
+
editedFiles.push('STATE.md');
|
|
1989
2052
|
}
|
|
1990
2053
|
}
|
|
1991
2054
|
// 4. Update config.json to the convention named by this plan — but only
|
|
@@ -2051,10 +2114,9 @@ module.exports = {
|
|
|
2051
2114
|
computeMigrationPlan,
|
|
2052
2115
|
applyMigration,
|
|
2053
2116
|
computeDependsOnRewrites,
|
|
2054
|
-
// #4698 review round 28: exported
|
|
2055
|
-
//
|
|
2056
|
-
//
|
|
2057
|
-
//
|
|
2058
|
-
|
|
2059
|
-
applyRoadmapEdits,
|
|
2117
|
+
// #4698 review round 28 precedent (ADR-1508): exported solely so the property
|
|
2118
|
+
// test drives the REAL roadmap transform `applyMigration` writes through —
|
|
2119
|
+
// which is now a composition of sectionizer seams (`updateHeading`,
|
|
2120
|
+
// `updateBullet`), not a line-indexer of its own. Not a new production seam.
|
|
2121
|
+
rewriteRoadmapLines,
|
|
2060
2122
|
};
|