mandrel 2.60.0 → 2.62.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/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
package/lib/cli/version-check.js
CHANGED
|
@@ -1,57 +1,19 @@
|
|
|
1
1
|
// lib/cli/version-check.js
|
|
2
2
|
/**
|
|
3
|
-
* Daily-cached version
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Detects a stale install ("f-notify-stale") via a daily on-disk JSON cache so
|
|
7
|
-
* callers learn that a newer version exists **without** issuing a network call
|
|
8
|
-
* on every command. The cache lives under the project's temp root as a small
|
|
9
|
-
* JSON document:
|
|
10
|
-
*
|
|
11
|
-
* { "latestVersion": "<semver>", "checkedAt": "<ISO-8601 timestamp>" }
|
|
12
|
-
*
|
|
13
|
-
* `isStale` reads that cache and only invokes the injected network `runner`
|
|
14
|
-
* seam when the cached `checkedAt` is older than 24h. A fresh cache short-
|
|
15
|
-
* circuits with zero network I/O; a missing, unreadable, or stale cache
|
|
16
|
-
* triggers exactly one `runner` call and a cache refresh.
|
|
17
|
-
*
|
|
18
|
-
* Security (security-baseline § 5 — Data Leakage & Logging):
|
|
19
|
-
* - Logs only version strings and filesystem paths. Never logs tokens,
|
|
20
|
-
* credentials, environment values, or raw file contents.
|
|
21
|
-
* - Performs no shell-string interpolation; the network probe is delegated
|
|
22
|
-
* to the injected `runner` seam so the host owns transport and auth.
|
|
23
|
-
*
|
|
24
|
-
* Injectable seams (used by lib/cli/__tests__/version-check.test.js):
|
|
25
|
-
* - `cachePath` — absolute path to the daily cache JSON file
|
|
26
|
-
* - `now` — Date provider (defaults to `new Date()`)
|
|
27
|
-
* - `runner` — async network seam returning the latest version string
|
|
28
|
-
* - `fs` — node:fs surface (readFileSync / writeFileSync / mkdirSync)
|
|
29
|
-
* - `log` — structured logger seam (defaults to a no-op)
|
|
30
|
-
*
|
|
31
|
-
* Following the lib/cli/*.js convention: Node built-ins only, every effectful
|
|
32
|
-
* dependency is an injectable seam, and the default export is the seam-free
|
|
33
|
-
* production wiring.
|
|
3
|
+
* Daily-cached newest-version check: `{ latestVersion, checkedAt }` JSON under
|
|
4
|
+
* the temp root, so commands learn of a newer release without a network call
|
|
5
|
+
* each time. Logs only versions and paths.
|
|
34
6
|
*/
|
|
35
7
|
|
|
36
8
|
import nodeFs from 'node:fs';
|
|
37
9
|
import path from 'node:path';
|
|
38
10
|
|
|
39
|
-
/** Cache freshness window in milliseconds (24 hours). */
|
|
40
11
|
export const STALE_AFTER_MS = 24 * 60 * 60 * 1000;
|
|
41
12
|
|
|
42
|
-
/** Default cache filename under the temp root. */
|
|
43
13
|
export const DEFAULT_CACHE_FILENAME = 'version-check.json';
|
|
44
14
|
|
|
45
15
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* Returns `null` when the file is absent, unreadable, malformed, or missing
|
|
49
|
-
* the required `checkedAt` / `latestVersion` fields — every one of those is a
|
|
50
|
-
* "treat as no cache" condition for `isStale`, so callers never have to
|
|
51
|
-
* distinguish them.
|
|
52
|
-
*
|
|
53
|
-
* Never throws: a corrupt or missing cache must degrade to a refresh, not a
|
|
54
|
-
* crash.
|
|
16
|
+
* `null` (never a throw) for any absent, unreadable or malformed cache.
|
|
55
17
|
*
|
|
56
18
|
* @param {{
|
|
57
19
|
* cachePath: string,
|
|
@@ -66,7 +28,6 @@ export function readCache({ cachePath, fs = nodeFs }) {
|
|
|
66
28
|
try {
|
|
67
29
|
raw = fs.readFileSync(cachePath, 'utf8');
|
|
68
30
|
} catch {
|
|
69
|
-
// Missing or unreadable file → no cache.
|
|
70
31
|
return null;
|
|
71
32
|
}
|
|
72
33
|
|
|
@@ -74,7 +35,6 @@ export function readCache({ cachePath, fs = nodeFs }) {
|
|
|
74
35
|
try {
|
|
75
36
|
parsed = JSON.parse(raw);
|
|
76
37
|
} catch {
|
|
77
|
-
// Malformed JSON → no cache.
|
|
78
38
|
return null;
|
|
79
39
|
}
|
|
80
40
|
|
|
@@ -91,11 +51,6 @@ export function readCache({ cachePath, fs = nodeFs }) {
|
|
|
91
51
|
}
|
|
92
52
|
|
|
93
53
|
/**
|
|
94
|
-
* Persist `{ latestVersion, checkedAt }` JSON to the cache path, creating the
|
|
95
|
-
* parent directory (the temp root) when needed.
|
|
96
|
-
*
|
|
97
|
-
* Logs only the version string and the cache path — never the raw payload.
|
|
98
|
-
*
|
|
99
54
|
* @param {{
|
|
100
55
|
* cachePath: string,
|
|
101
56
|
* latestVersion: string,
|
|
@@ -103,7 +58,7 @@ export function readCache({ cachePath, fs = nodeFs }) {
|
|
|
103
58
|
* fs?: typeof import('node:fs'),
|
|
104
59
|
* log?: (msg: string) => void,
|
|
105
60
|
* }} opts
|
|
106
|
-
* @returns {{ latestVersion: string, checkedAt: string }}
|
|
61
|
+
* @returns {{ latestVersion: string, checkedAt: string }}
|
|
107
62
|
*/
|
|
108
63
|
export function refreshCache({
|
|
109
64
|
cachePath,
|
|
@@ -121,32 +76,15 @@ export function refreshCache({
|
|
|
121
76
|
fs.mkdirSync(dir, { recursive: true });
|
|
122
77
|
fs.writeFileSync(cachePath, `${JSON.stringify(record, null, 2)}\n`, 'utf8');
|
|
123
78
|
|
|
124
|
-
// Safe to log: version string + path only (security-baseline § 5).
|
|
125
79
|
log(`version-check: cached latestVersion=${latestVersion} at ${cachePath}`);
|
|
126
80
|
|
|
127
81
|
return record;
|
|
128
82
|
}
|
|
129
83
|
|
|
130
84
|
/**
|
|
131
|
-
*
|
|
132
|
-
* it
|
|
133
|
-
*
|
|
134
|
-
* Behaviour:
|
|
135
|
-
* - **Fresh cache** (`checkedAt` within 24h): returns immediately with the
|
|
136
|
-
* cached version. The `runner` seam is **never** invoked — no per-command
|
|
137
|
-
* network call.
|
|
138
|
-
* - **Missing / corrupt / stale cache**: invokes `runner` exactly once to
|
|
139
|
-
* fetch the latest version, persists the result via `refreshCache`, and
|
|
140
|
-
* returns the refreshed record.
|
|
141
|
-
*
|
|
142
|
-
* The freshness comparison uses `>=` so an exactly-24h-old cache counts as
|
|
143
|
-
* stale (the boundary is treated as "due for refresh").
|
|
144
|
-
*
|
|
145
|
-
* `forceRefresh` skips the freshness read entirely and always probes. It is
|
|
146
|
-
* the supported way to bypass the cache: callers must **not** fake staleness
|
|
147
|
-
* by shifting `now` forward, because `now` is also the clock stamped into the
|
|
148
|
-
* refreshed `checkedAt` — a shifted clock persists a future timestamp and
|
|
149
|
-
* defeats the freshness window for every later reader (Story #4878).
|
|
85
|
+
* A cache under 24h old returns without calling `runner`; otherwise one probe
|
|
86
|
+
* refreshes it. Bypass with `forceRefresh`, never by shifting `now`: `now` is
|
|
87
|
+
* stamped as `checkedAt`, and a future stamp defeats every later reader.
|
|
150
88
|
*
|
|
151
89
|
* @param {{
|
|
152
90
|
* cachePath: string,
|
|
@@ -179,7 +117,6 @@ export async function isStale({
|
|
|
179
117
|
Number.isFinite(ageMs) && ageMs >= 0 && ageMs < STALE_AFTER_MS;
|
|
180
118
|
|
|
181
119
|
if (cacheIsFresh) {
|
|
182
|
-
// Fresh cache → no network call.
|
|
183
120
|
log(
|
|
184
121
|
`version-check: cache fresh latestVersion=${cached.latestVersion} (no network)`,
|
|
185
122
|
);
|
|
@@ -192,7 +129,6 @@ export async function isStale({
|
|
|
192
129
|
}
|
|
193
130
|
}
|
|
194
131
|
|
|
195
|
-
// Missing, corrupt, or stale cache → one network probe + refresh.
|
|
196
132
|
if (typeof runner !== 'function') {
|
|
197
133
|
throw new Error(
|
|
198
134
|
'version-check: runner seam is required to refresh a stale cache',
|
|
@@ -1,39 +1,18 @@
|
|
|
1
1
|
// lib/cli/version-helpers.js
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* `
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `compareVersions`; this module is the single authoritative
|
|
8
|
-
* implementation (Story #4048 B3 — multiplied helpers).
|
|
9
|
-
*
|
|
10
|
-
* `resolveConsumerPinVersion` (Story #4530) lives here for the same
|
|
11
|
-
* no-mirror-copies reason rather than in either file directly: `update.js`
|
|
12
|
-
* already imports `registry.js` (for the drift-check fallback), so a
|
|
13
|
-
* function needed by both would otherwise force a two-way circular import
|
|
14
|
-
* between them. This module is a dependency-free leaf both already import.
|
|
15
|
-
*
|
|
16
|
-
* Builtins only — this module is imported from both the CLI surface
|
|
17
|
-
* (`lib/cli/`) and the doctor registry which runs before third-party
|
|
18
|
-
* packages are guaranteed to be present.
|
|
19
|
-
*
|
|
20
|
-
* The two filesystem-touching helpers below take the module's injectable
|
|
21
|
-
* seam as their optional final `fsImpl` parameter, defaulting to the real
|
|
22
|
-
* `node:fs` (`.agents/rules/test-seams.md` rules 1-2);
|
|
23
|
-
* `resolveConsumerPinVersion` forwards that seam to
|
|
24
|
-
* `resolveConsumerPinSpec` rather than re-acquiring `fs` itself (rule 4).
|
|
25
|
-
* Every other export here is pure, so it needs no seam of its own.
|
|
3
|
+
* Version parse/compare and consumer-pin helpers shared by `update.js` and
|
|
4
|
+
* `registry.js`. A dependency-free, builtins-only leaf: `update.js` imports
|
|
5
|
+
* `registry.js` (a cycle otherwise), and the doctor registry runs before
|
|
6
|
+
* third-party packages are guaranteed present.
|
|
26
7
|
*/
|
|
27
8
|
|
|
28
9
|
import nodeFs from 'node:fs';
|
|
29
10
|
import path from 'node:path';
|
|
30
11
|
|
|
31
|
-
/** The published package whose consumer pin is resolved below. */
|
|
32
12
|
const PACKAGE_NAME = 'mandrel';
|
|
33
13
|
|
|
34
14
|
/**
|
|
35
|
-
*
|
|
36
|
-
* missing segments coerce to 0 so a partial version still compares sanely.
|
|
15
|
+
* Missing or non-numeric segments coerce to 0.
|
|
37
16
|
*
|
|
38
17
|
* @param {string} version
|
|
39
18
|
* @returns {[number, number, number]}
|
|
@@ -48,8 +27,7 @@ export function parseVersion(version) {
|
|
|
48
27
|
}
|
|
49
28
|
|
|
50
29
|
/**
|
|
51
|
-
*
|
|
52
|
-
* positive when `a > b` (the standard `Array.sort` comparator contract).
|
|
30
|
+
* `Array.sort` comparator contract.
|
|
53
31
|
*
|
|
54
32
|
* @param {string} a
|
|
55
33
|
* @param {string} b
|
|
@@ -65,10 +43,6 @@ export function compareVersions(a, b) {
|
|
|
65
43
|
}
|
|
66
44
|
|
|
67
45
|
/**
|
|
68
|
-
* True when `target`'s major axis is strictly greater than `current`'s —
|
|
69
|
-
* the gated "crosses a major boundary" condition used by the update
|
|
70
|
-
* orchestrator.
|
|
71
|
-
*
|
|
72
46
|
* @param {string} current
|
|
73
47
|
* @param {string} target
|
|
74
48
|
* @returns {boolean}
|
|
@@ -78,25 +52,8 @@ export function crossesMajor(current, target) {
|
|
|
78
52
|
}
|
|
79
53
|
|
|
80
54
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* {@link resolveConsumerPinSpec}?
|
|
84
|
-
*
|
|
85
|
-
* A deliberately minimal caret/tilde/exact implementation rather than a
|
|
86
|
-
* `semver` dependency: `version-helpers.js` is builtins-only (it is imported
|
|
87
|
-
* by the doctor registry, which runs before third-party packages are
|
|
88
|
-
* guaranteed to be present), and the only ranges
|
|
89
|
-
* {@link resolveConsumerPinSpec} ever yields are `^`, `~`, and exact.
|
|
90
|
-
*
|
|
91
|
-
* Semantics match npm's:
|
|
92
|
-
* - `''` (exact) → `version === spec.version`
|
|
93
|
-
* - `~1.2.3` → `>=1.2.3 <1.3.0`
|
|
94
|
-
* - `^1.2.3` → `>=1.2.3 <2.0.0`
|
|
95
|
-
* - `^0.2.3` → `>=0.2.3 <0.3.0` (0.x: the minor axis is the API axis)
|
|
96
|
-
* - `^0.0.3` → `>=0.0.3 <0.0.4`
|
|
97
|
-
*
|
|
98
|
-
* Prerelease tags are ignored on both sides, consistent with
|
|
99
|
-
* {@link parseVersion}'s numeric-tuple contract.
|
|
55
|
+
* npm caret/tilde/exact semantics (incl. 0.x caret), prereleases ignored —
|
|
56
|
+
* the only ranges {@link resolveConsumerPinSpec} yields, so no `semver` dep.
|
|
100
57
|
*
|
|
101
58
|
* @param {string} version
|
|
102
59
|
* @param {{ operator: '^' | '~' | '', version: string }} spec
|
|
@@ -120,20 +77,10 @@ export function satisfiesPinSpec(version, spec) {
|
|
|
120
77
|
}
|
|
121
78
|
|
|
122
79
|
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* `
|
|
126
|
-
* `
|
|
127
|
-
*
|
|
128
|
-
* Callers that only need to decide whether `npm install mandrel@<target>`
|
|
129
|
-
* would move the declared pin want {@link resolveConsumerPinVersion} (the
|
|
130
|
-
* base version alone). Callers that need to ask whether an installed
|
|
131
|
-
* version is *in range* — `mandrel doctor`'s `pin-current` check — need the
|
|
132
|
-
* operator too, because `^2.1.0` and `2.1.0` make very different claims
|
|
133
|
-
* about an installed 2.4.0.
|
|
134
|
-
*
|
|
135
|
-
* Returns `null` under exactly the same conditions as
|
|
136
|
-
* {@link resolveConsumerPinVersion} — see its contract.
|
|
80
|
+
* The consumer's declared `mandrel` pin (dependencies, then devDependencies)
|
|
81
|
+
* as operator + base version; the operator matters for in-range checks.
|
|
82
|
+
* `null`, never a throw, for no readable manifest, no entry, or anything but
|
|
83
|
+
* a plain exact/caret/tilde semver (`workspace:`, `latest`, ranges, …).
|
|
137
84
|
*
|
|
138
85
|
* @param {string} consumerRoot
|
|
139
86
|
* @param {typeof nodeFs} [fsImpl]
|
|
@@ -165,28 +112,8 @@ export function resolveConsumerPinSpec(consumerRoot, fsImpl = nodeFs) {
|
|
|
165
112
|
}
|
|
166
113
|
|
|
167
114
|
/**
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* `devDependencies`), stripping a leading `^`/`~` range operator to
|
|
171
|
-
* recover a base semver for comparison against the registry's newest
|
|
172
|
-
* published version.
|
|
173
|
-
*
|
|
174
|
-
* A base-version compare against the target is the right question here
|
|
175
|
-
* regardless of what the full range technically already matches: the
|
|
176
|
-
* declared pin is exactly what `npm install mandrel@<target>` (the
|
|
177
|
-
* `mandrel update` `npm-update` step) moves, so comparing its base version
|
|
178
|
-
* decides whether that step needs to run.
|
|
179
|
-
*
|
|
180
|
-
* Returns `null` — never throws — when there is no readable `package.json`,
|
|
181
|
-
* no `mandrel` entry in either dependency block, or the declared value
|
|
182
|
-
* isn't a plain exact/caret/tilde semver (a `workspace:`/`file:`/`git+`
|
|
183
|
-
* specifier, `latest`, `*`, or a comparator range). Callers fall back to
|
|
184
|
-
* resolving the actually-installed version in that case — see
|
|
185
|
-
* `lib/cli/update.js#resolveCurrentVersionForUpdate` and
|
|
186
|
-
* `lib/cli/registry.js`'s `pin-current` doctor check (both Story #4530),
|
|
187
|
-
* which is also how a project with no `mandrel` dependency at all —
|
|
188
|
-
* including mandrel's own repo, which carries no self-dependency —
|
|
189
|
-
* degrades to a clean skip rather than a false failure.
|
|
115
|
+
* The pin's base version: what `npm-update` moves, so comparing it decides
|
|
116
|
+
* whether that step runs whatever the range already matches.
|
|
190
117
|
*
|
|
191
118
|
* @param {string} consumerRoot
|
|
192
119
|
* @param {typeof nodeFs} [fsImpl]
|
|
@@ -1,53 +1,20 @@
|
|
|
1
1
|
// lib/migrations/helpers/retire-agentrc-key.js
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
* hits a hard validation failure on upgrade rather than a warning. Every such
|
|
10
|
-
* step reads the config, decides whether the key is present, deletes it,
|
|
11
|
-
* prunes whatever containers that emptied, and writes the file back — the
|
|
12
|
-
* same mechanics each time, previously copy-pasted per step (jscpd recorded
|
|
13
|
-
* five of them between 48 and 58 percent duplicated).
|
|
14
|
-
*
|
|
15
|
-
* Only three things actually vary between steps, so only those three are
|
|
16
|
-
* declared:
|
|
17
|
-
*
|
|
18
|
-
* - **which config surfaces to sweep** — `.agentrc.json` alone, or that plus
|
|
19
|
-
* the gitignored `.agentrc.local.json`. `config-resolver.js` deep-merges
|
|
20
|
-
* the overlay over the base *before* the AJV gate runs, so a key surviving
|
|
21
|
-
* in the overlay fails exactly as a base one would. A step that swept only
|
|
22
|
-
* the base would report "nothing to migrate" and leave that consumer hard
|
|
23
|
-
* broken with no self-service remedy.
|
|
24
|
-
* - **which key paths are retired** — a step may retire more than one.
|
|
25
|
-
* - **how far to prune emptied ancestors** — this is deliberately per-key
|
|
26
|
-
* and not a global policy. `planning` is optional, so an emptied
|
|
27
|
-
* `planning` block is removed; `project` is required and an empty
|
|
28
|
-
* `commands` object is valid against the schema, so pruning it would be a
|
|
29
|
-
* cosmetic edit to a config the consumer owns.
|
|
30
|
-
*
|
|
31
|
-
* Builtins only, and the `fs` seam stays injectable via `ctx.fs`, because
|
|
32
|
-
* these steps run during `mandrel update` before third-party packages are
|
|
33
|
-
* guaranteed to be present.
|
|
3
|
+
* Scaffold for steps that strip a retired `.agentrc` key (its block is
|
|
4
|
+
* `additionalProperties: false`, so a surviving key fails validation on
|
|
5
|
+
* upgrade). The default sweep includes `.agentrc.local.json`: the resolver
|
|
6
|
+
* merges it before validation. Prune depth is per-key, since pruning a
|
|
7
|
+
* required block is a gratuitous edit. Builtins only: runs during `mandrel
|
|
8
|
+
* update` before third-party packages are guaranteed present.
|
|
34
9
|
*/
|
|
35
10
|
|
|
36
11
|
import nodeFs from 'node:fs';
|
|
37
12
|
import path from 'node:path';
|
|
38
13
|
|
|
39
|
-
/** The committed config every consumer has. */
|
|
40
14
|
export const AGENTRC_BASE_FILENAME = '.agentrc.json';
|
|
41
15
|
|
|
42
|
-
/** The operator-owned, gitignored overlay the resolver merges over the base. */
|
|
43
16
|
const AGENTRC_LOCAL_FILENAME = '.agentrc.local.json';
|
|
44
17
|
|
|
45
|
-
/**
|
|
46
|
-
* Both surfaces the resolver reads — the default sweep for a retired key.
|
|
47
|
-
*
|
|
48
|
-
* Module-local: a step that wants both surfaces takes the default and names
|
|
49
|
-
* nothing, so exporting this would ship a symbol with no importer.
|
|
50
|
-
*/
|
|
51
18
|
const AGENTRC_FILENAMES = Object.freeze([
|
|
52
19
|
AGENTRC_BASE_FILENAME,
|
|
53
20
|
AGENTRC_LOCAL_FILENAME,
|
|
@@ -64,8 +31,7 @@ function resolveAgentrcPath(ctx, filename) {
|
|
|
64
31
|
}
|
|
65
32
|
|
|
66
33
|
/**
|
|
67
|
-
*
|
|
68
|
-
* common case (no overlay, fresh checkout), not an error.
|
|
34
|
+
* Absent or unparseable is the common case (no overlay), not an error.
|
|
69
35
|
*
|
|
70
36
|
* @param {unknown} ctx
|
|
71
37
|
* @param {string} filename
|
|
@@ -82,9 +48,7 @@ function readAgentrcConfig(ctx, filename, fsImpl) {
|
|
|
82
48
|
}
|
|
83
49
|
|
|
84
50
|
/**
|
|
85
|
-
*
|
|
86
|
-
* Returns `null` as soon as a level is missing or is not a plain object, which
|
|
87
|
-
* is what makes `hasKey` false for a config that never had the block.
|
|
51
|
+
* Every container along the key path; `null` if any level is missing.
|
|
88
52
|
*
|
|
89
53
|
* @param {object | null} config
|
|
90
54
|
* @param {string[]} keyPath
|
|
@@ -116,8 +80,7 @@ function hasKey(config, keyPath) {
|
|
|
116
80
|
}
|
|
117
81
|
|
|
118
82
|
/**
|
|
119
|
-
* Delete the leaf
|
|
120
|
-
* deletion left empty. `pruneDepth: 0` deletes the key and nothing else.
|
|
83
|
+
* Delete the leaf, then up to `pruneDepth` ancestors it left empty.
|
|
121
84
|
*
|
|
122
85
|
* @param {object} config
|
|
123
86
|
* @param {{ path: string[], pruneDepth?: number }} key
|
|
@@ -142,12 +105,8 @@ function stripKey(config, key) {
|
|
|
142
105
|
}
|
|
143
106
|
|
|
144
107
|
/**
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
* `detect` is true when any declared key is present in any swept surface;
|
|
149
|
-
* `apply` rewrites only the surfaces that actually carry one, which is what
|
|
150
|
-
* makes a repeat pass a genuine no-op rather than a reformat.
|
|
108
|
+
* `apply` rewrites only surfaces carrying a key, so a repeat pass never
|
|
109
|
+
* reformats.
|
|
151
110
|
*
|
|
152
111
|
* @param {{
|
|
153
112
|
* version: string,
|
package/lib/migrations/index.js
CHANGED
|
@@ -1,55 +1,8 @@
|
|
|
1
1
|
// lib/migrations/index.js
|
|
2
2
|
/**
|
|
3
|
-
* Version-keyed migration runner.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* project's on-disk state (config shape, baseline layout, materialized
|
|
7
|
-
* `.agents/` tree, …). When a consumer upgrades `mandrel` across a
|
|
8
|
-
* version boundary that changed a contract (see
|
|
9
|
-
* `.agents/rules/git-conventions.md` § Contract Cutovers), the upgrade path
|
|
10
|
-
* runs every migration whose `version` falls inside the upgrade range so the
|
|
11
|
-
* consumer's working tree matches the new release.
|
|
12
|
-
*
|
|
13
|
-
* The engine here is deliberately content-free: it owns ordering, version
|
|
14
|
-
* filtering, idempotency enforcement, and the actionable log line. The
|
|
15
|
-
* `migrations` registry is the single source of truth for which steps exist
|
|
16
|
-
* and in what order they run.
|
|
17
|
-
*
|
|
18
|
-
* ## Step shape
|
|
19
|
-
*
|
|
20
|
-
* Each entry in `migrations` is:
|
|
21
|
-
*
|
|
22
|
-
* ```js
|
|
23
|
-
* {
|
|
24
|
-
* version: '1.4.0', // semver the step graduates the tree to
|
|
25
|
-
* description: 'rename foo to bar', // short, operator-facing summary
|
|
26
|
-
* detect(ctx) { return boolean }, // true ⇒ this step still needs applying
|
|
27
|
-
* apply(ctx) { ... }, // perform the change (mutates ctx state)
|
|
28
|
-
* }
|
|
29
|
-
* ```
|
|
30
|
-
*
|
|
31
|
-
* ## Idempotency contract
|
|
32
|
-
*
|
|
33
|
-
* `detect(ctx)` MUST return `false` once `apply(ctx)` has run against the same
|
|
34
|
-
* context. The runner consults `detect` before every `apply`, so a step whose
|
|
35
|
-
* change is already present is skipped. This makes a second `runMigrations`
|
|
36
|
-
* pass over the same context a no-op — the property the unit test asserts.
|
|
37
|
-
*
|
|
38
|
-
* ## Version filtering
|
|
39
|
-
*
|
|
40
|
-
* `runMigrations({ fromVersion, toVersion, ctx })` applies only steps whose
|
|
41
|
-
* `version` is strictly greater than `fromVersion` and less than or equal to
|
|
42
|
-
* `toVersion`, in ascending version order. A step at exactly `fromVersion` is
|
|
43
|
-
* already in the tree (the consumer was on that version) and is skipped; a
|
|
44
|
-
* step at exactly `toVersion` is the target and runs.
|
|
45
|
-
*
|
|
46
|
-
* v2.0.0's Story-collapse cutover did not register a config migration step
|
|
47
|
-
* (consumers wipe/re-sync `.agents/` and re-seed `.agentrc.json` from the
|
|
48
|
-
* starter). Story #4531 registered the first real step — see
|
|
49
|
-
* `steps/2.1.0-retire-mi-drop-knobs.js` — alongside the fixture steps in
|
|
50
|
-
* `__tests__/index.test.js` that prove the machinery independent of any
|
|
51
|
-
* real step. When the next contract cutover lands, add its step here
|
|
52
|
-
* (ascending by version) with an idempotent `detect`/`apply`.
|
|
3
|
+
* Version-keyed migration runner. A step is `{ version, description,
|
|
4
|
+
* detect(ctx), apply(ctx) }`; `detect` MUST return false once `apply` has run
|
|
5
|
+
* on the same ctx, which makes a repeat pass a no-op.
|
|
53
6
|
*/
|
|
54
7
|
|
|
55
8
|
import { compareVersions } from '../cli/version-helpers.js';
|
|
@@ -62,10 +15,10 @@ import { retireLintBaselineCommand } from './steps/2.32.0-retire-lint-baseline-c
|
|
|
62
15
|
import { retireDeliveryLimitKnobs } from './steps/2.57.0-retire-delivery-limit-knobs.js';
|
|
63
16
|
import { retirePlanningLimitKnobs } from './steps/2.57.0-retire-planning-limit-knobs.js';
|
|
64
17
|
import { retireAuditResultsAutoFile } from './steps/2.60.0-retire-audit-results-autofile.js';
|
|
18
|
+
import { stripRemovedAgentrcKeys } from './steps/strip-removed-agentrc-keys.js';
|
|
65
19
|
|
|
66
20
|
/**
|
|
67
|
-
*
|
|
68
|
-
* `version`.
|
|
21
|
+
* MUST stay sorted ascending by `version`.
|
|
69
22
|
*
|
|
70
23
|
* @type {Array<{
|
|
71
24
|
* version: string,
|
|
@@ -84,29 +37,14 @@ export const migrations = [
|
|
|
84
37
|
retirePlanningLimitKnobs,
|
|
85
38
|
retireDeliveryLimitKnobs,
|
|
86
39
|
retireAuditResultsAutoFile,
|
|
40
|
+
stripRemovedAgentrcKeys,
|
|
87
41
|
];
|
|
88
42
|
|
|
89
|
-
/**
|
|
90
|
-
* The version ordering every migration decision uses.
|
|
91
|
-
*
|
|
92
|
-
* Re-exported from `lib/cli/version-helpers.js` — the dependency-free leaf
|
|
93
|
-
* that owns the canonical `parseVersion` / `compareVersions` pair (Story
|
|
94
|
-
* #4048 B3). The runner previously carried its own copy, so an ordering fix
|
|
95
|
-
* had to be made in three places or the copies drifted apart. Re-exporting
|
|
96
|
-
* rather than moving keeps this module's public surface intact for the
|
|
97
|
-
* callers that import `compareVersions` from here.
|
|
98
|
-
*/
|
|
99
43
|
export { compareVersions };
|
|
100
44
|
|
|
101
45
|
/**
|
|
102
|
-
*
|
|
103
|
-
* `
|
|
104
|
-
*
|
|
105
|
-
* Exported because `mandrel migrate --dry-run` has to preview exactly what the
|
|
106
|
-
* live run would do. That preview previously re-implemented this filter and
|
|
107
|
-
* carried a comment promising it "mirrors the runner's own comparator" — a
|
|
108
|
-
* sync obligation nothing enforced, and the reason a third `compareVersions`
|
|
109
|
-
* copy existed. One selector means the preview cannot drift from the run.
|
|
46
|
+
* `fromVersion < step.version <= toVersion`, ascending. Shared with
|
|
47
|
+
* `mandrel migrate --dry-run` so the preview cannot drift from the run.
|
|
110
48
|
*
|
|
111
49
|
* @param {{ registry?: Array<object>, fromVersion: string, toVersion: string }} params
|
|
112
50
|
* @returns {Array<object>}
|
|
@@ -126,35 +64,20 @@ export function selectStepsInRange({
|
|
|
126
64
|
}
|
|
127
65
|
|
|
128
66
|
/**
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* Steps are filtered to `fromVersion < version <= toVersion`, sorted ascending
|
|
132
|
-
* by version, and applied in order. Before each `apply`, the step's `detect`
|
|
133
|
-
* is consulted: a step whose change is already present (detect returns false)
|
|
134
|
-
* is skipped, which is what makes a repeat pass a no-op. Every step that
|
|
135
|
-
* actually applies prints `migrated <version>: <description>` through the
|
|
136
|
-
* injected `log` seam.
|
|
67
|
+
* Apply each in-range step whose `detect` is true.
|
|
137
68
|
*
|
|
138
69
|
* @param {object} params
|
|
139
|
-
* @param {string} params.fromVersion -
|
|
140
|
-
*
|
|
141
|
-
* @param {
|
|
142
|
-
*
|
|
143
|
-
* @param {unknown} params.ctx - Opaque context threaded to each step's
|
|
144
|
-
* `detect`/`apply`. Migrations mutate this to record their change.
|
|
145
|
-
* @param {(message: string) => void} [params.log] - Log seam for the
|
|
146
|
-
* actionable per-step line. Defaults to `console.log`. Injected by tests so
|
|
147
|
-
* no real stdout write occurs.
|
|
70
|
+
* @param {string} params.fromVersion - Exclusive.
|
|
71
|
+
* @param {string} params.toVersion - Inclusive.
|
|
72
|
+
* @param {unknown} params.ctx
|
|
73
|
+
* @param {(message: string) => void} [params.log]
|
|
148
74
|
* @param {Array<{
|
|
149
75
|
* version: string,
|
|
150
76
|
* description: string,
|
|
151
77
|
* detect: (ctx: unknown) => boolean,
|
|
152
78
|
* apply: (ctx: unknown) => void,
|
|
153
|
-
* }>} [params.registry]
|
|
154
|
-
*
|
|
155
|
-
* @returns {{ applied: string[], skipped: string[] }} The versions that
|
|
156
|
-
* applied and those that were in-range but skipped because `detect` returned
|
|
157
|
-
* false.
|
|
79
|
+
* }>} [params.registry]
|
|
80
|
+
* @returns {{ applied: string[], skipped: string[] }}
|
|
158
81
|
*/
|
|
159
82
|
export function runMigrations({
|
|
160
83
|
fromVersion,
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
// lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `delivery.quality.codingGuardrails.miDropMustRefactor` and
|
|
6
|
-
* `delivery.quality.autoRefresh.miDropCap` were schema-validated, defaulted,
|
|
7
|
-
* and seeded by `apply-quality-bootstrap.js` into a consumer's
|
|
8
|
-
* `.agentrc.json` — but never consumed by the gate they were named for
|
|
9
|
-
* (`maintainability.tolerance` is the knob actually in force; see the
|
|
10
|
-
* Story body for the full diagnosis). Both retired keys lived under
|
|
11
|
-
* sub-schemas with `additionalProperties: false`, so a consumer whose
|
|
12
|
-
* config still carries either key hits a hard AJV validation failure on
|
|
13
|
-
* upgrade, not a warning. This step strips them before that check runs.
|
|
14
|
-
*
|
|
15
|
-
* Unlike the later retire-steps this one sweeps the committed config only:
|
|
16
|
-
* the knobs were written by the bootstrap script, never hand-pinned in an
|
|
17
|
-
* operator's `.agentrc.local.json`.
|
|
3
|
+
* Strip the never-read MI-drop knobs. Base config only: the bootstrap script
|
|
4
|
+
* wrote them, never an operator's local overlay.
|
|
18
5
|
*/
|
|
19
6
|
|
|
20
7
|
import {
|
|
@@ -1,17 +1,5 @@
|
|
|
1
1
|
// lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js
|
|
2
|
-
/**
|
|
3
|
-
* Story #4531 — `delivery.deliverRunner.verifyConcurrencyCap` was retired
|
|
4
|
-
* when verification stopped being separately capped, but it stayed
|
|
5
|
-
* schema-validated in consumers' configs under a block carrying
|
|
6
|
-
* `additionalProperties: false`, so a config still setting it fails AJV
|
|
7
|
-
* validation on upgrade rather than warning. This step strips it before
|
|
8
|
-
* that check runs.
|
|
9
|
-
*
|
|
10
|
-
* Unlike the 2.1.0 mi-drop step, this one also sweeps `.agentrc.local.json`:
|
|
11
|
-
* the resolver deep-merges the local override over `.agentrc.json` and
|
|
12
|
-
* validates the *merged* result, so a key left in the local file fails the
|
|
13
|
-
* same way a key in the committed file does.
|
|
14
|
-
*/
|
|
2
|
+
/** Strip `delivery.deliverRunner.verifyConcurrencyCap`. */
|
|
15
3
|
|
|
16
4
|
import { createRetireAgentrcKeyStep } from '../helpers/retire-agentrc-key.js';
|
|
17
5
|
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
// lib/migrations/steps/2.11.0-retire-max-seed-words.js
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `.agentrc.json`.
|
|
6
|
-
*
|
|
7
|
-
* #4722 (PR #4725) hard-cutover-removed word-count complexity routing:
|
|
8
|
-
* the route derives from the authored Story's shape, never from seed word
|
|
9
|
-
* count, and `maxSeedWords` was dropped from the runtime AJV schema and
|
|
10
|
-
* the published mirror. The `complexityGate` block carries
|
|
11
|
-
* `additionalProperties: false`, so a consumer whose config still sets
|
|
12
|
-
* `maxSeedWords` hits a hard validation failure on upgrade, not a
|
|
13
|
-
* warning. This step strips the key before that check runs — the same
|
|
14
|
-
* contract-cutover pattern as `2.1.0-retire-mi-drop-knobs.js`.
|
|
15
|
-
*
|
|
16
|
-
* `planning` is an optional block, so an emptied `complexityGate` and an
|
|
17
|
-
* emptied `planning` are both pruned rather than left as orphan objects.
|
|
3
|
+
* Strip `planning.complexityGate.maxSeedWords`, pruning emptied optional
|
|
4
|
+
* ancestors.
|
|
18
5
|
*/
|
|
19
6
|
|
|
20
7
|
import {
|