mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/findings-renderer.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Story #2825 (Epic #2815) — adapters return `Finding[]`; the renderer
|
|
6
|
-
* is the sole source of truth for the markdown body posted to the
|
|
7
|
-
* Story/Epic ticket. Adapters MUST NOT post comments themselves.
|
|
8
|
-
*
|
|
9
|
-
* Output is deterministic for a given `Finding[]` input: the input
|
|
10
|
-
* order is preserved within each severity tier, and the tier sections
|
|
11
|
-
* always appear in the canonical order critical → high → medium →
|
|
12
|
-
* suggestion. This is what makes the snapshot test stable.
|
|
2
|
+
* review-providers/findings-renderer.js — the sole renderer of the
|
|
3
|
+
* `code-review` comment body (adapters never post). Deterministic: input
|
|
4
|
+
* order is kept within each tier, tiers in canonical order.
|
|
13
5
|
*
|
|
14
6
|
* @typedef {import('./types.js').Finding} Finding
|
|
15
7
|
* @typedef {import('./types.js').Severity} Severity
|
|
@@ -23,10 +15,6 @@ import {
|
|
|
23
15
|
} from './degraded-gates.js';
|
|
24
16
|
|
|
25
17
|
/**
|
|
26
|
-
* Canonical severity ordering. The render output always lists the
|
|
27
|
-
* severity-tier counts in this order and emits the per-finding sections
|
|
28
|
-
* in this order, so a stable input produces a byte-stable output.
|
|
29
|
-
*
|
|
30
18
|
* @type {ReadonlyArray<Severity>}
|
|
31
19
|
*/
|
|
32
20
|
const SEVERITY_ORDER = Object.freeze([
|
|
@@ -37,10 +25,6 @@ const SEVERITY_ORDER = Object.freeze([
|
|
|
37
25
|
]);
|
|
38
26
|
|
|
39
27
|
/**
|
|
40
|
-
* Emoji + human label mapping. Mirrors the legacy
|
|
41
|
-
* legacy epic-code-review vocabulary so downstream operators see the
|
|
42
|
-
* same tier names regardless of which adapter produced the findings.
|
|
43
|
-
*
|
|
44
28
|
* @type {Readonly<Record<Severity, { emoji: string, label: string }>>}
|
|
45
29
|
*/
|
|
46
30
|
const SEVERITY_META = Object.freeze({
|
|
@@ -51,9 +35,7 @@ const SEVERITY_META = Object.freeze({
|
|
|
51
35
|
});
|
|
52
36
|
|
|
53
37
|
/**
|
|
54
|
-
*
|
|
55
|
-
* keep the renderer forgiving of adapter bugs (a misbehaving adapter
|
|
56
|
-
* still produces a readable, if incomplete, report).
|
|
38
|
+
* Unknown severities are ignored, so a buggy adapter still renders.
|
|
57
39
|
*
|
|
58
40
|
* @param {ReadonlyArray<Finding>} findings
|
|
59
41
|
* @returns {Record<Severity, number>}
|
|
@@ -70,13 +52,7 @@ export function countBySeverity(findings) {
|
|
|
70
52
|
}
|
|
71
53
|
|
|
72
54
|
/**
|
|
73
|
-
*
|
|
74
|
-
* testability.
|
|
75
|
-
*
|
|
76
|
-
* The `file`/`line` attribution lives on the same line as the title so
|
|
77
|
-
* GitHub renders a compact, scannable header. The `body` follows
|
|
78
|
-
* verbatim — adapters own its markdown shape (it may contain code
|
|
79
|
-
* fences, lists, etc.).
|
|
55
|
+
* The body is emitted verbatim; adapters own its markdown.
|
|
80
56
|
*
|
|
81
57
|
* @param {Finding} finding
|
|
82
58
|
* @returns {string}
|
|
@@ -91,14 +67,6 @@ export function renderFinding(finding) {
|
|
|
91
67
|
}
|
|
92
68
|
|
|
93
69
|
/**
|
|
94
|
-
* Pure: render the optional "Manual review suggestions" section.
|
|
95
|
-
* Story #2871 — manual-prompt providers (e.g. ultrareview) contribute
|
|
96
|
-
* one message each; the section is omitted entirely when the input
|
|
97
|
-
* array is empty so the legacy snapshot stays byte-stable for chains
|
|
98
|
-
* that carry no prompts.
|
|
99
|
-
*
|
|
100
|
-
* Exported for testing.
|
|
101
|
-
*
|
|
102
70
|
* @param {ReadonlyArray<string>} messages
|
|
103
71
|
* @returns {string[]} lines to append (empty when no messages)
|
|
104
72
|
*/
|
|
@@ -116,17 +84,8 @@ function renderManualPromptsSection(messages) {
|
|
|
116
84
|
}
|
|
117
85
|
|
|
118
86
|
/**
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* Story #2871 — accepts an optional `promptMessages` field carrying
|
|
122
|
-
* manual-prompt provider output; rendered as a trailing section when
|
|
123
|
-
* non-empty.
|
|
124
|
-
*
|
|
125
|
-
* Story #4839 — an optional `degradations` field names review gates that could
|
|
126
|
-
* not execute. They are **not** findings and never enter `countBySeverity`; they
|
|
127
|
-
* render as their own section and suppress the unqualified "no findings" claim,
|
|
128
|
-
* because a review that could not run a gate has not established that the
|
|
129
|
-
* gate's surface is clean.
|
|
87
|
+
* `degradations` are never findings: they render as their own section and
|
|
88
|
+
* suppress the unqualified "no findings" claim.
|
|
130
89
|
*
|
|
131
90
|
* @param {{
|
|
132
91
|
* ticketId: number,
|
|
@@ -195,9 +154,6 @@ export function renderFindings(input) {
|
|
|
195
154
|
}
|
|
196
155
|
|
|
197
156
|
/**
|
|
198
|
-
* Pure: build the `(file:line)` attribution suffix for a finding header.
|
|
199
|
-
* Returns an empty string when no file is attributable.
|
|
200
|
-
*
|
|
201
157
|
* @param {Finding} finding
|
|
202
158
|
* @returns {string}
|
|
203
159
|
*/
|
|
@@ -1,24 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/mi-exemptions.js — the
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `delivery.quality.gates.maintainability.ignoreGlobs` is the one declared
|
|
6
|
-
* answer to "which files is the maintainability index meaningless for" —
|
|
7
|
-
* declarative schema blobs, generated code, vendored trees. Every other MI
|
|
8
|
-
* consumer already honours it: the baseline writer excludes those files
|
|
9
|
-
* (`update-maintainability-baseline.js`), so the `check-baselines.js` ratchet
|
|
10
|
-
* and the pre-merge MI advisory never see them either.
|
|
11
|
-
*
|
|
12
|
-
* `review-providers/native.js` did not, and the split produced a live
|
|
13
|
-
* contradiction on Story #5007 / PR #5022: the ratchet PASSED while the review
|
|
14
|
-
* lens raised a **critical blocker** on three exempted
|
|
15
|
-
* `config-settings-schema*.js` modules in the same close run. Because a critical
|
|
16
|
-
* finding halts `single-story-close.js` before auto-merge, the only way to land
|
|
17
|
-
* legitimate work was to merge the PR by hand. A gate that must be
|
|
18
|
-
* hand-bypassed to ship is not a gate.
|
|
19
|
-
*
|
|
20
|
-
* This module is that reconciliation, kept separate from the provider so the
|
|
21
|
-
* exemption concern has one home and the provider keeps one reason to change.
|
|
2
|
+
* review-providers/mi-exemptions.js — the MI gate's `ignoreGlobs`, as the
|
|
3
|
+
* native review provider reads them, so the review never raises a critical
|
|
4
|
+
* finding on a file the ratchet itself exempts.
|
|
22
5
|
*/
|
|
23
6
|
|
|
24
7
|
import { getQuality } from '../../config/quality.js';
|
|
@@ -26,13 +9,8 @@ import { resolveConfig } from '../../config-resolver.js';
|
|
|
26
9
|
import { isIgnoredByGlobs } from '../../maintainability-utils.js';
|
|
27
10
|
|
|
28
11
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* Best-effort and total. A config that cannot be resolved yields `[]`, which
|
|
33
|
-
* scores every changed JS file. That direction is deliberate: degrading to
|
|
34
|
-
* "score everything" can only produce an advisory the operator must read,
|
|
35
|
-
* whereas degrading to "score nothing" would silently retire the dimension.
|
|
12
|
+
* An unresolvable config yields `[]` (score everything) — deliberately, since
|
|
13
|
+
* scoring nothing would silently retire the dimension.
|
|
36
14
|
*
|
|
37
15
|
* @param {{ resolveConfigFn?: typeof resolveConfig, getQualityFn?: typeof getQuality }} [deps]
|
|
38
16
|
* @returns {string[]} minimatch patterns; `[]` when unset or unresolvable.
|
|
@@ -50,17 +28,8 @@ export function resolveMaintainabilityIgnoreGlobs({
|
|
|
50
28
|
}
|
|
51
29
|
|
|
52
30
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* Matching funnels through `maintainability-utils.js#isIgnoredByGlobs` — the
|
|
57
|
-
* declared single source of truth for how the MI scorer decides a file is
|
|
58
|
-
* ignored — so an exempted file is excluded here by exactly the same rule that
|
|
59
|
-
* kept it out of the baseline. Re-implementing the match with a local
|
|
60
|
-
* `minimatch` call is what let the two surfaces disagree in the first place.
|
|
61
|
-
*
|
|
62
|
-
* Module-local: {@link scopeMaintainabilityFiles} is the single door, and its
|
|
63
|
-
* `scored` / `ignored` split is where this behaviour is observable.
|
|
31
|
+
* Matches through `isIgnoredByGlobs`, the same rule the baseline uses; a
|
|
32
|
+
* local `minimatch` would let the two surfaces disagree.
|
|
64
33
|
*
|
|
65
34
|
* @param {string[]} files
|
|
66
35
|
* @param {string[]} ignoreGlobs
|
|
@@ -81,14 +50,7 @@ function partitionByIgnoreGlobs(files, ignoreGlobs, cwd) {
|
|
|
81
50
|
}
|
|
82
51
|
|
|
83
52
|
/**
|
|
84
|
-
*
|
|
85
|
-
* `null` when nothing was exempted so the caller can `if` past the log call.
|
|
86
|
-
*
|
|
87
|
-
* The notice exists because silence is ambiguous: an operator reading a review
|
|
88
|
-
* that says nothing about three changed schema modules cannot tell "scored and
|
|
89
|
-
* healthy" from "never scored".
|
|
90
|
-
*
|
|
91
|
-
* Module-local: reached through {@link scopeMaintainabilityFiles}'s `notice`.
|
|
53
|
+
* Name the exempted files, since silence cannot tell "healthy" from "never scored".
|
|
92
54
|
*
|
|
93
55
|
* @param {string[]|undefined} ignoredFiles
|
|
94
56
|
* @returns {string|null}
|
|
@@ -103,13 +65,6 @@ function formatExemptionNotice(ignoredFiles) {
|
|
|
103
65
|
}
|
|
104
66
|
|
|
105
67
|
/**
|
|
106
|
-
* Resolve the exemption list and split a review's changed-file set into the
|
|
107
|
-
* paths whose maintainability should be scored and the paths the gate exempts.
|
|
108
|
-
*
|
|
109
|
-
* This is the one door the native provider uses: it keeps the resolve → match →
|
|
110
|
-
* report sequence here rather than spread across the provider, so the provider
|
|
111
|
-
* carries no knowledge of how an exemption is decided.
|
|
112
|
-
*
|
|
113
68
|
* @param {string[]} changedFiles
|
|
114
69
|
* @param {{
|
|
115
70
|
* cwd: string,
|
|
@@ -1,49 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/native.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* previously lived in the retired `.agents/scripts/epic-code-review` CLI into a
|
|
6
|
-
* `ReviewProvider`-shaped adapter. The adapter:
|
|
7
|
-
*
|
|
8
|
-
* 1. Diffs `headRef` against `baseRef` to enumerate changed files.
|
|
9
|
-
* 2. Runs scoped lint (biome + markdownlint) over the changed surface.
|
|
10
|
-
* 3. Computes per-file maintainability reports for changed JS files, minus
|
|
11
|
-
* the files the maintainability gate exempts (see below).
|
|
12
|
-
* 4. Maps each signal to a `Finding` with a `severity` ∈ {critical, high,
|
|
13
|
-
* medium, suggestion}.
|
|
14
|
-
*
|
|
15
|
-
* **The maintainability dimension honours the gate's exemption list**, read via
|
|
16
|
-
* [`mi-exemptions.js`](mi-exemptions.js) — see that module for why this
|
|
17
|
-
* provider disagreeing with the ratchet was a live delivery blocker. Exempted
|
|
18
|
-
* files are named on the log rather than silently dropped.
|
|
19
|
-
*
|
|
20
|
-
* The lint dimension is deliberately NOT filtered through the same list:
|
|
21
|
-
* lint carries its own exclusion surface (biome's `files.includes`,
|
|
22
|
-
* `.markdownlintignore`), and a quality-gate ignore glob makes no claim about
|
|
23
|
-
* whether a file should parse or format cleanly.
|
|
24
|
-
*
|
|
25
|
-
* The adapter does NOT post to GitHub and does NOT render a markdown body.
|
|
26
|
-
* Those concerns belong to `runCodeReview()`, which calls the renderer + the
|
|
27
|
-
* structured-comment upserter.
|
|
28
|
-
*
|
|
29
|
-
* Construction is intentionally zero-arg so the factory can instantiate
|
|
30
|
-
* it without threading config through every call. Per-invocation config
|
|
31
|
-
* (paths, runners, evidence store) is injected via the `runReview` arg or
|
|
32
|
-
* the `createNativeProvider({ deps })` overload used by tests.
|
|
33
|
-
*
|
|
34
|
-
* **Depth is deliberately ignored here (Story #3937).** The pluggable review
|
|
35
|
-
* contract threads a risk-derived `depth` lever (`light` / `standard` /
|
|
36
|
-
* `deep`) on `ReviewInput` so LLM-backed providers can dial their thoroughness
|
|
37
|
-
* up or down with the Epic's judged risk. This native adapter does not read
|
|
38
|
-
* `input.depth` and does not branch on it: its work is a *mechanical* lint +
|
|
39
|
-
* maintainability sweep whose cost already scales with the diff — every
|
|
40
|
-
* changed file is linted once and every changed JS file is scored once,
|
|
41
|
-
* regardless of risk tier. There is no "review harder" knob a deterministic
|
|
42
|
-
* scorer can turn: a high-risk diff and a low-risk diff of the same size do
|
|
43
|
-
* exactly the same amount of work. The contract is therefore explicit rather
|
|
44
|
-
* than silently dropping the field — `depth` is a no-op for this provider by
|
|
45
|
-
* design, and the LLM-backed providers (codex, security-review, ultrareview)
|
|
46
|
-
* are where the lever actually changes behaviour.
|
|
2
|
+
* review-providers/native.js — in-process ReviewProvider: scoped lint plus
|
|
3
|
+
* maintainability scoring of the changed files. MI honours the gate's
|
|
4
|
+
* exemptions (lint has its own); `input.depth` is ignored by design.
|
|
47
5
|
*
|
|
48
6
|
* @typedef {import('./types.js').Finding} Finding
|
|
49
7
|
* @typedef {import('./types.js').ReviewInput} ReviewInput
|
|
@@ -73,56 +31,25 @@ import {
|
|
|
73
31
|
runScopedLint,
|
|
74
32
|
} from './scoped-lint.js';
|
|
75
33
|
|
|
76
|
-
/**
|
|
77
|
-
* The scoped-lint surface lives in [`scoped-lint.js`](scoped-lint.js), which
|
|
78
|
-
* owns runner resolution, per-surface classification, and the merge. Story
|
|
79
|
-
* #4839 moved it there while fixing the three invocation defects that made this
|
|
80
|
-
* gate fail open on ~78% of deliveries; the module docstring there carries the
|
|
81
|
-
* diagnosis. The three names stay part of this provider's published lint seam.
|
|
82
|
-
*/
|
|
83
34
|
export { parseLintOutput, partitionFilesForLint, runScopedLint };
|
|
84
35
|
|
|
85
|
-
/** Worker entry that scores one file into a full maintainability report. */
|
|
86
36
|
const MAINTAINABILITY_REPORT_WORKER_URL = new URL(
|
|
87
37
|
'../../workers/maintainability-report-worker.js',
|
|
88
38
|
import.meta.url,
|
|
89
39
|
);
|
|
90
40
|
|
|
91
|
-
/**
|
|
92
|
-
* Below this JS-file count the worker pool's spawn overhead dominates, so
|
|
93
|
-
* `analyzeChangedFiles` scores in-process (the pre-pool serial path). At or
|
|
94
|
-
* above it, per-file `calculateReportForFile` scoring is offloaded to the
|
|
95
|
-
* shared worker pool so the event loop is not blocked during epic-scoped
|
|
96
|
-
* reviews (f-performance). Single-sourced in `cpu-pool.js` (see the
|
|
97
|
-
* `POOL_SERIAL_THRESHOLD` docstring for the tuning rationale); the
|
|
98
|
-
* `SERIAL_THRESHOLD` export name is preserved as this module's public API.
|
|
99
|
-
*/
|
|
41
|
+
/** Below this JS-file count scoring runs in-process; at or above, on the worker pool. */
|
|
100
42
|
export const SERIAL_THRESHOLD = POOL_SERIAL_THRESHOLD;
|
|
101
43
|
|
|
102
44
|
const JS_MAINTAINABILITY_EXTS = new Set(['.js', '.mjs', '.cjs']);
|
|
103
45
|
|
|
104
46
|
/**
|
|
105
|
-
* Read
|
|
106
|
-
*
|
|
107
|
-
* `PROJECT_ROOT`.
|
|
108
|
-
*
|
|
109
|
-
* This is the fix for Story #3696: the native review previously scored the
|
|
110
|
-
* working-tree copy at `PROJECT_ROOT`, which — when the review runs from the
|
|
111
|
-
* main checkout (the common case for story/epic close) — is the **base**
|
|
112
|
-
* (pre-change) content, not the **head** (PR-branch) content the PR actually
|
|
113
|
-
* produces. Scoring the base copy made MI-*improving* refactors emit a
|
|
114
|
-
* false-positive "Size/Volume Warning" citing the very debt they removed.
|
|
115
|
-
* Sourcing from `headRef` makes the score reflect the PR branch regardless of
|
|
116
|
-
* which tree happens to be checked out on disk.
|
|
47
|
+
* Read the file at `headRef`, never from disk: close runs from the main
|
|
48
|
+
* checkout, where disk holds the BASE content. `null` when absent at head.
|
|
117
49
|
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* provider does not warn about a file it cannot read at head.
|
|
122
|
-
*
|
|
123
|
-
* @param {string} relPath Repo-relative path of the changed file.
|
|
124
|
-
* @param {string} headRef Git ref under review (e.g. 'story-3696', 'epic/42').
|
|
125
|
-
* @param {typeof gitSpawn} [gitSpawnFn] Injected git runner (test seam).
|
|
50
|
+
* @param {string} relPath
|
|
51
|
+
* @param {string} headRef
|
|
52
|
+
* @param {typeof gitSpawn} [gitSpawnFn]
|
|
126
53
|
* @returns {string|null}
|
|
127
54
|
*/
|
|
128
55
|
export function readHeadSource(relPath, headRef, gitSpawnFn = gitSpawn) {
|
|
@@ -132,16 +59,11 @@ export function readHeadSource(relPath, headRef, gitSpawnFn = gitSpawn) {
|
|
|
132
59
|
}
|
|
133
60
|
|
|
134
61
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* the same as the JS the engine would otherwise see. Returns a parse-error
|
|
138
|
-
* report (never throws) when the source cannot be transpiled, matching the
|
|
139
|
-
* disk-based `calculateReportForFile` contract.
|
|
140
|
-
*
|
|
141
|
-
* Exported for testing.
|
|
62
|
+
* Score a source string (TS transpiled first). Returns a parse-error report
|
|
63
|
+
* rather than throwing.
|
|
142
64
|
*
|
|
143
|
-
* @param {string} source
|
|
144
|
-
* @param {string} relPath
|
|
65
|
+
* @param {string} source
|
|
66
|
+
* @param {string} relPath Used only to pick the transpile mode.
|
|
145
67
|
* @returns {ReturnType<typeof calculateReport>}
|
|
146
68
|
*/
|
|
147
69
|
export function scoreSourceReport(source, relPath) {
|
|
@@ -159,10 +81,8 @@ export function scoreSourceReport(source, relPath) {
|
|
|
159
81
|
}
|
|
160
82
|
|
|
161
83
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* report (it closes over the file's head-ref source — see
|
|
165
|
-
* {@link analyzeChangedFiles}); a throw is treated as "drop this file".
|
|
84
|
+
* Classify one file's report into a row plus optional findings. A `reportFn`
|
|
85
|
+
* throw drops the file.
|
|
166
86
|
*
|
|
167
87
|
* @returns {{ row: object|null, criticalFinding: Finding|null, mediumFinding: Finding|null }}
|
|
168
88
|
*/
|
|
@@ -219,9 +139,7 @@ export function classifyChangedFile(relPath, { reportFn, classifier } = {}) {
|
|
|
219
139
|
}
|
|
220
140
|
|
|
221
141
|
/**
|
|
222
|
-
*
|
|
223
|
-
* the serial and pooled scoring paths so both produce byte-for-byte identical
|
|
224
|
-
* `maintainability` rows and `critical`/`medium` findings.
|
|
142
|
+
* Shared by the serial and pooled paths so both emit identical output.
|
|
225
143
|
*
|
|
226
144
|
* @param {{ totalFiles: number, jsFiles: number, maintainability: object[], criticalFindings: Finding[], mediumFindings: Finding[] }} results
|
|
227
145
|
* @param {{ row: object|null, criticalFinding: Finding|null, mediumFinding: Finding|null }} classified
|
|
@@ -239,39 +157,8 @@ function isJsMaintainabilityFile(relPath) {
|
|
|
239
157
|
}
|
|
240
158
|
|
|
241
159
|
/**
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
* For small JS-file sets (below {@link SERIAL_THRESHOLD}) scoring runs
|
|
245
|
-
* in-process — the worker pool's spawn overhead dominates at small sizes and
|
|
246
|
-
* the in-process path matches the pre-pool behaviour byte-for-byte. At or
|
|
247
|
-
* above the threshold, each file's `calculateReportForFile` call is offloaded
|
|
248
|
-
* to the shared worker pool (`maintainability-report-worker`) so the native
|
|
249
|
-
* provider no longer blocks the event loop during epic-scoped reviews
|
|
250
|
-
* (f-performance). Either way the pure classification core
|
|
251
|
-
* ({@link classifyChangedFile} + {@link classifyReport}) runs in-process, so
|
|
252
|
-
* the two paths emit identical rows and findings.
|
|
253
|
-
*
|
|
254
|
-
* **Head sourcing (Story #3696).** Each changed JS file is scored against the
|
|
255
|
-
* content it has at `headRef` — sourced via `git show <headRef>:<relPath>` —
|
|
256
|
-
* not the on-disk copy at `PROJECT_ROOT`. When the review runs from the main
|
|
257
|
-
* checkout (the common story/epic close case) the on-disk copy is the *base*
|
|
258
|
-
* (pre-change) content, so scoring it made MI-improving refactors emit a
|
|
259
|
-
* false-positive size/volume warning citing the debt they remove. Sourcing
|
|
260
|
-
* from head makes the score reflect the PR branch regardless of the checked-out
|
|
261
|
-
* tree. A file with no content at head (deleted by the PR, or unreadable) is
|
|
262
|
-
* dropped — the provider never warns about a file it cannot read at head.
|
|
263
|
-
*
|
|
264
|
-
* `classifier` is injected for testability. Tests may also inject `reportFn`
|
|
265
|
-
* to bypass head sourcing entirely (it receives the head source string and the
|
|
266
|
-
* relPath); production callers omit it and get the git-head scorer. Injecting
|
|
267
|
-
* `reportFn` forces the serial path (the injected scorer cannot cross the
|
|
268
|
-
* worker boundary).
|
|
269
|
-
*
|
|
270
|
-
* `serialThreshold` overrides the pool-vs-serial cutover for one call. It is
|
|
271
|
-
* the seam the parity test uses to drive the pooled branch: Story #5109
|
|
272
|
-
* retuned `POOL_SERIAL_THRESHOLD` from 8 to 256 against measured data, and a
|
|
273
|
-
* fixture sized to clear the old number would otherwise have gone quietly
|
|
274
|
-
* serial while still claiming to cover the pool.
|
|
160
|
+
* Pooled at or above `serialThreshold`. An injected `reportFn` forces the
|
|
161
|
+
* serial path (a closure cannot cross the worker boundary).
|
|
275
162
|
*
|
|
276
163
|
* @param {string[]} changedFiles
|
|
277
164
|
* @param {{ reportFn?: Function, classifier?: Function, runOnPoolFn?: typeof runOnPool, headRef?: string|null, gitSpawnFn?: typeof gitSpawn, readHeadSourceFn?: typeof readHeadSource, serialThreshold?: number }} [deps]
|
|
@@ -301,20 +188,14 @@ export async function analyzeChangedFiles(
|
|
|
301
188
|
results.jsFiles = jsFiles.length;
|
|
302
189
|
if (jsFiles.length === 0) return results;
|
|
303
190
|
|
|
304
|
-
// Resolve each file's head-ref source up front. `null` source (deleted at
|
|
305
|
-
// head / unreadable) is dropped — it carries no head report to warn about.
|
|
306
191
|
const sources = jsFiles.map((relPath) =>
|
|
307
192
|
headRef == null ? '' : readHeadSourceFn(relPath, headRef, gitSpawnFn),
|
|
308
193
|
);
|
|
309
194
|
|
|
310
|
-
// Default scorer: score the head source string. A test-injected `reportFn`
|
|
311
|
-
// overrides it (receives the head source + relPath) and forces the serial
|
|
312
|
-
// path because the closure cannot be cloned into a worker thread.
|
|
313
195
|
const scoreReport =
|
|
314
196
|
reportFn ?? ((source, relPath) => scoreSourceReport(source, relPath));
|
|
315
197
|
const customReportFn = reportFn != null;
|
|
316
198
|
|
|
317
|
-
// Serial path: small batches, or whenever a caller injects its own scorer.
|
|
318
199
|
if (jsFiles.length < serialThreshold || customReportFn) {
|
|
319
200
|
for (let i = 0; i < jsFiles.length; i += 1) {
|
|
320
201
|
const relPath = jsFiles[i];
|
|
@@ -331,12 +212,7 @@ export async function analyzeChangedFiles(
|
|
|
331
212
|
return results;
|
|
332
213
|
}
|
|
333
214
|
|
|
334
|
-
//
|
|
335
|
-
// pre-sourced head content (not a disk path) so the worker scores the same
|
|
336
|
-
// head string the serial path does. Files with `null` head source are not
|
|
337
|
-
// sent to the pool; their slot is reconstructed by mapping pool results back
|
|
338
|
-
// onto the non-null subset in input order. The pure classification core runs
|
|
339
|
-
// in-process so both paths emit identical rows and findings.
|
|
215
|
+
// Send head content (not a disk path) so the worker scores what the serial path does.
|
|
340
216
|
const poolItems = [];
|
|
341
217
|
const poolIndex = []; // poolItems[k] corresponds to jsFiles[poolIndex[k]]
|
|
342
218
|
for (let i = 0; i < jsFiles.length; i += 1) {
|
|
@@ -353,8 +229,7 @@ export async function analyzeChangedFiles(
|
|
|
353
229
|
for (let k = 0; k < poolIndex.length; k += 1) {
|
|
354
230
|
const relPath = jsFiles[poolIndex[k]];
|
|
355
231
|
const poolEntry = poolResults[k];
|
|
356
|
-
// A
|
|
357
|
-
// sentinel) maps to the serial path's "reportFn threw" → dropped file.
|
|
232
|
+
// A pool error or null report drops the file, as a serial throw does.
|
|
358
233
|
if (!poolEntry || poolEntry.__cpuPoolError || poolEntry.report == null) {
|
|
359
234
|
continue;
|
|
360
235
|
}
|
|
@@ -370,27 +245,8 @@ export async function analyzeChangedFiles(
|
|
|
370
245
|
}
|
|
371
246
|
|
|
372
247
|
/**
|
|
373
|
-
*
|
|
374
|
-
*
|
|
375
|
-
* warnings collapse into a single suggestion.
|
|
376
|
-
*
|
|
377
|
-
* **Findings come from the parsed counts, never from the execution flag**
|
|
378
|
-
* (Story #5282). `executionFailed` is the OR across the biome and markdownlint
|
|
379
|
-
* surfaces, so gating findings on it let *one* absent runner discard the
|
|
380
|
-
* *other* surface's real errors — and since the code surface's disk probe
|
|
381
|
-
* (#5193) degrades in every checkout without `node_modules/.bin/biome`, that
|
|
382
|
-
* was the default state of a consumer checkout: markdownlint errors reached
|
|
383
|
-
* neither the findings nor the severity tally while the outcome read clean
|
|
384
|
-
* apart from a degradation line.
|
|
385
|
-
*
|
|
386
|
-
* Story #4699's intent is preserved exactly, because it was never about the
|
|
387
|
-
* flag: a degradation is still not a `Finding` — it has no counts to report,
|
|
388
|
-
* so a surface that could not execute contributes `parsed: false` and zero
|
|
389
|
-
* counts and produces nothing here, while travelling on the degradation and
|
|
390
|
-
* friction-telemetry channels under its own name. A summary that explicitly
|
|
391
|
-
* reports `parsed: false` therefore yields no findings whatever its counts
|
|
392
|
-
* claim; a summary omitting `parsed` (an injected or pre-#4839 shape) is
|
|
393
|
-
* scored on its counts as before.
|
|
248
|
+
* Findings come from parsed counts, never `executionFailed` (an OR across
|
|
249
|
+
* surfaces), so one absent runner cannot discard the other's errors.
|
|
394
250
|
*
|
|
395
251
|
* @param {{ errors: number, warnings: number, parsed?: boolean, skipped?: boolean, mode?: string, executionFailed?: boolean, evidenceSkipped?: boolean }} lintSummary
|
|
396
252
|
* @returns {Finding[]}
|
|
@@ -452,13 +308,8 @@ async function runLintPhase({
|
|
|
452
308
|
}
|
|
453
309
|
|
|
454
310
|
/**
|
|
455
|
-
*
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
* A summary from `runScopedLint` names each failed surface; an injected or
|
|
459
|
-
* legacy summary that sets only `executionFailed` degrades to one record for
|
|
460
|
-
* the gate as a whole, so the outcome is never silent about a gate that did not
|
|
461
|
-
* run just because the summary predates the per-surface contract.
|
|
311
|
+
* Degradation records for an `executionFailed` summary; one without
|
|
312
|
+
* per-surface rows degrades to a single gate-wide record, never silence.
|
|
462
313
|
*
|
|
463
314
|
* @param {{ executionFailed?: boolean, degradations?: Array<{ surface: string, reason: string }> }} lintSummary
|
|
464
315
|
* @returns {Array<{ tool: string, gate: string, surface: string, reason: string }>}
|
|
@@ -481,12 +332,6 @@ function buildLintDegradations(lintSummary) {
|
|
|
481
332
|
}
|
|
482
333
|
|
|
483
334
|
/**
|
|
484
|
-
* Build a `ReviewProvider` instance backed by the native in-process pipeline.
|
|
485
|
-
*
|
|
486
|
-
* The `deps` overload is the test seam — production callers (the factory)
|
|
487
|
-
* invoke `createNativeProvider()` with no arguments and get the default
|
|
488
|
-
* dependency chain (real git, real lint, real maintainability engine).
|
|
489
|
-
*
|
|
490
335
|
* @param {{
|
|
491
336
|
* gitSpawnFn?: typeof gitSpawn,
|
|
492
337
|
* runScopedLintFn?: typeof runScopedLint,
|
|
@@ -506,20 +351,13 @@ export function createNativeProvider(deps = {}) {
|
|
|
506
351
|
analyzeChangedFilesFn = analyzeChangedFiles,
|
|
507
352
|
buildLintFindingsFn = buildLintFindings,
|
|
508
353
|
emitToolDegradationFn = emitRuntimeFriction,
|
|
509
|
-
// The maintainability-gate exemption seam. The resolution itself — gate-key
|
|
510
|
-
// read and fail-open — is unit-tested in `mi-exemptions.js`; this dep is
|
|
511
|
-
// here so a provider test can pin the WIRING without a config on disk.
|
|
512
354
|
resolveIgnoreGlobsFn = resolveMaintainabilityIgnoreGlobs,
|
|
513
355
|
logger,
|
|
514
356
|
scopeLint = 'changed-only',
|
|
515
357
|
} = deps;
|
|
516
358
|
|
|
517
359
|
/**
|
|
518
|
-
* Degradations
|
|
519
|
-
* `getDegradations()` after the run, mirroring how `getPromptMessages` is
|
|
520
|
-
* feature-detected by the orchestrator — findings and degradations travel
|
|
521
|
-
* side by side, so an unexecutable tool never has to become a `Finding` to
|
|
522
|
-
* be visible (Story #4699's intent; Story #4839's fix).
|
|
360
|
+
* Degradations from the latest `runReview`, travelling beside findings.
|
|
523
361
|
*
|
|
524
362
|
* @type {Array<{ tool: string, gate: string, surface: string, reason: string }>}
|
|
525
363
|
*/
|
|
@@ -527,9 +365,6 @@ export function createNativeProvider(deps = {}) {
|
|
|
527
365
|
|
|
528
366
|
return {
|
|
529
367
|
/**
|
|
530
|
-
* Gate degradations from the last `runReview`. Never a `Finding`, so
|
|
531
|
-
* severity counts stay code-findings-only.
|
|
532
|
-
*
|
|
533
368
|
* @returns {Array<{ tool: string, gate: string, surface: string, reason: string }>}
|
|
534
369
|
*/
|
|
535
370
|
getDegradations() {
|
|
@@ -600,19 +435,8 @@ export function createNativeProvider(deps = {}) {
|
|
|
600
435
|
});
|
|
601
436
|
|
|
602
437
|
if (lintSummary.executionFailed) {
|
|
603
|
-
//
|
|
604
|
-
//
|
|
605
|
-
// (best-effort) so severity counts reflect code findings only.
|
|
606
|
-
//
|
|
607
|
-
// Story #4839 — telemetry alone left the review's own verdict unable to
|
|
608
|
-
// distinguish "lint ran and found nothing" from "lint never ran", so
|
|
609
|
-
// the same degradation is also recorded on the outcome channel. It is
|
|
610
|
-
// still never a `Finding`: the friction emission below is unchanged.
|
|
611
|
-
//
|
|
612
|
-
// Story #5282 — this branch is about the degraded surface only. A
|
|
613
|
-
// sibling surface that *did* run still contributes its parsed counts
|
|
614
|
-
// to `buildLintFindings` below, so a degradation here no longer
|
|
615
|
-
// suppresses the other surface's errors.
|
|
438
|
+
// A tool that could not execute is a degradation, recorded on the
|
|
439
|
+
// outcome and in friction telemetry — never a finding.
|
|
616
440
|
recordedDegradations = buildLintDegradations(lintSummary);
|
|
617
441
|
logger?.warn?.(
|
|
618
442
|
`[native-review] Lint runner could not execute (${recordedDegradations
|
|
@@ -633,19 +457,13 @@ export function createNativeProvider(deps = {}) {
|
|
|
633
457
|
},
|
|
634
458
|
});
|
|
635
459
|
} catch {
|
|
636
|
-
// Observability must never fail the review
|
|
460
|
+
// Observability must never fail the review.
|
|
637
461
|
}
|
|
638
462
|
}
|
|
639
463
|
|
|
640
464
|
const lintFindings = buildLintFindingsFn(lintSummary);
|
|
641
465
|
|
|
642
|
-
//
|
|
643
|
-
// (lint errors), then medium (size/volume warnings), then suggestion
|
|
644
|
-
// (lint warnings). An execution failure contributes no counts of its
|
|
645
|
-
// own to these tiers — it travels on the degradation channel — but it
|
|
646
|
-
// no longer suppresses a sibling surface's. The renderer
|
|
647
|
-
// re-bucketizes by severity tier, so this order only matters for
|
|
648
|
-
// stability of fixture outputs.
|
|
466
|
+
// Severity order; only matters for fixture stability.
|
|
649
467
|
return [
|
|
650
468
|
...results.criticalFindings,
|
|
651
469
|
...lintFindings.filter((f) => f.severity === 'high'),
|
|
@@ -657,9 +475,7 @@ export function createNativeProvider(deps = {}) {
|
|
|
657
475
|
}
|
|
658
476
|
|
|
659
477
|
/**
|
|
660
|
-
* Zero-arg
|
|
661
|
-
* separate from `createNativeProvider({ deps })` so the registry signature
|
|
662
|
-
* stays `() => ReviewProvider`.
|
|
478
|
+
* Zero-arg registry entry point.
|
|
663
479
|
*
|
|
664
480
|
* @returns {ReviewProvider}
|
|
665
481
|
*/
|