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,43 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Every other module (label-taxonomy, single-story-close.js,
|
|
5
|
-
* stories-wave-tick.js, etc.) should import from here rather than using string literals. Renames
|
|
6
|
-
* land in one place.
|
|
2
|
+
* Single source of truth for GitHub label names — import these rather than
|
|
3
|
+
* using string literals.
|
|
7
4
|
*/
|
|
8
5
|
|
|
9
6
|
export const AGENT_LABELS = {
|
|
10
7
|
REVIEW_SPEC: 'agent::review-spec',
|
|
11
8
|
READY: 'agent::ready',
|
|
12
9
|
EXECUTING: 'agent::executing',
|
|
13
|
-
//
|
|
14
|
-
// flips to `agent::closing` after preflight validation succeeds and
|
|
15
|
-
// the Story PR is opened against `main`. It flips to
|
|
16
|
-
// `agent::done` only after the close pipeline confirms the PR merge
|
|
17
|
-
// landed; if the close is killed mid-flight, the Story remains at
|
|
18
|
-
// `agent::closing` so `/mandrel-deliver` can pick up at the
|
|
19
|
-
// post-merge phase rather than re-running preflight. The label is the
|
|
20
|
-
// distinguishing signal between "hung close" and "finished work".
|
|
10
|
+
// PR open, merge unconfirmed; a killed close stays here so deliver resumes.
|
|
21
11
|
CLOSING: 'agent::closing',
|
|
22
12
|
DONE: 'agent::done',
|
|
23
13
|
BLOCKED: 'agent::blocked',
|
|
24
14
|
};
|
|
25
15
|
|
|
26
|
-
/**
|
|
27
|
-
* Allowed state-machine transitions across `agent::*` labels.
|
|
28
|
-
*
|
|
29
|
-
* The validator is permissive in the directions that pre-Story #2144
|
|
30
|
-
* lifecycles relied on (e.g. `executing → done` for Tasks, which never
|
|
31
|
-
* route through the closing chokepoint) and restrictive on the post-
|
|
32
|
-
* `closing` exits: once a ticket is at `agent::closing` it may only
|
|
33
|
-
* advance to `done` (merge landed) or fall back to `blocked` (close
|
|
34
|
-
* failed and the operator must intervene).
|
|
35
|
-
*
|
|
36
|
-
* Each key is a source label; each value is the set of permitted target
|
|
37
|
-
* labels reachable in a single transition. Transitions absent from this
|
|
38
|
-
* map MUST be treated as invalid by the validator. Self-transitions
|
|
39
|
-
* (e.g. `executing → executing`) are not permitted.
|
|
40
|
-
*/
|
|
16
|
+
/** Absent transitions (and self-transitions) are invalid. */
|
|
41
17
|
export const VALID_TRANSITIONS = {
|
|
42
18
|
'agent::review-spec': ['agent::ready', 'agent::blocked'],
|
|
43
19
|
'agent::ready': ['agent::executing', 'agent::blocked'],
|
|
@@ -49,18 +25,13 @@ export const VALID_TRANSITIONS = {
|
|
|
49
25
|
'agent::closing',
|
|
50
26
|
'agent::done',
|
|
51
27
|
],
|
|
52
|
-
// Terminal
|
|
53
|
-
//
|
|
54
|
-
// is not modelled as a transition because the from-state at re-open
|
|
55
|
-
// is `null`, not `agent::done`.)
|
|
28
|
+
// Terminal. An operator re-open removes the label, so its from-state is
|
|
29
|
+
// `null`, not `done`.
|
|
56
30
|
'agent::done': [],
|
|
57
31
|
};
|
|
58
32
|
|
|
59
33
|
/**
|
|
60
|
-
*
|
|
61
|
-
* by {@link VALID_TRANSITIONS}. A `null` / `undefined` `fromState` is
|
|
62
|
-
* treated as the initial-entry edge and permits any state — the writer
|
|
63
|
-
* is establishing a state where there was none.
|
|
34
|
+
* A `null` / `undefined` `fromState` is initial entry and permits any state.
|
|
64
35
|
*
|
|
65
36
|
* @param {string|null|undefined} fromState
|
|
66
37
|
* @param {string} toState
|
|
@@ -75,21 +46,8 @@ export function isValidTransition(fromState, toState) {
|
|
|
75
46
|
}
|
|
76
47
|
|
|
77
48
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* `STORY` is the only type carrying an execution payload — it is what
|
|
81
|
-
* `/mandrel-deliver` branches, implements and lands.
|
|
82
|
-
*
|
|
83
|
-
* `EPIC` (Story #5139) is a **pure container**: a grouping ticket that holds
|
|
84
|
-
* a `## Goal` paragraph and a child checklist and nothing else. It is never
|
|
85
|
-
* branched, never implemented, and never carries an `agent::*` label — that
|
|
86
|
-
* absence is what keeps it out of the bare `/mandrel-deliver` ready list and
|
|
87
|
-
* outside `lint-issue-body.js`, which is `type::story`-scoped.
|
|
88
|
-
*
|
|
89
|
-
* This is deliberately NOT a revival of the v1 Epic tier. Linkage runs
|
|
90
|
-
* parent→child only (the Epic body's checklist plus native sub-issue edges),
|
|
91
|
-
* so Story bodies stay untouched and the `Epic: #N` footer stays retired and
|
|
92
|
-
* refused. See ADR `20260905-container-epic` in `docs/decisions.md`.
|
|
49
|
+
* `EPIC` is a pure container that never carries `agent::*`, keeping it out
|
|
50
|
+
* of the ready list; linkage is parent→child only.
|
|
93
51
|
*/
|
|
94
52
|
export const TYPE_LABELS = {
|
|
95
53
|
STORY: 'type::story',
|
|
@@ -100,89 +58,36 @@ export const STATUS_LABELS = {
|
|
|
100
58
|
BLOCKED: 'status::blocked',
|
|
101
59
|
};
|
|
102
60
|
|
|
103
|
-
/**
|
|
104
|
-
* Acceptance-axis labels for opt-out signalling on Epics that
|
|
105
|
-
* intentionally have no acceptance-table coverage. (Story #4324 retired
|
|
106
|
-
* the `context::tech-spec` / `context::acceptance-spec` label classes —
|
|
107
|
-
* planning content now lives as managed sections of the Epic body. This
|
|
108
|
-
* waiver survives with unchanged meaning: it waives the Epic body's
|
|
109
|
-
* `## Acceptance Table` section instead of a ticket.)
|
|
110
|
-
*/
|
|
61
|
+
/** Waives the Epic body's `## Acceptance Table` section. */
|
|
111
62
|
export const ACCEPTANCE_LABELS = {
|
|
112
63
|
N_A: 'acceptance::n-a',
|
|
113
64
|
};
|
|
114
65
|
|
|
115
66
|
export const ACCEPTANCE_NA = ACCEPTANCE_LABELS.N_A;
|
|
116
67
|
|
|
117
|
-
/**
|
|
118
|
-
* Meta-axis labels for retrospective signal routing (Epic #2547 — feedback
|
|
119
|
-
* loop). `meta::framework-gap` is applied to issues that surface a defect or
|
|
120
|
-
* missing capability in the framework itself; `meta::consumer-improvement`
|
|
121
|
-
* is applied to issues that surface improvements to a consumer project
|
|
122
|
-
* (workflow tweaks, ergonomic asks, doc polish); `meta::platform-gap` is
|
|
123
|
-
* applied to issues owned by neither — a shared base config, a runner fleet,
|
|
124
|
-
* a cross-repo toolchain. The three mirror the ownership buckets in
|
|
125
|
-
* `lib/github/framework-repo.js`, so a routed filing's label and its
|
|
126
|
-
* destination repository cannot disagree. The `/mandrel-plan` Phase 0
|
|
127
|
-
* fetcher (see `lib/feedback-loop/prior-feedback-fetcher.js`) reads open
|
|
128
|
-
* issues carrying either label and surfaces them to the planner so retro
|
|
129
|
-
* signals are routed into durable substrates rather than lost in chat.
|
|
130
|
-
*/
|
|
68
|
+
/** Mirror the ownership buckets in `lib/github/framework-repo.js`. */
|
|
131
69
|
export const META_LABELS = {
|
|
132
70
|
FRAMEWORK_GAP: 'meta::framework-gap',
|
|
133
71
|
CONSUMER_IMPROVEMENT: 'meta::consumer-improvement',
|
|
134
72
|
PLATFORM_GAP: 'meta::platform-gap',
|
|
135
73
|
};
|
|
136
74
|
|
|
137
|
-
/**
|
|
138
|
-
* Risk-axis labels. Planning/audit metadata only — `risk::high` carries no
|
|
139
|
-
* runtime behaviour (the single runtime pause point is `agent::blocked`, see
|
|
140
|
-
* `.agents/instructions.md` § 1.J); it marks a ticket a human should look at
|
|
141
|
-
* first. Applied by the audit filer to a Story whose merge contains a Critical
|
|
142
|
-
* finding.
|
|
143
|
-
*
|
|
144
|
-
* Named here because it was a bare `'risk::high'` string literal in
|
|
145
|
-
* `audit-to-stories/build-story-body.js` and defined by no taxonomy at all —
|
|
146
|
-
* neither `LABEL_TAXONOMY` nor the audit bootstrap created it, so the audit
|
|
147
|
-
* filer generated a label the repo did not have (Story #4877).
|
|
148
|
-
*/
|
|
75
|
+
/** Metadata only — the runtime pause is `agent::blocked`. */
|
|
149
76
|
export const RISK_LABELS = {
|
|
150
77
|
HIGH: 'risk::high',
|
|
151
78
|
};
|
|
152
79
|
|
|
153
|
-
/**
|
|
154
|
-
* Planning-axis labels (Epic #2880 F7). Currently scoped to the
|
|
155
|
-
* `planning::healthcheck-waived` operator-applied waiver — a historical
|
|
156
|
-
* escape hatch for the retired post-plan readiness healthcheck. The
|
|
157
|
-
* label remains in the taxonomy for tickets that still carry it; the
|
|
158
|
-
* healthcheck CLI itself was deleted in the v2 epic-scripts sweep.
|
|
159
|
-
*
|
|
160
|
-
* Future planning-axis waivers (one per failing exit condition) extend
|
|
161
|
-
* this enum so consumers can reference them by symbol.
|
|
162
|
-
*/
|
|
80
|
+
/** Legacy waiver for the retired post-plan healthcheck; kept for old tickets. */
|
|
163
81
|
export const PLANNING_LABELS = {
|
|
164
82
|
HEALTHCHECK_WAIVED: 'planning::healthcheck-waived',
|
|
165
83
|
};
|
|
166
84
|
|
|
167
|
-
/**
|
|
168
|
-
* Convenience named export so callers can reach the constant without
|
|
169
|
-
* indexing into PLANNING_LABELS — mirrors the ergonomics used by
|
|
170
|
-
* ACCEPTANCE_NA. The literal value is
|
|
171
|
-
* duplicated here (rather than aliased through PLANNING_LABELS) so a
|
|
172
|
-
* grep for `PLANNING_HEALTHCHECK_WAIVED.*planning::healthcheck-waived`
|
|
173
|
-
* matches a single line — see Story #2921 Task #2933 AC #1.
|
|
174
|
-
*/
|
|
85
|
+
/** Literal duplicated on purpose so a grep for name and value hits one line. */
|
|
175
86
|
export const PLANNING_HEALTHCHECK_WAIVED = 'planning::healthcheck-waived';
|
|
176
87
|
|
|
177
88
|
/**
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
* `META` and `FRICTION` are not in `LABEL_TAXONOMY`: the bootstrap runs once
|
|
182
|
-
* at repo setup, but `friction::<category>` names are minted from live
|
|
183
|
-
* telemetry and cannot be enumerated ahead of time. The graduator mints both
|
|
184
|
-
* axes on demand instead — Story #4828, where their absence made every
|
|
185
|
-
* `gh issue create` fail and the whole feedback loop file zero.
|
|
89
|
+
* `META`/`FRICTION` labels are minted on demand by the graduator (friction
|
|
90
|
+
* names come from live telemetry), not by the bootstrap taxonomy.
|
|
186
91
|
*/
|
|
187
92
|
export const LABEL_COLORS = {
|
|
188
93
|
TYPE: '#7057FF',
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* All label names are sourced from `label-constants.js` so renames only need
|
|
6
|
-
* to happen in one place. Colors come from `LABEL_COLORS` in the same module.
|
|
7
|
-
*
|
|
8
|
-
* v2 deleted the behavioral persona concept (`.agents/personas/` +
|
|
9
|
-
* `persona::*` labels). Role framing for spawns lives in `.agents/agents/`
|
|
10
|
-
* via `delivery.routing.roleScopedAgents`; QA auth identities live in
|
|
11
|
-
* `qa.personas` — neither is a GitHub label axis.
|
|
2
|
+
* GitHub label and project-field definitions the bootstrap applies
|
|
3
|
+
* idempotently. Names and colors come from `label-constants.js`.
|
|
12
4
|
*/
|
|
13
5
|
|
|
14
6
|
import {
|
|
@@ -21,11 +13,6 @@ import {
|
|
|
21
13
|
} from './label-constants.js';
|
|
22
14
|
|
|
23
15
|
/**
|
|
24
|
-
* The ticket-type axis. Both rows share one colour, so they are derived from
|
|
25
|
-
* `[name, description]` pairs rather than restated as full literals — Story
|
|
26
|
-
* #5139 added `type::epic` here, and the derived form absorbs it without
|
|
27
|
-
* growing the file's structural weight.
|
|
28
|
-
*
|
|
29
16
|
* @type {Array<{ name: string, color: string, description: string }>}
|
|
30
17
|
*/
|
|
31
18
|
const TYPE_LABEL_ROWS = [
|
|
@@ -39,10 +26,8 @@ const TYPE_LABEL_ROWS = [
|
|
|
39
26
|
|
|
40
27
|
/** @type {Array<{ name: string, color: string, description: string }>} */
|
|
41
28
|
export const LABEL_TAXONOMY = [
|
|
42
|
-
// Type
|
|
43
29
|
...TYPE_LABEL_ROWS,
|
|
44
30
|
|
|
45
|
-
// Agent State
|
|
46
31
|
{
|
|
47
32
|
name: AGENT_LABELS.REVIEW_SPEC,
|
|
48
33
|
color: LABEL_COLORS.AGENT,
|
|
@@ -71,25 +56,18 @@ export const LABEL_TAXONOMY = [
|
|
|
71
56
|
description: 'Agent work completed',
|
|
72
57
|
},
|
|
73
58
|
|
|
74
|
-
// Status
|
|
75
59
|
{
|
|
76
60
|
name: STATUS_LABELS.BLOCKED,
|
|
77
61
|
color: LABEL_COLORS.STATUS_BLOCKED,
|
|
78
62
|
description: 'Blocked by a dependency',
|
|
79
63
|
},
|
|
80
64
|
|
|
81
|
-
// Acceptance axis — explicit opt-out signal for Epics that
|
|
82
|
-
// intentionally have no acceptance-table coverage (waives the Epic
|
|
83
|
-
// body's ## Acceptance Table section — Story #4324).
|
|
84
65
|
{
|
|
85
66
|
name: ACCEPTANCE_LABELS.N_A,
|
|
86
67
|
color: LABEL_COLORS.ACCEPTANCE,
|
|
87
68
|
description: 'No acceptance specification required',
|
|
88
69
|
},
|
|
89
70
|
|
|
90
|
-
// Planning axis — operator-applied waivers for the planning → delivery
|
|
91
|
-
// handoff gates. `healthcheck-waived` remains for tickets that still
|
|
92
|
-
// carry the historical label; the healthcheck CLI was retired.
|
|
93
71
|
{
|
|
94
72
|
name: PLANNING_LABELS.HEALTHCHECK_WAIVED,
|
|
95
73
|
color: LABEL_COLORS.PLANNING,
|
|
@@ -108,12 +86,8 @@ export const PROJECT_FIELD_DEFS = [
|
|
|
108
86
|
];
|
|
109
87
|
|
|
110
88
|
/**
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
* in the `agent::*` labels and `ColumnSync` collapses each label onto one of
|
|
114
|
-
* these three buckets via `LABEL_TO_COLUMN` in
|
|
115
|
-
* `lib/orchestration/column-sync.js`. Order matches the order options appear
|
|
116
|
-
* on a fresh GitHub board.
|
|
89
|
+
* The stock Projects v2 options, in board order; `column-sync.js` collapses
|
|
90
|
+
* each `agent::*` label onto one.
|
|
117
91
|
*
|
|
118
92
|
* @type {string[]}
|
|
119
93
|
*/
|
|
@@ -3,45 +3,14 @@ import { install as installAstCompat } from './escomplex-ast-compat.js';
|
|
|
3
3
|
import { analyzeModule } from './escomplex-kernel.js';
|
|
4
4
|
import { transpileIfNeeded } from './transpile.js';
|
|
5
5
|
|
|
6
|
-
/**
|
|
7
|
-
* Calculates the maintainability score of a JavaScript source file or string.
|
|
8
|
-
* Uses `typhonjs-escomplex` internally, which provides a maintainability index
|
|
9
|
-
* based on the Halstead Volume, Cyclomatic Complexity, and Lines of Code.
|
|
10
|
-
*
|
|
11
|
-
* The kernel's code generator predates the Babel AST its own parser emits, so
|
|
12
|
-
* ordinary modern syntax (`?.`, `await` in a loop head, a regex in a loop
|
|
13
|
-
* head, object spread in a default parameter) aborts the whole analysis.
|
|
14
|
-
* `escomplex-ast-compat` repairs that before any scoring runs — see that
|
|
15
|
-
* module for the defect and the upstream status.
|
|
16
|
-
*/
|
|
17
6
|
installAstCompat();
|
|
18
7
|
|
|
19
|
-
/**
|
|
20
|
-
* Sentinel score for a file the kernel cannot analyse.
|
|
21
|
-
*
|
|
22
|
-
* A real maintainability index never reaches 0 for runnable code — the
|
|
23
|
-
* escomplex floor is ~10–20 — so 0 has long been used as an out-of-band
|
|
24
|
-
* "unscorable" marker. That overload is the bug: consumers drop `mi === 0`
|
|
25
|
-
* rows, so an unscorable file silently vanishes from the baseline instead of
|
|
26
|
-
* being reported, and no amount of re-seeding can ever give it a row.
|
|
27
|
-
*
|
|
28
|
-
* Deliberately module-private. The numeric return is kept for backwards
|
|
29
|
-
* compatibility, but the *value* is not something a caller should branch on —
|
|
30
|
-
* that is the overload this change exists to stop propagating. Callers that
|
|
31
|
-
* need to tell "unscorable" from "genuinely terrible" read the `unscorable`
|
|
32
|
-
* flag from {@link scoreSource} / {@link scoreFile}.
|
|
33
|
-
*/
|
|
8
|
+
/** Branch on the `unscorable` flag, never on this value. */
|
|
34
9
|
const UNSCORABLE = 0;
|
|
35
10
|
|
|
36
11
|
/**
|
|
37
|
-
*
|
|
38
|
-
* "this scored badly".
|
|
39
|
-
*
|
|
40
|
-
* @param {string} sourceCode The JavaScript source code.
|
|
12
|
+
* @param {string} sourceCode
|
|
41
13
|
* @returns {{ score: number, unscorable: boolean, reason: string|null }}
|
|
42
|
-
* `score` is {@link UNSCORABLE} when `unscorable` is true; `reason` carries
|
|
43
|
-
* the kernel's own error message so a consumer can report *why* rather than
|
|
44
|
-
* just omitting the file.
|
|
45
14
|
*/
|
|
46
15
|
export function scoreSource(sourceCode) {
|
|
47
16
|
try {
|
|
@@ -65,42 +34,28 @@ function unscorable(reason) {
|
|
|
65
34
|
}
|
|
66
35
|
|
|
67
36
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* Returns 0 for unscorable input, which is ambiguous by construction — see
|
|
71
|
-
* {@link UNSCORABLE}. Prefer {@link scoreSource} in new code.
|
|
37
|
+
* Ambiguous 0 when unscorable — prefer {@link scoreSource}.
|
|
72
38
|
*
|
|
73
|
-
* @param {string} sourceCode
|
|
74
|
-
* @returns {number}
|
|
39
|
+
* @param {string} sourceCode
|
|
40
|
+
* @returns {number}
|
|
75
41
|
*/
|
|
76
42
|
export function calculateForSource(sourceCode) {
|
|
77
43
|
return scoreSource(sourceCode).score;
|
|
78
44
|
}
|
|
79
45
|
|
|
80
46
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* the JS-only escomplex kernel; the score for a TS file is identical to
|
|
84
|
-
* the score the same logic would produce as plain JS, because TS type
|
|
85
|
-
* annotations introduce no control flow.
|
|
86
|
-
*
|
|
87
|
-
* @param {string} filePath Path to the JS/TS source file.
|
|
88
|
-
* @returns {number} Maintainability index, or 0 when the source cannot
|
|
89
|
-
* be parsed (escomplex parse error or TS transpile failure).
|
|
47
|
+
* @param {string} filePath
|
|
48
|
+
* @returns {number}
|
|
90
49
|
*/
|
|
91
50
|
export function calculateForFile(filePath) {
|
|
92
51
|
return scoreFile(filePath).score;
|
|
93
52
|
}
|
|
94
53
|
|
|
95
54
|
/**
|
|
96
|
-
*
|
|
55
|
+
* TS is transpiled first. Transpile and kernel failures need different
|
|
56
|
+
* fixes, so they are reported separately.
|
|
97
57
|
*
|
|
98
|
-
*
|
|
99
|
-
* because they need different fixes: a transpile failure is usually the
|
|
100
|
-
* consumer's own syntax or `tsconfig`, whereas a kernel failure is the
|
|
101
|
-
* upstream generator gap described in `escomplex-ast-compat.js`.
|
|
102
|
-
*
|
|
103
|
-
* @param {string} filePath Path to the JS/TS source file.
|
|
58
|
+
* @param {string} filePath
|
|
104
59
|
* @returns {{ score: number, unscorable: boolean, reason: string|null }}
|
|
105
60
|
*/
|
|
106
61
|
export function scoreFile(filePath) {
|
|
@@ -120,15 +75,7 @@ export function scoreFile(filePath) {
|
|
|
120
75
|
}
|
|
121
76
|
|
|
122
77
|
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* The module-level index from escomplex is heavily penalised by Halstead
|
|
126
|
-
* volume, which means well-structured but long files (many small helpers)
|
|
127
|
-
* score as "critical" even when no single function is complex. Consumers
|
|
128
|
-
* that need to tier findings by real complexity should use `worstMethod`
|
|
129
|
-
* (the lowest per-method maintainability) and fall back to `moduleScore`
|
|
130
|
-
* for files that contain no methods (scripts that are purely top-level
|
|
131
|
-
* statements).
|
|
78
|
+
* The module index is Halstead-volume dominated, so tier by `worstMethod`.
|
|
132
79
|
*
|
|
133
80
|
* @param {string} sourceCode
|
|
134
81
|
* @returns {{
|
|
@@ -176,9 +123,6 @@ export function calculateReport(sourceCode) {
|
|
|
176
123
|
}
|
|
177
124
|
|
|
178
125
|
/**
|
|
179
|
-
* Convenience wrapper that reads a file from disk and produces a report.
|
|
180
|
-
* TypeScript and TSX sources are transpiled in memory before scoring.
|
|
181
|
-
*
|
|
182
126
|
* @param {string} filePath
|
|
183
127
|
* @returns {ReturnType<typeof calculateReport>}
|
|
184
128
|
*/
|
|
@@ -205,19 +149,7 @@ export function calculateReportForFile(filePath) {
|
|
|
205
149
|
}
|
|
206
150
|
|
|
207
151
|
/**
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
* Tiering rules (chosen after the v5.11 calibration issue where clean
|
|
211
|
-
* multi-hundred-line scripts scored 0 at the module level):
|
|
212
|
-
*
|
|
213
|
-
* - 🔴 critical — a real hotspot: some method scores < 20, OR the file
|
|
214
|
-
* contains no methods and the module scores < 40.
|
|
215
|
-
* - 🟡 warning — size- or volume-driven signal: worst method < 50
|
|
216
|
-
* OR module score < 65 (but no critical method).
|
|
217
|
-
* - 🟢 healthy — every method scores ≥ 50 and module ≥ 65.
|
|
218
|
-
*
|
|
219
|
-
* File-size-driven module-score drops land in the warning tier, not the
|
|
220
|
-
* critical tier — they should nudge the reviewer, not block the sprint.
|
|
152
|
+
* Size-driven module drops only reach `warning`; `critical` is a real hotspot.
|
|
221
153
|
*
|
|
222
154
|
* @param {ReturnType<typeof calculateReport>} report
|
|
223
155
|
* @returns {'critical' | 'warning' | 'healthy' | 'parse-error'}
|
|
@@ -1,24 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* maintainability-unscorable.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* A file the kernel throws on has no maintainability index, so it gets no
|
|
6
|
-
* baseline row — a phantom `mi: 0` would poison the `min`/p50 rollup and let
|
|
7
|
-
* real regressions hide behind it. Dropping the row is therefore correct; doing
|
|
8
|
-
* it *silently* is not. Without a report, an unscorable file is
|
|
9
|
-
* indistinguishable from a file nobody added yet: the scorer emits nothing, the
|
|
10
|
-
* scope gate sees an absence it cannot explain, and re-seeding the baseline can
|
|
11
|
-
* never produce the missing row no matter how many times it runs.
|
|
12
|
-
*
|
|
13
|
-
* Kept separate from `maintainability-utils.js` so the scoring path stays about
|
|
14
|
-
* scoring and this stays about explaining.
|
|
2
|
+
* maintainability-unscorable.js — report files the MI kernel cannot analyse.
|
|
3
|
+
* They get no baseline row (a phantom `mi: 0` would poison the rollup), but
|
|
4
|
+
* dropping them silently makes them indistinguishable from unseeded files.
|
|
15
5
|
*/
|
|
16
6
|
|
|
17
7
|
import { Logger } from './Logger.js';
|
|
18
8
|
|
|
19
9
|
/**
|
|
20
|
-
* Report every unscorable file, then summarise.
|
|
21
|
-
*
|
|
22
10
|
* @param {Array<{ relPath: string, unscorable?: boolean, reason?: string|null }>} perFile
|
|
23
11
|
* @returns {number} how many files were unscorable, for the caller's own use.
|
|
24
12
|
*/
|
|
@@ -41,16 +29,8 @@ export function reportUnscorable(perFile) {
|
|
|
41
29
|
}
|
|
42
30
|
|
|
43
31
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* An unscorable entry carries the sentinel score, not an index — letting it
|
|
48
|
-
* through would write an `mi: 0` phantom and drag the rollup floor down with it
|
|
49
|
-
* (Story #2467). `score === null` is the separate I/O-failure case.
|
|
50
|
-
*
|
|
51
|
-
* Tests for a *number* rather than `score !== null`, because the latter passes
|
|
52
|
-
* anything absent: `undefined !== null` is true, so a missing entry or one with
|
|
53
|
-
* no `score` key at all would have been treated as scored.
|
|
32
|
+
* Tests for a number, not `score !== null` (which lets `undefined` through);
|
|
33
|
+
* unscorable entries carry a sentinel, not an index.
|
|
54
34
|
*
|
|
55
35
|
* @param {{ score?: number|null, unscorable?: boolean }} entry
|
|
56
36
|
* @returns {boolean}
|
|
@@ -13,8 +13,6 @@ const MAINTAINABILITY_WORKER_URL = new URL(
|
|
|
13
13
|
import.meta.url,
|
|
14
14
|
);
|
|
15
15
|
|
|
16
|
-
// Pool-vs-serial cutover — single-sourced in cpu-pool.js (see the
|
|
17
|
-
// POOL_SERIAL_THRESHOLD docstring for the tuning rationale).
|
|
18
16
|
const SERIAL_THRESHOLD = POOL_SERIAL_THRESHOLD;
|
|
19
17
|
|
|
20
18
|
const IGNORED_DIRS = new Set([
|
|
@@ -28,24 +26,9 @@ const IGNORED_DIRS = new Set([
|
|
|
28
26
|
]);
|
|
29
27
|
|
|
30
28
|
/**
|
|
31
|
-
* Compiled-
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* scan was paying O(files × globs) glob *compilations* to answer O(files ×
|
|
35
|
-
* globs) glob *matches* — 12–17 ms over the 619-file tree against 0.5 ms
|
|
36
|
-
* once the patterns are compiled (Story #5109). The number of distinct
|
|
37
|
-
* pattern lists in a process is tiny (one per gate), and each list is
|
|
38
|
-
* config-derived and immutable, so an unbounded `Map` keyed on the joined
|
|
39
|
-
* patterns is bounded in practice.
|
|
40
|
-
*
|
|
41
|
-
* Each entry also memoises the per-path verdict. The baseline gates ask the
|
|
42
|
-
* same question about the same path many times over — `crap.json` carries
|
|
43
|
-
* thousands of method rows spread over a few hundred files, and the evaluate
|
|
44
|
-
* phase filters every row — so the second and later asks about a path cost a
|
|
45
|
-
* `Map` lookup instead of a globstar walk. Both caches are keyed on
|
|
46
|
-
* config-derived, immutable inputs, and both are bounded by the tree the
|
|
47
|
-
* process is scanning.
|
|
48
|
-
*
|
|
29
|
+
* Compiled matchers plus a per-path verdict memo, keyed on the pattern list:
|
|
30
|
+
* functional `minimatch()` recompiles per call, and the gates ask about the
|
|
31
|
+
* same path once per CRAP row. Inputs are immutable config, so it is bounded.
|
|
49
32
|
* `\u0000` is the join separator because it cannot occur in a glob, so two
|
|
50
33
|
* different lists cannot collide onto one key.
|
|
51
34
|
*
|
|
@@ -54,12 +37,7 @@ const IGNORED_DIRS = new Set([
|
|
|
54
37
|
const IGNORE_MATCHER_CACHE = new Map();
|
|
55
38
|
|
|
56
39
|
/**
|
|
57
|
-
*
|
|
58
|
-
* per-path verdict memo that shares their lifetime.
|
|
59
|
-
*
|
|
60
|
-
* Non-string patterns are dropped rather than compiled — `minimatch()` would
|
|
61
|
-
* have thrown on them, and the functional call site never fed it any, so
|
|
62
|
-
* dropping preserves the observable result set.
|
|
40
|
+
* Non-string patterns are dropped rather than compiled.
|
|
63
41
|
*
|
|
64
42
|
* @param {string[]} ignoreGlobs
|
|
65
43
|
* @returns {{matchers: import('minimatch').Minimatch[], verdicts: Map<string, boolean>}}
|
|
@@ -79,22 +57,10 @@ function ignoreMatcherEntry(ignoreGlobs) {
|
|
|
79
57
|
}
|
|
80
58
|
|
|
81
59
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* in `refresh-service.js` MUST funnel through it so an `ignoreGlobs`-listed
|
|
87
|
-
* file is excluded identically in both scopes (a diff-scope refresh that
|
|
88
|
-
* skipped this check would let an ignored file poison the `rollup["*"].min`
|
|
89
|
-
* floor — see `buildDefaultMaintainabilityScorer`).
|
|
90
|
-
*
|
|
91
|
-
* Matching mirrors `scanDirectory`: the path is reduced to a canonicalised,
|
|
92
|
-
* POSIX, repo-relative form and tested against each glob with minimatch's
|
|
93
|
-
* `{ dot: true }` so dot-prefixed roots like `.agents/` match. The patterns
|
|
94
|
-
* are compiled at most once per distinct list (see `IGNORE_MATCHER_CACHE`);
|
|
95
|
-
* the matched set is identical to the functional `minimatch()` call this
|
|
96
|
-
* replaced, which is what the `gate-scan-fast-path` test pins over the real
|
|
97
|
-
* configured `ignoreGlobs`.
|
|
60
|
+
* The single ignore-glob test: the full-scope walk and the diff-scope refresh
|
|
61
|
+
* both funnel through it, or an ignored file could poison the
|
|
62
|
+
* `rollup["*"].min` floor in one scope. `{ dot: true }` lets `.agents/`
|
|
63
|
+
* match.
|
|
98
64
|
*
|
|
99
65
|
* @param {string} filePath absolute or relative path to the source file
|
|
100
66
|
* @param {string[]} ignoreGlobs minimatch patterns; empty/absent is a no-op
|
|
@@ -102,9 +68,6 @@ function ignoreMatcherEntry(ignoreGlobs) {
|
|
|
102
68
|
* @returns {boolean} true when the file matches at least one ignore glob
|
|
103
69
|
*/
|
|
104
70
|
/**
|
|
105
|
-
* Reduce an absolute-or-relative path to the canonicalised, POSIX,
|
|
106
|
-
* repo-relative form the ignore patterns are written against.
|
|
107
|
-
*
|
|
108
71
|
* @param {string} filePath
|
|
109
72
|
* @param {string} matchCwd
|
|
110
73
|
* @returns {string}
|
|
@@ -118,14 +81,7 @@ function canonicalRelPath(filePath, matchCwd) {
|
|
|
118
81
|
}
|
|
119
82
|
|
|
120
83
|
/**
|
|
121
|
-
*
|
|
122
|
-
* populating the entry's verdict memo.
|
|
123
|
-
*
|
|
124
|
-
* Split out of `isIgnoredByGlobs` rather than inlined: the memo's
|
|
125
|
-
* hit/miss test is a branch, and folding it into the caller pushed that
|
|
126
|
-
* function from cyclomatic 4 to 5 — over the per-method CRAP contract the
|
|
127
|
-
* pre-push preview enforces. The lookup belongs beside the cache it reads
|
|
128
|
-
* anyway, and the hot function keeps a flat shape.
|
|
84
|
+
* Split out to keep `isIgnoredByGlobs` under the per-method CRAP contract.
|
|
129
85
|
*
|
|
130
86
|
* @param {{matchers: import('minimatch').Minimatch[], verdicts: Map<string, boolean>}} entry
|
|
131
87
|
* @param {string} relPath Canonicalised, POSIX, repo-relative path.
|
|
@@ -149,22 +105,12 @@ export function isIgnoredByGlobs(filePath, ignoreGlobs = [], cwd) {
|
|
|
149
105
|
}
|
|
150
106
|
|
|
151
107
|
/**
|
|
152
|
-
* Recursively
|
|
153
|
-
* the
|
|
154
|
-
* walk, the coverage-freshness check and the close-validation CRAP projection
|
|
155
|
-
* cannot drift apart. Directories listed
|
|
156
|
-
* in `IGNORED_DIRS` (including `coverage` and `.next`, added in 5.29.0
|
|
157
|
-
* to skip vitest's istanbul HTML scaffolding and Next.js build output)
|
|
158
|
-
* are skipped.
|
|
108
|
+
* Recursively collect scorable source files, using the shared extension set
|
|
109
|
+
* so the walk, coverage freshness and CRAP projection cannot drift apart.
|
|
159
110
|
*
|
|
160
111
|
* @param {string} dir
|
|
161
112
|
* @param {string[]} fileList
|
|
162
113
|
* @param {{ ignoreGlobs?: string[], cwd?: string }} [opts]
|
|
163
|
-
* `ignoreGlobs` — minimatch patterns matched against the canonicalised
|
|
164
|
-
* repo-relative path of each discovered file. Files whose path matches
|
|
165
|
-
* any pattern are excluded before scoring. Absent/empty is a no-op.
|
|
166
|
-
* `cwd` — root used to compute repo-relative paths for glob matching;
|
|
167
|
-
* defaults to `process.cwd()` when omitted.
|
|
168
114
|
* @returns {string[]}
|
|
169
115
|
*/
|
|
170
116
|
export function scanDirectory(dir, fileList = [], opts = {}) {
|
|
@@ -195,35 +141,13 @@ export function scanDirectory(dir, fileList = [], opts = {}) {
|
|
|
195
141
|
}
|
|
196
142
|
|
|
197
143
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
* are recycled across files so TypeScript loads at most once per
|
|
203
|
-
* worker. The pool is bypassed for batches of fewer than
|
|
204
|
-
* `SERIAL_THRESHOLD` files because spawn overhead dominates at small
|
|
205
|
-
* sizes — the in-process path matches the pre-pool serial behaviour
|
|
206
|
-
* byte-for-byte.
|
|
207
|
-
*
|
|
208
|
-
* Output is sorted by relative file path so the returned object is
|
|
209
|
-
* insertion-order-stable regardless of which worker happened to
|
|
210
|
-
* finish first. Files that fail to read/transpile/parse are dropped
|
|
211
|
-
* from the result (matching the pre-pool log-and-continue contract);
|
|
212
|
-
* worker-side per-item failures surface as a `null` score that is
|
|
213
|
-
* filtered out before assembly.
|
|
214
|
-
*
|
|
215
|
-
* A file the kernel cannot analyse is also dropped — a phantom `mi: 0` row
|
|
216
|
-
* poisons the rollup — but it is **reported** on the way out, with the
|
|
217
|
-
* kernel's own error text, and the count is summarised at the end of the run.
|
|
218
|
-
* Silently omitting these is what let a file sit unmeasured indefinitely: the
|
|
219
|
-
* scorer emitted no row, so no amount of re-seeding could ever produce one,
|
|
220
|
-
* and nothing said so.
|
|
144
|
+
* Score files on a worker pool (serial below the cutover, where spawn cost
|
|
145
|
+
* dominates). Output is sorted by path so it is stable across worker timing.
|
|
146
|
+
* Failed and unscorable files are dropped — a phantom `mi: 0` poisons the
|
|
147
|
+
* rollup — but unscorable ones are reported, never silently omitted.
|
|
221
148
|
*
|
|
222
149
|
* @param {string[]} paths
|
|
223
|
-
* @param {{serialThreshold?: number}} [opts]
|
|
224
|
-
* pool-vs-serial cutover for this call only. Production callers omit it;
|
|
225
|
-
* the parity tests use it to drive the pooled path on a small fixture set
|
|
226
|
-
* rather than materialising 256 files to clear the cutover.
|
|
150
|
+
* @param {{serialThreshold?: number}} [opts] Test seam for the cutover.
|
|
227
151
|
* @returns {Promise<Record<string, number>>}
|
|
228
152
|
*/
|
|
229
153
|
export async function calculateAll(paths, opts = {}) {
|