@opengsd/gsd-core 1.14.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/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-code-fixer.compact.md +7 -6
- package/agents/gsd-code-fixer.md +9 -8
- 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 +17 -2
- package/agents/gsd-debug-session-manager.md +17 -2
- package/agents/gsd-debugger.md +3 -3
- package/agents/gsd-eval-auditor.compact.md +1 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +17 -12
- 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 +19 -11
- package/agents/gsd-plan-checker.md +15 -9
- package/agents/gsd-planner.md +15 -11
- 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 +166 -37
- package/agents/gsd-ui-researcher.compact.md +1 -1
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-verifier.md +37 -14
- package/bin/install.js +764 -287
- 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 +7 -2
- package/commands/gsd/capture.md +9 -5
- 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 +12 -4
- 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 +11 -7
- package/commands/gsd/pr-branch.md +4 -0
- package/commands/gsd/profile-user.md +5 -1
- package/commands/gsd/progress.md +7 -2
- package/commands/gsd/quick-batch.md +21 -9
- package/commands/gsd/quick.md +12 -7
- package/commands/gsd/review.md +7 -4
- 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 +477 -78
- package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
- package/gsd-core/bin/lib/adr-parser.cjs +3 -1
- package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
- package/gsd-core/bin/lib/audit.cjs +144 -42
- 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 +197 -222
- package/gsd-core/bin/lib/capability-validator.cjs +16 -1
- package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
- package/gsd-core/bin/lib/check-command-router.cjs +164 -1625
- 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 +32 -33
- 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 +343 -207
- package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
- package/gsd-core/bin/lib/config-loader.cjs +65 -4
- package/gsd-core/bin/lib/config.cjs +76 -19
- 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/decisions.cjs +30 -14
- 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 +426 -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/graphify.cjs +10 -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/host-runtime-detection.cjs +9 -0
- package/gsd-core/bin/lib/init.cjs +364 -132
- package/gsd-core/bin/lib/install-engine.cjs +30 -33
- package/gsd-core/bin/lib/install-profiles.cjs +7 -4
- package/gsd-core/bin/lib/installer-migrations.cjs +8 -1
- 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 +37 -6
- package/gsd-core/bin/lib/model-resolver.cjs +171 -62
- 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 +20 -5
- package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
- 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 +110 -8
- package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
- package/gsd-core/bin/lib/phase-locator.cjs +29 -10
- package/gsd-core/bin/lib/phase-status.cjs +360 -0
- package/gsd-core/bin/lib/phase.cjs +489 -88
- package/gsd-core/bin/lib/plan-document.cjs +142 -20
- package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
- package/gsd-core/bin/lib/planning-document.cjs +692 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +60 -9
- package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +83 -55
- package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
- package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
- package/gsd-core/bin/lib/probe-core.cjs +7 -1
- 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/project-root.cjs +41 -2
- 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/review-lane-descriptor.cjs +10 -30
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
- package/gsd-core/bin/lib/roadmap-command-router.cjs +25 -19
- package/gsd-core/bin/lib/roadmap-parser.cjs +242 -15
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +1653 -65
- package/gsd-core/bin/lib/roadmap.cjs +405 -88
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +373 -187
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +5 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
- package/gsd-core/bin/lib/runtime-homes.cjs +14 -7
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +522 -624
- package/gsd-core/bin/lib/runtime-name-policy.cjs +246 -21
- package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
- package/gsd-core/bin/lib/shell-command-projection.cjs +47 -8
- 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-transition.cjs +39 -2
- package/gsd-core/bin/lib/state.cjs +256 -105
- package/gsd-core/bin/lib/surface.cjs +19 -2
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -79
- package/gsd-core/bin/lib/uat-predicate.cjs +359 -38
- package/gsd-core/bin/lib/uat.cjs +432 -7
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +167 -40
- package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
- 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 +1378 -274
- package/gsd-core/bin/lib/verify-command-grounding.cjs +46 -2
- package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
- package/gsd-core/bin/lib/verify.cjs +357 -531
- 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/lib/worktree-base-ref.cjs +482 -73
- package/gsd-core/bin/lib/worktree-safety.cjs +784 -51
- package/gsd-core/bin/shared/config-defaults.manifest.json +8 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +5 -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/checkpoints.md +5 -3
- 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-mvp-tdd.md +5 -10
- package/gsd-core/references/execute-phase-between-wave-reset.md +10 -6
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- 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 +7 -1
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/offer-next.md +1 -1
- 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 +12 -3
- package/gsd-core/references/spidr-splitting.md +1 -1
- package/gsd-core/references/tdd.md +37 -8
- package/gsd-core/references/ui-consideration-probe.md +10 -5
- package/gsd-core/references/verifier-phase-gates.md +5 -2
- package/gsd-core/references/verify-command-path-resolvability.md +10 -2
- package/gsd-core/references/verify-mvp-mode.md +2 -2
- package/gsd-core/references/workstream-flag.md +33 -3
- package/gsd-core/references/worktree-path-safety.md +321 -0
- 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 +4 -3
- package/gsd-core/workflows/add-todo.md +6 -5
- package/gsd-core/workflows/ai-integration-phase.md +13 -4
- 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/steps/converge-fail-fast.md +9 -18
- package/gsd-core/workflows/autonomous.md +43 -23
- package/gsd-core/workflows/check-todos.md +7 -6
- package/gsd-core/workflows/cleanup.md +2 -2
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
- package/gsd-core/workflows/code-review-fix.md +112 -25
- package/gsd-core/workflows/code-review.md +146 -135
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
- package/gsd-core/workflows/complete-milestone.md +13 -8
- package/gsd-core/workflows/debug.md +32 -7
- 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 +2 -2
- package/gsd-core/workflows/docs-update.md +6 -5
- package/gsd-core/workflows/edit-phase.md +4 -3
- package/gsd-core/workflows/eval-review.md +14 -5
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1019 -0
- 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 +37 -3
- 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 +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/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/threat-id-gate.md +28 -0
- 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/steps/worktree-base-check.md +25 -0
- package/gsd-core/workflows/execute-phase.md +96 -178
- package/gsd-core/workflows/execute-plan.md +18 -23
- package/gsd-core/workflows/explore.md +4 -4
- package/gsd-core/workflows/extract-learnings.md +4 -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 +3 -2
- package/gsd-core/workflows/help/modes/full.compact.md +3 -3
- package/gsd-core/workflows/help/modes/full.md +5 -5
- package/gsd-core/workflows/help/modes/topic.md +15 -5
- package/gsd-core/workflows/import.md +4 -3
- package/gsd-core/workflows/inbox.md +2 -2
- package/gsd-core/workflows/ingest-docs.md +3 -3
- 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 +6 -4
- package/gsd-core/workflows/map-codebase.md +5 -4
- 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 +11 -11
- 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 +7 -7
- 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 +2 -2
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
- 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 +23 -5
- package/gsd-core/workflows/plan-phase.md +50 -24
- 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 +113 -13
- package/gsd-core/workflows/profile-user.md +2 -2
- package/gsd-core/workflows/progress.md +19 -49
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +27 -0
- 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 +62 -39
- package/gsd-core/workflows/reapply-patches.md +9 -3
- package/gsd-core/workflows/remove-phase.md +3 -2
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +3 -2
- package/gsd-core/workflows/review.md +33 -17
- package/gsd-core/workflows/scan.md +3 -2
- package/gsd-core/workflows/secure-phase.md +13 -13
- package/gsd-core/workflows/settings-advanced.md +30 -10
- package/gsd-core/workflows/settings-integrations.md +2 -3
- package/gsd-core/workflows/settings.md +4 -4
- package/gsd-core/workflows/ship.md +14 -13
- 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 +2 -2
- package/gsd-core/workflows/transition.md +13 -23
- package/gsd-core/workflows/ui-phase.md +48 -11
- package/gsd-core/workflows/ui-review.md +21 -6
- package/gsd-core/workflows/ultraplan-phase.md +3 -2
- package/gsd-core/workflows/undo.md +339 -20
- package/gsd-core/workflows/update.md +7 -7
- package/gsd-core/workflows/validate-phase.md +12 -13
- 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 +129 -55
- package/hooks/dist/gsd-agent-isolation-guard.js +32 -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 +161 -4
- package/hooks/dist/gsd-statusline.js +85 -20
- package/hooks/dist/gsd-update-banner.js +8 -0
- package/hooks/dist/gsd-validate-commit.sh +63 -4
- 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 +32 -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 +161 -4
- package/hooks/gsd-statusline.js +85 -20
- package/hooks/gsd-update-banner.js +8 -0
- package/hooks/gsd-validate-commit.sh +63 -4
- 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 +22 -4
- package/scripts/build-hooks.js +15 -6
- package/scripts/changeset/parse.cjs +52 -4
- package/scripts/check-contract-drift.cjs +127 -11
- package/scripts/ci-timeout-report.cjs +770 -4
- package/scripts/command-contract-helpers.cjs +15 -8
- package/scripts/docs-guard-registry.cjs +34 -0
- package/scripts/gen-features.cjs +13 -8
- package/scripts/gen-hooks-cli-exit.cjs +12 -28
- package/scripts/gen-loop-host-contract.cjs +79 -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 +34 -2
- package/scripts/lib/ndjson-reporter.cjs +31 -5
- package/scripts/lib/platform-conformance-tier.generated.cjs +45 -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 +38 -1
- 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-arg-assignment.cjs +257 -0
- package/scripts/lint-phase-enumeration-drift.cjs +12 -8
- package/scripts/lint-phase-id-drift.cjs +319 -5
- package/scripts/lint-planning-document-positive-control.cjs +329 -0
- package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
- package/scripts/lint-response-language-coverage.cjs +3 -0
- package/scripts/lint-retired-runtime-name.cjs +619 -0
- package/scripts/lint-skill-deps.cjs +7 -3
- package/scripts/lint-state-write-path-drift.cjs +93 -0
- package/scripts/lint-test-file-count.allowlist.json +38 -9
- package/scripts/lint-test-file-count.cjs +34 -1
- package/scripts/lint-vendored-deps.cjs +41 -5
- package/scripts/lint-workflow-shellcheck-baseline.json +25 -10
- package/scripts/mutation-matrix.cjs +50 -5
- package/scripts/prompt-injection-scan.sh +4 -0
- package/scripts/release-tarball-smoke.cjs +194 -1
- 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 +7 -2
- package/skills/gsd-capture/SKILL.md +9 -5
- 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 +12 -4
- 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 +10 -6
- package/skills/gsd-pr-branch/SKILL.md +4 -0
- package/skills/gsd-profile-user/SKILL.md +5 -1
- package/skills/gsd-progress/SKILL.md +7 -2
- package/skills/gsd-quick/SKILL.md +16 -10
- package/skills/gsd-quick-batch/SKILL.md +21 -9
- package/skills/gsd-review/SKILL.md +7 -4
- 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
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase Status Module — the single owner of "what state is phase P in?"
|
|
4
|
+
* (ADR-5057 §1/§2, epic #5056 Phase 1, #5060).
|
|
5
|
+
*
|
|
6
|
+
* ADR-3180 §7.4 made `isPhaseComplete` the owner of "is phase P complete?".
|
|
7
|
+
* The richer question the UI, the health rules and the ROADMAP writers ask —
|
|
8
|
+
* which rung of the lifecycle is this phase on — had no owner: it was derived
|
|
9
|
+
* at eleven sites in seven vocabularies, and two of them disagreed on a stale
|
|
10
|
+
* `passed` report. This module is that owner.
|
|
11
|
+
*
|
|
12
|
+
* - `PHASE_STATUS` is a closed, frozen ladder. Its values are the upper-case
|
|
13
|
+
* rung names, spelled unlike every projection word, so a display label or
|
|
14
|
+
* a wire value can never pass for a status.
|
|
15
|
+
* - `phaseStatusFromFacts` is the ladder itself — pure. Callers that already
|
|
16
|
+
* hold the §7 owners' answers (the health rules over `PlanningSnapshot`,
|
|
17
|
+
* the pure Workstream Inventory builder, `update-plan-progress`'s stricter
|
|
18
|
+
* write gate) hand it those facts.
|
|
19
|
+
* - `phaseStatus(phaseDir)` gathers the facts from the §7 owners only —
|
|
20
|
+
* `scanPhasePlans` (§7.5) for counts and `isPhaseComplete` (§7.4) for
|
|
21
|
+
* completion and the verification verdict. It never reads VERIFICATION.md
|
|
22
|
+
* frontmatter itself.
|
|
23
|
+
* - Every other vocabulary is a projection exported here: display labels,
|
|
24
|
+
* the `state.json` / Workstream Inventory wire values, the ROADMAP
|
|
25
|
+
* `## Progress` Status cell (both directions), `roadmap analyze` /
|
|
26
|
+
* `init manager`'s `disk_status`, `init`'s `completion_status`, and
|
|
27
|
+
* `init progress`'s `status`. A consumer never maps raw inputs to a word.
|
|
28
|
+
* - Every function that takes a `PhaseStatus` throws `TypeError` on a value
|
|
29
|
+
* outside the ladder, so an out-of-vocabulary value fails where it is
|
|
30
|
+
* produced (ADR-5057 §1.2).
|
|
31
|
+
*
|
|
32
|
+
* LOAD-TIME LEAF. `verification.cjs` and `plan-scan.cjs` are required lazily
|
|
33
|
+
* inside `phaseStatus()`. `state-contract.cjs` imports this module at top
|
|
34
|
+
* level for its wire vocabulary, and `state-contract` sits on the documented
|
|
35
|
+
* `state -> state-contract -> smart-entry -> state` require cycle; keeping this
|
|
36
|
+
* module import-free at load keeps it off that cycle.
|
|
37
|
+
*
|
|
38
|
+
* ADR-457 build-at-publish: source in src/phase-status.cts, compiled to
|
|
39
|
+
* gsd-core/bin/lib/phase-status.cjs (gitignored).
|
|
40
|
+
*/
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.COMPLETION_STATUS = exports.PROGRESS_STATUS = exports.DISK_STATUS = exports.ROADMAP_STATUS_TOKEN = exports.WIRE_STATUS = exports.PHASE_STATUS = void 0;
|
|
43
|
+
exports.phaseStatusFromFacts = phaseStatusFromFacts;
|
|
44
|
+
exports.phaseStatus = phaseStatus;
|
|
45
|
+
exports.foldPhaseStatuses = foldPhaseStatuses;
|
|
46
|
+
exports.toDisplayLabel = toDisplayLabel;
|
|
47
|
+
exports.toWireStatus = toWireStatus;
|
|
48
|
+
exports.toRoadmapStatusCell = toRoadmapStatusCell;
|
|
49
|
+
exports.toDiskStatus = toDiskStatus;
|
|
50
|
+
exports.toCompletionStatus = toCompletionStatus;
|
|
51
|
+
exports.toProgressStatus = toProgressStatus;
|
|
52
|
+
exports.matchRoadmapStatusCell = matchRoadmapStatusCell;
|
|
53
|
+
exports.parseRoadmapStatusCell = parseRoadmapStatusCell;
|
|
54
|
+
// ─── Closed vocabularies ───────────────────────────────────────────────────
|
|
55
|
+
/** The lifecycle ladder, lowest rung first. */
|
|
56
|
+
exports.PHASE_STATUS = Object.freeze({
|
|
57
|
+
NOT_STARTED: 'NOT_STARTED',
|
|
58
|
+
PLANNED: 'PLANNED',
|
|
59
|
+
IN_PROGRESS: 'IN_PROGRESS',
|
|
60
|
+
EXECUTED: 'EXECUTED',
|
|
61
|
+
NEEDS_REVIEW: 'NEEDS_REVIEW',
|
|
62
|
+
COMPLETE: 'COMPLETE',
|
|
63
|
+
});
|
|
64
|
+
/**
|
|
65
|
+
* The three-value wire vocabulary published by `.planning/state.json`
|
|
66
|
+
* (`phases[].status`) and the Workstream Inventory (`PhaseStatus.status`).
|
|
67
|
+
*/
|
|
68
|
+
exports.WIRE_STATUS = Object.freeze({
|
|
69
|
+
COMPLETE: 'complete',
|
|
70
|
+
IN_PROGRESS: 'in_progress',
|
|
71
|
+
PENDING: 'pending',
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* The ROADMAP `## Progress` table Status-cell vocabulary: the template's
|
|
75
|
+
* `Not started | In progress | Complete | Deferred` plus the `Planned` word
|
|
76
|
+
* `roadmap update-plan-progress` writes. `In Progress` is spelled the way the
|
|
77
|
+
* writers have always written it.
|
|
78
|
+
*/
|
|
79
|
+
exports.ROADMAP_STATUS_TOKEN = Object.freeze({
|
|
80
|
+
NOT_STARTED: 'Not started',
|
|
81
|
+
PLANNED: 'Planned',
|
|
82
|
+
IN_PROGRESS: 'In Progress',
|
|
83
|
+
COMPLETE: 'Complete',
|
|
84
|
+
DEFERRED: 'Deferred',
|
|
85
|
+
});
|
|
86
|
+
/** `roadmap analyze` / `init manager`'s `disk_status` vocabulary (ADR-5057 §1.2). */
|
|
87
|
+
exports.DISK_STATUS = Object.freeze({
|
|
88
|
+
COMPLETE: 'complete',
|
|
89
|
+
EXECUTED: 'executed',
|
|
90
|
+
PARTIAL: 'partial',
|
|
91
|
+
PLANNED: 'planned',
|
|
92
|
+
RESEARCHED: 'researched',
|
|
93
|
+
DISCUSSED: 'discussed',
|
|
94
|
+
EMPTY: 'empty',
|
|
95
|
+
NO_DIRECTORY: 'no_directory',
|
|
96
|
+
});
|
|
97
|
+
/** `init progress`'s per-phase `status` vocabulary (ADR-5057 §1.2). */
|
|
98
|
+
exports.PROGRESS_STATUS = Object.freeze({
|
|
99
|
+
COMPLETE: 'complete',
|
|
100
|
+
EXECUTED: 'executed',
|
|
101
|
+
IN_PROGRESS: 'in_progress',
|
|
102
|
+
RESEARCHED: 'researched',
|
|
103
|
+
PENDING: 'pending',
|
|
104
|
+
NOT_STARTED: 'not_started',
|
|
105
|
+
});
|
|
106
|
+
/** `init`'s `completion_status` vocabulary (ADR-5057 §1.2). */
|
|
107
|
+
exports.COMPLETION_STATUS = Object.freeze({
|
|
108
|
+
COMPLETE: 'complete',
|
|
109
|
+
EXECUTED: 'executed',
|
|
110
|
+
INCOMPLETE: 'incomplete',
|
|
111
|
+
});
|
|
112
|
+
const LADDER = Object.freeze([
|
|
113
|
+
exports.PHASE_STATUS.NOT_STARTED,
|
|
114
|
+
exports.PHASE_STATUS.PLANNED,
|
|
115
|
+
exports.PHASE_STATUS.IN_PROGRESS,
|
|
116
|
+
exports.PHASE_STATUS.EXECUTED,
|
|
117
|
+
exports.PHASE_STATUS.NEEDS_REVIEW,
|
|
118
|
+
exports.PHASE_STATUS.COMPLETE,
|
|
119
|
+
]);
|
|
120
|
+
const LADDER_RANK = new Map(LADDER.map((s, i) => [s, i]));
|
|
121
|
+
function assertPhaseStatus(value, where) {
|
|
122
|
+
if (typeof value !== 'string' || !LADDER_RANK.has(value)) {
|
|
123
|
+
throw new TypeError(`${where}: ${JSON.stringify(value)} is not a PHASE_STATUS value`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function assertCount(value, name) {
|
|
127
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
|
|
128
|
+
throw new TypeError(`phaseStatusFromFacts: ${name} must be a non-negative integer, got ${JSON.stringify(value)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The ladder. First matching rung wins:
|
|
133
|
+
* complete → COMPLETE (disk-strict: no plan precondition, #3168)
|
|
134
|
+
* no plans → NOT_STARTED
|
|
135
|
+
* no summaries → PLANNED
|
|
136
|
+
* fewer summaries than plans → IN_PROGRESS
|
|
137
|
+
* verification `human_needed` → NEEDS_REVIEW
|
|
138
|
+
* otherwise → EXECUTED (gaps_found, stale, missing, unparseable, phase_dir_not_found)
|
|
139
|
+
*
|
|
140
|
+
* `verificationStatus`, when non-null, must be a VerificationStatus member
|
|
141
|
+
* (#5118) — the same fail-where-produced rule as `assertPhaseStatus`.
|
|
142
|
+
*
|
|
143
|
+
* Completion comes ONLY from `complete`. The ladder never restates a
|
|
144
|
+
* summary-versus-plan completion comparison (scripts/lint-completion-predicate-drift.cjs shape (c)).
|
|
145
|
+
*/
|
|
146
|
+
function phaseStatusFromFacts(facts) {
|
|
147
|
+
if (facts === null || typeof facts !== 'object') {
|
|
148
|
+
throw new TypeError('phaseStatusFromFacts: facts object required');
|
|
149
|
+
}
|
|
150
|
+
const { planCount, summaryCount, complete, verificationStatus } = facts;
|
|
151
|
+
assertCount(planCount, 'planCount');
|
|
152
|
+
assertCount(summaryCount, 'summaryCount');
|
|
153
|
+
if (typeof complete !== 'boolean') {
|
|
154
|
+
throw new TypeError(`phaseStatusFromFacts: complete must be a boolean, got ${JSON.stringify(complete)}`);
|
|
155
|
+
}
|
|
156
|
+
const { verification } = owners();
|
|
157
|
+
if (verificationStatus !== null && verificationStatus !== undefined) {
|
|
158
|
+
// Called through a plain function type: a lazily-required owner's
|
|
159
|
+
// assertion signature cannot narrow here (TS2775), and needs not to.
|
|
160
|
+
const assertMember = verification.assertVerificationStatus;
|
|
161
|
+
assertMember(verificationStatus, 'phaseStatusFromFacts: verificationStatus');
|
|
162
|
+
}
|
|
163
|
+
if (complete)
|
|
164
|
+
return exports.PHASE_STATUS.COMPLETE;
|
|
165
|
+
if (planCount === 0)
|
|
166
|
+
return exports.PHASE_STATUS.NOT_STARTED;
|
|
167
|
+
if (summaryCount === 0)
|
|
168
|
+
return exports.PHASE_STATUS.PLANNED;
|
|
169
|
+
if (summaryCount < planCount)
|
|
170
|
+
return exports.PHASE_STATUS.IN_PROGRESS;
|
|
171
|
+
if (verificationStatus === verification.VERIFICATION_STATUS.HUMAN_NEEDED)
|
|
172
|
+
return exports.PHASE_STATUS.NEEDS_REVIEW;
|
|
173
|
+
return exports.PHASE_STATUS.EXECUTED;
|
|
174
|
+
}
|
|
175
|
+
const SCOPE_SEVERITY = Object.freeze({
|
|
176
|
+
complete: 0,
|
|
177
|
+
truncated: 1,
|
|
178
|
+
unscoped: 2,
|
|
179
|
+
unreadable: 3,
|
|
180
|
+
});
|
|
181
|
+
let _verification = null;
|
|
182
|
+
let _planScan = null;
|
|
183
|
+
function owners() {
|
|
184
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
185
|
+
if (!_verification)
|
|
186
|
+
_verification = require('./verification.cjs');
|
|
187
|
+
if (!_planScan)
|
|
188
|
+
_planScan = require('./plan-scan.cjs');
|
|
189
|
+
/* eslint-enable @typescript-eslint/no-require-imports */
|
|
190
|
+
return { verification: _verification, planScan: _planScan };
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* What state is the phase in `phaseDir` in? Composes only ADR-3180's §7
|
|
194
|
+
* owners. `scope` is the worse of the plan scan's and the completion read's
|
|
195
|
+
* scopes, so a caller can tell "not started" from "could not look".
|
|
196
|
+
*/
|
|
197
|
+
function phaseStatus(phaseDir, deps = {}) {
|
|
198
|
+
const { verification, planScan } = owners();
|
|
199
|
+
const scan = planScan.scanPhasePlans(phaseDir);
|
|
200
|
+
const completion = verification.isPhaseComplete(phaseDir, {
|
|
201
|
+
convention: deps.convention,
|
|
202
|
+
fs: deps.fs,
|
|
203
|
+
phaseCleanCommitTimesMs: deps.phaseCleanCommitTimesMs,
|
|
204
|
+
});
|
|
205
|
+
const status = phaseStatusFromFacts({
|
|
206
|
+
planCount: scan.planCount,
|
|
207
|
+
summaryCount: scan.summaryCount,
|
|
208
|
+
complete: completion.value.complete,
|
|
209
|
+
verificationStatus: completion.value.verification.status,
|
|
210
|
+
});
|
|
211
|
+
const scope = (SCOPE_SEVERITY[completion.scope] ?? 0) > (SCOPE_SEVERITY[scan.scope] ?? 0)
|
|
212
|
+
? completion.scope
|
|
213
|
+
: scan.scope;
|
|
214
|
+
return {
|
|
215
|
+
value: {
|
|
216
|
+
status,
|
|
217
|
+
planCount: scan.planCount,
|
|
218
|
+
summaryCount: scan.summaryCount,
|
|
219
|
+
verification: completion.value.verification,
|
|
220
|
+
...(completion.value.statusError ? { statusError: completion.value.statusError } : {}),
|
|
221
|
+
},
|
|
222
|
+
scope,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
// ─── Fold (#2408) ──────────────────────────────────────────────────────────
|
|
226
|
+
/**
|
|
227
|
+
* Fold two statuses for directories that collide on one phase key (#2408):
|
|
228
|
+
* the further-along rung wins. Commutative, idempotent and associative, so
|
|
229
|
+
* `readdirSync` order cannot change the answer.
|
|
230
|
+
*/
|
|
231
|
+
function foldPhaseStatuses(a, b) {
|
|
232
|
+
assertPhaseStatus(a, 'foldPhaseStatuses');
|
|
233
|
+
assertPhaseStatus(b, 'foldPhaseStatuses');
|
|
234
|
+
return LADDER_RANK.get(a) >= LADDER_RANK.get(b) ? a : b;
|
|
235
|
+
}
|
|
236
|
+
const DISPLAY_LABEL = Object.freeze({
|
|
237
|
+
[exports.PHASE_STATUS.NOT_STARTED]: 'Not Started',
|
|
238
|
+
[exports.PHASE_STATUS.PLANNED]: 'Planned',
|
|
239
|
+
[exports.PHASE_STATUS.IN_PROGRESS]: 'In Progress',
|
|
240
|
+
[exports.PHASE_STATUS.EXECUTED]: 'Executed',
|
|
241
|
+
[exports.PHASE_STATUS.NEEDS_REVIEW]: 'Needs Review',
|
|
242
|
+
[exports.PHASE_STATUS.COMPLETE]: 'Complete',
|
|
243
|
+
});
|
|
244
|
+
/**
|
|
245
|
+
* The label `progress`, `stats`, `init plan-phase` and `gsd-health` show. The
|
|
246
|
+
* NOT_STARTED word is the caller's display choice (`progress` and `init` say
|
|
247
|
+
* `Pending`, `stats` and the health rule say `Not Started`).
|
|
248
|
+
*/
|
|
249
|
+
function toDisplayLabel(status, opts = {}) {
|
|
250
|
+
assertPhaseStatus(status, 'toDisplayLabel');
|
|
251
|
+
const pendingWord = opts.pendingWord ?? 'Not Started';
|
|
252
|
+
if (pendingWord !== 'Pending' && pendingWord !== 'Not Started') {
|
|
253
|
+
throw new TypeError(`toDisplayLabel: pendingWord must be 'Pending' or 'Not Started', got ${JSON.stringify(pendingWord)}`);
|
|
254
|
+
}
|
|
255
|
+
return status === exports.PHASE_STATUS.NOT_STARTED ? pendingWord : DISPLAY_LABEL[status];
|
|
256
|
+
}
|
|
257
|
+
/** `pending` means nothing is planned yet; every rung between that and COMPLETE is `in_progress`. */
|
|
258
|
+
function toWireStatus(status) {
|
|
259
|
+
assertPhaseStatus(status, 'toWireStatus');
|
|
260
|
+
if (status === exports.PHASE_STATUS.COMPLETE)
|
|
261
|
+
return exports.WIRE_STATUS.COMPLETE;
|
|
262
|
+
if (status === exports.PHASE_STATUS.NOT_STARTED)
|
|
263
|
+
return exports.WIRE_STATUS.PENDING;
|
|
264
|
+
return exports.WIRE_STATUS.IN_PROGRESS;
|
|
265
|
+
}
|
|
266
|
+
/** The word a ROADMAP writer puts in the Status cell for this rung. */
|
|
267
|
+
function toRoadmapStatusCell(status) {
|
|
268
|
+
assertPhaseStatus(status, 'toRoadmapStatusCell');
|
|
269
|
+
switch (status) {
|
|
270
|
+
case exports.PHASE_STATUS.COMPLETE: return exports.ROADMAP_STATUS_TOKEN.COMPLETE;
|
|
271
|
+
case exports.PHASE_STATUS.PLANNED: return exports.ROADMAP_STATUS_TOKEN.PLANNED;
|
|
272
|
+
case exports.PHASE_STATUS.NOT_STARTED: return exports.ROADMAP_STATUS_TOKEN.NOT_STARTED;
|
|
273
|
+
default: return exports.ROADMAP_STATUS_TOKEN.IN_PROGRESS;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* `roadmap analyze` / `init manager`'s `disk_status`. Below NOT_STARTED the
|
|
278
|
+
* word records which pre-planning artifacts exist. (`no_directory` is the
|
|
279
|
+
* callers' own word for "no directory matched" — there is no phase to ask.)
|
|
280
|
+
*/
|
|
281
|
+
function toDiskStatus(status, artifacts) {
|
|
282
|
+
assertPhaseStatus(status, 'toDiskStatus');
|
|
283
|
+
switch (status) {
|
|
284
|
+
case exports.PHASE_STATUS.COMPLETE: return exports.DISK_STATUS.COMPLETE;
|
|
285
|
+
case exports.PHASE_STATUS.NEEDS_REVIEW:
|
|
286
|
+
case exports.PHASE_STATUS.EXECUTED: return exports.DISK_STATUS.EXECUTED;
|
|
287
|
+
case exports.PHASE_STATUS.IN_PROGRESS: return exports.DISK_STATUS.PARTIAL;
|
|
288
|
+
case exports.PHASE_STATUS.PLANNED: return exports.DISK_STATUS.PLANNED;
|
|
289
|
+
default:
|
|
290
|
+
if (artifacts.hasResearch)
|
|
291
|
+
return exports.DISK_STATUS.RESEARCHED;
|
|
292
|
+
if (artifacts.hasContext)
|
|
293
|
+
return exports.DISK_STATUS.DISCUSSED;
|
|
294
|
+
return exports.DISK_STATUS.EMPTY;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/** `init`'s `completion_status`: complete / executed / incomplete. */
|
|
298
|
+
function toCompletionStatus(status) {
|
|
299
|
+
assertPhaseStatus(status, 'toCompletionStatus');
|
|
300
|
+
if (status === exports.PHASE_STATUS.COMPLETE)
|
|
301
|
+
return exports.COMPLETION_STATUS.COMPLETE;
|
|
302
|
+
if (status === exports.PHASE_STATUS.EXECUTED || status === exports.PHASE_STATUS.NEEDS_REVIEW)
|
|
303
|
+
return exports.COMPLETION_STATUS.EXECUTED;
|
|
304
|
+
return exports.COMPLETION_STATUS.INCOMPLETE;
|
|
305
|
+
}
|
|
306
|
+
/** `init progress`'s per-phase `status`. */
|
|
307
|
+
function toProgressStatus(status, artifacts) {
|
|
308
|
+
assertPhaseStatus(status, 'toProgressStatus');
|
|
309
|
+
switch (status) {
|
|
310
|
+
case exports.PHASE_STATUS.COMPLETE: return exports.PROGRESS_STATUS.COMPLETE;
|
|
311
|
+
case exports.PHASE_STATUS.NEEDS_REVIEW:
|
|
312
|
+
case exports.PHASE_STATUS.EXECUTED: return exports.PROGRESS_STATUS.EXECUTED;
|
|
313
|
+
case exports.PHASE_STATUS.IN_PROGRESS:
|
|
314
|
+
case exports.PHASE_STATUS.PLANNED: return exports.PROGRESS_STATUS.IN_PROGRESS;
|
|
315
|
+
default: return artifacts.hasResearch ? exports.PROGRESS_STATUS.RESEARCHED : exports.PROGRESS_STATUS.PENDING;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// ─── ROADMAP Status cell reader ────────────────────────────────────────────
|
|
319
|
+
// Leading token of a trimmed cell, case-insensitive, a whitespace run allowed
|
|
320
|
+
// inside the two-word tokens, and `(?!\w)` so `Completed` / `Planning` are not
|
|
321
|
+
// tokens. #4925 lets operator prose follow the token; that prose is ignored.
|
|
322
|
+
const CELL_TOKEN_RE = /^(not\s+started|planned|in\s+progress|complete|deferred)(?!\w)/i;
|
|
323
|
+
const TOKEN_BY_KEY = Object.freeze({
|
|
324
|
+
'not started': exports.ROADMAP_STATUS_TOKEN.NOT_STARTED,
|
|
325
|
+
planned: exports.ROADMAP_STATUS_TOKEN.PLANNED,
|
|
326
|
+
'in progress': exports.ROADMAP_STATUS_TOKEN.IN_PROGRESS,
|
|
327
|
+
complete: exports.ROADMAP_STATUS_TOKEN.COMPLETE,
|
|
328
|
+
deferred: exports.ROADMAP_STATUS_TOKEN.DEFERRED,
|
|
329
|
+
});
|
|
330
|
+
/**
|
|
331
|
+
* Read a Status cell's leading token. Returns the canonical token and the raw
|
|
332
|
+
* text it matched (writers compare `text` to decide whether a rewrite is a
|
|
333
|
+
* no-op), or null when the cell has no leading token. Never throws.
|
|
334
|
+
*/
|
|
335
|
+
function matchRoadmapStatusCell(cell) {
|
|
336
|
+
if (typeof cell !== 'string')
|
|
337
|
+
return null;
|
|
338
|
+
const m = CELL_TOKEN_RE.exec(cell.trim());
|
|
339
|
+
if (!m)
|
|
340
|
+
return null;
|
|
341
|
+
const key = m[1].toLowerCase().replace(/\s+/g, ' ');
|
|
342
|
+
return { token: TOKEN_BY_KEY[key], text: m[1] };
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* A Status cell as a wire value. `Deferred`, `Not started`, a cell with no
|
|
346
|
+
* leading token, and a non-string all read `pending` — an unrecognized cell
|
|
347
|
+
* never becomes a fourth wire value. Inverse of `toRoadmapStatusCell` under
|
|
348
|
+
* `toWireStatus` (ADR-5057 Phase 1 property).
|
|
349
|
+
*/
|
|
350
|
+
function parseRoadmapStatusCell(cell) {
|
|
351
|
+
const m = matchRoadmapStatusCell(cell);
|
|
352
|
+
if (m === null)
|
|
353
|
+
return exports.WIRE_STATUS.PENDING;
|
|
354
|
+
switch (m.token) {
|
|
355
|
+
case exports.ROADMAP_STATUS_TOKEN.COMPLETE: return exports.WIRE_STATUS.COMPLETE;
|
|
356
|
+
case exports.ROADMAP_STATUS_TOKEN.IN_PROGRESS:
|
|
357
|
+
case exports.ROADMAP_STATUS_TOKEN.PLANNED: return exports.WIRE_STATUS.IN_PROGRESS;
|
|
358
|
+
default: return exports.WIRE_STATUS.PENDING;
|
|
359
|
+
}
|
|
360
|
+
}
|