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,12 +1,5 @@
|
|
|
1
1
|
import { coverageForMethodInEntry } from './coverage-utils.js';
|
|
2
|
-
// `finalizeMethodRowsWithBaseline` (Story #4981) lives in
|
|
3
|
-
// crap-baseline-join.js — `resolveRawRow`, the per-row policy it shares with
|
|
4
|
-
// `finalizeMethodRows` below, is imported from there so the two stay a
|
|
5
|
-
// single implementation.
|
|
6
2
|
import { resolveRawRow } from './crap-baseline-join.js';
|
|
7
|
-
// `COORDINATE_ORIGINAL` / `COORDINATE_TRANSPILED` / `crapFormula` (Story
|
|
8
|
-
// #4866 / this module's original home) now live in crap-coordinates.js —
|
|
9
|
-
// re-exported here so every existing importer of this module is unaffected.
|
|
10
3
|
import {
|
|
11
4
|
COORDINATE_ORIGINAL,
|
|
12
5
|
COORDINATE_TRANSPILED,
|
|
@@ -19,73 +12,19 @@ import { analyzeModule } from './escomplex-kernel.js';
|
|
|
19
12
|
export { COORDINATE_ORIGINAL, COORDINATE_TRANSPILED, crapFormula };
|
|
20
13
|
|
|
21
14
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* cannot tell an unscorable file from one with no methods, which is how a
|
|
25
|
-
* parse failure used to reach the baseline as a silent zero (Story #5311).
|
|
15
|
+
* Returned for a source the kernel cannot parse — never `[]`, which would be
|
|
16
|
+
* indistinguishable from a file with no methods.
|
|
26
17
|
*/
|
|
27
18
|
export const UNSCORABLE = null;
|
|
28
19
|
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
// see `escomplex-ast-compat.js` for the defect and the upstream status.
|
|
33
|
-
//
|
|
34
|
-
// Story #5311: the install belongs here, at the scoring kernel, because this
|
|
35
|
-
// is where both CRAP scorers converge — `calculateCrapForSource` (the worker
|
|
36
|
-
// path) and `crap-utils.js#analyzeOnce` (the serial path, which reaches this
|
|
37
|
-
// module for `methodRowsFromReport`). It used to be reached only as a side
|
|
38
|
-
// effect of `maintainability-engine.js` sitting somewhere in the serial path's
|
|
39
|
-
// import graph, which the worker's graph never included: 362 methods across
|
|
40
|
-
// 21 files scored zero via workers and scored fine serially, and
|
|
41
|
-
// `POOL_SERIAL_THRESHOLD` makes the worker path the only one a real repo
|
|
42
|
-
// takes. Anchoring it at the kernel makes the next worker entrypoint correct
|
|
43
|
-
// by construction rather than by an import nobody would guess is load-bearing.
|
|
20
|
+
// Without the AST compat shim, modern syntax aborts `analyzeModule` for the
|
|
21
|
+
// whole file. Installed here, where the worker and serial scorers converge,
|
|
22
|
+
// so every entrypoint gets it by construction.
|
|
44
23
|
installAstCompat();
|
|
45
24
|
|
|
46
25
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* Single-sourced between `calculateCrapForSource` (CRAP-only path) and
|
|
50
|
-
* `analyzeOnce` (combined MI + CRAP path) so the two cannot drift on how a
|
|
51
|
-
* method's line is remapped or its coverage joined — the parity the
|
|
52
|
-
* combined-parity suite asserts.
|
|
53
|
-
*
|
|
54
|
-
* **Coordinates (Story #4775, corrected by Story #4866).** `mapLine`
|
|
55
|
-
* translates escomplex's `lineStart` — which is in *transpiled* coordinates
|
|
56
|
-
* for a TS/TSX source — into the *original source* coordinates istanbul's
|
|
57
|
-
* `fnMap` uses. A `null` mapper means the two coordinate systems already
|
|
58
|
-
* coincide (plain JavaScript).
|
|
59
|
-
*
|
|
60
|
-
* #4775 let an unresolvable line fall back to the un-remapped value, which
|
|
61
|
-
* made one scan emit rows in two coordinate systems with nothing on the row
|
|
62
|
-
* saying which. Each row now records its own `coordinateSystem`, and an
|
|
63
|
-
* un-remapped row joins no coverage at all: joining a transpiled line against
|
|
64
|
-
* an original-source `fnMap` does not merely miss, it can land inside an
|
|
65
|
-
* unrelated function's range and mis-attribute that function's coverage. An
|
|
66
|
-
* honest `coverage: null` lets the scanner's `requireCoverage` policy decide,
|
|
67
|
-
* exactly as it does for a genuinely uninstrumented method.
|
|
68
|
-
*
|
|
69
|
-
* @param {object|null} report An `escomplex.analyzeModule` report.
|
|
70
|
-
* @param {object|null} coverageForFile Istanbul coverage entry for this file.
|
|
71
|
-
* @param {((line: number) => number|null)|null} [mapLine]
|
|
72
|
-
* @returns {Array<{
|
|
73
|
-
* method: string,
|
|
74
|
-
* anonymous: boolean,
|
|
75
|
-
* startLine: number,
|
|
76
|
-
* cyclomatic: number,
|
|
77
|
-
* coverage: number|null,
|
|
78
|
-
* crap: number|null,
|
|
79
|
-
* coordinateSystem: 'original'|'transpiled',
|
|
80
|
-
* }>}
|
|
81
|
-
*/
|
|
82
|
-
/**
|
|
83
|
-
* Resolve one method's line into a coordinate and the provenance of that
|
|
84
|
-
* coordinate — the single place the rule lives.
|
|
85
|
-
*
|
|
86
|
-
* No mapper means the source was never transpiled, so its line already IS an
|
|
87
|
-
* original-source coordinate. A mapper that resolves yields one. A mapper
|
|
88
|
-
* that does not leaves the transpiled line, said so.
|
|
26
|
+
* No mapper: already original coordinates. An unresolved mapping stays
|
|
27
|
+
* transpiled, and says so.
|
|
89
28
|
*
|
|
90
29
|
* @param {number} rawStartLine escomplex's `lineStart`.
|
|
91
30
|
* @param {((line: number) => number|null)|null} mapLine
|
|
@@ -101,13 +40,28 @@ function resolveCoordinate(rawStartLine, mapLine) {
|
|
|
101
40
|
: { startLine: rawStartLine, coordinateSystem: COORDINATE_TRANSPILED };
|
|
102
41
|
}
|
|
103
42
|
|
|
43
|
+
/**
|
|
44
|
+
* Raw per-method CRAP rows, shared by the CRAP-only and combined MI paths.
|
|
45
|
+
* A row still in transpiled coordinates joins no coverage: a transpiled line
|
|
46
|
+
* can land inside an unrelated function's `fnMap` range and mis-attribute it.
|
|
47
|
+
*
|
|
48
|
+
* @param {object|null} report An `escomplex.analyzeModule` report.
|
|
49
|
+
* @param {object|null} coverageForFile Istanbul coverage entry for this file.
|
|
50
|
+
* @param {((line: number) => number|null)|null} [mapLine]
|
|
51
|
+
* @returns {Array<{
|
|
52
|
+
* method: string,
|
|
53
|
+
* anonymous: boolean,
|
|
54
|
+
* startLine: number,
|
|
55
|
+
* cyclomatic: number,
|
|
56
|
+
* coverage: number|null,
|
|
57
|
+
* crap: number|null,
|
|
58
|
+
* coordinateSystem: 'original'|'transpiled',
|
|
59
|
+
* }>}
|
|
60
|
+
*/
|
|
104
61
|
export function methodRowsFromReport(report, coverageForFile, mapLine = null) {
|
|
105
62
|
const methods = report?.methods ?? [];
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
// surviving rows instead would let an unscorable method's absence shift its
|
|
109
|
-
// siblings' ordinals — reintroducing, through the back door, exactly the
|
|
110
|
-
// position dependence this replaces.
|
|
63
|
+
// Derive identities over the whole list before skipping, so a skipped
|
|
64
|
+
// method cannot shift its siblings' ordinals.
|
|
111
65
|
const identities = deriveMethodIdentities(methods);
|
|
112
66
|
const rows = [];
|
|
113
67
|
for (const [i, m] of methods.entries()) {
|
|
@@ -136,43 +90,11 @@ export function methodRowsFromReport(report, coverageForFile, mapLine = null) {
|
|
|
136
90
|
}
|
|
137
91
|
|
|
138
92
|
/**
|
|
139
|
-
* Apply
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
* - `requireCoverage: true` — an unresolved method is skipped and counted,
|
|
145
|
-
* exactly as before. The baseline stays a record of measured code.
|
|
146
|
-
* - `requireCoverage: false` — an unresolved method scores as **0%
|
|
147
|
-
* covered** (`crap = c² + c`, the formula's own treatment of untested
|
|
148
|
-
* code) and lands in the baseline. Previously the flag only stopped
|
|
149
|
-
* whole *files* being skipped while each individual method was still
|
|
150
|
-
* dropped, which made it a no-op for baseline population — the caller
|
|
151
|
-
* asked for "score it anyway" and got silence.
|
|
152
|
-
*
|
|
153
|
-
* **Absent coverage is not zero coverage (Story #4871).** The 0%-covered
|
|
154
|
-
* inference above is only defensible when a coverage **artifact** exists and
|
|
155
|
-
* simply reports nothing for this method — "the tests ran and never reached
|
|
156
|
-
* it" is a measurement. When no artifact was produced at all — a freshly
|
|
157
|
-
* initialized story worktree, whose `coverage/` directory does not exist —
|
|
158
|
-
* nothing was measured, and filling the gap with 0% manufactures a maximal
|
|
159
|
-
* CRAP out of an absent observation, failing the first commit on files the
|
|
160
|
-
* change never touched. `coverageAvailable: false` therefore makes such a
|
|
161
|
-
* method **unscorable** under either policy: skipped and counted, never
|
|
162
|
-
* filled. It is deliberately keyed on the artifact, not the per-file entry,
|
|
163
|
-
* so `requireCoverage: false` keeps meaning "score untested code" whenever a
|
|
164
|
-
* real coverage run stands behind the verdict.
|
|
165
|
-
*
|
|
166
|
-
* **Unjoinable is not untested (Story #4901).** Both policies above are about
|
|
167
|
-
* a method whose coverage is *absent*; neither is about one whose coverage
|
|
168
|
-
* could not be **joined**. A transpiled `startLine` is the latter — not in
|
|
169
|
-
* the coordinate space the `fnMap` or the baseline is keyed against — so 0%
|
|
170
|
-
* is not a measurement but a number invented for it, and `crapFormula(c, 0)`
|
|
171
|
-
* is the maximal `c² + c`. Excluded under **either** policy, and counted.
|
|
172
|
-
*
|
|
173
|
-
* `resolvedMethods` / `totalMethods` count the *join*, not the fill, which is
|
|
174
|
-
* what makes them a health signal for the updater's fail-closed
|
|
175
|
-
* resolution-rate floor — so the exclusion is applied *after* both counters.
|
|
93
|
+
* Apply `requireCoverage`: `true` skips an unresolved method; `false` scores
|
|
94
|
+
* it 0% covered. With no coverage artifact at all (`coverageAvailable:
|
|
95
|
+
* false`) or a transpiled (unjoinable) line, the method is skipped under
|
|
96
|
+
* either policy — absent or unjoinable is not untested. The counters measure
|
|
97
|
+
* the join, not the fill, for the resolution-rate floor.
|
|
176
98
|
*
|
|
177
99
|
* @param {Array<object>} rawRows Rows from `methodRowsFromReport`.
|
|
178
100
|
* @param {{requireCoverage?: boolean, coverageAvailable?: boolean}} [opts]
|
|
@@ -207,37 +129,17 @@ export function finalizeMethodRows(
|
|
|
207
129
|
return { rows, skippedMethodsNoCoverage, resolvedMethods, totalMethods };
|
|
208
130
|
}
|
|
209
131
|
|
|
210
|
-
// The incremental-mode join (Story #4981) lives in crap-baseline-join.js;
|
|
211
|
-
// re-exported here so it stays reachable from the scoring kernel's existing
|
|
212
|
-
// public surface.
|
|
213
132
|
export { finalizeMethodRowsWithBaseline } from './crap-baseline-join.js';
|
|
214
133
|
|
|
215
134
|
/**
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
* Kernel contract:
|
|
221
|
-
* - Pure (no I/O, no AST parse beyond the one delegated to escomplex via
|
|
222
|
-
* `analyzeModule`).
|
|
223
|
-
* - Methods whose coverage cannot be resolved from `coverageForFile` —
|
|
224
|
-
* including every method whose line stayed in transpiled coordinates —
|
|
225
|
-
* produce `coverage: null` and `crap: null`. Callers apply their own
|
|
226
|
-
* `requireCoverage` policy at the scanner level (`finalizeMethodRows`);
|
|
227
|
-
* this kernel never decides to skip.
|
|
228
|
-
* - A parse error returns {@link UNSCORABLE} (`null`) — the file could not
|
|
229
|
-
* be scored at all, which is a different fact from "it has no methods"
|
|
230
|
-
* (`[]`). Story #5311: returning `[]` for both collapsed them, and every
|
|
231
|
-
* caller's drop path for an unscorable file became unreachable — the
|
|
232
|
-
* whole parse-failure class landed in the baseline as a clean zero.
|
|
233
|
-
* Callers MUST branch on `rows === null` before iterating.
|
|
135
|
+
* Pure CRAP scoring kernel (`c² · (1 − cov)³ + c`); never skips — unresolved
|
|
136
|
+
* coverage yields `null` fields. Callers MUST branch on `rows === null`
|
|
137
|
+
* ({@link UNSCORABLE}) before iterating.
|
|
234
138
|
*
|
|
235
139
|
* @param {string} source JavaScript source text (possibly transpiled).
|
|
236
|
-
* @param {object|null} coverageForFile
|
|
237
|
-
* `coverage-final.json` map keyed by this file's path, or null when no
|
|
238
|
-
* coverage data is available for this file.
|
|
140
|
+
* @param {object|null} coverageForFile This file's `coverage-final.json` entry.
|
|
239
141
|
* @param {((line: number) => number|null)|null} [mapLine] Transpiled →
|
|
240
|
-
* original line resolver
|
|
142
|
+
* original line resolver.
|
|
241
143
|
* @returns {Array<{
|
|
242
144
|
* method: string,
|
|
243
145
|
* anonymous: boolean,
|
|
@@ -264,22 +166,9 @@ export function calculateCrapForSource(
|
|
|
264
166
|
}
|
|
265
167
|
|
|
266
168
|
/**
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
* Two orthogonal remediations are surfaced:
|
|
271
|
-
* - `minComplexityAt100Cov`: branch count a refactor must reach so that,
|
|
272
|
-
* even untested, the method would pass (`CRAP@cov=1 = c` → `c ≤ target`).
|
|
273
|
-
* Computed as `floor(sqrt(target))`.
|
|
274
|
-
* - `minCoverageAtCurrentComplexity`: ratio a test-addition must reach at
|
|
275
|
-
* the current complexity to pass, derived by inverting the formula:
|
|
276
|
-
* `cov = 1 − ((target − c) / c²)^(1/3)`. Null when unachievable — i.e.
|
|
277
|
-
* `c > target` (CRAP at 100% coverage still exceeds the target) or when
|
|
278
|
-
* `c ≤ 0` (no branches; coverage is meaningless).
|
|
279
|
-
*
|
|
280
|
-
* Callers apply the target convention: `baseline` for regressions,
|
|
281
|
-
* `newMethodCeiling` for new violations. The helper stays scalar so it can
|
|
282
|
-
* be re-used by MI-parity output or future guidance surfaces.
|
|
169
|
+
* Single-axis fixes bringing a method under `target`: the complexity to reach
|
|
170
|
+
* (`floor(sqrt(target))`), and the coverage needed at current complexity
|
|
171
|
+
* (`1 − ((target − c) / c²)^(1/3)`; null when `c > target` or `c ≤ 0`).
|
|
283
172
|
*
|
|
284
173
|
* @param {{ cyclomatic: number, target: number }} params
|
|
285
174
|
* @returns {{
|
|
@@ -297,8 +186,6 @@ export function deriveFixGuidance({ cyclomatic, target } = {}) {
|
|
|
297
186
|
|
|
298
187
|
let minCoverageAtCurrentComplexity = null;
|
|
299
188
|
if (c > 0 && t >= c) {
|
|
300
|
-
// `(t - c) / c²` lies in `[0, 1]` for `t ∈ [c, c + c²]`; Math.cbrt stays
|
|
301
|
-
// real-valued for any input so a numeric clamp is the only safeguard.
|
|
302
189
|
const ratio = (t - c) / (c * c);
|
|
303
190
|
const minCov = 1 - Math.cbrt(ratio);
|
|
304
191
|
minCoverageAtCurrentComplexity = Math.max(0, Math.min(1, minCov));
|
|
@@ -1,32 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* crap-method-identity.js — order-independent identity for the methods an
|
|
3
|
-
* escomplex report describes (Story #4969).
|
|
4
|
-
*
|
|
5
|
-
* Split out of `crap-engine.js` deliberately. That module is the CRAP scoring
|
|
6
|
-
* kernel — parse, remap a line, join coverage, apply the formula — and naming
|
|
7
|
-
* a method is a different question from scoring one: it reads the shape of the
|
|
8
|
-
* scope tree and nothing about coverage or complexity. Keeping the walker here
|
|
9
|
-
* leaves the kernel's contract ("pure, no I/O, one method in, one score out")
|
|
10
|
-
* legible instead of half-buried under a tree traversal.
|
|
11
|
-
*/
|
|
1
|
+
/** Order-independent identity for the methods of an escomplex report. */
|
|
12
2
|
|
|
13
3
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* The `N` is a per-module counter incremented during the AST walk, so it
|
|
18
|
-
* numbers a function by its *position among its anonymous siblings* rather
|
|
19
|
-
* than by anything about the function itself. Inserting or deleting one
|
|
20
|
-
* anonymous function renumbers every later one in the file — and 34.6% of this
|
|
21
|
-
* repository's CRAP rows were keyed on exactly that. See
|
|
22
|
-
* `deriveMethodIdentities` for what replaces it.
|
|
4
|
+
* escomplex's label for an unnamed function: a file-wide positional counter,
|
|
5
|
+
* so one insertion renumbers every later anonymous function.
|
|
23
6
|
*/
|
|
24
7
|
const ESCOMPLEX_ANON_LABEL_RE = /^<anon method-\d+>$/;
|
|
25
8
|
|
|
26
9
|
/**
|
|
27
|
-
* True for a
|
|
28
|
-
* name the source actually carries — either this module's `<anon …>` identity
|
|
29
|
-
* or escomplex's superseded ordinal label.
|
|
10
|
+
* True for a derived anonymous identity (ours or escomplex's).
|
|
30
11
|
*
|
|
31
12
|
* @param {unknown} method
|
|
32
13
|
* @returns {boolean}
|
|
@@ -36,11 +17,8 @@ export function isAnonymousMethodLabel(method) {
|
|
|
36
17
|
}
|
|
37
18
|
|
|
38
19
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* tree, so it collapses to a zero-width span rather than being dropped: an
|
|
42
|
-
* identity that varies with how the parser failed would be worse than one that
|
|
43
|
-
* is merely coarse.
|
|
20
|
+
* A missing bound collapses to a zero-width span, never a drop, so the
|
|
21
|
+
* method keeps a deterministic place in the scope tree.
|
|
44
22
|
*
|
|
45
23
|
* @param {{lineStart?: unknown, lineEnd?: unknown}} m
|
|
46
24
|
* @returns {{lineStart: number, lineEnd: number}}
|
|
@@ -52,53 +30,16 @@ function spanOf(m) {
|
|
|
52
30
|
}
|
|
53
31
|
|
|
54
32
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* **An anonymous method is identified by where it sits, not by when it was
|
|
62
|
-
* counted.** The identity is `<anon {scope path}>`, where the path is the
|
|
63
|
-
* chain of enclosing methods from the module down to the method itself. Each
|
|
64
|
-
* link contributes a name if it has one, otherwise its parameter list plus an
|
|
65
|
-
* ordinal among the siblings that share *that exact parent and that exact
|
|
66
|
-
* parameter list*:
|
|
67
|
-
*
|
|
68
|
-
* ```text
|
|
69
|
-
* <anon (p)#0> module-scope, first (p) arrow
|
|
70
|
-
* <anon buildDefaultCrapScorer/(files,opts)#0> inside a named function
|
|
71
|
-
* <anon buildDefaultCrapScorer/(files,opts)#0/(r)#0> inside that one
|
|
72
|
-
* ```
|
|
73
|
-
*
|
|
74
|
-
* **Why the parameter list and not the body.** The identity has to survive an
|
|
75
|
-
* edit *to* the method — a method that gains a branch must still be recognised
|
|
76
|
-
* as the same method, or a genuine complexity regression would read as a brand
|
|
77
|
-
* new function and score against the new-method ceiling instead of its own
|
|
78
|
-
* baseline. That rules out anything derived from the body: a source or
|
|
79
|
-
* normalized-AST hash re-keys the row on the very edit the gate exists to
|
|
80
|
-
* catch. A parameter list is stable across the edits CRAP measures, and it
|
|
81
|
-
* partitions same-scope siblings finely enough that the residual ordinal is
|
|
82
|
-
* almost always `#0`.
|
|
83
|
-
*
|
|
84
|
-
* **The residual.** Within one parent *and* one parameter list, siblings are
|
|
85
|
-
* still told apart by source order, so inserting a same-signature sibling
|
|
86
|
-
* *before* an existing one still shifts it. That residual is irreducible:
|
|
87
|
-
* anything that distinguishes two same-scope, same-signature functions has to
|
|
88
|
-
* read their bodies, and reading their bodies re-keys them on every edit. The
|
|
89
|
-
* blast radius drops from "every anonymous function in the file" to "the
|
|
90
|
-
* same-signature siblings of one scope".
|
|
91
|
-
*
|
|
92
|
-
* Emission order is load-bearing and guaranteed: escomplex walks the AST
|
|
93
|
-
* pre-order, so a method's ancestors are always emitted before it. That lets a
|
|
94
|
-
* single forward pass with an open-ancestor stack resolve every parent in
|
|
95
|
-
* O(n), and it makes the innermost enclosing method the most recent one still
|
|
96
|
-
* open.
|
|
33
|
+
* Named methods keep their name. An anonymous one becomes `<anon {scope
|
|
34
|
+
* path}>`, e.g. `<anon build/(files,opts)#0/(r)#0>`: each enclosing link is a
|
|
35
|
+
* name, or a parameter list plus an ordinal among siblings with the same
|
|
36
|
+
* parent and parameter list. Never derived from the body — that would re-key
|
|
37
|
+
* a method on the very edit the gate must catch. Relies on escomplex's
|
|
38
|
+
* pre-order emission (ancestors first) for a single-pass ancestor stack.
|
|
97
39
|
*
|
|
98
40
|
* @param {Array<object>} methods `report.methods` from escomplex.
|
|
99
|
-
* @returns {Array<{method: string, anonymous: boolean}>}
|
|
100
|
-
*
|
|
101
|
-
* The scope path itself stays internal — only the identity leaves.
|
|
41
|
+
* @returns {Array<{method: string, anonymous: boolean}>} Index-aligned with
|
|
42
|
+
* `methods`.
|
|
102
43
|
*/
|
|
103
44
|
export function deriveMethodIdentities(methods) {
|
|
104
45
|
const identities = [];
|
|
@@ -109,7 +50,6 @@ export function deriveMethodIdentities(methods) {
|
|
|
109
50
|
|
|
110
51
|
for (const m of methods ?? []) {
|
|
111
52
|
const { lineStart, lineEnd } = spanOf(m);
|
|
112
|
-
// Close every ancestor whose span has ended before this method begins.
|
|
113
53
|
while (
|
|
114
54
|
openAncestors.length > 0 &&
|
|
115
55
|
openAncestors[openAncestors.length - 1].lineEnd < lineStart
|
|
@@ -127,10 +67,8 @@ export function deriveMethodIdentities(methods) {
|
|
|
127
67
|
if (name === '' || ESCOMPLEX_ANON_LABEL_RE.test(name)) {
|
|
128
68
|
const params = Array.isArray(m?.paramNames) ? m.paramNames : [];
|
|
129
69
|
const signature = `(${params.join(',')})`;
|
|
130
|
-
// NUL
|
|
131
|
-
//
|
|
132
|
-
// parameter name and silently merge two distinct buckets. Spelled as an
|
|
133
|
-
// escape: a literal NUL byte would make this file binary to git and grep.
|
|
70
|
+
// NUL can never appear in a scope path; keep it an escape (a raw NUL
|
|
71
|
+
// makes the file binary to git).
|
|
134
72
|
const bucket = `${parentPath}\u0000${signature}`;
|
|
135
73
|
const ordinal = ordinals.get(bucket) ?? 0;
|
|
136
74
|
ordinals.set(bucket, ordinal + 1);
|