@opengsd/gsd-core 1.13.0 → 1.15.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/README.ja-JP.md +3 -3
- package/README.ko-KR.md +3 -3
- package/README.pt-BR.md +3 -3
- package/README.zh-CN.md +3 -3
- package/agents/gsd-advisor-researcher.compact.md +85 -0
- package/agents/gsd-ai-researcher.compact.md +96 -0
- package/agents/gsd-assumptions-analyzer.compact.md +81 -0
- package/agents/gsd-code-fixer.compact.md +459 -0
- package/agents/gsd-code-fixer.md +9 -8
- package/agents/gsd-code-reviewer.compact.md +269 -0
- package/agents/gsd-code-reviewer.md +15 -3
- package/agents/gsd-codebase-mapper.compact.md +760 -0
- package/agents/gsd-debug-session-manager.compact.md +360 -0
- package/agents/gsd-debug-session-manager.md +17 -2
- package/agents/gsd-debugger.md +2 -2
- package/agents/gsd-doc-classifier.compact.md +192 -0
- package/agents/gsd-doc-synthesizer.compact.md +200 -0
- package/agents/gsd-doc-verifier.compact.md +143 -0
- package/agents/gsd-doc-writer.compact.md +440 -0
- package/agents/gsd-dom-verifier.compact.md +138 -0
- package/agents/gsd-domain-researcher.compact.md +141 -0
- package/agents/gsd-eval-auditor.compact.md +160 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-eval-planner.compact.md +137 -0
- package/agents/gsd-executor.md +13 -8
- package/agents/gsd-framework-selector.compact.md +82 -0
- package/agents/gsd-integration-checker.compact.md +245 -0
- package/agents/gsd-intel-updater.compact.md +226 -0
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.compact.md +45 -0
- package/agents/gsd-nyquist-auditor.compact.md +179 -0
- package/agents/gsd-pattern-mapper.compact.md +275 -0
- package/agents/gsd-phase-researcher.md +19 -11
- package/agents/gsd-plan-checker.md +8 -7
- package/agents/gsd-planner.md +12 -8
- package/agents/gsd-project-researcher.compact.md +587 -0
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.compact.md +212 -0
- package/agents/gsd-research-synthesizer.md +1 -1
- package/agents/gsd-roadmapper.compact.md +454 -0
- package/agents/gsd-roadmapper.md +13 -0
- package/agents/gsd-security-auditor.compact.md +162 -0
- package/agents/gsd-ui-auditor.compact.md +404 -0
- package/agents/gsd-ui-auditor.md +155 -17
- package/agents/gsd-ui-checker.compact.md +277 -0
- package/agents/gsd-ui-researcher.compact.md +282 -0
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-user-profiler.compact.md +108 -0
- package/agents/gsd-verifier.md +10 -9
- package/bin/install.js +848 -163
- package/commands/gsd/autonomous.md +2 -2
- package/commands/gsd/capture.md +1 -1
- package/commands/gsd/cleanup.md +1 -0
- package/commands/gsd/code-review.md +2 -1
- package/commands/gsd/complete-milestone.md +1 -0
- package/commands/gsd/config.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/graphify.md +1 -0
- package/commands/gsd/health.md +1 -0
- package/commands/gsd/mempalace-capture.md +8 -3
- package/commands/gsd/mempalace-recall.md +1 -0
- package/commands/gsd/new-milestone.md +1 -0
- package/commands/gsd/new-project.md +1 -0
- package/commands/gsd/next.md +1 -0
- package/commands/gsd/pause-work.md +1 -0
- package/commands/gsd/phase.md +1 -0
- package/commands/gsd/plan-review-convergence.md +6 -6
- package/commands/gsd/pr-branch.md +1 -0
- package/commands/gsd/progress.md +1 -1
- package/commands/gsd/quick-batch.md +1 -1
- package/commands/gsd/resume-work.md +1 -0
- package/commands/gsd/review-backlog.md +1 -0
- package/commands/gsd/review.md +2 -3
- package/commands/gsd/settings.md +2 -1
- package/commands/gsd/stats.md +1 -0
- package/commands/gsd/thread.md +1 -0
- package/commands/gsd/workspace.md +1 -0
- package/commands/gsd/workstreams.md +1 -0
- package/gsd-core/bin/check-latest-version.cjs +8 -3
- package/gsd-core/bin/gsd-tools.cjs +672 -146
- package/gsd-core/bin/lib/adr-parser.cjs +4 -2
- package/gsd-core/bin/lib/artifacts.cjs +2 -1
- package/gsd-core/bin/lib/audit.cjs +119 -34
- package/gsd-core/bin/lib/broken-windows.cjs +168 -49
- package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
- package/gsd-core/bin/lib/capability-loader.cjs +135 -1
- package/gsd-core/bin/lib/capability-registry.cjs +96 -189
- package/gsd-core/bin/lib/capability-source.cjs +19 -2
- package/gsd-core/bin/lib/capability-validator.cjs +14 -2
- package/gsd-core/bin/lib/check-command-router.cjs +213 -49
- package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
- package/gsd-core/bin/lib/codex-agent-toml.cjs +21 -25
- package/gsd-core/bin/lib/commands.cjs +823 -112
- package/gsd-core/bin/lib/config-loader.cjs +66 -4
- package/gsd-core/bin/lib/config.cjs +186 -45
- package/gsd-core/bin/lib/coverage.cjs +1 -1
- package/gsd-core/bin/lib/decisions.cjs +164 -45
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
- package/gsd-core/bin/lib/frontmatter.cjs +13 -0
- package/gsd-core/bin/lib/graphify.cjs +10 -2
- package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +12 -1
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
- package/gsd-core/bin/lib/init.cjs +614 -86
- package/gsd-core/bin/lib/install-engine.cjs +29 -3
- package/gsd-core/bin/lib/install-profiles.cjs +14 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +41 -5
- package/gsd-core/bin/lib/loop-resolver.cjs +50 -31
- package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
- package/gsd-core/bin/lib/milestone.cjs +37 -13
- package/gsd-core/bin/lib/model-resolver.cjs +253 -53
- package/gsd-core/bin/lib/phase-command-router.cjs +16 -2
- package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
- package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
- package/gsd-core/bin/lib/phase-id.cjs +268 -27
- package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
- package/gsd-core/bin/lib/phase-locator.cjs +29 -10
- package/gsd-core/bin/lib/phase.cjs +393 -88
- package/gsd-core/bin/lib/plan-document.cjs +49 -1
- package/gsd-core/bin/lib/planning-document.cjs +459 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +52 -19
- package/gsd-core/bin/lib/planning-snapshot.cjs +61 -12
- package/gsd-core/bin/lib/planning-workspace.cjs +57 -3
- package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
- package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
- package/gsd-core/bin/lib/probe-core.cjs +7 -1
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
- package/gsd-core/bin/lib/project-root.cjs +41 -2
- package/gsd-core/bin/lib/quick-batch.cjs +1 -1
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +61 -2
- package/gsd-core/bin/lib/research-store.cjs +11 -12
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
- package/gsd-core/bin/lib/review-lane-invocation.cjs +23 -0
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
- package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +12 -4
- package/gsd-core/bin/lib/roadmap-parser.cjs +219 -18
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +1539 -13
- package/gsd-core/bin/lib/roadmap.cjs +356 -42
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +310 -41
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +15 -4
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +13 -5
- package/gsd-core/bin/lib/runtime-homes.cjs +4 -0
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -37
- package/gsd-core/bin/lib/runtime-name-policy.cjs +111 -1
- package/gsd-core/bin/lib/security.cjs +126 -7
- package/gsd-core/bin/lib/shell-command-projection.cjs +10 -6
- package/gsd-core/bin/lib/state-document.cjs +130 -28
- package/gsd-core/bin/lib/state-md-schema.cjs +21 -14
- package/gsd-core/bin/lib/state-transition.cjs +181 -30
- package/gsd-core/bin/lib/state.cjs +265 -27
- package/gsd-core/bin/lib/surface.cjs +77 -3
- package/gsd-core/bin/lib/task-command-router.cjs +12 -6
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +78 -5
- package/gsd-core/bin/lib/uat-predicate.cjs +47 -4
- package/gsd-core/bin/lib/uat.cjs +9 -1
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +100 -9
- package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
- package/gsd-core/bin/lib/update-context.cjs +30 -24
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
- package/gsd-core/bin/lib/verification.cjs +315 -30
- package/gsd-core/bin/lib/verify-command-grounding.cjs +47 -3
- package/gsd-core/bin/lib/verify.cjs +320 -48
- package/gsd-core/bin/lib/workstream-inventory.cjs +1 -0
- package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
- package/gsd-core/bin/lib/worktree-safety.cjs +797 -58
- package/gsd-core/bin/shared/config-defaults.manifest.json +4 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +6 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +439 -80
- package/gsd-core/references/checkpoints.md +5 -3
- package/gsd-core/references/compact-content-gate.md +66 -0
- package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe.md +195 -21
- package/gsd-core/references/execute-phase-between-wave-reset.md +7 -6
- package/gsd-core/references/execute-phase-wave-guard.md +22 -11
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +18 -0
- package/gsd-core/references/model-profiles.md +13 -4
- package/gsd-core/references/phase-argument-parsing.md +9 -7
- package/gsd-core/references/phase-id-convention.md +28 -0
- package/gsd-core/references/planner-gap-closure.md +2 -0
- package/gsd-core/references/planner-load-graph-context.md +24 -13
- package/gsd-core/references/planner-verify-command-grounding.md +14 -0
- package/gsd-core/references/planning-config.md +14 -2
- package/gsd-core/references/tdd.md +30 -4
- package/gsd-core/references/thinking-models-planning.md +18 -2
- package/gsd-core/references/ui-consideration-probe.md +10 -5
- package/gsd-core/references/verification-patterns.md +17 -4
- package/gsd-core/references/verify-command-path-resolvability.md +10 -2
- package/gsd-core/references/worktree-path-safety.md +433 -2
- package/gsd-core/templates/README.md +7 -1
- package/gsd-core/templates/state.md +6 -3
- package/gsd-core/templates/summary.compact.md +212 -0
- package/gsd-core/templates/user-setup.compact.md +199 -0
- package/gsd-core/templates/user-setup.md +0 -9
- 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 +1 -1
- package/gsd-core/workflows/add-tests.md +2 -2
- package/gsd-core/workflows/add-todo.md +6 -5
- package/gsd-core/workflows/ai-integration-phase.md +11 -3
- package/gsd-core/workflows/audit-fix.md +1 -1
- package/gsd-core/workflows/audit-milestone.md +1 -1
- package/gsd-core/workflows/audit-uat.md +1 -1
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
- package/gsd-core/workflows/autonomous.md +29 -16
- package/gsd-core/workflows/check-todos.md +6 -4
- package/gsd-core/workflows/cleanup.md +5 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +8 -1
- package/gsd-core/workflows/code-review-fix.md +108 -22
- package/gsd-core/workflows/code-review.md +216 -73
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
- package/gsd-core/workflows/complete-milestone.md +41 -264
- package/gsd-core/workflows/debug.md +3 -3
- package/gsd-core/workflows/diagnose-issues.md +1 -1
- 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 +1 -1
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +2 -2
- package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
- package/gsd-core/workflows/docs-update.md +17 -158
- package/gsd-core/workflows/edit-phase.md +1 -1
- package/gsd-core/workflows/eval-review.md +10 -3
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
- package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1017 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +19 -4
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +43 -4
- package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- 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 +46 -9
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
- package/gsd-core/workflows/execute-phase/steps/stale-reverification.md +24 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
- package/gsd-core/workflows/execute-phase.md +83 -172
- package/gsd-core/workflows/execute-plan.md +24 -10
- package/gsd-core/workflows/explore.md +3 -3
- package/gsd-core/workflows/extract-learnings.md +2 -1
- 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 -2
- package/gsd-core/workflows/help/modes/full.compact.md +398 -0
- package/gsd-core/workflows/help/modes/full.md +5 -5
- package/gsd-core/workflows/help/modes/topic.md +15 -5
- package/gsd-core/workflows/help.md +1 -1
- package/gsd-core/workflows/import.md +2 -2
- package/gsd-core/workflows/inbox.md +2 -2
- package/gsd-core/workflows/ingest-docs.md +3 -3
- package/gsd-core/workflows/insert-phase.md +1 -1
- package/gsd-core/workflows/list-seeds.md +1 -1
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +2 -2
- package/gsd-core/workflows/map-codebase.md +52 -5
- package/gsd-core/workflows/milestone-summary.md +1 -1
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +56 -14
- package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
- package/gsd-core/workflows/new-project.md +39 -209
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +1 -1
- package/gsd-core/workflows/note.md +1 -1
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +1 -1
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
- package/gsd-core/workflows/plan-phase.md +45 -187
- package/gsd-core/workflows/plan-review-convergence.md +21 -5
- package/gsd-core/workflows/plant-seed.md +62 -20
- package/gsd-core/workflows/pr-branch.md +132 -20
- package/gsd-core/workflows/profile-user.md +2 -2
- package/gsd-core/workflows/progress.md +1 -1
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +25 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +1 -1
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +1 -1
- 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 +1 -1
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
- package/gsd-core/workflows/quick-batch.md +1 -1
- package/gsd-core/workflows/quick.md +29 -10
- package/gsd-core/workflows/reapply-patches.md +86 -6
- package/gsd-core/workflows/remove-phase.md +1 -1
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +1 -1
- package/gsd-core/workflows/review.md +31 -16
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +3 -2
- package/gsd-core/workflows/settings-advanced.md +30 -10
- package/gsd-core/workflows/settings-integrations.md +2 -3
- package/gsd-core/workflows/settings.md +22 -9
- package/gsd-core/workflows/ship.md +3 -2
- 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 +2 -2
- package/gsd-core/workflows/spec-phase.md +15 -5
- 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 +5 -5
- package/gsd-core/workflows/thread.md +1 -1
- package/gsd-core/workflows/transition.md +1 -1
- package/gsd-core/workflows/ui-phase.md +44 -8
- package/gsd-core/workflows/ui-review.md +18 -4
- package/gsd-core/workflows/ultraplan-phase.md +1 -1
- package/gsd-core/workflows/undo.md +339 -20
- package/gsd-core/workflows/update.md +14 -12
- package/gsd-core/workflows/validate-phase.md +3 -2
- package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +101 -196
- package/hooks/dist/gsd-agent-isolation-guard.js +66 -16
- package/hooks/dist/gsd-context-monitor.js +88 -15
- package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
- package/hooks/dist/gsd-secret-read-guard.js +71 -19
- package/hooks/dist/gsd-statusline.js +81 -20
- package/hooks/dist/gsd-validate-commit.sh +97 -8
- package/hooks/dist/gsd-worktree-path-guard.js +25 -14
- package/hooks/dist/gsd-write-guard.js +46 -1
- package/hooks/dist/lib/dispatch-identity.js +187 -0
- package/hooks/dist/lib/filename-classification.js +64 -0
- package/hooks/dist/lib/isolation-deny-reason.js +53 -1
- package/hooks/dist/lib/isolation-sentinel.js +58 -19
- package/hooks/gsd-agent-isolation-guard.js +66 -16
- package/hooks/gsd-context-monitor.js +88 -15
- package/hooks/gsd-cursor-subagent-start.js +34 -14
- package/hooks/gsd-secret-read-guard.js +71 -19
- package/hooks/gsd-statusline.js +81 -20
- package/hooks/gsd-validate-commit.sh +97 -8
- package/hooks/gsd-worktree-path-guard.js +25 -14
- package/hooks/gsd-write-guard.js +46 -1
- package/hooks/lib/dispatch-identity.js +187 -0
- package/hooks/lib/filename-classification.js +64 -0
- package/hooks/lib/isolation-deny-reason.js +53 -1
- package/hooks/lib/isolation-sentinel.js +58 -19
- package/package.json +11 -6
- package/scripts/benchmark-compact-content-variants.cjs +298 -0
- package/scripts/benchmark-compact-content.cjs +368 -0
- package/scripts/build-hooks.js +15 -6
- package/scripts/check-contract-drift.cjs +131 -12
- package/scripts/check-env.cjs +36 -8
- package/scripts/check-glossary-refs.cjs +25 -21
- package/scripts/ci-next-health.cjs +271 -0
- package/scripts/ci-prepare-test-scope.cjs +7 -7
- package/scripts/ci-test-scope.cjs +126 -20
- package/scripts/ci-timeout-report.cjs +1 -1
- package/scripts/command-contract-helpers.cjs +3 -0
- package/scripts/diff-touches-shipped-paths.cjs +1 -1
- package/scripts/docs-guard-registry.cjs +35 -2
- package/scripts/gen-adr-index.cjs +8 -2
- package/scripts/gen-inventory-manifest.cjs +12 -0
- package/scripts/gen-loop-host-contract.cjs +69 -0
- package/scripts/gen-platform-conformance-tier.cjs +557 -0
- package/scripts/lib/drift-scan.cjs +1 -1
- package/scripts/lib/macos-conformance-tier.generated.cjs +224 -0
- package/scripts/lib/ndjson-reporter.cjs +3 -2
- package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +287 -0
- package/scripts/lib/suite-detection.cjs +32 -0
- package/scripts/lint-allowed-tools-parity.cjs +221 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +47 -3
- package/scripts/lint-phase-arg-assignment.cjs +257 -0
- package/scripts/lint-phase-id-drift.cjs +623 -13
- package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
- package/scripts/lint-response-language-coverage.cjs +9 -3
- package/scripts/lint-retired-runtime-name.cjs +619 -0
- package/scripts/lint-source-test-name-collision.cjs +1 -1
- package/scripts/lint-state-write-path-drift.cjs +93 -0
- package/scripts/lint-test-file-count.allowlist.json +29 -9
- package/scripts/lint-vendored-deps.cjs +128 -17
- package/scripts/lint-workflow-shellcheck-baseline.json +100 -0
- package/scripts/prompt-injection-scan.sh +18 -0
- package/scripts/release-tarball-smoke.cjs +194 -1
- package/scripts/workflow-size.cjs +139 -0
- package/skills/gsd-autonomous/SKILL.md +2 -2
- package/skills/gsd-capture/SKILL.md +1 -1
- package/skills/gsd-cleanup/SKILL.md +1 -0
- package/skills/gsd-code-review/SKILL.md +2 -1
- package/skills/gsd-complete-milestone/SKILL.md +1 -0
- package/skills/gsd-config/SKILL.md +1 -0
- package/skills/gsd-debug/SKILL.md +1 -0
- package/skills/gsd-graphify/SKILL.md +1 -0
- package/skills/gsd-health/SKILL.md +1 -0
- package/skills/gsd-mempalace-capture/SKILL.md +8 -3
- package/skills/gsd-mempalace-recall/SKILL.md +1 -0
- package/skills/gsd-new-milestone/SKILL.md +1 -0
- package/skills/gsd-new-project/SKILL.md +1 -0
- package/skills/gsd-next/SKILL.md +1 -0
- package/skills/gsd-pause-work/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +1 -0
- package/skills/gsd-plan-review-convergence/SKILL.md +5 -5
- package/skills/gsd-pr-branch/SKILL.md +1 -0
- package/skills/gsd-progress/SKILL.md +1 -1
- package/skills/gsd-quick-batch/SKILL.md +1 -1
- package/skills/gsd-resume-work/SKILL.md +1 -0
- package/skills/gsd-review/SKILL.md +2 -3
- package/skills/gsd-review-backlog/SKILL.md +1 -0
- package/skills/gsd-settings/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +1 -0
- package/skills/gsd-thread/SKILL.md +1 -0
- package/skills/gsd-workspace/SKILL.md +1 -0
- package/skills/gsd-workstreams/SKILL.md +1 -0
- package/vscode/package.json +1 -1
- package/gsd-core/templates/claude-md.md +0 -145
- package/gsd-core/templates/codebase/concerns.md +0 -310
- package/gsd-core/templates/codebase/conventions.md +0 -307
- package/gsd-core/templates/codebase/integrations.md +0 -280
- package/gsd-core/templates/codebase/structure.md +0 -285
- package/gsd-core/templates/codebase/testing.md +0 -480
- package/gsd-core/templates/debug-subagent-prompt.md +0 -91
- package/gsd-core/templates/discovery.md +0 -146
|
@@ -25,6 +25,7 @@ exports.getFieldClassification = getFieldClassification;
|
|
|
25
25
|
exports.getPreserveWhenUnchangedFields = getPreserveWhenUnchangedFields;
|
|
26
26
|
exports.openStateTransaction = openStateTransaction;
|
|
27
27
|
exports.rebuildStateTransaction = rebuildStateTransaction;
|
|
28
|
+
exports.createStateWriteIntent = createStateWriteIntent;
|
|
28
29
|
exports.applyPreserveWhenUnchanged = applyPreserveWhenUnchanged;
|
|
29
30
|
exports.applyStatePreservation = applyStatePreservation;
|
|
30
31
|
exports.transitionCore = transitionCore;
|
|
@@ -36,6 +37,11 @@ const state_document_cjs_2 = require("./state-document.cjs");
|
|
|
36
37
|
const markdown_sectionizer_cjs_1 = require("./markdown-sectionizer.cjs");
|
|
37
38
|
const phase_lifecycle_cjs_1 = require("./phase-lifecycle.cjs");
|
|
38
39
|
const pattern_cjs_1 = require("./pattern.cjs");
|
|
40
|
+
// #4129: the completion-ratio kernel for the resync-arm ratchet's percent
|
|
41
|
+
// (planning-scope's SCOPE — state-document's own dependency, no cycle here:
|
|
42
|
+
// state-document never imports this module).
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
44
|
+
const planningScopeMod = require("./planning-scope.cjs");
|
|
39
45
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
40
46
|
const stateMdSchemaMod = require("./state-md-schema.cjs");
|
|
41
47
|
const { STATE_FIELD_SCHEMA } = stateMdSchemaMod;
|
|
@@ -44,12 +50,13 @@ function formatProgressMachineSegment(percent) {
|
|
|
44
50
|
// ADR-3180 Decision 7: rounding and the 100 ceiling belong to the
|
|
45
51
|
// completion-ratio kernel. The floor is added here because this helper is
|
|
46
52
|
// also fed persisted frontmatter values (hand-editable, unlike the
|
|
47
|
-
// count-shaped entries into that kernel)
|
|
48
|
-
//
|
|
49
|
-
//
|
|
53
|
+
// count-shaped entries into that kernel). Bar and printed percent use the
|
|
54
|
+
// clamped value so the two halves of the segment can never disagree.
|
|
55
|
+
// #4294: the CELL count is the render kernel's — `renderProgressBar` holds a
|
|
56
|
+
// sub-100 percent one cell short of full, so `[██████████]` beside `95%`
|
|
57
|
+
// cannot recur here as a seventh inline copy of the rounding.
|
|
50
58
|
const clamped = Math.max(0, (0, phase_lifecycle_cjs_1.clampPercentFromFraction)(percent / 100));
|
|
51
|
-
|
|
52
|
-
return `[${'█'.repeat(filled)}${'░'.repeat(10 - filled)}] ${clamped}%`;
|
|
59
|
+
return `[${(0, phase_lifecycle_cjs_1.renderProgressBar)(clamped, 10)}] ${clamped}%`;
|
|
53
60
|
}
|
|
54
61
|
// Consumers (a future STATE.md writer that bypasses all three reintroduces the
|
|
55
62
|
// #4213 divergence class): `cmdStateUpdateProgress` and `syncCore`'s progress
|
|
@@ -60,11 +67,29 @@ function formatProgressMachineSegment(percent) {
|
|
|
60
67
|
// `syncCore`'s call here.
|
|
61
68
|
function stateReplaceProgressPercent(content, percent) {
|
|
62
69
|
const body = stripFrontmatter(content);
|
|
63
|
-
// #2177: bold `**Progress:**`
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
|
|
70
|
+
// #2177: bold `**Progress:**` takes priority over the plain `^Progress:`
|
|
71
|
+
// form, so an earlier free-text line starting with `Progress:` cannot
|
|
72
|
+
// capture the rewrite ahead of the real status line.
|
|
73
|
+
//
|
|
74
|
+
// #4243 (follow-up to #4453, maintainer ruling 2026-09-07): the bold form
|
|
75
|
+
// is also ANCHORED to line start, with same-line leading whitespace only —
|
|
76
|
+
// the exact idiom #4453 applied to stateReplaceField's bold branch. The
|
|
77
|
+
// pre-fix pattern carried no `^` and no `m` flag, so a bold percent-ish
|
|
78
|
+
// label quoted MID-SENTENCE inside prose (an Accumulated Context bullet
|
|
79
|
+
// mentioning `**Progress:**`) captured the machine-segment rewrite and
|
|
80
|
+
// destroyed the rest of its line, silently, while the real Progress line
|
|
81
|
+
// stayed stale — every caller (cmdStateUpdateProgress, syncCore's percent
|
|
82
|
+
// arm, applyPostSyncPreservation) feeds the whole document. #2177's own
|
|
83
|
+
// recorded requirements are unaffected: the frontmatter is stripped before
|
|
84
|
+
// matching (its defect was the YAML `progress:` key shadowing the body
|
|
85
|
+
// line), the suffix-preserving machine-segment swap is untouched, and the
|
|
86
|
+
// bold-beats-plain priority now governs LINE-START forms. The leading class
|
|
87
|
+
// is `[ \t]*`, deliberately NOT `\s*` — `^\s*\*\*` can consume the newlines
|
|
88
|
+
// before the label into the match and drop them on rebuild (#4010's
|
|
89
|
+
// same-line confinement hazard). `$` is explicit-and-inert (`[^\r\n]*`
|
|
90
|
+
// never crosses line terminators) and documents that the match ends at
|
|
91
|
+
// end-of-line.
|
|
92
|
+
const boldProgressPattern = /^([ \t]*\*\*Progress:\*\*[ \t]*)([^\r\n]*)$/im;
|
|
68
93
|
const plainProgressPattern = /^(Progress:[ \t]*)([^\r\n]*)/im;
|
|
69
94
|
const pattern = boldProgressPattern.test(body)
|
|
70
95
|
? boldProgressPattern
|
|
@@ -377,6 +402,28 @@ function openStateTransaction(init) {
|
|
|
377
402
|
function rebuildStateTransaction(init) {
|
|
378
403
|
return createStateTransaction('rebuild', init, 'rebuildStateTransaction');
|
|
379
404
|
}
|
|
405
|
+
/**
|
|
406
|
+
* Extend an existing StateTransaction into a StateWriteIntent. The base
|
|
407
|
+
* transaction is REQUIRED — an absent base is a construction failure, mirroring
|
|
408
|
+
* `createStateTransaction`'s ADR-3473 §8.6 posture (do not tolerate null). `scope`
|
|
409
|
+
* defaults to the conservative `'narrow'`; `assertions` defaults to none. Frozen
|
|
410
|
+
* so an intent, like a transaction, cannot be mutated after construction.
|
|
411
|
+
*/
|
|
412
|
+
function createStateWriteIntent(transaction, init = {}) {
|
|
413
|
+
if (transaction === null || typeof transaction !== 'object' || Array.isArray(transaction)) {
|
|
414
|
+
const err = new Error('createStateWriteIntent: a base StateTransaction is required (build it with ' +
|
|
415
|
+
'openStateTransaction / rebuildStateTransaction first). Per ADR-4629 §8.1, an absent ' +
|
|
416
|
+
'transaction is a construction failure — do not tolerate null.');
|
|
417
|
+
err.code = 'STATE_WRITE_INTENT_TRANSACTION_REQUIRED';
|
|
418
|
+
throw err;
|
|
419
|
+
}
|
|
420
|
+
const assertions = Object.freeze((init.assertions ?? []).map((a) => Object.freeze({ field: a.field, requirement: a.requirement })));
|
|
421
|
+
return Object.freeze({
|
|
422
|
+
...transaction,
|
|
423
|
+
assertions,
|
|
424
|
+
scope: init.scope ?? 'narrow',
|
|
425
|
+
});
|
|
426
|
+
}
|
|
380
427
|
/**
|
|
381
428
|
* ADR-3408 §8.2: an unenforced `preserve-when-unchanged` row throws. Both
|
|
382
429
|
* ends of this invariant are gsd-core's own source — a declared row the
|
|
@@ -508,6 +555,72 @@ function preservedValuesEqual(a, b) {
|
|
|
508
555
|
}
|
|
509
556
|
return a === b;
|
|
510
557
|
}
|
|
558
|
+
/**
|
|
559
|
+
* #4129: the resync-arm progress merge. A resyncing write whose scan MEASURED
|
|
560
|
+
* something no longer wholesale-replaces the curated block — the declared
|
|
561
|
+
* `progress-ratchet` mergeStrategy ("completed_plans/completed_phases only ever
|
|
562
|
+
* ratchet UP toward the derived value (#2969)", state-md-schema.cts) now holds
|
|
563
|
+
* on the write path too, matching what the read path (`shouldPreserveExistingProgress`)
|
|
564
|
+
* has always enforced. Rules, mirroring the `deriveProgressKeys` branch above:
|
|
565
|
+
*
|
|
566
|
+
* - total_plans / total_phases always take the derived value (#2440 — totals
|
|
567
|
+
* correct in BOTH directions).
|
|
568
|
+
* - completed_plans / completed_phases take the derived value only when it is
|
|
569
|
+
* strictly GREATER (#2969's `>` not `>=`); else the curated value survives
|
|
570
|
+
* (a hand-corrected or previously-correct counter can never be re-derived
|
|
571
|
+
* downward — the #4129 clobber).
|
|
572
|
+
* - any other key keeps the curated value (the existing branch's convention).
|
|
573
|
+
* - percent is RECOMPUTED from the merged counters through the single kernel
|
|
574
|
+
* (`computeProgressPercent`), because either side's stored percent was
|
|
575
|
+
* computed against that side's counters and the merged block may mix them
|
|
576
|
+
* (curated completed, derived totals). Recomputation runs ONLY when the
|
|
577
|
+
* derived block itself carried a percent — an upstream withhold
|
|
578
|
+
* (#1761 milestone-unbounded, #3217 scope) nulled percent deliberately and
|
|
579
|
+
* this merge must not resurrect it.
|
|
580
|
+
*
|
|
581
|
+
* Frontmatter scalars arrive as STRINGS ("2", not 2), so every comparison
|
|
582
|
+
* coerces through `toFiniteNumber` — never a `typeof === 'number'` test
|
|
583
|
+
* (scanMeasuredSomething's own convention).
|
|
584
|
+
*/
|
|
585
|
+
function mergeResyncProgressRatchet(curatedRecord, derivedRecord) {
|
|
586
|
+
const merged = { ...derivedRecord };
|
|
587
|
+
for (const [key, value] of Object.entries(curatedRecord)) {
|
|
588
|
+
if (key === 'total_plans' || key === 'total_phases' || key === 'percent')
|
|
589
|
+
continue;
|
|
590
|
+
if (key === 'completed_plans' || key === 'completed_phases') {
|
|
591
|
+
const derivedNum = (0, state_document_cjs_2.toFiniteNumber)(derivedRecord[key]) ?? -Infinity;
|
|
592
|
+
const curatedNum = (0, state_document_cjs_2.toFiniteNumber)(value) ?? -Infinity;
|
|
593
|
+
// Ratchet up only (strictly greater, #2969); else keep curated.
|
|
594
|
+
if (derivedNum > curatedNum)
|
|
595
|
+
continue;
|
|
596
|
+
// Numerically EQUAL keeps the derived value VERBATIM. The two sides
|
|
597
|
+
// arrive in different scalar shapes (the re-parsed derived block
|
|
598
|
+
// carries string totals "2" while the curated snapshot carries numbers
|
|
599
|
+
// 2), and substituting the curated spelling over an equal derived one
|
|
600
|
+
// is a no-op in substance but a shape churn the §8.7 reporting loop
|
|
601
|
+
// would surface as a phantom `preserved-over-disagreeing-derived`
|
|
602
|
+
// warning (it diffs structurally). Only a curated counter that is
|
|
603
|
+
// STRICTLY greater replaces the derived value.
|
|
604
|
+
if (derivedNum === curatedNum)
|
|
605
|
+
continue;
|
|
606
|
+
merged[key] = value;
|
|
607
|
+
}
|
|
608
|
+
else {
|
|
609
|
+
merged[key] = value;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
if ((0, state_document_cjs_2.toFiniteNumber)(derivedRecord.percent) !== null) {
|
|
613
|
+
const recomputed = (0, state_document_cjs_2.computeProgressPercent)((0, state_document_cjs_2.toFiniteNumber)(merged.completed_plans), (0, state_document_cjs_2.toFiniteNumber)(merged.total_plans), (0, state_document_cjs_2.toFiniteNumber)(merged.completed_phases), (0, state_document_cjs_2.toFiniteNumber)(merged.total_phases), planningScopeMod.SCOPE.COMPLETE);
|
|
614
|
+
// Same verbatim rule for percent: assign only when the recomputed value
|
|
615
|
+
// numerically differs, so a string-spelled derived percent ("67") is not
|
|
616
|
+
// churned into a number-spelled 67 (phantom-divergence noise, not a
|
|
617
|
+
// change).
|
|
618
|
+
if (recomputed !== null && recomputed !== (0, state_document_cjs_2.toFiniteNumber)(merged.percent)) {
|
|
619
|
+
merged.percent = recomputed;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
return merged;
|
|
623
|
+
}
|
|
511
624
|
/**
|
|
512
625
|
* Executor for `preservation: 'preserve-always'` (ADR-3408 §8.1). Only
|
|
513
626
|
* `progress` carries this policy today. Preserves #3242/#1446/#2440/#2969
|
|
@@ -523,25 +636,39 @@ function applyPreserveAlways(field, cls, ctx) {
|
|
|
523
636
|
const derived = ctx.postFm[field];
|
|
524
637
|
const derivedMeasured = scanMeasuredSomething(cls, derived);
|
|
525
638
|
const curatedMeasured = scanMeasuredSomething(cls, curated);
|
|
526
|
-
// On a resyncing write the fresh derivation is authoritative
|
|
527
|
-
//
|
|
528
|
-
//
|
|
529
|
-
//
|
|
530
|
-
//
|
|
531
|
-
//
|
|
532
|
-
//
|
|
533
|
-
//
|
|
534
|
-
//
|
|
535
|
-
//
|
|
536
|
-
//
|
|
537
|
-
//
|
|
538
|
-
//
|
|
539
|
-
//
|
|
540
|
-
//
|
|
541
|
-
|
|
639
|
+
// On a resyncing write the fresh derivation is authoritative in two cases
|
|
640
|
+
// (#3756 / ADR-3473 §8.6, unchanged): when the caller EXPLICITLY named a
|
|
641
|
+
// progress-affecting field (`preserve-always`'s contract is "never
|
|
642
|
+
// overwrite unless the caller explicitly names this field" — `state update
|
|
643
|
+
// Progress` is exactly that naming, pre-existing #3242 behavior), and when
|
|
644
|
+
// the derivation measured something the curated block did not (an
|
|
645
|
+
// unmeasured CURATED block is not worth protecting). The unmeasured-DERIVED
|
|
646
|
+
// guard also stands: an incidental resync (e.g. `state add-decision`, whose
|
|
647
|
+
// `resync` defaults true for reasons that have nothing to do with
|
|
648
|
+
// `progress`) that measured nothing must not drop a real curated block
|
|
649
|
+
// (#3756's archived-milestone case) — that falls through to the wholesale
|
|
650
|
+
// restore below.
|
|
651
|
+
//
|
|
652
|
+
// #4129 narrows the remaining arm. A resyncing write whose scan MEASURED
|
|
653
|
+
// something while the curated block is also real previously wholesale-
|
|
654
|
+
// replaced the curated block with the derived one — no monotonic guard, so
|
|
655
|
+
// any under-counting derivation (a stale-dated verification, #2348) silently
|
|
656
|
+
// reverted every hand-correction and every correct value an earlier write
|
|
657
|
+
// had persisted, while the read path (`shouldPreserveExistingProgress`)
|
|
658
|
+
// kept reporting the higher stored counters. That arm now falls through to
|
|
659
|
+
// `mergeResyncProgressRatchet` — the declared `progress-ratchet`
|
|
660
|
+
// mergeStrategy, finally enforced on the write path: totals derived both
|
|
661
|
+
// directions (#2440), completed counters up-only (#2969), percent
|
|
662
|
+
// recomputed from the merged counters.
|
|
663
|
+
if (ctx.resync && (ctx.explicitProgressField || (derivedMeasured && !curatedMeasured)))
|
|
542
664
|
return;
|
|
543
665
|
let next;
|
|
544
|
-
if (cls.mergeStrategy === 'progress-ratchet' && ctx.
|
|
666
|
+
if (cls.mergeStrategy === 'progress-ratchet' && ctx.resync && derived && derivedMeasured && curatedMeasured) {
|
|
667
|
+
// #4129 resync arm — see mergeResyncProgressRatchet's doc. Reached only
|
|
668
|
+
// after the early-out above, so curatedMeasured is guaranteed true here.
|
|
669
|
+
next = mergeResyncProgressRatchet(curated, (derived ?? {}));
|
|
670
|
+
}
|
|
671
|
+
else if (cls.mergeStrategy === 'progress-ratchet' && ctx.deriveProgressKeys && derived && derivedMeasured) {
|
|
545
672
|
// #2440: total_plans and total_phases always take the derived (post-sync)
|
|
546
673
|
// value even under !resync. This is used by cmdStatePlannedPhase where
|
|
547
674
|
// total_plans must correct upward after plans are added. For body-only
|
|
@@ -824,7 +951,17 @@ function beginPhaseCore(content, intent, deps) {
|
|
|
824
951
|
const focusLabel = intent.phaseName
|
|
825
952
|
? `Phase ${intent.phaseNumber} — ${intent.phaseName}`
|
|
826
953
|
: `Phase ${intent.phaseNumber}`;
|
|
827
|
-
|
|
954
|
+
// #4469: anchored to line start with same-line whitespace only, mirroring
|
|
955
|
+
// #4243/PR #4453's fix to stateReplaceField's bold branch. The pre-fix
|
|
956
|
+
// pattern carried no `^`/`m` and used `\s*` (crosses newlines), so a bold
|
|
957
|
+
// `**Current focus:**` quoted mid-sentence elsewhere in the body (e.g. an
|
|
958
|
+
// Accumulated Context bullet) matched first and had the rest of its line
|
|
959
|
+
// silently overwritten with the new focus label -- the same #4010
|
|
960
|
+
// data-loss class. `[ \t]*` (not `\s*`) avoids consuming the newlines
|
|
961
|
+
// before the label into the match; `$` documents the match ends at
|
|
962
|
+
// end-of-line (inert here since `.` never crosses line terminators
|
|
963
|
+
// without `/s`, which is not set).
|
|
964
|
+
const focusPattern = /^([ \t]*\*\*Current focus:\*\*[ \t]*)(.*)$/im;
|
|
828
965
|
if (focusPattern.test(body)) {
|
|
829
966
|
body = body.replace(focusPattern, (_match, prefix) => `${prefix}${focusLabel}`);
|
|
830
967
|
updated.push('Current focus');
|
|
@@ -1534,8 +1671,22 @@ function completePhaseCore(content, intent, deps) {
|
|
|
1534
1671
|
body = statusAfter;
|
|
1535
1672
|
updated.push('Status');
|
|
1536
1673
|
}
|
|
1537
|
-
// Current Plan — reset for the next phase.
|
|
1538
|
-
|
|
1674
|
+
// Current Plan — reset for the next phase. #4823: when a Current Position
|
|
1675
|
+
// section exists (the canonical layout, #2956 locator), the reset is scoped
|
|
1676
|
+
// to it — the whole-body fallback 'Plan' run matched any hard-wrapped prose
|
|
1677
|
+
// line starting with `plan:` anywhere in the document and rewrote it to
|
|
1678
|
+
// 'Not started', silently destroying narrative. Legacy sectionless layouts
|
|
1679
|
+
// (fields at top level, no section) keep the whole-body behavior unchanged:
|
|
1680
|
+
// there is no section to scope to, and their fields are the intended
|
|
1681
|
+
// targets.
|
|
1682
|
+
let planAfter;
|
|
1683
|
+
const positionScope = (0, state_document_cjs_1.stateCurrentPositionSlice)(body);
|
|
1684
|
+
if (positionScope !== null) {
|
|
1685
|
+
planAfter = (0, markdown_sectionizer_cjs_1.withSection)(body, (h) => (h.level === 2 || h.level === 3) && h.text.trim().toLowerCase() === 'current position', (sectionBody) => (0, state_document_cjs_1.stateReplaceFieldWithFallback)(sectionBody, 'Current Plan', 'Plan', 'Not started'), { levelBounded: true });
|
|
1686
|
+
}
|
|
1687
|
+
else {
|
|
1688
|
+
planAfter = (0, state_document_cjs_1.stateReplaceFieldWithFallback)(body, 'Current Plan', 'Plan', 'Not started');
|
|
1689
|
+
}
|
|
1539
1690
|
if (planAfter !== body) {
|
|
1540
1691
|
body = planAfter;
|
|
1541
1692
|
updated.push('Current Plan');
|