mandrel 2.59.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 +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- 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 +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- 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 +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- 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 +57 -49
- 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 +7 -19
- 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 +39 -121
- 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 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- 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 +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- 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 +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- 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 -124
- 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 +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- 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 +123 -191
- 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 +22 -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 +28 -156
- 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 +121 -157
- 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 +118 -462
- 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 +37 -307
- 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 +55 -318
- 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 +16 -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 +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- 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 -91
- 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 +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- 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 +20 -82
- 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 +96 -0
- 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 +180 -273
- 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 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- 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 -135
- 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 +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- 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 +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- 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 +67 -209
- 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 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- 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 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- 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/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- 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/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- 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 +60 -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 +326 -523
- 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 +17 -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 +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- 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/schemas/model-attribution.schema.json +0 -53
- 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 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- 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/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- 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 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,35 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* their structured envelopes into a single per-file delta table
|
|
8
|
-
* contributors can read while the diff is still warm. Designed for
|
|
9
|
-
* three callers:
|
|
10
|
-
*
|
|
11
|
-
* 1. `npm run quality:preview` — interactive operator, pretty table.
|
|
12
|
-
* 2. `npm run quality:watch` — chokidar wrapper re-emits on save.
|
|
13
|
-
* 3. `.husky/pre-commit` — block the commit on threshold violations.
|
|
14
|
-
*
|
|
15
|
-
* The pre-commit hook passes `--staged` and nothing else — the index is
|
|
16
|
-
* already the exact delta the operator is about to commit, and
|
|
17
|
-
* `tests/pre-commit-hook.test.js` pins that `--changed-since` stays off it.
|
|
18
|
-
* (This docblock previously claimed the hook passed `--changed-since HEAD`,
|
|
19
|
-
* describing a wiring the hook has not used for some time; the stale prose
|
|
20
|
-
* sent at least one bug report at the wrong flag — Story #5131.)
|
|
21
|
-
*
|
|
22
|
-
* `--staged` is merge-aware: while a merge is in progress the index is read
|
|
23
|
-
* against `MERGE_HEAD` rather than `HEAD`, so a base-sync merge commit is
|
|
24
|
-
* scored for the merging branch's own work and its conflict resolutions, not
|
|
25
|
-
* for everything the base branch landed. See `resolveMergeHead` in
|
|
26
|
-
* `lib/changed-files.js`.
|
|
27
|
-
*
|
|
28
|
-
* The CLI exits 0 when both envelopes report zero violations and the script
|
|
29
|
-
* could not surface a regression. Any violation in either envelope, or any
|
|
30
|
-
* non-zero gate exit, propagates as a non-zero exit code so git/husky/CI
|
|
31
|
-
* surface the failure. The merge logic is exported as `mergeEnvelopes` for
|
|
32
|
-
* unit testing without spawning the gate scripts.
|
|
3
|
+
* quality-preview.js — per-file MI/CRAP delta preview; exits non-zero on any
|
|
4
|
+
* violation. The pre-commit hook passes only `--staged`. During a merge,
|
|
5
|
+
* `--staged` reads the index against `MERGE_HEAD` so a base-sync commit is
|
|
6
|
+
* scored for the branch's own work, not everything the base landed.
|
|
33
7
|
*/
|
|
34
8
|
|
|
35
9
|
import path from 'node:path';
|
|
@@ -40,8 +14,7 @@ import {
|
|
|
40
14
|
} from './lib/baselines/preview-gates.js';
|
|
41
15
|
import { resolveMergeHead } from './lib/changed-files.js';
|
|
42
16
|
import { respondToHelp } from './lib/cli-usage.js';
|
|
43
|
-
import {
|
|
44
|
-
import { resolveCyclomaticPolicy } from './lib/cyclomatic-ceiling.js';
|
|
17
|
+
import { CODING_GUARDRAILS } from './lib/config/quality.js';
|
|
45
18
|
|
|
46
19
|
const USAGE = {
|
|
47
20
|
invocation:
|
|
@@ -61,26 +34,12 @@ const USAGE = {
|
|
|
61
34
|
],
|
|
62
35
|
};
|
|
63
36
|
|
|
64
|
-
|
|
65
|
-
* Framework default for `delivery.quality.codingGuardrails.cyclomaticFlag`,
|
|
66
|
-
* used only when a caller drives `mergeEnvelopes` / `renderTable` without a
|
|
67
|
-
* resolved config in hand (tests, and the pure-function surface). `runCli`
|
|
68
|
-
* always passes the resolved value.
|
|
69
|
-
*/
|
|
70
|
-
const DEFAULT_CYCLOMATIC_FLAG = 8;
|
|
37
|
+
const DEFAULT_CYCLOMATIC_FLAG = CODING_GUARDRAILS.cyclomaticFlag;
|
|
71
38
|
|
|
72
39
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* **Last occurrence wins** (Story #4603). `npm run <alias> -- --changed-since <base>`
|
|
78
|
-
* appends the operator's flag *after* any flag baked into the npm script, so a
|
|
79
|
-
* first-wins scan silently discarded the operator's base and compared against
|
|
80
|
-
* the script's hardcoded one instead — reporting a false green for a branch the
|
|
81
|
-
* gate had never actually scored. Last-wins matches the convention every
|
|
82
|
-
* mainstream CLI parser follows for repeated scalar flags, and makes the
|
|
83
|
-
* npm-alias passthrough behave the way its callers already assume.
|
|
40
|
+
* `--changed-since <ref>` (bare flag → `HEAD`, absent → `null`). Last
|
|
41
|
+
* occurrence wins so `npm run <alias> -- --changed-since <base>` overrides a
|
|
42
|
+
* flag baked into the npm script.
|
|
84
43
|
*
|
|
85
44
|
* @param {string[]} argv
|
|
86
45
|
* @returns {string | null}
|
|
@@ -96,10 +55,6 @@ export function parseChangedSinceArg(argv) {
|
|
|
96
55
|
}
|
|
97
56
|
|
|
98
57
|
/**
|
|
99
|
-
* Detect `--json` (machine-readable mode). When set, the merged envelope is
|
|
100
|
-
* written to stdout as JSON instead of the human-readable table; the exit code
|
|
101
|
-
* still reflects gate health so CI runners can fail fast.
|
|
102
|
-
*
|
|
103
58
|
* @param {string[]} argv
|
|
104
59
|
* @returns {boolean}
|
|
105
60
|
*/
|
|
@@ -108,10 +63,8 @@ export function parseJsonFlag(argv) {
|
|
|
108
63
|
}
|
|
109
64
|
|
|
110
65
|
/**
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
* so only index (staged) paths are scored. When present, `--staged` takes
|
|
114
|
-
* precedence over `--changed-since`.
|
|
66
|
+
* `--staged` scores only index paths and takes precedence over
|
|
67
|
+
* `--changed-since`.
|
|
115
68
|
*
|
|
116
69
|
* @param {string[]} argv
|
|
117
70
|
* @returns {boolean}
|
|
@@ -121,9 +74,6 @@ export function parseStagedFlag(argv) {
|
|
|
121
74
|
}
|
|
122
75
|
|
|
123
76
|
/**
|
|
124
|
-
* Coerce a caller-supplied flag ceiling to a usable number, falling back to
|
|
125
|
-
* the framework default for anything non-finite.
|
|
126
|
-
*
|
|
127
77
|
* @param {unknown} value
|
|
128
78
|
* @returns {number}
|
|
129
79
|
*/
|
|
@@ -133,17 +83,11 @@ function normalizeFlag(value) {
|
|
|
133
83
|
}
|
|
134
84
|
|
|
135
85
|
/**
|
|
136
|
-
* Fold one CRAP violation into its per-file
|
|
137
|
-
*
|
|
138
|
-
* Split out of `mergeEnvelopes` (Story #4923): threading the resolved
|
|
139
|
-
* `cyclomaticFlag` through pushed that function from c=12 — exactly at the
|
|
140
|
-
* must-fix ceiling — to c=13, and the same Story starts *enforcing* that
|
|
141
|
-
* ceiling. Recording its own breach in `baselines/cyclomatic.json` would have
|
|
142
|
-
* been the first re-spend of the slack the Story reclaims.
|
|
86
|
+
* Fold one CRAP violation into its per-file row (mutates `row`).
|
|
143
87
|
*
|
|
144
88
|
* @param {{ worstCrapDelta: number, newOverCeilingMethods: number }} row
|
|
145
89
|
* @param {{ crap?: number, ceiling?: number, baseline?: number, cyclomatic?: number, kind?: string }} v
|
|
146
|
-
* @param {number} flag
|
|
90
|
+
* @param {number} flag
|
|
147
91
|
* @returns {void}
|
|
148
92
|
*/
|
|
149
93
|
function foldCrapViolation(row, v, flag) {
|
|
@@ -162,27 +106,9 @@ function foldCrapViolation(row, v, flag) {
|
|
|
162
106
|
}
|
|
163
107
|
|
|
164
108
|
/**
|
|
165
|
-
* Merge
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
* Output rows are keyed by file (forward-slash relative path) and carry:
|
|
170
|
-
* - `miDrop`: maintainability score drop from baseline (0 when unchanged or
|
|
171
|
-
* improved). Higher = worse.
|
|
172
|
-
* - `worstCrapDelta`: largest CRAP regression delta among the file's
|
|
173
|
-
* methods (max of `crap - baseline` for matched-baseline rows, `crap`
|
|
174
|
-
* for new-method rows). 0 when the file has no CRAP violations.
|
|
175
|
-
* - `newOverCeilingMethods`: count of new-method violations (kind:'new')
|
|
176
|
-
* scoring above the flag ceiling. The CRAP envelope's `cyclomatic` field
|
|
177
|
-
* is the per-method `c` reading.
|
|
178
|
-
*
|
|
179
|
-
* `cyclomaticFlag` is the resolved
|
|
180
|
-
* `delivery.quality.codingGuardrails.cyclomaticFlag` (Story #4923). It used to
|
|
181
|
-
* be the literal `8` written into this function and into the column header, so
|
|
182
|
-
* a consumer that tuned the knob saw its own value validated by the schema,
|
|
183
|
-
* defaulted by the bootstrap, resolved by `lib/config/quality.js` — and then
|
|
184
|
-
* ignored here. The parameter defaults to the framework default so a caller
|
|
185
|
-
* with no config in hand still gets the historical reading.
|
|
109
|
+
* Merge MI and CRAP envelopes into per-file rows: `miDrop` (higher = worse),
|
|
110
|
+
* `worstCrapDelta` (vs baseline, or vs ceiling for new methods), and
|
|
111
|
+
* `newOverCeilingMethods` (new methods with cyclomatic above the flag).
|
|
186
112
|
*
|
|
187
113
|
* @param {{ violations?: Array<{ file: string, drop?: number }> } | null} miEnvelope
|
|
188
114
|
* @param {{ violations?: Array<{
|
|
@@ -249,14 +175,12 @@ export function mergeEnvelopes(
|
|
|
249
175
|
(crapEnvelope?.summary?.newViolations ?? 0),
|
|
250
176
|
},
|
|
251
177
|
cyclomaticFlag: flag,
|
|
252
|
-
//
|
|
178
|
+
// Advisories ride the merge but never the exit code.
|
|
253
179
|
advisories: advisoriesOf(crapEnvelope),
|
|
254
180
|
};
|
|
255
181
|
}
|
|
256
182
|
|
|
257
183
|
/**
|
|
258
|
-
* The cyclomatic advisories a CRAP envelope carries (Story #5313), or none.
|
|
259
|
-
*
|
|
260
184
|
* @param {{ cyclomaticAdvisories?: unknown } | null | undefined} crapEnvelope
|
|
261
185
|
* @returns {Array<{ file: string, method: string, startLine: number, cyclomatic: number }>}
|
|
262
186
|
*/
|
|
@@ -266,10 +190,6 @@ function advisoriesOf(crapEnvelope) {
|
|
|
266
190
|
}
|
|
267
191
|
|
|
268
192
|
/**
|
|
269
|
-
* Print the advisories block when there is one (Story #5313). Split out of
|
|
270
|
-
* `emitReport` so that function's branching stays inside its committed
|
|
271
|
-
* cyclomatic budget.
|
|
272
|
-
*
|
|
273
193
|
* @param {Array<object>} advisories
|
|
274
194
|
* @param {{ write: (s: string) => void }} stdout
|
|
275
195
|
* @returns {void}
|
|
@@ -280,11 +200,6 @@ function writeAdvisories(advisories, stdout) {
|
|
|
280
200
|
}
|
|
281
201
|
|
|
282
202
|
/**
|
|
283
|
-
* Render the cyclomatic advisories block (Story #5313), or `null` when the
|
|
284
|
-
* scan carried none. One line per method at or over the ceiling; the block
|
|
285
|
-
* says outright that it is advisory so a reader does not hunt for the exit
|
|
286
|
-
* code it did not change.
|
|
287
|
-
*
|
|
288
203
|
* @param {Array<{ file: string, method: string, startLine: number, cyclomatic: number }>} advisories
|
|
289
204
|
* @returns {string|null}
|
|
290
205
|
*/
|
|
@@ -300,14 +215,8 @@ export function renderAdvisories(advisories) {
|
|
|
300
215
|
}
|
|
301
216
|
|
|
302
217
|
/**
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
* A diagnostic is what a gate emits *instead of* per-method verdicts when it
|
|
307
|
-
* has established that no verdict it could produce would be meaningful — an
|
|
308
|
-
* incomparable baseline, or a comparison basis whose drifted-row ratio proves
|
|
309
|
-
* the two sides disagree on line coordinates. It must reach the operator
|
|
310
|
-
* verbatim: the gate exits 0, so silence would read as a clean run.
|
|
218
|
+
* Gate diagnostics (emitted instead of verdicts when none would be
|
|
219
|
+
* meaningful). Surfaced verbatim: the gate exits 0, so silence reads as clean.
|
|
311
220
|
*
|
|
312
221
|
* @param {Array<{ envelope: { diagnostics?: Array<{name: string, message: string}> } | null }>} results
|
|
313
222
|
* @returns {string | null}
|
|
@@ -323,18 +232,8 @@ export function renderDiagnostics(results) {
|
|
|
323
232
|
}
|
|
324
233
|
|
|
325
234
|
/**
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
* The exit code is non-zero (1) whenever:
|
|
329
|
-
* - either gate returned a non-zero exit code (real violations or runtime
|
|
330
|
-
* failure), OR
|
|
331
|
-
* - the merged envelope reports any violation rows at all.
|
|
332
|
-
*
|
|
333
|
-
* Both signals are combined so a transient gate failure (e.g. JSON write
|
|
334
|
-
* error) still surfaces even if the violations array happens to be empty.
|
|
335
|
-
*
|
|
336
|
-
* Advisories (`merged.advisories`, Story #5313) are deliberately not read
|
|
337
|
-
* here: a method at cyclomatic 12 or above is reported and exits 0.
|
|
235
|
+
* 1 on any gate failure or violation (a gate failure counts even with no rows);
|
|
236
|
+
* advisories never affect it.
|
|
338
237
|
*
|
|
339
238
|
* @param {{ rows: Array<unknown>, totals: { miRegressions: number, crapViolations: number } }} merged
|
|
340
239
|
* @param {number} miExit
|
|
@@ -350,28 +249,7 @@ export function computeExitCode(merged, miExit, crapExit) {
|
|
|
350
249
|
}
|
|
351
250
|
|
|
352
251
|
/**
|
|
353
|
-
*
|
|
354
|
-
* "file", "MI delta", "worst CRAP delta", "new-method count over c=<flag>".
|
|
355
|
-
*
|
|
356
|
-
* The last header used to hardcode `c=8`, which quietly lied to any consumer
|
|
357
|
-
* that had tuned `codingGuardrails.cyclomaticFlag`. It now names the value the
|
|
358
|
-
* count was actually taken against, read off the merge result — through the
|
|
359
|
-
* same `normalizeFlag` the merge itself uses, rather than the second, hand-
|
|
360
|
-
* inlined copy of that coercion this function used to carry.
|
|
361
|
-
*
|
|
362
|
-
* Pure — accepts pre-computed merge rows and returns a multi-line string. The
|
|
363
|
-
* table renders even on a clean diff so operators see the "no drift" signal.
|
|
364
|
-
*
|
|
365
|
-
* @param {{ rows: Array<{ file: string, miDrop: number, worstCrapDelta: number, newOverCeilingMethods: number }>, totals: { miRegressions: number, crapViolations: number }, cyclomaticFlag?: number }} merged
|
|
366
|
-
* @returns {string}
|
|
367
|
-
*/
|
|
368
|
-
/**
|
|
369
|
-
* The table's body: one row per regressed file, or the single placeholder
|
|
370
|
-
* line that keeps the "no drift" signal visible on a clean diff.
|
|
371
|
-
*
|
|
372
|
-
* Split out of `renderTable` so that function keeps a flat shape — the
|
|
373
|
-
* empty-vs-populated branch and the row loop together carried it above the
|
|
374
|
-
* per-method CRAP contract the pre-push preview enforces.
|
|
252
|
+
* Placeholder row on a clean diff keeps the "no drift" signal visible.
|
|
375
253
|
*
|
|
376
254
|
* @param {Array<{ file: string, miDrop: number, worstCrapDelta: number, newOverCeilingMethods: number }>} rows
|
|
377
255
|
* @returns {string[]}
|
|
@@ -384,6 +262,10 @@ function tableBodyLines(rows) {
|
|
|
384
262
|
);
|
|
385
263
|
}
|
|
386
264
|
|
|
265
|
+
/**
|
|
266
|
+
* @param {{ rows: Array<{ file: string, miDrop: number, worstCrapDelta: number, newOverCeilingMethods: number }>, totals: { miRegressions: number, crapViolations: number }, cyclomaticFlag?: number }} merged
|
|
267
|
+
* @returns {string}
|
|
268
|
+
*/
|
|
387
269
|
export function renderTable(merged) {
|
|
388
270
|
const flag = normalizeFlag(merged?.cyclomaticFlag);
|
|
389
271
|
const header = [
|
|
@@ -402,39 +284,7 @@ export function renderTable(merged) {
|
|
|
402
284
|
}
|
|
403
285
|
|
|
404
286
|
/**
|
|
405
|
-
*
|
|
406
|
-
* (Story #4923), falling back to the framework default when the config cannot
|
|
407
|
-
* be resolved at all.
|
|
408
|
-
*
|
|
409
|
-
* Best-effort by design: `quality:preview` is a developer-facing report, and a
|
|
410
|
-
* run in a tree with no readable `.agentrc.json` should still render its table
|
|
411
|
-
* rather than abort. Extracted from `runCli` rather than inlined so the CLI
|
|
412
|
-
* body stays under the cyclomatic must-fix ceiling this same Story starts
|
|
413
|
-
* enforcing — a gate whose own delivery breaches it is not a gate.
|
|
414
|
-
*
|
|
415
|
-
* @param {{ cwd: string, stderr: { write: (s: string) => void } }} args
|
|
416
|
-
* @returns {number}
|
|
417
|
-
*/
|
|
418
|
-
function resolveCyclomaticFlag({ cwd, stderr }) {
|
|
419
|
-
try {
|
|
420
|
-
return resolveCyclomaticPolicy(getQuality(resolveConfig({ cwd }))).flag;
|
|
421
|
-
} catch (err) {
|
|
422
|
-
stderr.write(
|
|
423
|
-
`[quality:preview] config resolution failed, using cyclomaticFlag=${DEFAULT_CYCLOMATIC_FLAG}: ${err?.message ?? err}\n`,
|
|
424
|
-
);
|
|
425
|
-
return DEFAULT_CYCLOMATIC_FLAG;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* Invoke one preview runner, degrading a thrown failure into the same
|
|
431
|
-
* `{ exitCode: 1, envelope: null }` shape a real gate failure produces.
|
|
432
|
-
*
|
|
433
|
-
* Both runners degraded identically before, in two hand-copied `catch`
|
|
434
|
-
* arms; folding them into one helper removes the copy and keeps `runCli` a
|
|
435
|
-
* pipeline rather than a pair of inlined error handlers. The emitted message
|
|
436
|
-
* is byte-identical to the arm it replaces — `label` supplies the `MI` /
|
|
437
|
-
* `CRAP` prefix.
|
|
287
|
+
* A thrown runner degrades to the `{ exitCode: 1, envelope: null }` shape.
|
|
438
288
|
*
|
|
439
289
|
* @param {(args: object) => Promise<{exitCode: number, envelope: object|null}>} runner
|
|
440
290
|
* @param {{cwd: string, staged: boolean, changedSinceRef: string|null}} args
|
|
@@ -452,19 +302,9 @@ function runGateSafely(runner, args, label, stderr) {
|
|
|
452
302
|
}
|
|
453
303
|
|
|
454
304
|
/**
|
|
455
|
-
*
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
* `MERGE_HEAD`, and the header says so. Without that line the operator sees a
|
|
459
|
-
* table whose row count does not match `git diff --cached` with no way to tell
|
|
460
|
-
* the narrowing was deliberate.
|
|
461
|
-
*
|
|
462
|
-
* The merge state is resolved here rather than read back off a gate envelope's
|
|
463
|
-
* `summary.diffRef`: that field means "the ref this scope was resolved
|
|
464
|
-
* against" for every scope kind, so anything that populates it — a future
|
|
465
|
-
* scope mode, a test stub — would render a merge banner over a repo that is
|
|
466
|
-
* not merging. Resolving it after the `!staged` early return also keeps the
|
|
467
|
-
* probe off the `--changed-since` path, which has no use for it.
|
|
305
|
+
* Scope header; names a `MERGE_HEAD` re-base so the narrowed row count reads as
|
|
306
|
+
* deliberate. Merge state is probed here, not read off an envelope's `diffRef`
|
|
307
|
+
* (which every scope kind populates).
|
|
468
308
|
*
|
|
469
309
|
* @param {{ staged: boolean, ref: string|null, cwd: string }} args
|
|
470
310
|
* @returns {string}
|
|
@@ -481,13 +321,7 @@ function stagedScopeLine({ staged, ref, cwd }) {
|
|
|
481
321
|
}
|
|
482
322
|
|
|
483
323
|
/**
|
|
484
|
-
* Write the
|
|
485
|
-
* table plus any gate diagnostics and the non-zero-exit summary.
|
|
486
|
-
*
|
|
487
|
-
* Split out of `runCli` (Story #5109): the rendering half carried five of
|
|
488
|
-
* that function's decision points, which put it over the per-method CRAP
|
|
489
|
-
* contract the pre-push preview enforces. Output bytes are unchanged in both
|
|
490
|
-
* modes. The exit code stays with the caller — this function only reports.
|
|
324
|
+
* Write the `--json` envelope or the table + diagnostics; reports only.
|
|
491
325
|
*
|
|
492
326
|
* @param {{
|
|
493
327
|
* json: boolean,
|
|
@@ -545,10 +379,6 @@ function emitReport({
|
|
|
545
379
|
}
|
|
546
380
|
|
|
547
381
|
/**
|
|
548
|
-
* Top-level CLI entry: invoke both per-kind preview runners, merge, render,
|
|
549
|
-
* and exit with the right code. Exposed as `runCli` so tests can drive the
|
|
550
|
-
* full pipeline through injected runner stubs.
|
|
551
|
-
*
|
|
552
382
|
* @param {{
|
|
553
383
|
* argv?: string[],
|
|
554
384
|
* cwd?: string,
|
|
@@ -571,19 +401,9 @@ export async function runCli({
|
|
|
571
401
|
const staged = parseStagedFlag(argv);
|
|
572
402
|
const ref = staged ? null : (parseChangedSinceArg(argv) ?? 'HEAD');
|
|
573
403
|
|
|
574
|
-
//
|
|
575
|
-
//
|
|
576
|
-
//
|
|
577
|
-
// the host by 2x and stacked two escomplex heaps: a 58-file preview peaked
|
|
578
|
-
// at 1.0-1.2 GB RSS for 3.9 s of CPU. Serialising them bounds the preview
|
|
579
|
-
// to one `availableParallelism` of workers and one heap at a time. The two
|
|
580
|
-
// runners share no state and neither reads the other's envelope, so the
|
|
581
|
-
// emitted envelopes — and therefore the merged table and the exit code —
|
|
582
|
-
// are identical either way; only the peak cost differs.
|
|
583
|
-
//
|
|
584
|
-
// Each runner gets its own options literal rather than one shared object,
|
|
585
|
-
// so serialising them cannot introduce a coupling the concurrent form
|
|
586
|
-
// did not have.
|
|
404
|
+
// Serial, not Promise.all: each runner sizes its own pool to
|
|
405
|
+
// availableParallelism, so overlapping them oversubscribes 2x and stacks
|
|
406
|
+
// two escomplex heaps (>1 GB RSS).
|
|
587
407
|
const miResult = await runGateSafely(
|
|
588
408
|
runMi,
|
|
589
409
|
{ cwd, staged, changedSinceRef: ref },
|
|
@@ -597,12 +417,8 @@ export async function runCli({
|
|
|
597
417
|
stderr,
|
|
598
418
|
);
|
|
599
419
|
|
|
600
|
-
// Story #4923 — the over-ceiling column counts against the *resolved*
|
|
601
|
-
// `codingGuardrails.cyclomaticFlag`, not the literal that used to be written
|
|
602
|
-
// into `mergeEnvelopes` and the column header.
|
|
603
|
-
const cyclomaticFlag = resolveCyclomaticFlag({ cwd, stderr });
|
|
604
420
|
const merged = mergeEnvelopes(miResult.envelope, crapResult.envelope, {
|
|
605
|
-
cyclomaticFlag,
|
|
421
|
+
cyclomaticFlag: DEFAULT_CYCLOMATIC_FLAG,
|
|
606
422
|
});
|
|
607
423
|
|
|
608
424
|
emitReport({
|
|
@@ -624,7 +440,6 @@ export async function runCli({
|
|
|
624
440
|
}
|
|
625
441
|
|
|
626
442
|
// cli-opt-out: Windows-aware main-guard with leading-slash drive-letter normalisation; mirrors quality-watch.js so the diagnostic surface stays consistent across the gate suite.
|
|
627
|
-
// Only run main when invoked directly — keep the module importable from tests.
|
|
628
443
|
const isDirect = (() => {
|
|
629
444
|
try {
|
|
630
445
|
const invoked = process.argv[1] ? path.resolve(process.argv[1]) : '';
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* map — `{ tiers: { alwaysLoaded, mandatoryRead, digestVisible, onDemand } }`,
|
|
6
|
-
* every entry `{ path, bytes }` — as JSON. Consumed by the `audit-documentation`
|
|
7
|
-
* lens (read-tier severity weighting), the `check-context-budget.js` ratchet,
|
|
8
|
-
* and operators inspecting the always-loaded closure.
|
|
9
|
-
*
|
|
10
|
-
* Flags:
|
|
11
|
-
* --json emit the tier map as JSON to stdout (default rendering is also
|
|
12
|
-
* JSON; the flag is accepted for parity with the sibling ratchets
|
|
13
|
-
* and future non-JSON renderings).
|
|
14
|
-
* --root <path> resolve tiers against an explicit repo root (default: the
|
|
15
|
-
* resolved PROJECT_ROOT).
|
|
16
|
-
*
|
|
17
|
-
* Exit code is always 0 on success — this is a reporter, not a gate.
|
|
2
|
+
* CLI: print the documentation read-tier map
|
|
3
|
+
* (`{ tiers: { alwaysLoaded, mandatoryRead, digestVisible, onDemand } }`,
|
|
4
|
+
* entries `{ path, bytes }`) as JSON. A reporter, not a gate: exits 0.
|
|
18
5
|
*/
|
|
19
6
|
|
|
20
7
|
import process from 'node:process';
|
|
@@ -23,8 +10,6 @@ import { PROJECT_ROOT, resolveConfig } from './lib/config-resolver.js';
|
|
|
23
10
|
import { resolveDocTiers } from './lib/doc-tiers.js';
|
|
24
11
|
|
|
25
12
|
/**
|
|
26
|
-
* Parse argv for `--root <path>` and `--json`.
|
|
27
|
-
*
|
|
28
13
|
* @param {string[]} argv
|
|
29
14
|
* @returns {{ rootPath: string | null, json: boolean }}
|
|
30
15
|
*/
|
|
@@ -47,14 +32,6 @@ export function parseArgv(argv = []) {
|
|
|
47
32
|
}
|
|
48
33
|
|
|
49
34
|
/**
|
|
50
|
-
* Top-level CLI entry. Exported so tests can drive it against a fixture root
|
|
51
|
-
* with an injected sink and config.
|
|
52
|
-
*
|
|
53
|
-
* The optional final `deps` parameter is the module's injectable seam
|
|
54
|
-
* (`.agents/rules/test-seams.md` rules 1-2): every entry defaults to the real
|
|
55
|
-
* implementation, so the CLI path below — and any production caller — needs no
|
|
56
|
-
* configuration change.
|
|
57
|
-
*
|
|
58
35
|
* @param {{
|
|
59
36
|
* argv?: string[],
|
|
60
37
|
* config?: object,
|
|
@@ -1,29 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* resolve-stories.js — resolve
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* What it resolves, per Story:
|
|
12
|
-
* - the issue itself, fetched with **state=all** so an already-landed
|
|
13
|
-
* sibling is present rather than silently dropped;
|
|
14
|
-
* - its dependency edges: the union of the body's `---` footer
|
|
15
|
-
* (`blocked by #N`, footer-scoped and strict — prose mentioning a blocker
|
|
16
|
-
* elsewhere in the body declares nothing) and native GitHub `blocked_by`
|
|
17
|
-
* edges, read to exhaustion and failing loud rather than degrading to
|
|
18
|
-
* "no edges";
|
|
19
|
-
* - its declared file footprint, as plain path strings, so the scheduler's
|
|
20
|
-
* co-dispatch overlap guard has something to work with.
|
|
21
|
-
*
|
|
22
|
-
* And across the set: every dependency id — inside the requested set or
|
|
23
|
-
* foreign to it — is checked against live issue state, and a blocker that is
|
|
24
|
-
* closed or `agent::done` lands in `done[]`. That is what makes "deliver
|
|
25
|
-
* Stories across plan runs and over time" work: a Story whose blocker merged
|
|
26
|
-
* weeks ago in a different run is simply ready.
|
|
4
|
+
* resolve-stories.js — resolve Story ids into the `{ stories, dag, done }`
|
|
5
|
+
* envelope `/mandrel-deliver` sequences from, discovering the graph from live
|
|
6
|
+
* state: footer `blocked by #N` edges union native `blocked_by` edges (read to
|
|
7
|
+
* exhaustion, failing loud), plus each Story's footprint for the overlap
|
|
8
|
+
* guard. Every blocker, in-set or foreign, is checked live, so one that landed
|
|
9
|
+
* in an earlier run lands in `done[]`.
|
|
27
10
|
*
|
|
28
11
|
* Usage:
|
|
29
12
|
* node .agents/scripts/resolve-stories.js --ids 101,102
|
|
@@ -55,22 +38,15 @@ import { paginateRest } from './providers/github/request-helpers.js';
|
|
|
55
38
|
|
|
56
39
|
export {
|
|
57
40
|
buildStoriesEnvelope,
|
|
58
|
-
// Re-exported, not redefined
|
|
59
|
-
//
|
|
60
|
-
// the rollup share one definition — the pair whose divergence makes an Epic
|
|
61
|
-
// expandable but unclosable. The name stays exported here because two test
|
|
62
|
-
// modules import it from this entrypoint.
|
|
41
|
+
// Re-exported, not redefined: expansion and the Epic rollup must share one
|
|
42
|
+
// reader or an Epic becomes expandable but unclosable.
|
|
63
43
|
nativeChildReader,
|
|
64
44
|
parseIds,
|
|
65
45
|
readNativeBlockedBy,
|
|
66
46
|
toStoryRecord,
|
|
67
47
|
};
|
|
68
48
|
|
|
69
|
-
/**
|
|
70
|
-
* Bounded concurrency for the per-issue round-trips. Matches the edge-writer's
|
|
71
|
-
* cap: modest enough for GitHub's secondary rate limits, while collapsing
|
|
72
|
-
* wall-clock from sum(round-trips) toward sum/concurrency.
|
|
73
|
-
*/
|
|
49
|
+
/** Modest enough for GitHub's secondary rate limits. */
|
|
74
50
|
const FETCH_CONCURRENCY = 5;
|
|
75
51
|
|
|
76
52
|
const HELP = `\
|
|
@@ -111,13 +87,8 @@ export function resolveStoriesProvider({
|
|
|
111
87
|
}
|
|
112
88
|
|
|
113
89
|
/**
|
|
114
|
-
*
|
|
115
|
-
* id that is not a deliverable Story.
|
|
116
|
-
*
|
|
117
|
-
* Container Epics are expanded to their open child Stories **first**, so
|
|
118
|
-
* everything downstream sees a plain Story-id list (Story #5139). The
|
|
119
|
-
* expansion walk is sequential because it is id-by-id conditional; the Story
|
|
120
|
-
* fetch that follows stays under the bounded concurrency.
|
|
90
|
+
* Container Epics expand to their open child Stories first; fails on the
|
|
91
|
+
* first id that is not a deliverable Story.
|
|
121
92
|
*
|
|
122
93
|
* @param {object} provider
|
|
123
94
|
* @param {number[]} ids
|
|
@@ -153,12 +124,7 @@ export async function fetchStories(provider, ids, { allowUnlabelled } = {}) {
|
|
|
153
124
|
}
|
|
154
125
|
|
|
155
126
|
/**
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* `paginate` is injected rather than imported inside the lib layer so
|
|
159
|
-
* `readNativeBlockedBy` stays provider-agnostic and unit-testable; production
|
|
160
|
-
* passes `paginateRest`, which walks every page (the read used to stop at the
|
|
161
|
-
* first, silently truncating a Story's gates — Story #5046).
|
|
127
|
+
* `paginate` must walk every page; stopping at one silently drops gates.
|
|
162
128
|
*
|
|
163
129
|
* @returns {Promise<Map<number, number[]>>}
|
|
164
130
|
*/
|
|
@@ -189,14 +155,8 @@ export async function readNativeEdges({
|
|
|
189
155
|
}
|
|
190
156
|
|
|
191
157
|
/**
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* scheduler withholds its dependent forever — the exact wedge that made
|
|
195
|
-
* cross-run delivery impossible.
|
|
196
|
-
*
|
|
197
|
-
* A foreign id that cannot be read is left OUT of `done[]`: unknown means
|
|
198
|
-
* "still gating", which withholds the dependent rather than dispatching it
|
|
199
|
-
* against a possibly-unlanded blocker.
|
|
158
|
+
* A landed foreign blocker must enter `done[]` or its dependent waits forever;
|
|
159
|
+
* an unreadable one stays out (unknown means still gating).
|
|
200
160
|
*
|
|
201
161
|
* @returns {Promise<number[]>}
|
|
202
162
|
*/
|
|
@@ -227,11 +187,6 @@ export async function resolveForeignDone({ provider, dag, inSetIds }) {
|
|
|
227
187
|
}
|
|
228
188
|
|
|
229
189
|
/**
|
|
230
|
-
* Resolve the requested ids into the `{ stories, dag, done }` envelope and
|
|
231
|
-
* write it to `stdout`. The flow core behind `main` — provider, config, and
|
|
232
|
-
* stdout are injected so the whole path is unit-testable without a live
|
|
233
|
-
* GitHub round-trip. Exported for testing.
|
|
234
|
-
*
|
|
235
190
|
* @param {{ ids: string, native?: boolean, pretty?: boolean,
|
|
236
191
|
* allowUnlabelled?: boolean }} args
|
|
237
192
|
* @param {{ provider: object, config: object, stdout?: { write(s: string): void } }} deps
|
|
@@ -277,9 +232,6 @@ export async function runResolveStories(
|
|
|
277
232
|
}
|
|
278
233
|
|
|
279
234
|
/**
|
|
280
|
-
* Project the parsed flags onto the flow core's options object, so `main` reads
|
|
281
|
-
* as parse → help → run and the flag-name spellings live in one place.
|
|
282
|
-
*
|
|
283
235
|
* @param {Record<string, unknown>} values
|
|
284
236
|
* @returns {{ ids: string, native: boolean, pretty: boolean, allowUnlabelled: boolean }}
|
|
285
237
|
*/
|
|
@@ -301,9 +253,7 @@ async function main() {
|
|
|
301
253
|
'allow-unlabelled': { type: 'boolean', default: false },
|
|
302
254
|
help: { type: 'boolean', default: false },
|
|
303
255
|
},
|
|
304
|
-
//
|
|
305
|
-
// parseArgs rejects it as an unknown option and the CLI has no working
|
|
306
|
-
// way to skip the dependencies API.
|
|
256
|
+
// Required for `--no-native` to parse.
|
|
307
257
|
allowNegative: true,
|
|
308
258
|
allowPositionals: false,
|
|
309
259
|
});
|
|
@@ -317,8 +267,7 @@ async function main() {
|
|
|
317
267
|
throw new Error('[resolve-stories] --ids <n,n,...> is required');
|
|
318
268
|
}
|
|
319
269
|
|
|
320
|
-
// stdout is a JSON stream
|
|
321
|
-
// headless caller can pipe this straight into stories-wave-tick.js.
|
|
270
|
+
// stdout is a JSON stream.
|
|
322
271
|
routeAllOutputToStderr();
|
|
323
272
|
|
|
324
273
|
return runResolveStories(toRunOptions(values), resolveStoriesProvider());
|
|
@@ -2,26 +2,10 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* resync-status-column.js — re-assert
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* this CLI after Step 5 confirms `state: "MERGED"` so the orchestrator
|
|
10
|
-
* wins the race against the GitHub built-in `Pull request merged`
|
|
11
|
-
* workflow, which would otherwise overwrite Status to whatever value
|
|
12
|
-
* the bot's rule prescribes (typically `In Progress`) ~minutes after
|
|
13
|
-
* the merge lands.
|
|
14
|
-
*
|
|
15
|
-
* Story #2876 — the helper polls the live Status after the initial
|
|
16
|
-
* mutation and re-fires on drift. The one-shot mutation routinely
|
|
17
|
-
* lost the race (reproduced on Story #2871 / PR #2872); the bounded
|
|
18
|
-
* poll loop hardens the defense-in-depth so consumers who haven't
|
|
19
|
-
* disabled the conflicting bot workflows still get a deterministic
|
|
20
|
-
* outcome.
|
|
21
|
-
*
|
|
22
|
-
* Idempotent: re-running on a ticket whose Status already matches the
|
|
23
|
-
* derived target returns the same `synced` envelope and issues the
|
|
24
|
-
* same single GraphQL mutation.
|
|
5
|
+
* resync-status-column.js — re-assert a ticket's Projects v2 Status after
|
|
6
|
+
* merge, beating GitHub's built-in "Pull request merged" workflow that
|
|
7
|
+
* overwrites it minutes later. A one-shot write loses that race, so the live
|
|
8
|
+
* Status is polled and re-fired on drift. Idempotent.
|
|
25
9
|
*
|
|
26
10
|
* Usage:
|
|
27
11
|
* node .agents/scripts/resync-status-column.js --ticket <id>
|
|
@@ -84,9 +68,7 @@ export function parseArgv(argv) {
|
|
|
84
68
|
}
|
|
85
69
|
|
|
86
70
|
/**
|
|
87
|
-
*
|
|
88
|
-
* a subprocess. Returns `{ ticketId, pollAttempts, pollDelayMs, errors }`
|
|
89
|
-
* — `errors` is empty on success.
|
|
71
|
+
* `errors` is empty on success.
|
|
90
72
|
*
|
|
91
73
|
* @param {Record<string, unknown>} values
|
|
92
74
|
*/
|
|
@@ -136,8 +118,7 @@ export function buildReassertOptions({
|
|
|
136
118
|
};
|
|
137
119
|
if (pollAttempts !== undefined) opts.pollAttempts = pollAttempts;
|
|
138
120
|
if (pollDelayMs !== undefined) opts.pollDelayMs = pollDelayMs;
|
|
139
|
-
//
|
|
140
|
-
// board-metadata cache lands under the project's configured tempRoot.
|
|
121
|
+
// So the board-metadata cache lands under the configured tempRoot.
|
|
141
122
|
if (config !== undefined) opts.config = config;
|
|
142
123
|
return opts;
|
|
143
124
|
}
|