mandrel 2.60.0 → 2.61.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/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 +83 -239
- 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 +136 -486
- 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 +25 -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
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* kinds/lighthouse.js — per-kind module for the Lighthouse audit baseline
|
|
3
|
-
* (Story #1891). Row shape: `{ route, performance, accessibility,
|
|
4
|
-
* bestPractices, seo }`. The key field is `route` (a path-like string that
|
|
5
|
-
* still passes the path-canon checks for absolute / `..` rejection).
|
|
6
|
-
*
|
|
7
|
-
* Higher score = better. New routes inherit a base of 100 for each axis
|
|
8
|
-
* (so lower scores register as regressions — a new route must meet the
|
|
9
|
-
* bar); dropped routes inherit a head of 100 (so a higher base registers
|
|
10
|
-
* as an improvement). Unlike the file-derived kinds, compare emits no
|
|
11
|
-
* `additions` bucket. Scaffold is generated by `makeBaselineKind`
|
|
12
|
-
* (Story #3983).
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { canonicalise } from '../path-canon.js';
|
|
16
|
-
import { makeBaselineKind } from './kind-factory.js';
|
|
17
|
-
|
|
18
|
-
export const name = 'lighthouse';
|
|
19
|
-
export const keyField = 'route';
|
|
20
|
-
|
|
21
|
-
const LH_AXES = ['performance', 'accessibility', 'bestPractices', 'seo'];
|
|
22
|
-
|
|
23
|
-
function canonRoute(route) {
|
|
24
|
-
// Routes look like `/`, `/dashboard`, or `pricing` — strip the leading
|
|
25
|
-
// slash so the canonicaliser doesn't see them as absolute paths.
|
|
26
|
-
if (typeof route !== 'string') return canonicalise(route);
|
|
27
|
-
const stripped = route.startsWith('/') ? route.slice(1) : route;
|
|
28
|
-
if (stripped.length === 0) return '/';
|
|
29
|
-
return canonicalise(stripped);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function projectRow(row) {
|
|
33
|
-
return {
|
|
34
|
-
route: canonRoute(row.route),
|
|
35
|
-
performance: Number(row.performance),
|
|
36
|
-
accessibility: Number(row.accessibility),
|
|
37
|
-
bestPractices: Number(row.bestPractices),
|
|
38
|
-
seo: Number(row.seo),
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function meanOf(rows, axis) {
|
|
43
|
-
let sum = 0;
|
|
44
|
-
for (const r of rows) sum += r[axis] ?? 0;
|
|
45
|
-
return Number((sum / rows.length).toFixed(2));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function aggregate(rows) {
|
|
49
|
-
if (!rows || rows.length === 0) {
|
|
50
|
-
return { performance: 0, accessibility: 0, bestPractices: 0, seo: 0 };
|
|
51
|
-
}
|
|
52
|
-
return {
|
|
53
|
-
performance: meanOf(rows, 'performance'),
|
|
54
|
-
accessibility: meanOf(rows, 'accessibility'),
|
|
55
|
-
bestPractices: meanOf(rows, 'bestPractices'),
|
|
56
|
-
seo: meanOf(rows, 'seo'),
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function perfectLighthouseRow(route) {
|
|
61
|
-
return {
|
|
62
|
-
route,
|
|
63
|
-
performance: 100,
|
|
64
|
-
accessibility: 100,
|
|
65
|
-
bestPractices: 100,
|
|
66
|
-
seo: 100,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export const {
|
|
71
|
-
kernelVersion,
|
|
72
|
-
rowIdentity,
|
|
73
|
-
sortRows,
|
|
74
|
-
rollup,
|
|
75
|
-
compare,
|
|
76
|
-
applyEpsilon,
|
|
77
|
-
mergeRows,
|
|
78
|
-
} = makeBaselineKind({
|
|
79
|
-
keyField,
|
|
80
|
-
kernelVersion: '1.0.0',
|
|
81
|
-
axes: LH_AXES,
|
|
82
|
-
betterWhen: 'higher',
|
|
83
|
-
aggregate,
|
|
84
|
-
missingBasePolicy: 'perfect',
|
|
85
|
-
removedRowPolicy: { kind: 'perfect-head' },
|
|
86
|
-
perfectRow: perfectLighthouseRow,
|
|
87
|
-
});
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* kinds/lint.js — per-kind module for the lint baseline (Story #1891).
|
|
3
|
-
*
|
|
4
|
-
* Declares:
|
|
5
|
-
* - `name`: kind identifier matching the per-kind schema filename.
|
|
6
|
-
* - `keyField`: row field used as the rollup key (`path` here).
|
|
7
|
-
* - `kernelVersion()`: the lint kernel is the in-repo formatter contract
|
|
8
|
-
* — it has no upstream library version to track, so we ship a static
|
|
9
|
-
* semver and bump it whenever the rollup math or row shape changes.
|
|
10
|
-
* - `rollup(rows, components)`: aggregate per-component lint counts.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { componentMatches } from '../component-matcher.js';
|
|
14
|
-
import { canonicalise } from '../path-canon.js';
|
|
15
|
-
import { mergeRowsByScope } from '../scope.js';
|
|
16
|
-
|
|
17
|
-
export const name = 'lint';
|
|
18
|
-
export const keyField = 'path';
|
|
19
|
-
const KERNEL_VERSION = '1.0.0';
|
|
20
|
-
|
|
21
|
-
export function kernelVersion() {
|
|
22
|
-
return KERNEL_VERSION;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Aggregate `rows` into a `{ '*': {...}, [component]: {...} }` rollup. The
|
|
27
|
-
* caller passes `components` as an array of `{ name, includes, excludes }`
|
|
28
|
-
* objects. When `components` is empty or undefined the rollup carries only
|
|
29
|
-
* the whole-repo `*` key.
|
|
30
|
-
*
|
|
31
|
-
* Rollup math for lint: sum of `errorCount` and `warningCount` across the
|
|
32
|
-
* matching rows.
|
|
33
|
-
*/
|
|
34
|
-
export function rollup(rows, components = []) {
|
|
35
|
-
const all = { errorCount: 0, warningCount: 0 };
|
|
36
|
-
const buckets = new Map();
|
|
37
|
-
for (const row of rows ?? []) {
|
|
38
|
-
all.errorCount += row.errorCount ?? 0;
|
|
39
|
-
all.warningCount += row.warningCount ?? 0;
|
|
40
|
-
for (const c of components ?? []) {
|
|
41
|
-
if (componentMatches(c, row.path)) {
|
|
42
|
-
const existing = buckets.get(c.name) ?? {
|
|
43
|
-
errorCount: 0,
|
|
44
|
-
warningCount: 0,
|
|
45
|
-
};
|
|
46
|
-
existing.errorCount += row.errorCount ?? 0;
|
|
47
|
-
existing.warningCount += row.warningCount ?? 0;
|
|
48
|
-
buckets.set(c.name, existing);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
const out = { '*': all };
|
|
53
|
-
for (const [name, value] of buckets) out[name] = value;
|
|
54
|
-
return out;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Project a raw row into the canonical lint row shape. `path` is funnelled
|
|
59
|
-
* through the canonicaliser — every kind exposes a `projectRow` so the
|
|
60
|
-
* writer can normalise rows uniformly.
|
|
61
|
-
*/
|
|
62
|
-
export function projectRow(row) {
|
|
63
|
-
return {
|
|
64
|
-
path: canonicalise(row.path),
|
|
65
|
-
errorCount: row.errorCount ?? 0,
|
|
66
|
-
warningCount: row.warningCount ?? 0,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Canonical row identity (Story #5215). This kind does not use the shared
|
|
72
|
-
* factory scaffold, so it declares the protocol member itself; `path` is
|
|
73
|
-
* unique per row here, which a shipped-baseline injectivity test pins.
|
|
74
|
-
*
|
|
75
|
-
* @param {{path: string, errorCount: number, warningCount: number}} row
|
|
76
|
-
* @returns {string}
|
|
77
|
-
*/
|
|
78
|
-
export function rowIdentity(row) {
|
|
79
|
-
return row.path;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export function sortRows(rows) {
|
|
83
|
-
return [...rows].sort((a, b) => a.path.localeCompare(b.path));
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Pure compare(head, base) for the lint kind. Diffs rows by `path`.
|
|
88
|
-
*
|
|
89
|
-
* Classification (per row key):
|
|
90
|
-
* - regression: head has more errorCount or warningCount than base
|
|
91
|
-
* - improvement: head has fewer errorCount or warningCount than base
|
|
92
|
-
* - unchanged: counts match
|
|
93
|
-
*
|
|
94
|
-
* A row present in `head` but missing from `base` is treated as a new
|
|
95
|
-
* row — a regression if it carries any errors/warnings, otherwise
|
|
96
|
-
* unchanged. A row present in `base` but missing from `head` is treated
|
|
97
|
-
* as an improvement when it had findings, otherwise unchanged.
|
|
98
|
-
*
|
|
99
|
-
* No I/O. No process exit. No friction emission.
|
|
100
|
-
*/
|
|
101
|
-
export function compare(head, base) {
|
|
102
|
-
const headRows = Array.isArray(head?.rows) ? head.rows : [];
|
|
103
|
-
const baseRows = Array.isArray(base?.rows) ? base.rows : [];
|
|
104
|
-
const baseByKey = new Map();
|
|
105
|
-
for (const r of baseRows) baseByKey.set(r.path, r);
|
|
106
|
-
const seen = new Set();
|
|
107
|
-
const regressions = [];
|
|
108
|
-
const improvements = [];
|
|
109
|
-
const unchanged = [];
|
|
110
|
-
for (const h of headRows) {
|
|
111
|
-
seen.add(h.path);
|
|
112
|
-
const b = baseByKey.get(h.path);
|
|
113
|
-
const headTotal = (h.errorCount ?? 0) + (h.warningCount ?? 0);
|
|
114
|
-
if (!b) {
|
|
115
|
-
if (headTotal > 0) regressions.push({ key: h.path, head: h, base: null });
|
|
116
|
-
else unchanged.push({ key: h.path, head: h, base: null });
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
const errDelta = (h.errorCount ?? 0) - (b.errorCount ?? 0);
|
|
120
|
-
const warnDelta = (h.warningCount ?? 0) - (b.warningCount ?? 0);
|
|
121
|
-
if (errDelta > 0 || warnDelta > 0) {
|
|
122
|
-
regressions.push({ key: h.path, head: h, base: b });
|
|
123
|
-
} else if (errDelta < 0 || warnDelta < 0) {
|
|
124
|
-
improvements.push({ key: h.path, head: h, base: b });
|
|
125
|
-
} else {
|
|
126
|
-
unchanged.push({ key: h.path, head: h, base: b });
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
for (const b of baseRows) {
|
|
130
|
-
if (seen.has(b.path)) continue;
|
|
131
|
-
const baseTotal = (b.errorCount ?? 0) + (b.warningCount ?? 0);
|
|
132
|
-
if (baseTotal > 0) improvements.push({ key: b.path, head: null, base: b });
|
|
133
|
-
else unchanged.push({ key: b.path, head: null, base: b });
|
|
134
|
-
}
|
|
135
|
-
return { regressions, improvements, unchanged };
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Pure stabilizer for s-stability-epsilon (Story #1964). The metric is
|
|
140
|
-
* the maximum absolute delta across `errorCount` and `warningCount`. The
|
|
141
|
-
* framework default for lint is epsilon 0 (counts are integer; any change
|
|
142
|
-
* is meaningful), but the function honours any non-negative epsilon for
|
|
143
|
-
* operator overrides. Missing-prior rows fall through.
|
|
144
|
-
*
|
|
145
|
-
* @param {Array<{path: string, errorCount: number, warningCount: number}>} prior
|
|
146
|
-
* @param {Array<{path: string, errorCount: number, warningCount: number}>} regenerated
|
|
147
|
-
* @param {number} epsilon non-negative absolute tolerance on count deltas
|
|
148
|
-
* @returns {Array<object>}
|
|
149
|
-
*/
|
|
150
|
-
export function applyEpsilon(prior, regenerated, epsilon) {
|
|
151
|
-
const priorRows = Array.isArray(prior) ? prior : [];
|
|
152
|
-
const regenRows = Array.isArray(regenerated) ? regenerated : [];
|
|
153
|
-
const eps = Number.isFinite(epsilon) && epsilon >= 0 ? epsilon : 0;
|
|
154
|
-
const priorByKey = new Map();
|
|
155
|
-
for (const r of priorRows) priorByKey.set(r.path, r);
|
|
156
|
-
return regenRows.map((row) => {
|
|
157
|
-
const p = priorByKey.get(row.path);
|
|
158
|
-
if (!p) return row;
|
|
159
|
-
const errDelta = Math.abs((row.errorCount ?? 0) - (p.errorCount ?? 0));
|
|
160
|
-
const warnDelta = Math.abs((row.warningCount ?? 0) - (p.warningCount ?? 0));
|
|
161
|
-
return Math.max(errDelta, warnDelta) <= eps ? p : row;
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Pure scope-aware merge for s-diff-scoped-writes (Story #1974). Lint rows
|
|
167
|
-
* match by `path`. In diff mode, rows whose `path` is OUTSIDE
|
|
168
|
-
* `scope.files` are preserved from `prior` verbatim; in-scope rows come
|
|
169
|
-
* from `regenerated`. In full mode (or no scope), regenerated wins
|
|
170
|
-
* everywhere.
|
|
171
|
-
*
|
|
172
|
-
* @param {Array<{path: string, errorCount: number, warningCount: number}>} prior
|
|
173
|
-
* @param {Array<{path: string, errorCount: number, warningCount: number}>} regenerated
|
|
174
|
-
* @param {{mode: 'full'|'diff', files: Set<string>}|null|undefined} scope
|
|
175
|
-
* @returns {Array<object>}
|
|
176
|
-
*/
|
|
177
|
-
export function mergeRows(prior, regenerated, scope) {
|
|
178
|
-
return mergeRowsByScope({
|
|
179
|
-
prior,
|
|
180
|
-
regenerated,
|
|
181
|
-
scope,
|
|
182
|
-
scopeKey: (row) => row.path,
|
|
183
|
-
});
|
|
184
|
-
}
|
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
// .agents/scripts/lib/baselines/orphan-pruner.js
|
|
2
|
-
//
|
|
3
|
-
// Story #5012 — the measurement-free remedy that makes hard-failing on a stale
|
|
4
|
-
// baseline row defensible.
|
|
5
|
-
//
|
|
6
|
-
// The scope gate (`check-baseline-scope.js`) blocks a PR that leaves a row
|
|
7
|
-
// pointing at a file it deleted. A hard gate is only fair while its remedy is
|
|
8
|
-
// cheap, and the existing remedy — re-run the scorer, re-derive the baseline —
|
|
9
|
-
// costs a full coverage run or a full-tree MI re-score for what is arithmetic
|
|
10
|
-
// on a row set. This pruner is that arithmetic.
|
|
11
|
-
//
|
|
12
|
-
// ## Measurement-free by contract
|
|
13
|
-
//
|
|
14
|
-
// Three prohibitions, each guarding a way the file could start lying:
|
|
15
|
-
//
|
|
16
|
-
// 1. **Never add a row.** Adding one means claiming a measurement nobody
|
|
17
|
-
// took. Producing rows stays the producers' exclusive job.
|
|
18
|
-
// 2. **Never restamp `generatedAt`.** A fresh stamp over rows nobody
|
|
19
|
-
// re-measured is precisely the failure an age check exists to catch — the
|
|
20
|
-
// envelope would claim to describe today's tree on the strength of a
|
|
21
|
-
// deletion. The pruner carries the original stamp through untouched.
|
|
22
|
-
// 3. **Never delete a row it cannot prove inert.** Only two classes qualify:
|
|
23
|
-
// the file is absent from disk, or the file is no longer matched by the
|
|
24
|
-
// gate's own `targetDirs` / `ignoreGlobs`. Everything else survives.
|
|
25
|
-
//
|
|
26
|
-
// ## Degrade, never guess
|
|
27
|
-
//
|
|
28
|
-
// A degraded inventory (`files: null` — unreadable `.c8rc.cjs`, absent
|
|
29
|
-
// `targetDirs`) means scope is unknown, not empty. Treating it as empty would
|
|
30
|
-
// make every row look out-of-scope and hand the pruner the whole baseline. So
|
|
31
|
-
// an unreadable scope config falls back to **orphan-only** pruning: the
|
|
32
|
-
// absent-from-disk class still resolves off the filesystem and is still safe,
|
|
33
|
-
// while the out-of-scope class is suspended until scope can be read again.
|
|
34
|
-
|
|
35
|
-
import fs from 'node:fs';
|
|
36
|
-
import path from 'node:path';
|
|
37
|
-
|
|
38
|
-
import { getKindModule } from './kernel.js';
|
|
39
|
-
import { _internals as readerInternals } from './reader.js';
|
|
40
|
-
import { EXTRA_REASONS } from './scope-assert.js';
|
|
41
|
-
import {
|
|
42
|
-
buildScopeInventory,
|
|
43
|
-
isFileKeyed,
|
|
44
|
-
SCOPE_KINDS,
|
|
45
|
-
} from './scope-inventory.js';
|
|
46
|
-
import { writeFile } from './writer.js';
|
|
47
|
-
|
|
48
|
-
/** Every kind whose rows key on a repo-relative file path. */
|
|
49
|
-
export const PRUNABLE_KINDS = Object.freeze(SCOPE_KINDS.filter(isFileKeyed));
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Partition a row set into the rows to keep and the rows to drop.
|
|
53
|
-
*
|
|
54
|
-
* Pure given its injected `existsOnDisk` predicate. `inScope` of `null` is the
|
|
55
|
-
* degraded case: only the absent-from-disk class is prunable.
|
|
56
|
-
*
|
|
57
|
-
* @param {{
|
|
58
|
-
* rows: Array<Record<string, unknown>>,
|
|
59
|
-
* inScope: Set<string> | null,
|
|
60
|
-
* existsOnDisk: (relPath: string) => boolean,
|
|
61
|
-
* }} params
|
|
62
|
-
* @returns {{ keep: Array<object>, removed: Array<{ path: string, reason: string }> }}
|
|
63
|
-
*/
|
|
64
|
-
export function planPrune({ rows, inScope, existsOnDisk } = {}) {
|
|
65
|
-
const keep = [];
|
|
66
|
-
const removed = [];
|
|
67
|
-
for (const row of Array.isArray(rows) ? rows : []) {
|
|
68
|
-
const key = row?.path;
|
|
69
|
-
if (typeof key !== 'string' || key.length === 0) {
|
|
70
|
-
keep.push(row);
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
if (!existsOnDisk(key)) {
|
|
74
|
-
removed.push({ path: key, reason: EXTRA_REASONS.ABSENT });
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
if (inScope !== null && !inScope.has(key)) {
|
|
78
|
-
removed.push({ path: key, reason: EXTRA_REASONS.OUT_OF_SCOPE });
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
keep.push(row);
|
|
82
|
-
}
|
|
83
|
-
return { keep, removed };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Prune one parsed envelope and recompute its `rollup` through the kind's own
|
|
88
|
-
* arithmetic (`kinds/<kind>.js#rollup`), so the pruned file stays internally
|
|
89
|
-
* consistent and still validates against its schema. Recomputing by a private
|
|
90
|
-
* formula here would let the rollup and the rows describe different trees.
|
|
91
|
-
*
|
|
92
|
-
* A rollup carrying component buckets beyond `*` is refused rather than
|
|
93
|
-
* recomputed: the component globs that produced those buckets live in gate
|
|
94
|
-
* config this module is not handed, and emitting a `*`-only rollup would
|
|
95
|
-
* silently delete them.
|
|
96
|
-
*
|
|
97
|
-
* @param {{
|
|
98
|
-
* kind: string,
|
|
99
|
-
* envelope: object,
|
|
100
|
-
* inventory: { files: string[] | null },
|
|
101
|
-
* existsOnDisk?: (relPath: string) => boolean,
|
|
102
|
-
* }} params
|
|
103
|
-
* @returns {{
|
|
104
|
-
* envelope: object | null,
|
|
105
|
-
* removed: Array<{ path: string, reason: string }>,
|
|
106
|
-
* skipped: boolean,
|
|
107
|
-
* reason: string | null,
|
|
108
|
-
* }}
|
|
109
|
-
*/
|
|
110
|
-
export function pruneEnvelope({
|
|
111
|
-
kind,
|
|
112
|
-
envelope,
|
|
113
|
-
inventory,
|
|
114
|
-
existsOnDisk,
|
|
115
|
-
} = {}) {
|
|
116
|
-
const rollupKeys = Object.keys(envelope?.rollup ?? {});
|
|
117
|
-
if (rollupKeys.some((key) => key !== '*')) {
|
|
118
|
-
return {
|
|
119
|
-
envelope: null,
|
|
120
|
-
removed: [],
|
|
121
|
-
skipped: true,
|
|
122
|
-
reason: `rollup carries component buckets (${rollupKeys.join(', ')}); prune them with the producer`,
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
const inScope = inventory?.files === null ? null : new Set(inventory.files);
|
|
126
|
-
const { keep, removed } = planPrune({
|
|
127
|
-
rows: envelope?.rows ?? [],
|
|
128
|
-
inScope,
|
|
129
|
-
existsOnDisk: existsOnDisk ?? (() => true),
|
|
130
|
-
});
|
|
131
|
-
if (removed.length === 0) {
|
|
132
|
-
return { envelope: null, removed: [], skipped: false, reason: null };
|
|
133
|
-
}
|
|
134
|
-
return {
|
|
135
|
-
envelope: {
|
|
136
|
-
...envelope,
|
|
137
|
-
// `generatedAt` is carried by the spread, deliberately unmodified.
|
|
138
|
-
rollup: getKindModule(kind).rollup(keep, []),
|
|
139
|
-
rows: keep,
|
|
140
|
-
},
|
|
141
|
-
removed,
|
|
142
|
-
skipped: false,
|
|
143
|
-
reason: null,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Read and JSON-parse a baseline file. Returns `null` when the file is absent
|
|
149
|
-
* (a kind this repository does not use) and throws only on malformed JSON,
|
|
150
|
-
* which is a real defect the caller should surface rather than swallow.
|
|
151
|
-
*
|
|
152
|
-
* @param {string} absPath
|
|
153
|
-
* @param {typeof fs} fsImpl
|
|
154
|
-
* @returns {object | null}
|
|
155
|
-
*/
|
|
156
|
-
function readEnvelope(absPath, fsImpl) {
|
|
157
|
-
let raw;
|
|
158
|
-
try {
|
|
159
|
-
raw = fsImpl.readFileSync(absPath, 'utf8');
|
|
160
|
-
} catch {
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
return JSON.parse(raw);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Prune one kind end to end: resolve its baseline path, read it, build the
|
|
168
|
-
* scope inventory, plan, and (unless `check`) write.
|
|
169
|
-
*
|
|
170
|
-
* @param {object} params
|
|
171
|
-
* @returns {object} One entry of the report's `kinds` array.
|
|
172
|
-
*/
|
|
173
|
-
function pruneKind({ kind, cwd, quality, check, fsImpl, requireFn }) {
|
|
174
|
-
const absPath = readerInternals.resolveBaselinePath(kind, { cwd });
|
|
175
|
-
const relPath = path.relative(cwd, absPath).split(path.sep).join('/');
|
|
176
|
-
const envelope = readEnvelope(absPath, fsImpl);
|
|
177
|
-
if (envelope === null) {
|
|
178
|
-
return { kind, path: relPath, present: false, removed: [], written: false };
|
|
179
|
-
}
|
|
180
|
-
const inventory = buildScopeInventory({ kind, cwd, quality, requireFn });
|
|
181
|
-
const result = pruneEnvelope({
|
|
182
|
-
kind,
|
|
183
|
-
envelope,
|
|
184
|
-
inventory,
|
|
185
|
-
existsOnDisk: (rel) => fsImpl.existsSync(path.resolve(cwd, rel)),
|
|
186
|
-
});
|
|
187
|
-
const base = {
|
|
188
|
-
kind,
|
|
189
|
-
path: relPath,
|
|
190
|
-
present: true,
|
|
191
|
-
degraded: inventory.degraded,
|
|
192
|
-
degradedReason: inventory.degraded ? inventory.reason : null,
|
|
193
|
-
skipped: result.skipped,
|
|
194
|
-
skipReason: result.reason,
|
|
195
|
-
removed: result.removed,
|
|
196
|
-
written: false,
|
|
197
|
-
};
|
|
198
|
-
if (result.envelope === null || check) return base;
|
|
199
|
-
writeFile(absPath, result.envelope, { fsImpl });
|
|
200
|
-
return { ...base, written: true };
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Prune every file-keyed baseline under `cwd`.
|
|
205
|
-
*
|
|
206
|
-
* @param {{
|
|
207
|
-
* cwd?: string,
|
|
208
|
-
* kinds?: string[],
|
|
209
|
-
* check?: boolean,
|
|
210
|
-
* quality?: object,
|
|
211
|
-
* fsImpl?: typeof fs,
|
|
212
|
-
* requireFn?: (id: string) => object,
|
|
213
|
-
* }} params
|
|
214
|
-
* @returns {{ kinds: Array<object>, removedCount: number, writtenCount: number, check: boolean }}
|
|
215
|
-
*/
|
|
216
|
-
export function runPrune({
|
|
217
|
-
cwd = process.cwd(),
|
|
218
|
-
kinds = PRUNABLE_KINDS,
|
|
219
|
-
check = false,
|
|
220
|
-
quality,
|
|
221
|
-
fsImpl = fs,
|
|
222
|
-
requireFn,
|
|
223
|
-
} = {}) {
|
|
224
|
-
const results = kinds.map((kind) =>
|
|
225
|
-
pruneKind({ kind, cwd, quality, check, fsImpl, requireFn }),
|
|
226
|
-
);
|
|
227
|
-
return {
|
|
228
|
-
check,
|
|
229
|
-
kinds: results,
|
|
230
|
-
removedCount: results.reduce((sum, r) => sum + r.removed.length, 0),
|
|
231
|
-
writtenCount: results.filter((r) => r.written).length,
|
|
232
|
-
};
|
|
233
|
-
}
|