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,47 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/parse-findings.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `parseCodexFindings` (codex.js) and `parseSecurityReviewFindings`
|
|
6
|
-
* (security-review.js) into one templated parser. Both adapters emit
|
|
7
|
-
* JSON; the parser is liberal in what it accepts:
|
|
8
|
-
* - A bare array of finding objects.
|
|
9
|
-
* - An object with a `findings` array.
|
|
10
|
-
* - Either shape wrapped in an outer envelope with a `result` or
|
|
11
|
-
* `data` key (covers minor wire-format drift across versions
|
|
12
|
-
* without re-shimming).
|
|
13
|
-
*
|
|
14
|
-
* Each entry's severity is funnelled through the caller-supplied
|
|
15
|
-
* `mapSeverity` so the canonical enum is the only thing that reaches
|
|
16
|
-
* the renderer. Entries without a `title` or `body` are skipped — the
|
|
17
|
-
* orchestrator cannot post an empty finding, and silently dropping the
|
|
18
|
-
* entry is safer than fabricating one.
|
|
19
|
-
*
|
|
20
|
-
* Per-provider deltas ride in as options:
|
|
21
|
-
* - `errorPrefix` — prefix for the JSON-parse failure message.
|
|
22
|
-
* - `mapSeverity` — provider severity vocabulary → canonical enum.
|
|
23
|
-
* - `defaultCategory` — when set, entries missing a `category` get
|
|
24
|
-
* this value (security-review defaults to `'security'`); when
|
|
25
|
-
* omitted, `category` is only set when present (codex behavior).
|
|
26
|
-
*
|
|
27
|
-
* Story #4074 — the parser body was a CC-30 ternary thicket. The
|
|
28
|
-
* per-field branching now lives in three small, independently-testable
|
|
29
|
-
* pure helpers (`unwrapEnvelope`, `coerceString`, `buildFinding`), so the
|
|
30
|
-
* orchestration body collapses to: unwrap → `Array.isArray` guard →
|
|
31
|
-
* `map(buildFinding).filter(Boolean)`.
|
|
2
|
+
* review-providers/parse-findings.js — the JSON-findings parser shared by the
|
|
3
|
+
* LLM-backed providers. Entries without a title or body are dropped rather
|
|
4
|
+
* than fabricated.
|
|
32
5
|
*
|
|
33
6
|
* @typedef {import('./types.js').Finding} Finding
|
|
34
7
|
* @typedef {import('./types.js').Severity} Severity
|
|
35
8
|
*/
|
|
36
9
|
|
|
37
10
|
/**
|
|
38
|
-
* Unwrap
|
|
39
|
-
*
|
|
40
|
-
* Accepts a bare array unchanged, an object with a `findings` array, or
|
|
41
|
-
* either shape nested one level deep under a `result` / `data` key. The
|
|
42
|
-
* second pass resolves `{ result: { findings: [] } }`-style
|
|
43
|
-
* double-envelopes. Anything that does not resolve to an array is
|
|
44
|
-
* returned as-is for the caller's `Array.isArray` guard to reject.
|
|
11
|
+
* Unwrap a bare array, `{ findings }`, or either under `result`/`data`.
|
|
12
|
+
* A non-array result is returned for the caller to reject.
|
|
45
13
|
*
|
|
46
14
|
* @param {unknown} parsed
|
|
47
15
|
* @returns {unknown}
|
|
@@ -60,11 +28,6 @@ export function unwrapEnvelope(parsed) {
|
|
|
60
28
|
}
|
|
61
29
|
|
|
62
30
|
/**
|
|
63
|
-
* Coerce a value to a non-empty trimmed string, or null.
|
|
64
|
-
*
|
|
65
|
-
* Returns the trimmed string when `value` is a string with
|
|
66
|
-
* non-whitespace content; otherwise null.
|
|
67
|
-
*
|
|
68
31
|
* @param {unknown} value
|
|
69
32
|
* @returns {string | null}
|
|
70
33
|
*/
|
|
@@ -75,14 +38,8 @@ export function coerceString(value) {
|
|
|
75
38
|
}
|
|
76
39
|
|
|
77
40
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* `title` is trimmed; `body` falls back to a non-empty `message` alias
|
|
82
|
-
* and is preserved verbatim (untrimmed) to match the historical
|
|
83
|
-
* behavior. `category` is set from the entry when present, else from
|
|
84
|
-
* `defaultCategory` when supplied. `file` / `line` are included only
|
|
85
|
-
* when present and well-formed.
|
|
41
|
+
* `body` (or its `message` alias) is kept untrimmed; `category` falls back
|
|
42
|
+
* to `defaultCategory`.
|
|
86
43
|
*
|
|
87
44
|
* @param {unknown} entry
|
|
88
45
|
* @param {{
|
|
@@ -121,8 +78,6 @@ export function buildFinding(entry, { mapSeverity, defaultCategory }) {
|
|
|
121
78
|
}
|
|
122
79
|
|
|
123
80
|
/**
|
|
124
|
-
* Parse a provider's raw stdout into `Finding[]`.
|
|
125
|
-
*
|
|
126
81
|
* @param {string} rawStdout
|
|
127
82
|
* @param {{
|
|
128
83
|
* errorPrefix: string,
|
|
@@ -1,31 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/review-depth.js —
|
|
3
|
-
* LLM-backed
|
|
4
|
-
*
|
|
5
|
-
* Story #3937 / #3938 — the depth lever (`light` / `standard` / `deep`,
|
|
6
|
-
* derived from the diff's observable width and sensitive-path hits by
|
|
7
|
-
* `lib/orchestration/review-depth.js`; #4542 retired the judged-risk
|
|
8
|
-
* input) is threaded into every
|
|
9
|
-
* provider's `runReview` input. LLM-backed providers (codex, security-review,
|
|
10
|
-
* ultrareview) must render that lever into the prompt/instructions they emit so
|
|
11
|
-
* the model actually changes its thoroughness; the native (mechanical) provider
|
|
12
|
-
* documents in its own JSDoc why depth does not change its lint +
|
|
13
|
-
* maintainability sweep. This module is the single home for the depth → prose
|
|
14
|
-
* mapping so the three LLM providers share one wording rather than each
|
|
15
|
-
* re-spelling the semantics (which would cross the duplication gate).
|
|
16
|
-
*
|
|
17
|
-
* The mapping is intentionally model-agnostic: it describes *how thorough* the
|
|
18
|
-
* review should be, not which tool runs it. A provider appends
|
|
19
|
-
* `renderDepthDirective(depth)` to its prompt to instruct the model.
|
|
2
|
+
* review-providers/review-depth.js — the one depth → prompt-prose mapping the
|
|
3
|
+
* LLM-backed providers share; model-agnostic, it says how thorough to be.
|
|
20
4
|
*
|
|
21
5
|
* @typedef {import('./types.js').ReviewDepth} ReviewDepth
|
|
22
6
|
*/
|
|
23
7
|
|
|
24
8
|
/**
|
|
25
|
-
* Canonical per-depth review directive sentences. Keyed by the canonical
|
|
26
|
-
* `ReviewDepth` enum. Exported so tests and doc tooling can assert against the
|
|
27
|
-
* exact wording rather than free-text matching.
|
|
28
|
-
*
|
|
29
9
|
* @type {Readonly<Record<ReviewDepth, string>>}
|
|
30
10
|
*/
|
|
31
11
|
const DEPTH_DIRECTIVES = Object.freeze({
|
|
@@ -45,11 +25,7 @@ const DEPTH_DIRECTIVES = Object.freeze({
|
|
|
45
25
|
});
|
|
46
26
|
|
|
47
27
|
/**
|
|
48
|
-
*
|
|
49
|
-
* `standard` for anything unrecognised (including `undefined` — providers may
|
|
50
|
-
* receive an input without a depth from a caller that did not resolve one).
|
|
51
|
-
*
|
|
52
|
-
* Pure. Exported for testing.
|
|
28
|
+
* Anything unrecognised, including `undefined`, is `standard`.
|
|
53
29
|
*
|
|
54
30
|
* @param {unknown} depth
|
|
55
31
|
* @returns {ReviewDepth}
|
|
@@ -59,12 +35,7 @@ function normalizeDepth(depth) {
|
|
|
59
35
|
}
|
|
60
36
|
|
|
61
37
|
/**
|
|
62
|
-
*
|
|
63
|
-
* append to a provider's prompt. Always returns a non-empty string carrying a
|
|
64
|
-
* `Review depth:` marker so connectivity tests can assert the lever reached the
|
|
65
|
-
* prompt regardless of which tier resolved.
|
|
66
|
-
*
|
|
67
|
-
* Pure. Exported for testing.
|
|
38
|
+
* Always non-empty and carrying a `Review depth:` marker.
|
|
68
39
|
*
|
|
69
40
|
* @param {ReviewDepth|undefined} depth
|
|
70
41
|
* @returns {string}
|
|
@@ -1,27 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/review-provider-factory.js —
|
|
3
|
-
* `codeReview.providers`
|
|
4
|
-
*
|
|
5
|
-
* Story #2825 (Epic #2815) — the factory is the only entry point.
|
|
6
|
-
* `runCodeReview()` never references a specific adapter directly;
|
|
7
|
-
* adding a backend is (1) implement the interface, (2) register here,
|
|
8
|
-
* (3) extend the schema enum.
|
|
9
|
-
*
|
|
10
|
-
* Story #2871 — the factory always returns a `ChainProvider` that
|
|
11
|
-
* fans out `runReview` across every inline entry (merging `Finding[]`
|
|
12
|
-
* in declaration order) and exposes `getPromptMessages` so the
|
|
13
|
-
* orchestrator can render the trailing "Manual review suggestions"
|
|
14
|
-
* section without knowing about per-provider mechanics.
|
|
15
|
-
*
|
|
16
|
-
* Behaviour:
|
|
17
|
-
* - Unset / empty `codeReview.providers` defaults to a single-entry
|
|
18
|
-
* chain `[{ name: 'native' }]`.
|
|
19
|
-
* - Unknown provider name throws an Error with remediation text
|
|
20
|
-
* naming the supported values.
|
|
21
|
-
* - Adapters that throw at construction time (e.g. `codex` probing
|
|
22
|
-
* for an absent plugin command) bubble their error verbatim —
|
|
23
|
-
* EXCEPT when the chain entry carries `optional: true`, in which
|
|
24
|
-
* case the chain logs a warning and skips that entry.
|
|
2
|
+
* review-providers/review-provider-factory.js — resolves
|
|
3
|
+
* `codeReview.providers` into a `ChainProvider`. A failing entry throws
|
|
4
|
+
* unless it is `optional`.
|
|
25
5
|
*
|
|
26
6
|
* @typedef {import('./types.js').ReviewProvider} ReviewProvider
|
|
27
7
|
* @typedef {import('./types.js').ManualPromptProvider} ManualPromptProvider
|
|
@@ -40,12 +20,7 @@ import { createNativeProviderForRegistry } from './native.js';
|
|
|
40
20
|
import { createSecurityReviewProviderForRegistry } from './security-review.js';
|
|
41
21
|
import { createUltrareviewProviderForRegistry } from './ultrareview.js';
|
|
42
22
|
|
|
43
|
-
/**
|
|
44
|
-
* Inline provider registry — entries return a `ReviewProvider` that
|
|
45
|
-
* produces `Finding[]` from a git diff.
|
|
46
|
-
*
|
|
47
|
-
* @type {Readonly<Record<string, () => ReviewProvider>>}
|
|
48
|
-
*/
|
|
23
|
+
/** @type {Readonly<Record<string, () => ReviewProvider>>} */
|
|
49
24
|
const INLINE_PROVIDERS = Object.freeze({
|
|
50
25
|
codex: createCodexProviderForRegistry,
|
|
51
26
|
native: createNativeProviderForRegistry,
|
|
@@ -53,9 +28,7 @@ const INLINE_PROVIDERS = Object.freeze({
|
|
|
53
28
|
});
|
|
54
29
|
|
|
55
30
|
/**
|
|
56
|
-
*
|
|
57
|
-
* `ManualPromptProvider` that contributes a non-blocking operator
|
|
58
|
-
* suggestion to the structured comment without running a review.
|
|
31
|
+
* Non-blocking operator suggestions; they run no review.
|
|
59
32
|
*
|
|
60
33
|
* @type {Readonly<Record<string, () => ManualPromptProvider>>}
|
|
61
34
|
*/
|
|
@@ -63,18 +36,10 @@ const PROMPT_PROVIDERS = Object.freeze({
|
|
|
63
36
|
ultrareview: createUltrareviewProviderForRegistry,
|
|
64
37
|
});
|
|
65
38
|
|
|
66
|
-
/**
|
|
67
|
-
* The inline provider name used when `codeReview.providers` is unset,
|
|
68
|
-
* empty, or the `codeReview` block is absent entirely.
|
|
69
|
-
*/
|
|
70
39
|
export const DEFAULT_PROVIDER_NAME = 'native';
|
|
71
40
|
|
|
72
41
|
/**
|
|
73
|
-
*
|
|
74
|
-
* Currently supports `label` (single string) and `labelAny`
|
|
75
|
-
* (string[]); other keys are rejected at the schema layer.
|
|
76
|
-
*
|
|
77
|
-
* `when` absent → gate is "always true".
|
|
42
|
+
* Gate predicate from a `when` clause (`label` / `labelAny`); absent → always true.
|
|
78
43
|
*
|
|
79
44
|
* @param {{ label?: string, labelAny?: string[] }|undefined} when
|
|
80
45
|
* @returns {ProviderGate}
|
|
@@ -100,10 +65,7 @@ export function buildGate(when) {
|
|
|
100
65
|
}
|
|
101
66
|
|
|
102
67
|
/**
|
|
103
|
-
*
|
|
104
|
-
* includes the current invocation scope. Default (no `scopes`) is
|
|
105
|
-
* "fires on both" so unattended chains keep working at story-close
|
|
106
|
-
* and epic-finalize alike.
|
|
68
|
+
* No declared `scopes` fires on every scope.
|
|
107
69
|
*
|
|
108
70
|
* @param {string[]|undefined} declaredScopes
|
|
109
71
|
* @param {string} currentScope
|
|
@@ -117,12 +79,7 @@ export function isScopeApplicable(declaredScopes, currentScope) {
|
|
|
117
79
|
}
|
|
118
80
|
|
|
119
81
|
/**
|
|
120
|
-
*
|
|
121
|
-
* config block. Pass the `codeReview` sub-object (not the full
|
|
122
|
-
* config) so callers can compose with their own config readers.
|
|
123
|
-
*
|
|
124
|
-
* Always returns a `ChainProvider`. When `codeReviewConfig.providers`
|
|
125
|
-
* is unset or empty, the chain defaults to `[{ name: 'native' }]`.
|
|
82
|
+
* Takes the `codeReview` sub-object; unset/empty `providers` defaults to native.
|
|
126
83
|
*
|
|
127
84
|
* @param {{
|
|
128
85
|
* providers?: Array<object>,
|
|
@@ -159,11 +116,6 @@ export function createReviewProvider(codeReviewConfig, opts = {}) {
|
|
|
159
116
|
}
|
|
160
117
|
|
|
161
118
|
/**
|
|
162
|
-
* Build the inline + prompt entry list from a `providers: []` config.
|
|
163
|
-
* Pure with respect to registry inputs — the registry is the only
|
|
164
|
-
* side-effectful surface (provider constructors may probe disk or
|
|
165
|
-
* spawn binaries).
|
|
166
|
-
*
|
|
167
119
|
* @param {Array<object>} entries
|
|
168
120
|
* @param {{
|
|
169
121
|
* inlineRegistry: Readonly<Record<string, () => ReviewProvider>>,
|
|
@@ -242,10 +194,8 @@ export function buildProviderChain(entries, ctx) {
|
|
|
242
194
|
}
|
|
243
195
|
|
|
244
196
|
/**
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
* fan out via `runReview`; prompt adapters fan out via
|
|
248
|
-
* `getPromptMessages` (a method the orchestrator feature-detects).
|
|
197
|
+
* Inline findings merge in declaration order; prompt entries render via
|
|
198
|
+
* `getPromptMessages`.
|
|
249
199
|
*
|
|
250
200
|
* @param {ProviderChain} chain
|
|
251
201
|
* @param {{ logger?: { info?: Function, warn?: Function } }} [opts]
|
|
@@ -290,8 +240,7 @@ export function createChainProvider(chain, opts = {}) {
|
|
|
290
240
|
return merged;
|
|
291
241
|
},
|
|
292
242
|
/**
|
|
293
|
-
*
|
|
294
|
-
* `runReview`.
|
|
243
|
+
* Called after `runReview`.
|
|
295
244
|
*
|
|
296
245
|
* @returns {Promise<Array<object>>}
|
|
297
246
|
*/
|
|
@@ -337,9 +286,6 @@ export function createChainProvider(chain, opts = {}) {
|
|
|
337
286
|
}
|
|
338
287
|
|
|
339
288
|
/**
|
|
340
|
-
* Expose the registered provider names — primarily for diagnostics
|
|
341
|
-
* and test fixtures. Lists both inline and prompt providers.
|
|
342
|
-
*
|
|
343
289
|
* @returns {string[]}
|
|
344
290
|
*/
|
|
345
291
|
export function listRegisteredProviders() {
|
|
@@ -351,10 +297,6 @@ export function listRegisteredProviders() {
|
|
|
351
297
|
}
|
|
352
298
|
|
|
353
299
|
/**
|
|
354
|
-
* Expose the inline-only provider names — used by adapter tests that
|
|
355
|
-
* need to assert against the inline registry without coupling to
|
|
356
|
-
* manual-prompt entries.
|
|
357
|
-
*
|
|
358
300
|
* @returns {string[]}
|
|
359
301
|
*/
|
|
360
302
|
export function listInlineProviders() {
|
|
@@ -362,8 +304,6 @@ export function listInlineProviders() {
|
|
|
362
304
|
}
|
|
363
305
|
|
|
364
306
|
/**
|
|
365
|
-
* Expose the manual-prompt-only provider names.
|
|
366
|
-
*
|
|
367
307
|
* @returns {string[]}
|
|
368
308
|
*/
|
|
369
309
|
export function listPromptProviders() {
|
|
@@ -1,98 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/scoped-lint.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* The scoped-lint gate reported `executionFailed` — and therefore emitted zero
|
|
8
|
-
* findings while the review reported clean — on 18 of 23 Beestera/swarm-os
|
|
9
|
-
* Stories carrying friction (78%) and on 5 mandrel Stories. Measured
|
|
10
|
-
* 2026-07-29, the cause was **not** environmental and **not** a parse failure.
|
|
11
|
-
* Three defects in how the runners were invoked and reconciled produced the
|
|
12
|
-
* same symptom:
|
|
13
|
-
*
|
|
14
|
-
* 1. **The markdown runner was never resolvable.** The provider spawned
|
|
15
|
-
* `npx --no markdownlint`, but the binary this project (and the consumer)
|
|
16
|
-
* installs is `markdownlint-cli2` — `markdownlint-cli2` is the package and
|
|
17
|
-
* the bin name; a bare `markdownlint` bin does not exist. `npx --no` with an
|
|
18
|
-
* unresolvable bin exits 1 printing `could not determine executable to run`
|
|
19
|
-
* and nothing else, so the summary parsed nothing and the gate degraded.
|
|
20
|
-
* The parser was already written for **cli2's** `Summary: N error(s)` line,
|
|
21
|
-
* so the invocation and the parser had never agreed. The `--ignore
|
|
22
|
-
* node_modules` flag was likewise `markdownlint-cli` (v1) syntax, which
|
|
23
|
-
* cli2 does not accept. Fix: resolve the runner from what is actually
|
|
24
|
-
* installed and pass each candidate its own argument shape.
|
|
25
|
-
*
|
|
26
|
-
* 2. **One runner's failure poisoned the other's verdict.** The two runs were
|
|
27
|
-
* folded into a *single* `parseLintOutput` call over concatenated output and
|
|
28
|
-
* the maximum exit status. So the unresolvable markdown runner's exit 1
|
|
29
|
-
* became the verdict for biome too: any change set containing at least one
|
|
30
|
-
* `.md` file degraded the whole gate whenever biome itself had nothing to
|
|
31
|
-
* report — i.e. exactly the clean case the gate exists to confirm. Fix:
|
|
32
|
-
* classify each surface independently and merge structurally.
|
|
33
|
-
*
|
|
34
|
-
* 3. **Biome's "nothing in scope" exit was read as a failure.** `biome lint`
|
|
35
|
-
* exits 1 with `No files were processed in the specified paths.` when every
|
|
36
|
-
* supplied path is excluded by `biome.json` (`temp/`, `dist/`,
|
|
37
|
-
* `.worktrees/`, anything in the VCS ignore file). That is an empty scope,
|
|
38
|
-
* not a runner that could not execute. Fix: recognise the sentinel.
|
|
39
|
-
*
|
|
40
|
-
* ## What a degraded surface now produces
|
|
41
|
-
*
|
|
42
|
-
* `runScopedLint` still reports `executionFailed` — the friction-telemetry
|
|
43
|
-
* emission in `native.js` is deliberately unchanged (Story #4699 routed an
|
|
44
|
-
* unexecutable tool to telemetry so severity tiers reflect code findings only,
|
|
45
|
-
* and that intent stands). It additionally reports a `degradations[]` array
|
|
46
|
-
* naming **which** surface could not run and **why**, so the review outcome can
|
|
47
|
-
* say "this gate did not run" instead of silently reading clean.
|
|
48
|
-
*
|
|
49
|
-
* ## The code surface never got the same treatment (Story #5193)
|
|
50
|
-
*
|
|
51
|
-
* Story #4839 gave the *markdown* surface a disk probe and left the code
|
|
52
|
-
* surface spawning `npx --no biome` and classifying the exit code. On npm 11.x
|
|
53
|
-
* that spawn exits **0 with empty output** when biome is absent, so
|
|
54
|
-
* `parseLintOutput` saw no failure, produced no degradation, and the surface
|
|
55
|
-
* contributed `errors: 0, warnings: 0` — a *silent false clean*, which is
|
|
56
|
-
* strictly worse than a degradation: a degraded surface announces itself, a
|
|
57
|
-
* falsely-clean one is trusted. Since nothing in the framework requires either
|
|
58
|
-
* runner, "absent" is the default state of a consumer checkout.
|
|
59
|
-
*
|
|
60
|
-
* Fix: runner resolution is a **precondition** for every surface, not an
|
|
61
|
-
* outcome inferred from an exit code. Both surfaces now resolve through
|
|
62
|
-
* {@link resolveRunner}, and an unresolved runner is never spawned.
|
|
63
|
-
*
|
|
64
|
-
* The same measurement invalidated the `NPX_UNRESOLVABLE` sentinel: current npm
|
|
65
|
-
* answers an unresolvable bin with `npm error code E404`, not `could not
|
|
66
|
-
* determine executable to run`, so every genuinely-unresolvable runner was
|
|
67
|
-
* being labelled `unparseable-output`. The sentinel now recognises both shapes.
|
|
68
|
-
* It still earns its keep after the disk probe: the probe only sees
|
|
69
|
-
* `node_modules/.bin`, so a runner resolvable some other way can still fail.
|
|
2
|
+
* review-providers/scoped-lint.js — scoped biome + markdownlint over the
|
|
3
|
+
* changed surface. Runners resolve on disk before spawning (`npx --no biome`
|
|
4
|
+
* exits 0 silently when biome is absent), and each surface is classified
|
|
5
|
+
* independently so one failure cannot become the other's verdict.
|
|
70
6
|
*/
|
|
71
7
|
|
|
72
8
|
import { spawnSync } from 'node:child_process';
|
|
73
9
|
import { existsSync } from 'node:fs';
|
|
74
10
|
import path from 'node:path';
|
|
75
11
|
|
|
76
|
-
/** Paths these extensions land on the biome (code) runner. */
|
|
77
12
|
const CODE_EXTENSIONS = /\.(js|mjs|cjs|jsx|ts|tsx|json|jsonc)$/i;
|
|
78
13
|
|
|
79
14
|
/**
|
|
80
|
-
* npx's output
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* `npm error` line keeps a genuine runner error out of this classification.
|
|
15
|
+
* npx's unresolvable-bin output: the legacy message or current npm's E404.
|
|
16
|
+
* Matching the E404 code, not any `npm error` line, keeps genuine runner
|
|
17
|
+
* errors out.
|
|
84
18
|
*/
|
|
85
19
|
const NPX_UNRESOLVABLE =
|
|
86
20
|
/could not determine executable to run|npm (?:error|ERR!)\s+code\s+E404/i;
|
|
87
21
|
|
|
88
|
-
/** Biome's exit-1
|
|
22
|
+
/** Biome's exit-1 when every path is config-excluded: an empty scope, not a failure. */
|
|
89
23
|
const BIOME_EMPTY_SCOPE = /No files were processed in the specified paths/i;
|
|
90
24
|
|
|
91
25
|
/**
|
|
92
|
-
* Markdown runners in preference order, each with
|
|
93
|
-
*
|
|
94
|
-
* `markdownlint` (cli v1) takes `--ignore`. Explicit changed-file paths are
|
|
95
|
-
* passed either way, so the v1 ignore flag is belt-and-braces only.
|
|
26
|
+
* Markdown runners in preference order, each with its own argument shape:
|
|
27
|
+
* cli2 rejects `--ignore`, which cli v1 takes.
|
|
96
28
|
*/
|
|
97
29
|
const MARKDOWN_RUNNERS = Object.freeze([
|
|
98
30
|
Object.freeze({ bin: 'markdownlint-cli2', extraArgs: Object.freeze([]) }),
|
|
@@ -102,16 +34,10 @@ const MARKDOWN_RUNNERS = Object.freeze([
|
|
|
102
34
|
}),
|
|
103
35
|
]);
|
|
104
36
|
|
|
105
|
-
/**
|
|
106
|
-
* Code runners in preference order. `@biomejs/biome` installs a bare `biome`
|
|
107
|
-
* bin, which is also the canonical name this surface reports itself under when
|
|
108
|
-
* nothing resolves.
|
|
109
|
-
*/
|
|
110
37
|
const CODE_RUNNERS = Object.freeze([
|
|
111
38
|
Object.freeze({ bin: 'biome', extraArgs: Object.freeze([]) }),
|
|
112
39
|
]);
|
|
113
40
|
|
|
114
|
-
/** Reason codes carried on a degradation record. */
|
|
115
41
|
const DEGRADATION_REASONS = Object.freeze({
|
|
116
42
|
RUNNER_NOT_INSTALLED: 'runner-not-installed',
|
|
117
43
|
RUNNER_NOT_RESOLVABLE: 'runner-not-resolvable',
|
|
@@ -140,22 +66,9 @@ function spawnLintRunner(bin, args, cwd) {
|
|
|
140
66
|
}
|
|
141
67
|
|
|
142
68
|
/**
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* into a generic parse failure.
|
|
147
|
-
*
|
|
148
|
-
* The disk probe (rather than "spawn and see") is what makes the failure
|
|
149
|
-
* *nameable*, and — since Story #5193 — what makes it *visible at all* on the
|
|
150
|
-
* code surface: `npx --no <missing-bin>` answers with a generic npm error at
|
|
151
|
-
* best and an empty exit 0 at worst, which is precisely how both defects hid.
|
|
152
|
-
*
|
|
153
|
-
* Probing `node_modules/.bin` only is a deliberate bound: a globally-installed
|
|
154
|
-
* runner reads as absent here, which degrades the gate honestly rather than
|
|
155
|
-
* trusting a spawn nobody resolved.
|
|
156
|
-
*
|
|
157
|
-
* Not exported: it is reachable — and asserted — through {@link runScopedLint},
|
|
158
|
-
* whose `existsFn` seam drives every resolution branch.
|
|
69
|
+
* First candidate installed under `<cwd>/node_modules/.bin`, else `null`.
|
|
70
|
+
* Deliberately local-only: a global runner reads as absent and degrades
|
|
71
|
+
* honestly rather than trusting an unresolved spawn.
|
|
159
72
|
*
|
|
160
73
|
* @param {ReadonlyArray<{ bin: string, extraArgs: ReadonlyArray<string> }>} candidates
|
|
161
74
|
* @param {string} cwd
|
|
@@ -177,9 +90,7 @@ function resolveRunner(candidates, cwd, existsFn) {
|
|
|
177
90
|
}
|
|
178
91
|
|
|
179
92
|
/**
|
|
180
|
-
*
|
|
181
|
-
* are zero *and* `executionFailed` is true, so the row can never be read as a
|
|
182
|
-
* clean result — the invariant Story #5193 restored.
|
|
93
|
+
* Zero counts with `executionFailed: true`, so it can never read as clean.
|
|
183
94
|
*
|
|
184
95
|
* @returns {ReturnType<typeof parseLintOutput>}
|
|
185
96
|
*/
|
|
@@ -196,7 +107,6 @@ function unresolvedRunnerSummary() {
|
|
|
196
107
|
|
|
197
108
|
/**
|
|
198
109
|
* Resolve one surface's runner and, only if it resolved, spawn and classify it.
|
|
199
|
-
* Shared by both surfaces so neither can drift back into spawn-and-see.
|
|
200
110
|
*
|
|
201
111
|
* @param {{
|
|
202
112
|
* label: string,
|
|
@@ -220,8 +130,6 @@ function runSurface({ label, candidates, buildArgs, cwd, runnerFn, existsFn }) {
|
|
|
220
130
|
}
|
|
221
131
|
|
|
222
132
|
/**
|
|
223
|
-
* Pure: split changed paths into the file lists each lint runner consumes.
|
|
224
|
-
*
|
|
225
133
|
* @param {string[]} changedFiles
|
|
226
134
|
* @returns {{ code: string[], md: string[] }}
|
|
227
135
|
*/
|
|
@@ -236,16 +144,8 @@ export function partitionFilesForLint(changedFiles) {
|
|
|
236
144
|
}
|
|
237
145
|
|
|
238
146
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* Handles the reporter formats composing `npm run lint` here:
|
|
242
|
-
* - Biome: `Found N error(s).` / `Found N warning(s).`
|
|
243
|
-
* - markdownlint-cli2: a trailing `Summary: N error(s)` line.
|
|
244
|
-
*
|
|
245
|
-
* A non-zero exit whose output matches no known reporter format is "could not
|
|
246
|
-
* classify" → `executionFailed: true`, with `reason` naming what was actually
|
|
247
|
-
* observed. Biome's empty-scope exit is recognised separately as
|
|
248
|
-
* `emptyScope` — nothing to lint is not a broken runner.
|
|
147
|
+
* A non-zero exit matching no reporter format is `executionFailed`, except
|
|
148
|
+
* biome's empty-scope exit.
|
|
249
149
|
*
|
|
250
150
|
* @param {{ status?: number, stdout?: string, stderr?: string }} result
|
|
251
151
|
* @returns {{ errors: number, warnings: number, parsed: boolean, executionFailed: boolean, emptyScope: boolean, reason: string|null }}
|
|
@@ -284,18 +184,8 @@ export function parseLintOutput(result) {
|
|
|
284
184
|
}
|
|
285
185
|
|
|
286
186
|
/**
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
* one degradation record naming itself. Merging *summaries* rather than raw
|
|
290
|
-
* output is what stops one runner's failure from becoming the other's verdict.
|
|
291
|
-
*
|
|
292
|
-
* The OR is deliberately lossy — it answers "did any surface fail?", which is
|
|
293
|
-
* the only question the degradation channel asks. Story #5282 added the
|
|
294
|
-
* `surfaces[]` rows so a consumer can ask the *other* questions the OR cannot
|
|
295
|
-
* answer: which surface the merged counts came from, and — via each row's
|
|
296
|
-
* `parsed` and `executionFailed` — whether an absent biome or a biome run that
|
|
297
|
-
* simply reported nothing is behind a zero. Consumers that read the flat
|
|
298
|
-
* counts are unaffected; the rows are additive.
|
|
187
|
+
* Counts add and `executionFailed` is the OR; `surfaces[]` keeps what the
|
|
188
|
+
* lossy OR cannot answer.
|
|
299
189
|
*
|
|
300
190
|
* @param {Array<{ surface: string, summary: ReturnType<typeof parseLintOutput> }>} surfaces
|
|
301
191
|
*/
|
|
@@ -325,12 +215,10 @@ function mergeSurfaceSummaries(surfaces) {
|
|
|
325
215
|
}
|
|
326
216
|
|
|
327
217
|
/**
|
|
328
|
-
* Run lint scoped to the changed surface only.
|
|
329
|
-
*
|
|
330
218
|
* @param {string[]} changedFiles
|
|
331
219
|
* @param {string} cwd
|
|
332
220
|
* @param {typeof spawnLintRunner} [runnerFn]
|
|
333
|
-
* @param {{ existsFn?: (p: string) => boolean }} [deps]
|
|
221
|
+
* @param {{ existsFn?: (p: string) => boolean }} [deps]
|
|
334
222
|
* @returns {{ errors: number, warnings: number, parsed: boolean, skipped: boolean, mode: 'changed-only'|'off', executionFailed: boolean, degradations: Array<{ surface: string, reason: string }>, surfaces: Array<{ surface: string, parsed: boolean, errors: number, warnings: number, executionFailed: boolean }> }}
|
|
335
223
|
*/
|
|
336
224
|
export function runScopedLint(
|