@opengsd/gsd-core 1.15.0 → 1.17.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 -2
- package/.opencode/plugins/gsd-core.js +336 -6
- package/.opencode/plugins/gsd-statusline/tui.tsx +55 -0
- package/GEMINI.md +1 -1
- 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 +7 -1
- package/agents/gsd-debug-session-manager.md +7 -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/gsd-mcp-server.js +3 -1
- package/bin/install.js +487 -290
- 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 +159 -58
- package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
- package/gsd-core/bin/lib/adr-parser.cjs +37 -5
- 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 +249 -117
- package/gsd-core/bin/lib/capability-validator.cjs +18 -1
- package/gsd-core/bin/lib/capability-writer.cjs +2 -1
- 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 +201 -178
- 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 +142 -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 +81 -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/graphify.cjs +3 -2
- 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 +194 -108
- package/gsd-core/bin/lib/install-engine.cjs +30 -35
- package/gsd-core/bin/lib/install-profiles.cjs +7 -4
- package/gsd-core/bin/lib/install-shadow-report.cjs +12 -0
- package/gsd-core/bin/lib/installer-migrations/011-opencode-mcp-no-prompts.cjs +99 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +54 -1
- package/gsd-core/bin/lib/io.cjs +122 -3
- package/gsd-core/bin/lib/jsonc-edit.cjs +418 -0
- package/gsd-core/bin/lib/loop-host-contract.cjs +2 -1
- 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/mcp-server.cjs +5 -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/opencode-mcp-entry.cjs +39 -0
- package/gsd-core/bin/lib/opencode-version.cjs +486 -0
- 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 +301 -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 +13 -9
- 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 +186 -161
- 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 +365 -594
- package/gsd-core/bin/lib/runtime-name-policy.cjs +142 -27
- package/gsd-core/bin/lib/runtime-slash.cjs +60 -30
- package/gsd-core/bin/lib/shell-command-projection.cjs +37 -2
- package/gsd-core/bin/lib/smart-entry.cjs +111 -56
- 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-transition.cjs +67 -9
- package/gsd-core/bin/lib/state.cjs +668 -171
- 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/update-context.cjs +18 -1
- 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 +1265 -324
- 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 +100 -91
- 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 +2 -2
- 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 +81 -171
- 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 +17 -12
- 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 +34 -20
- package/hooks/dist/gsd-context-monitor.js +45 -13
- package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
- package/hooks/dist/gsd-secret-read-guard.js +263 -16
- package/hooks/dist/gsd-statusline.js +336 -29
- 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 +34 -20
- package/hooks/gsd-context-monitor.js +45 -13
- package/hooks/gsd-cursor-subagent-start.js +8 -0
- package/hooks/gsd-secret-read-guard.js +263 -16
- package/hooks/gsd-statusline.js +336 -29
- 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-capability-registry.cjs +7 -1
- package/scripts/gen-features.cjs +13 -8
- package/scripts/gen-hooks-cli-exit.cjs +12 -28
- package/scripts/gen-loop-host-contract.cjs +14 -2
- 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 +24 -2
- package/scripts/lib/ndjson-reporter.cjs +28 -3
- package/scripts/lib/platform-conformance-tier.generated.cjs +44 -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 +53 -6
- package/scripts/release-tarball-smoke.cjs +14 -7
- 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
|
@@ -30,6 +30,7 @@ const markdown_table_cjs_1 = require("./markdown-table.cjs");
|
|
|
30
30
|
const phase_lifecycle_cjs_1 = require("./phase-lifecycle.cjs");
|
|
31
31
|
const markdown_sectionizer_cjs_1 = require("./markdown-sectionizer.cjs");
|
|
32
32
|
const pattern_cjs_1 = require("./pattern.cjs");
|
|
33
|
+
const planning_document_cjs_1 = require("./planning-document.cjs");
|
|
33
34
|
// eslint-disable-next-line @typescript-eslint/no-require-imports -- planning-scope.cjs is an export= CommonJS module
|
|
34
35
|
const planningScopeMod = require("./planning-scope.cjs");
|
|
35
36
|
const { SCOPE } = planningScopeMod;
|
|
@@ -536,29 +537,106 @@ function joinFieldReplacement(prefix, newValue) {
|
|
|
536
537
|
function stateReplaceField(content, fieldName, newValue) {
|
|
537
538
|
const escaped = (0, pattern_cjs_1.escapeRegex)(fieldName);
|
|
538
539
|
// Bold inline format: **FieldName:** value
|
|
539
|
-
// The label-to-value gap is same-line whitespace only (`[ \t]*`, mirroring the
|
|
540
|
-
// read side at stateExtractField). `\s*` here matched `\n`, so on an empty field
|
|
541
|
-
// `(.*)` captured the following line and the rebuild discarded it — the #4010
|
|
542
|
-
// data-loss. ADR-3180 §7.7 makes stateExtractField the same-line-confined owner;
|
|
543
|
-
// this aligns the writer to it.
|
|
544
540
|
//
|
|
545
|
-
// #
|
|
546
|
-
//
|
|
547
|
-
//
|
|
548
|
-
//
|
|
549
|
-
//
|
|
550
|
-
//
|
|
551
|
-
//
|
|
552
|
-
//
|
|
553
|
-
//
|
|
554
|
-
//
|
|
555
|
-
//
|
|
556
|
-
//
|
|
557
|
-
//
|
|
558
|
-
//
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
541
|
+
// #5007 (Phase 6 / ADR-4910 amendment): migrated off the hand-rolled
|
|
542
|
+
// `^([ \t]*\*\*${escaped}:\*\*[ \t]*)(.*)$` regex (which, per #4010/#4243
|
|
543
|
+
// below, already existed to fix real same-line-confinement and mid-prose
|
|
544
|
+
// data-loss bugs) onto `parsePlanningDoc` for LOCATING the field — same-
|
|
545
|
+
// line confinement AND fence/frontmatter exclusion (parseBoldFieldLine
|
|
546
|
+
// never matches inside a fenced block or frontmatter, which the removed
|
|
547
|
+
// regex could not tell apart from prose) — so this migration keeps
|
|
548
|
+
// #4010/#4243's fix and extends it, rather than replacing it with a
|
|
549
|
+
// weaker check.
|
|
550
|
+
//
|
|
551
|
+
// This does NOT go through the seam's `setFieldValue`/`serialize` write
|
|
552
|
+
// path. An earlier version of this migration did, via a since-removed
|
|
553
|
+
// `setFieldValue({ allowSeparator: true })` option (#5007) — that option
|
|
554
|
+
// spliced the caller's value across the FULL rest-of-line span
|
|
555
|
+
// (`valueSpan.start`..`trailingSpan.end`) to permit a value containing the
|
|
556
|
+
// grammar's ` — ` trailing-separator token (needed here: see the
|
|
557
|
+
// `${currentPhase} — COMPLETE` value below). It was removed after a
|
|
558
|
+
// failing-first reproduction proved it only avoided the write-time
|
|
559
|
+
// refusal: the bytes it writes are correct, but `parseBoldFieldLine`
|
|
560
|
+
// splits on ` — ` unconditionally on every read, with no escaping
|
|
561
|
+
// convention in this grammar to tell "atomic value containing the token"
|
|
562
|
+
// apart from "value plus hand-annotation". So the NEXT fresh
|
|
563
|
+
// `parsePlanningDoc` of that exact text — not the in-memory doc the
|
|
564
|
+
// option's own tests checked — silently re-truncates the value and
|
|
565
|
+
// demotes the rest to `trailingSpan`, with `findField`/`readNode`
|
|
566
|
+
// reporting a confident, wrong `ok: true` and no error. That is exactly
|
|
567
|
+
// the #4917 finding-2 corruption `setFieldValue`'s round-trip check
|
|
568
|
+
// exists to prevent, just moved one parse cycle downstream. This call
|
|
569
|
+
// site never reads STATE.md fields back through `parsePlanningDoc`/
|
|
570
|
+
// `findField` (reads go through `stateExtractField`'s own non-splitting
|
|
571
|
+
// regex, below), so it is safe HERE — but making that a shared, public
|
|
572
|
+
// option on the seam's `setFieldValue` was an attractive nuisance for any
|
|
573
|
+
// future `findField`/`readNode` caller (this same module already serves
|
|
574
|
+
// ROADMAP.md's `Plans`/`Depends on` fields that way). The full-rest-of-
|
|
575
|
+
// line splice is done locally, directly against `content`, instead —
|
|
576
|
+
// `parsePlanningDoc` is used only to locate the field's spans.
|
|
577
|
+
//
|
|
578
|
+
// Two deliberate deviations from a bare findField() call, both
|
|
579
|
+
// PRESERVING this function's own prior contract rather than adopting the
|
|
580
|
+
// seam's stricter defaults:
|
|
581
|
+
//
|
|
582
|
+
// 1. Label lookup here is case-INSENSITIVE (not findField's exact
|
|
583
|
+
// match), mirroring the removed regex's `i` flag: callers in
|
|
584
|
+
// state.cts/state-transition.cts pass a fieldName spelling that can
|
|
585
|
+
// differ only in case from what a given template actually has (the
|
|
586
|
+
// explicit 'Last Activity' / 'Last activity' fallback-call pairs at
|
|
587
|
+
// those call sites), so a case-sensitive lookup would silently miss
|
|
588
|
+
// matches the removed regex used to find.
|
|
589
|
+
// 2. Every write below replaces the FULL rest-of-line span
|
|
590
|
+
// (`valueSpan.start`..`trailingSpan.end`) UNCONDITIONALLY, not only
|
|
591
|
+
// when `newValue` contains the grammar's ` — ` separator token,
|
|
592
|
+
// because `joinFieldReplacement` always discarded the OLD regex's
|
|
593
|
+
// entire captured tail (`(.*)$` — both what the seam calls
|
|
594
|
+
// `valueSpan` AND `trailingSpan`) and replaced it wholesale with the
|
|
595
|
+
// new value. This call site never had a "preserve a hand-written
|
|
596
|
+
// trailing annotation" contract, so writing anything narrower than
|
|
597
|
+
// the full rest-of-line span here would be a NEW, untested behavior
|
|
598
|
+
// this migration must not introduce as a side effect.
|
|
599
|
+
//
|
|
600
|
+
// Matching BOTH bold-placement spellings (`**Label:**` and `**Label**:`,
|
|
601
|
+
// `BOLD_FIELD_RE`) where the removed regex recognized only `**Label:**`
|
|
602
|
+
// is the same, already-precedented widening as the "Depends on"
|
|
603
|
+
// migration (src/phase.cts) — intentional, not scope creep.
|
|
604
|
+
//
|
|
605
|
+
// A parse failure, an absent/case-mismatched label, or a value containing
|
|
606
|
+
// a line break (\r/\n — would forge sibling structure on splice, the same
|
|
607
|
+
// hazard `setFieldValue` refuses unconditionally at #4917/ADR-4910
|
|
608
|
+
// Decision 2 & 4; this local splice has no seam call to inherit that
|
|
609
|
+
// refusal from, so it is re-checked here) falls through to the
|
|
610
|
+
// plain/pipe-table branches below unchanged — the same silent
|
|
611
|
+
// per-occurrence no-op-on-no-match contract the removed regex had for any
|
|
612
|
+
// input it didn't match.
|
|
613
|
+
const parsed = (0, planning_document_cjs_1.parsePlanningDoc)(content, 'STATE.md');
|
|
614
|
+
if (parsed.ok) {
|
|
615
|
+
let boldField = null;
|
|
616
|
+
for (const node of parsed.value.nodes) {
|
|
617
|
+
if (node.kind !== 'boldField')
|
|
618
|
+
continue;
|
|
619
|
+
if (node.label.toLowerCase() !== fieldName.toLowerCase())
|
|
620
|
+
continue;
|
|
621
|
+
boldField = node;
|
|
622
|
+
break;
|
|
623
|
+
}
|
|
624
|
+
if (boldField) {
|
|
625
|
+
// Replicates joinFieldReplacement's own `` `${newValue}` `` coercion
|
|
626
|
+
// (a caller may pass a non-string, e.g. a number, at the JS boundary
|
|
627
|
+
// even though the type signature says `string`) before the
|
|
628
|
+
// missing-separator normalization below: insert a single space when
|
|
629
|
+
// the existing label-to-value gap has none, so `**Status:**value`
|
|
630
|
+
// still becomes `**Status:** value` rather than gluing the two
|
|
631
|
+
// together.
|
|
632
|
+
const spacingText = parsed.value.source.slice(boldField.labelSpan.end, boldField.valueSpan.start);
|
|
633
|
+
const newValueStr = `${newValue}`;
|
|
634
|
+
const needsSeparator = newValueStr.length > 0 && !/[ \t]$/.test(spacingText);
|
|
635
|
+
const writeValue = `${needsSeparator ? ' ' : ''}${newValueStr}`;
|
|
636
|
+
if (!/[\r\n]/.test(writeValue)) {
|
|
637
|
+
return (content.slice(0, boldField.valueSpan.start) + writeValue + content.slice(boldField.trailingSpan.end));
|
|
638
|
+
}
|
|
639
|
+
}
|
|
562
640
|
}
|
|
563
641
|
// Plain line-start format: FieldName: value (same same-line confinement as above)
|
|
564
642
|
const plainPattern = new RegExp(`(^${escaped}:[ \\t]*)(.*)`, 'im');
|
|
@@ -417,7 +417,41 @@ function createStateWriteIntent(transaction, init = {}) {
|
|
|
417
417
|
err.code = 'STATE_WRITE_INTENT_TRANSACTION_REQUIRED';
|
|
418
418
|
throw err;
|
|
419
419
|
}
|
|
420
|
-
|
|
420
|
+
// C2 (ADR-4629 §8.2): an unknown `requirement` is a construction error. §8.2
|
|
421
|
+
// judges only `'required'` assertions, so a mistyped value (`'Required'`)
|
|
422
|
+
// would otherwise be silently skipped: a fail-open verifier.
|
|
423
|
+
for (const a of init.assertions ?? []) {
|
|
424
|
+
if (a.requirement !== 'required' && a.requirement !== 'best-effort') {
|
|
425
|
+
const err = new Error(`createStateWriteIntent: assertion ${JSON.stringify(a.field)} has unknown requirement ` +
|
|
426
|
+
`${JSON.stringify(a.requirement)}; expected 'required' or 'best-effort' (ADR-4629 §8.1).`);
|
|
427
|
+
err.code = 'STATE_WRITE_INTENT_REQUIREMENT_INVALID';
|
|
428
|
+
throw err;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
if (init.scope !== undefined && init.scope !== 'narrow' && init.scope !== 'broad') {
|
|
432
|
+
const err = new Error(`createStateWriteIntent: unknown scope ${JSON.stringify(init.scope)}; expected 'narrow' or 'broad' ` +
|
|
433
|
+
'(ADR-4629 §8.1).');
|
|
434
|
+
err.code = 'STATE_WRITE_INTENT_SCOPE_INVALID';
|
|
435
|
+
throw err;
|
|
436
|
+
}
|
|
437
|
+
// C2 (ADR-4629 §8.2): an unknown `target` is a construction error, never a
|
|
438
|
+
// silent fall-back to field semantics (a JS caller passing `'sections'`).
|
|
439
|
+
for (const a of init.assertions ?? []) {
|
|
440
|
+
if (a.target !== undefined && a.target !== 'field' && a.target !== 'section') {
|
|
441
|
+
const err = new Error(`createStateWriteIntent: assertion ${JSON.stringify(a.field)} has unknown target ` +
|
|
442
|
+
`${JSON.stringify(a.target)}; expected 'field' or 'section' (ADR-4629 §8.2).`);
|
|
443
|
+
err.code = 'STATE_WRITE_INTENT_TARGET_INVALID';
|
|
444
|
+
throw err;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// C2 (ADR-4629 §8.2): `target` / `value` are copied only when the caller set
|
|
448
|
+
// them, so a C1-shaped assertion stays exactly `{ field, requirement }`.
|
|
449
|
+
const assertions = Object.freeze((init.assertions ?? []).map((a) => Object.freeze({
|
|
450
|
+
field: a.field,
|
|
451
|
+
requirement: a.requirement,
|
|
452
|
+
...(a.target !== undefined ? { target: a.target } : {}),
|
|
453
|
+
...(a.value !== undefined ? { value: a.value } : {}),
|
|
454
|
+
})));
|
|
421
455
|
return Object.freeze({
|
|
422
456
|
...transaction,
|
|
423
457
|
assertions,
|
|
@@ -1575,9 +1609,30 @@ function advancePlanCore(content, deps) {
|
|
|
1575
1609
|
data: { advanced: true, previous_plan: currentPlan, current_plan: newPlan, total_plans: totalPlans },
|
|
1576
1610
|
};
|
|
1577
1611
|
}
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1612
|
+
/**
|
|
1613
|
+
* #4824: Status / Current Plan / Stopped-at wording for the phase a
|
|
1614
|
+
* completion hands off to. The historical `Ready to plan` is only true for a
|
|
1615
|
+
* phase with no plans; a phase that already has PLANs routes to execution,
|
|
1616
|
+
* and one whose plans all have SUMMARYs awaits verification — never back to
|
|
1617
|
+
* `/gsd-plan-phase`. Which phase is selected stays #4078's rule.
|
|
1618
|
+
*/
|
|
1619
|
+
function nextPhaseWording(disk) {
|
|
1620
|
+
switch (disk?.status) {
|
|
1621
|
+
case 'PLANNED':
|
|
1622
|
+
return { status: 'Ready to execute', currentPlan: 'Not started', stoppedAt: 'ready to execute' };
|
|
1623
|
+
case 'IN_PROGRESS':
|
|
1624
|
+
return { status: 'Ready to execute', currentPlan: String(disk.summaryCount + 1), stoppedAt: 'ready to execute' };
|
|
1625
|
+
case 'EXECUTED':
|
|
1626
|
+
case 'NEEDS_REVIEW':
|
|
1627
|
+
return {
|
|
1628
|
+
status: 'Phase complete — ready for verification',
|
|
1629
|
+
currentPlan: String(disk.planCount),
|
|
1630
|
+
stoppedAt: 'ready to verify',
|
|
1631
|
+
};
|
|
1632
|
+
default:
|
|
1633
|
+
return { status: 'Ready to plan', currentPlan: 'Not started', stoppedAt: 'ready to plan' };
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1581
1636
|
/**
|
|
1582
1637
|
* Apply a `completePhase` transition to STATE.md content.
|
|
1583
1638
|
*
|
|
@@ -1585,7 +1640,9 @@ function advancePlanCore(content, deps) {
|
|
|
1585
1640
|
* (phase.cts) onto the substrate. Owns the field-classification-governed body
|
|
1586
1641
|
* mutations: Current Phase (preserving the `of total` shape and phase name),
|
|
1587
1642
|
* Current Phase Name, Status (`All phases complete` on the last phase, else
|
|
1588
|
-
* `Ready to plan` per ADR-2207
|
|
1643
|
+
* `Ready to plan` per ADR-2207 — or, #4824, the next phase's disk-derived
|
|
1644
|
+
* wording when it is already planned or executed), Current Plan (`Not started`
|
|
1645
|
+
* unless the next phase is in flight), Last Activity + Description,
|
|
1589
1646
|
* and the Completed/Total Phases + Progress percent block (re-derived from the
|
|
1590
1647
|
* roadmap via the injected `roadmapProvider`).
|
|
1591
1648
|
*
|
|
@@ -1602,6 +1659,7 @@ function advancePlanCore(content, deps) {
|
|
|
1602
1659
|
function completePhaseCore(content, intent, deps) {
|
|
1603
1660
|
const updated = [];
|
|
1604
1661
|
const today = deps.clock.localToday();
|
|
1662
|
+
const nextWording = nextPhaseWording(intent.isLastPhase ? null : intent.nextPhaseDisk ?? null);
|
|
1605
1663
|
// Consult the field-classification table for the frontmatter keys this
|
|
1606
1664
|
// transition touches (same guard beginPhaseCore applies). A missing row is a
|
|
1607
1665
|
// substrate defect — fail loudly rather than silently re-encoding policy.
|
|
@@ -1665,7 +1723,7 @@ function completePhaseCore(content, intent, deps) {
|
|
|
1665
1723
|
// Status — `All phases complete` on the final phase (ADR-2207), otherwise
|
|
1666
1724
|
// `Ready to plan`. Milestone termination (`<version> milestone complete`) is
|
|
1667
1725
|
// owned solely by the milestone-close verb (milestoneCompleteCore).
|
|
1668
|
-
const statusValue = intent.isLastPhase ? 'All phases complete' :
|
|
1726
|
+
const statusValue = intent.isLastPhase ? 'All phases complete' : nextWording.status;
|
|
1669
1727
|
const statusAfter = (0, state_document_cjs_1.stateReplaceFieldWithFallback)(body, 'Status', null, statusValue);
|
|
1670
1728
|
if (statusAfter !== body) {
|
|
1671
1729
|
body = statusAfter;
|
|
@@ -1682,10 +1740,10 @@ function completePhaseCore(content, intent, deps) {
|
|
|
1682
1740
|
let planAfter;
|
|
1683
1741
|
const positionScope = (0, state_document_cjs_1.stateCurrentPositionSlice)(body);
|
|
1684
1742
|
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',
|
|
1743
|
+
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', nextWording.currentPlan), { levelBounded: true });
|
|
1686
1744
|
}
|
|
1687
1745
|
else {
|
|
1688
|
-
planAfter = (0, state_document_cjs_1.stateReplaceFieldWithFallback)(body, 'Current Plan', 'Plan',
|
|
1746
|
+
planAfter = (0, state_document_cjs_1.stateReplaceFieldWithFallback)(body, 'Current Plan', 'Plan', nextWording.currentPlan);
|
|
1689
1747
|
}
|
|
1690
1748
|
if (planAfter !== body) {
|
|
1691
1749
|
body = planAfter;
|
|
@@ -1729,7 +1787,7 @@ function completePhaseCore(content, intent, deps) {
|
|
|
1729
1787
|
// milestone termination wording stays owned by milestoneCompleteCore.
|
|
1730
1788
|
const stoppedAtLine = intent.isLastPhase
|
|
1731
1789
|
? `Phase ${intent.phaseNum} complete — all phases complete`
|
|
1732
|
-
: `Phase ${intent.phaseNum} complete${intent.nextPhaseNum ? `,
|
|
1790
|
+
: `Phase ${intent.phaseNum} complete${intent.nextPhaseNum ? `, ${nextWording.stoppedAt} Phase ${intent.nextPhaseNum}` : ''}`;
|
|
1733
1791
|
const stoppedAfter = (0, state_document_cjs_1.stateReplaceFieldInSession)(body, 'Stopped At', 'Stopped at', stoppedAtLine);
|
|
1734
1792
|
if (stoppedAfter !== body) {
|
|
1735
1793
|
body = stoppedAfter;
|