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,197 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// cli-opt-out: top-level CLI driver invoked via npm run test:coverage; spawns child processes rather than parsing argv, so runAsCli() does not apply.
|
|
3
|
-
/**
|
|
4
|
-
* Cross-platform driver for `npm run test:coverage`.
|
|
5
|
-
*
|
|
6
|
-
* Why this exists: setting `NODE_V8_COVERAGE` directly in a package.json
|
|
7
|
-
* script string (`NODE_V8_COVERAGE=... node ...`) is bash-only — Windows
|
|
8
|
-
* cmd.exe (npm's default script-shell on Windows) treats it as a literal
|
|
9
|
-
* argument and node never sees the env var. Wrapping the run in this
|
|
10
|
-
* Node script keeps the env injection portable.
|
|
11
|
-
*
|
|
12
|
-
* Pipeline:
|
|
13
|
-
* 0. Run the full tier's preflight (`runTierPreflight`). Story #4936: this
|
|
14
|
-
* used to be a `pretest:coverage` npm script that CI had to name
|
|
15
|
-
* explicitly, because `.npmrc`'s `ignore-scripts=true` (CWE-1357
|
|
16
|
-
* defence, which stays) suppresses every `pre*` hook. The runner
|
|
17
|
-
* invokes it now, so it executes however the coverage run is started.
|
|
18
|
-
* 1. Run the test suite under `NODE_V8_COVERAGE` so each worker writes
|
|
19
|
-
* raw V8 dumps under `coverage/tmp/`. The suite targets are the
|
|
20
|
-
* shared `FULL_TIER_GLOBS` from `lib/test-tiers.js` — the same set
|
|
21
|
-
* `run-tests.js` walks — so the measured surface and `npm test`'s
|
|
22
|
-
* surface are the same set by construction.
|
|
23
|
-
* 2. `c8 report` post-processes the dumps into `coverage/coverage-final.json`
|
|
24
|
-
* plus the printed text table. Include/exclude scope from `.c8rc.cjs`
|
|
25
|
-
* is passed explicitly because `c8 report` does not auto-load the
|
|
26
|
-
* config file.
|
|
27
|
-
* 3. `check-baselines.js --gate coverage` compares the per-file
|
|
28
|
-
* lines/branches/functions percentages in `coverage-final.json`
|
|
29
|
-
* against the recorded floors in `baselines/coverage.json` and
|
|
30
|
-
* fails on any regression. Update the baseline with
|
|
31
|
-
* `npm run coverage:update` when you intentionally change scope.
|
|
32
|
-
*
|
|
33
|
-
* The previous shape of this script wrapped tests in `c8 <cmd>`. A
|
|
34
|
-
* one-off A/B benchmark (now retired) showed the NODE_V8_COVERAGE +
|
|
35
|
-
* `c8 report` path is ~19% faster end-to-end on a Windows dev host
|
|
36
|
-
* while producing an identical `coverage-final.json` artifact for the
|
|
37
|
-
* CRAP gate.
|
|
38
|
-
*
|
|
39
|
-
* Test-runner flags: the suite spawn reuses `TEST_RUNNER_FLAGS` from
|
|
40
|
-
* `lib/test-runner-contract.js` — the single source of truth for the
|
|
41
|
-
* `node --test` flag set, including the host-derived
|
|
42
|
-
* `--test-concurrency` value clamped to `[TEST_CONCURRENCY_MIN,
|
|
43
|
-
* TEST_CONCURRENCY_MAX]`. Story #4936: sharing the whole flag set (not
|
|
44
|
-
* just the concurrency number) is what stops this runner and
|
|
45
|
-
* `run-tests.js` disagreeing about whether a test can execute at all —
|
|
46
|
-
* `--experimental-test-module-mocks` decides whether `t.mock.module`
|
|
47
|
-
* works, and this is the *required* CI job.
|
|
48
|
-
*/
|
|
49
|
-
|
|
50
|
-
import { spawnSync } from 'node:child_process';
|
|
51
|
-
import { mkdirSync, rmSync } from 'node:fs';
|
|
52
|
-
import { createRequire } from 'node:module';
|
|
53
|
-
import path from 'node:path';
|
|
54
|
-
import { fileURLToPath } from 'node:url';
|
|
55
|
-
|
|
56
|
-
import { cleanupRepoTestTempArtifacts } from './cleanup-repo-test-temp.js';
|
|
57
|
-
import { C8_CLI } from './lib/c8-cli-path.js';
|
|
58
|
-
import { buildWebhookSafeTestEnv } from './lib/test-env.js';
|
|
59
|
-
import {
|
|
60
|
-
runTierPreflight,
|
|
61
|
-
TEST_RUNNER_FLAGS,
|
|
62
|
-
} from './lib/test-runner-contract.js';
|
|
63
|
-
import { FULL_TIER_GLOBS } from './lib/test-tiers.js';
|
|
64
|
-
|
|
65
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
66
|
-
const ROOT = path.resolve(__dirname, '..', '..');
|
|
67
|
-
const require = createRequire(import.meta.url);
|
|
68
|
-
const C8_CONFIG = require('../../.c8rc.cjs');
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Build the `node --test` argv for the coverage suite spawn.
|
|
72
|
-
*
|
|
73
|
-
* Reuses two shared constants so the coverage path cannot drift from
|
|
74
|
-
* `run-tests.js`:
|
|
75
|
-
*
|
|
76
|
-
* - `TEST_RUNNER_FLAGS` — the single source of truth for the host-aware,
|
|
77
|
-
* clamped `--test-concurrency` value.
|
|
78
|
-
* - `FULL_TIER_GLOBS` — the single source of truth for *which files the
|
|
79
|
-
* full tier runs*. Story #4922: this script used to restate
|
|
80
|
-
* `tests/**\/*.test.js` on its own, so the 47 colocated `__tests__`
|
|
81
|
-
* suites under `lib/` and `.agents/scripts/` executed under `npm test`
|
|
82
|
-
* but never under the measuring run — the coverage and CRAP numbers
|
|
83
|
-
* were computed over code the coverage run had not executed.
|
|
84
|
-
*
|
|
85
|
-
* Both parameters are injected in tests so the argv can be asserted without
|
|
86
|
-
* touching the OS.
|
|
87
|
-
*
|
|
88
|
-
* @param {object} [opts]
|
|
89
|
-
* @param {readonly string[]} [opts.runnerFlags]
|
|
90
|
-
* @param {readonly string[]} [opts.testGlobs]
|
|
91
|
-
* @returns {string[]}
|
|
92
|
-
*/
|
|
93
|
-
export function buildCoverageTestArgs({
|
|
94
|
-
runnerFlags = TEST_RUNNER_FLAGS,
|
|
95
|
-
testGlobs = FULL_TIER_GLOBS,
|
|
96
|
-
} = {}) {
|
|
97
|
-
return [...runnerFlags, ...testGlobs];
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Execute the coverage pipeline: run the full tier's preflight, run the
|
|
102
|
-
* suite under `NODE_V8_COVERAGE`, post-process the dumps with `c8 report`,
|
|
103
|
-
* then gate on the coverage baseline. Returns the first non-zero exit code
|
|
104
|
-
* across the stages (or the baseline check's status when the prior stages
|
|
105
|
-
* pass); a refused preflight short-circuits before anything is spawned or
|
|
106
|
-
* removed.
|
|
107
|
-
*
|
|
108
|
-
* Every collaborator is injected so the pipeline's wiring — above all
|
|
109
|
-
* *that the preflight actually runs, and runs first* — is assertable
|
|
110
|
-
* without spawning the real suite.
|
|
111
|
-
*
|
|
112
|
-
* @param {object} [opts]
|
|
113
|
-
* @param {typeof spawnSync} [opts.spawn]
|
|
114
|
-
* @param {(opts: { tier: string, repoRoot: string }) => number} [opts.preflight]
|
|
115
|
-
* @param {(opts: { repoRoot: string }) => unknown} [opts.cleanup]
|
|
116
|
-
* @param {string} [opts.repoRoot]
|
|
117
|
-
* @returns {number}
|
|
118
|
-
*/
|
|
119
|
-
export function runCoveragePipeline({
|
|
120
|
-
spawn = spawnSync,
|
|
121
|
-
preflight = runTierPreflight,
|
|
122
|
-
cleanup = cleanupRepoTestTempArtifacts,
|
|
123
|
-
repoRoot = ROOT,
|
|
124
|
-
} = {}) {
|
|
125
|
-
const coverageDir = path.join(repoRoot, 'coverage');
|
|
126
|
-
const v8Tmp = path.join(coverageDir, 'tmp');
|
|
127
|
-
|
|
128
|
-
const preflightStatus = preflight({ tier: 'full', repoRoot });
|
|
129
|
-
if (preflightStatus !== 0) return preflightStatus;
|
|
130
|
-
|
|
131
|
-
rmSync(coverageDir, { recursive: true, force: true });
|
|
132
|
-
mkdirSync(v8Tmp, { recursive: true });
|
|
133
|
-
|
|
134
|
-
const testRun = spawn(process.execPath, buildCoverageTestArgs(), {
|
|
135
|
-
cwd: repoRoot,
|
|
136
|
-
stdio: 'inherit',
|
|
137
|
-
// GIT_*-scrubbed: under a husky pre-push from a linked worktree the
|
|
138
|
-
// inherited GIT_DIR poisons fixture `git init` runs (#4580).
|
|
139
|
-
env: { ...buildWebhookSafeTestEnv(process.env), NODE_V8_COVERAGE: v8Tmp },
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
cleanup({ repoRoot });
|
|
143
|
-
|
|
144
|
-
const includeArgs = (C8_CONFIG.include ?? []).flatMap((p) => [
|
|
145
|
-
'--include',
|
|
146
|
-
p,
|
|
147
|
-
]);
|
|
148
|
-
const excludeArgs = (C8_CONFIG.exclude ?? []).flatMap((p) => [
|
|
149
|
-
'--exclude',
|
|
150
|
-
p,
|
|
151
|
-
]);
|
|
152
|
-
|
|
153
|
-
// `c8 report` does not auto-load `.c8rc.cjs`, so every scope knob it needs
|
|
154
|
-
// is forwarded explicitly from the config object — including `all`, which
|
|
155
|
-
// is what puts a 0 % row on a source file no test ever loaded (Story
|
|
156
|
-
// #4922). Reading it off the config keeps `.c8rc.cjs` the one declaration.
|
|
157
|
-
const allArgs = C8_CONFIG.all ? ['--all'] : [];
|
|
158
|
-
|
|
159
|
-
const reportRun = spawn(
|
|
160
|
-
process.execPath,
|
|
161
|
-
[
|
|
162
|
-
C8_CLI,
|
|
163
|
-
'report',
|
|
164
|
-
'--reporter=json',
|
|
165
|
-
'--reporter=text',
|
|
166
|
-
...allArgs,
|
|
167
|
-
'--temp-directory',
|
|
168
|
-
v8Tmp,
|
|
169
|
-
...includeArgs,
|
|
170
|
-
...excludeArgs,
|
|
171
|
-
],
|
|
172
|
-
{ cwd: repoRoot, stdio: 'inherit', shell: false },
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
const checkRun = spawn(
|
|
176
|
-
process.execPath,
|
|
177
|
-
[
|
|
178
|
-
path.join(repoRoot, '.agents', 'scripts', 'check-baselines.js'),
|
|
179
|
-
'--gate',
|
|
180
|
-
'coverage',
|
|
181
|
-
],
|
|
182
|
-
{ cwd: repoRoot, stdio: 'inherit' },
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
return testRun.status !== 0
|
|
186
|
-
? (testRun.status ?? 1)
|
|
187
|
-
: reportRun.status !== 0
|
|
188
|
-
? (reportRun.status ?? 1)
|
|
189
|
-
: (checkRun.status ?? 1);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Run the pipeline only when invoked directly as a CLI; importing the
|
|
193
|
-
// module (e.g. from a test asserting the spawn argv) must not spawn the
|
|
194
|
-
// real suite.
|
|
195
|
-
if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
|
|
196
|
-
process.exit(runCoveragePipeline());
|
|
197
|
-
}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// cli-opt-out: top-level-await driver with no main() function — runAsCli wraps an async main, which doesn't apply here.
|
|
3
|
-
/* node:coverage ignore file */
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Cross-platform parallel driver for `npm run lint`.
|
|
7
|
-
*
|
|
8
|
-
* Spawns `biome ci .` and `markdownlint-cli2` concurrently. They share
|
|
9
|
-
* no state, so running them in series (the prior `&&` form) wasted
|
|
10
|
-
* wall-clock time on every developer save and pre-push. Stdout/stderr
|
|
11
|
-
* stream through unchanged so error context survives. Exit code is
|
|
12
|
-
* non-zero if either tool fails.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { spawn } from 'node:child_process';
|
|
16
|
-
import process from 'node:process';
|
|
17
|
-
|
|
18
|
-
// On Windows, npm/npx shims are `.cmd` batch files. Since Node 20,
|
|
19
|
-
// these can only be spawned through a shell (CWE-78 mitigation closing
|
|
20
|
-
// CVE-2024-27980), so `shell: true` is mandatory there. POSIX hosts
|
|
21
|
-
// can spawn directly.
|
|
22
|
-
const useShell = process.platform === 'win32';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* A Node gate spelled `node .agents/scripts/<script>` — the shape six of the
|
|
26
|
-
* eight tasks share. Spelling it once keeps this list readable as what it
|
|
27
|
-
* actually is (a fan-out roster) instead of a wall of spawn tuples, and keeps
|
|
28
|
-
* adding a gate from costing the module a maintainability regression for the
|
|
29
|
-
* boilerplate rather than the behaviour. Mirrors `run-verify.js`'s `gate()`.
|
|
30
|
-
*
|
|
31
|
-
* Use bare `node` (PATH-resolved) rather than `process.execPath`:
|
|
32
|
-
* `process.execPath` on Windows often expands to `C:\Program
|
|
33
|
-
* Files\nodejs\node.exe`, and spawn(..., { shell: true }) does not quote the
|
|
34
|
-
* executable, so the space breaks invocation.
|
|
35
|
-
*
|
|
36
|
-
* The path is passed WHOLE rather than assembled from a basename. Composing
|
|
37
|
-
* it (`` `.agents/scripts/${script}` ``) reads better and is wrong:
|
|
38
|
-
* `check-knip-entries.js` derives which CLIs something actually invokes by
|
|
39
|
-
* scanning this file's source text for literal script paths, and four of the
|
|
40
|
-
* gates below are invoked from nowhere else. Interpolating the path made them
|
|
41
|
-
* invisible to that derivation, so knip called them dead and the ratchet
|
|
42
|
-
* offered to record live gates as expected-dead — the Story #5012 trap.
|
|
43
|
-
*
|
|
44
|
-
* @param {string} name reported in this driver's own error prefix
|
|
45
|
-
* @param {string} script repo-relative path, spelled as one literal
|
|
46
|
-
* @returns {{ name: string, cmd: string, args: string[] }}
|
|
47
|
-
*/
|
|
48
|
-
const nodeGate = (name, script) => ({ name, cmd: 'node', args: [script] });
|
|
49
|
-
|
|
50
|
-
const tasks = [
|
|
51
|
-
{
|
|
52
|
-
name: 'biome',
|
|
53
|
-
cmd: 'npx',
|
|
54
|
-
args: ['biome', 'ci', '.'],
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
// `docs/**/*.md` sat outside these globs until PR #4970's follow-up,
|
|
58
|
-
// so `npm run lint` reported "0 error(s)" while the close-time
|
|
59
|
-
// code-review lens — which lints the whole changed surface, not just
|
|
60
|
-
// what this driver globs — raised pre-existing `docs/` violations
|
|
61
|
-
// against whichever Story happened to touch the file. Keep `docs/`
|
|
62
|
-
// here so the two surfaces agree. `docs/CHANGELOG.md` is linted too;
|
|
63
|
-
// the generator-owned rules it can never satisfy are exempted by a
|
|
64
|
-
// `markdownlint-disable-file` directive in its own header.
|
|
65
|
-
name: 'markdownlint',
|
|
66
|
-
cmd: 'npx',
|
|
67
|
-
args: [
|
|
68
|
-
'markdownlint-cli2',
|
|
69
|
-
'.agents/**/*.md',
|
|
70
|
-
'docs/**/*.md',
|
|
71
|
-
'*.md',
|
|
72
|
-
'!node_modules/**',
|
|
73
|
-
'!.worktrees/**',
|
|
74
|
-
],
|
|
75
|
-
},
|
|
76
|
-
// Lifecycle surface (Story #2227). Enforces (1) no `Promise.all` under
|
|
77
|
-
// `.agents/scripts/lib/orchestration/lifecycle/**` — the ledger is
|
|
78
|
-
// append-only and a parallel write interleaves records; and (2) the
|
|
79
|
-
// auto-merge lockout: the `gh pr merge` literal appears only in
|
|
80
|
-
// `single-story-close/phases/auto-merge.js`. Neither has a biome
|
|
81
|
-
// equivalent. Story #5024 dropped the third rule (the wildcard-observer
|
|
82
|
-
// firewall) with the bus and the `listeners/` directory its predicate
|
|
83
|
-
// required.
|
|
84
|
-
nodeGate('lifecycle-lint', '.agents/scripts/check-lifecycle-lint.js'),
|
|
85
|
-
// Workflow prose surface (Epic #4474 PR5). No workflow may instruct calling
|
|
86
|
-
// an exported library function that has no CLI entrypoint — the measured
|
|
87
|
-
// shim-writing failure mode the /mandrel-plan collapse killed. See
|
|
88
|
-
// check-workflow-cli-lint.js for the paragraph-level heuristic.
|
|
89
|
-
nodeGate('workflow-cli-lint', '.agents/scripts/check-workflow-cli-lint.js'),
|
|
90
|
-
// Label-vocabulary citations in `.agents/docs/SDLC.md` and
|
|
91
|
-
// `.agents/workflows/**/*.md` (Story #2892). Greps inline backtick code
|
|
92
|
-
// spans for axis-shaped tokens (`type/epic`, etc.) and asserts only the
|
|
93
|
-
// canonical `<axis>::<value>` separator from `lib/label-constants.js`
|
|
94
|
-
// appears. Closes the drift gap that let the original `type/epic` typo land.
|
|
95
|
-
nodeGate('label-vocabulary', '.agents/scripts/lint-label-vocabulary.js'),
|
|
96
|
-
// GitHub Actions job-timeout gate (Story #4936). Fails a `jobs.<id>` that
|
|
97
|
-
// sets no `timeout-minutes` (inheriting GitHub's 360-minute default) or sets
|
|
98
|
-
// one above the ceiling. A deadlocked Windows job burned 44 minutes of a
|
|
99
|
-
// runner and withheld the failing required check's logs for the whole time.
|
|
100
|
-
nodeGate('workflow-timeouts', '.agents/scripts/check-workflow-timeouts.js'),
|
|
101
|
-
// Architecture cycle ratchet (Story #3991). Detects directed import cycles
|
|
102
|
-
// under `.agents/scripts/` and fails on any cycle not in the committed
|
|
103
|
-
// allowlist (`baselines/arch-cycles.json`).
|
|
104
|
-
nodeGate('arch-cycles', '.agents/scripts/check-arch-cycles.js'),
|
|
105
|
-
// Static Gherkin corpus gate (Story #5013): must-compile with the real
|
|
106
|
-
// parser, then must-bind scoped per step root. Opt-in behind
|
|
107
|
-
// `qa.gherkinLint`, so it exits 0 as "not configured" in this repo. Here
|
|
108
|
-
// rather than in run-verify.js so it reaches CI through the same `lint`
|
|
109
|
-
// required check as arch-cycles; listing it in both would double-pay it.
|
|
110
|
-
nodeGate('gherkin-corpus', '.agents/scripts/check-gherkin-corpus.js'),
|
|
111
|
-
];
|
|
112
|
-
|
|
113
|
-
function runTask({ name, cmd, args }) {
|
|
114
|
-
return new Promise((resolve) => {
|
|
115
|
-
const child = spawn(cmd, args, { stdio: 'inherit', shell: useShell });
|
|
116
|
-
child.on('error', (err) => {
|
|
117
|
-
process.stderr.write(`[run-lint:${name}] spawn error: ${err.message}\n`);
|
|
118
|
-
resolve(1);
|
|
119
|
-
});
|
|
120
|
-
child.on('exit', (code, signal) => {
|
|
121
|
-
if (signal) {
|
|
122
|
-
process.stderr.write(`[run-lint:${name}] killed by ${signal}\n`);
|
|
123
|
-
resolve(1);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
resolve(code ?? 1);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const results = await Promise.all(tasks.map(runTask));
|
|
132
|
-
const failed = results.findIndex((code) => code !== 0);
|
|
133
|
-
process.exit(failed === -1 ? 0 : results[failed]);
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/* node:coverage ignore file */
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Capture TAP timing from the full test suite and write a human summary under
|
|
7
|
-
* `temp/` (gitignored). Skips npm-test preflight so timings reflect the
|
|
8
|
-
* runner only — set SKIP_PREFLIGHT=0 to include preflight if desired.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import fs from 'node:fs';
|
|
12
|
-
import path from 'node:path';
|
|
13
|
-
import { fileURLToPath } from 'node:url';
|
|
14
|
-
import { spawnChild } from './lib/child-exec.js';
|
|
15
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
16
|
-
import { buildWebhookSafeTestEnv } from './lib/test-env.js';
|
|
17
|
-
import { parseTapOutput } from './lib/test-profile/parse-tap.js';
|
|
18
|
-
import { renderProfileReport } from './lib/test-profile/render-report.js';
|
|
19
|
-
import { buildNodeTestArgs } from './run-tests.js';
|
|
20
|
-
|
|
21
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
22
|
-
const ROOT = path.resolve(__dirname, '..', '..');
|
|
23
|
-
const DEFAULT_OUT_DIR = path.join(ROOT, 'temp');
|
|
24
|
-
const TAP_FILE = 'test-profile.tap';
|
|
25
|
-
const SUMMARY_FILE = 'test-profile.summary.txt';
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* @param {string[]} argv
|
|
29
|
-
* @returns {{ outDir: string, topN: number, testArgv: string[] }}
|
|
30
|
-
*/
|
|
31
|
-
export function parseProfileArgv(argv) {
|
|
32
|
-
let outDir = DEFAULT_OUT_DIR;
|
|
33
|
-
let topN = 20;
|
|
34
|
-
const testArgv = [];
|
|
35
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
36
|
-
const arg = argv[i];
|
|
37
|
-
if (arg === '--out-dir' && argv[i + 1]) {
|
|
38
|
-
outDir = path.resolve(argv[i + 1]);
|
|
39
|
-
i += 1;
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
if (arg === '--top' && argv[i + 1]) {
|
|
43
|
-
topN = Number(argv[i + 1]);
|
|
44
|
-
i += 1;
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
testArgv.push(arg);
|
|
48
|
-
}
|
|
49
|
-
if (!Number.isFinite(topN) || topN < 1) {
|
|
50
|
-
throw new Error('[test-profile] --top must be a positive number');
|
|
51
|
-
}
|
|
52
|
-
return { outDir, topN, testArgv };
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* @param {object} [opts]
|
|
57
|
-
* @param {string[]} [opts.argv]
|
|
58
|
-
* @param {string} [opts.cwd]
|
|
59
|
-
* @param {Function} [opts.spawn] - Injected child runner; defaults to the
|
|
60
|
-
* shared surface's real `spawnSync`.
|
|
61
|
-
* @param {typeof fs} [opts.fs]
|
|
62
|
-
*/
|
|
63
|
-
export function runTestProfile({
|
|
64
|
-
argv = process.argv.slice(2),
|
|
65
|
-
cwd = ROOT,
|
|
66
|
-
spawn,
|
|
67
|
-
fs: fsLike = fs,
|
|
68
|
-
} = {}) {
|
|
69
|
-
const { outDir, topN, testArgv } = parseProfileArgv(argv);
|
|
70
|
-
fsLike.mkdirSync(outDir, { recursive: true });
|
|
71
|
-
|
|
72
|
-
// The reporter is a *builder option*, not a suffix. Appended after the
|
|
73
|
-
// file targets it was two more positionals to Node, the default reporter
|
|
74
|
-
// ran, and every profile parsed `Timed entries parsed: 0` off a full
|
|
75
|
-
// suite run. `buildNodeTestArgs` places it in flag position.
|
|
76
|
-
const nodeArgs = buildNodeTestArgs({
|
|
77
|
-
extraArgs: testArgv,
|
|
78
|
-
reporter: 'tap',
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
const started = Date.now();
|
|
82
|
-
const result = spawnChild(process.execPath, nodeArgs, {
|
|
83
|
-
run: spawn,
|
|
84
|
-
cwd,
|
|
85
|
-
encoding: 'utf8',
|
|
86
|
-
env: {
|
|
87
|
-
...buildWebhookSafeTestEnv(process.env),
|
|
88
|
-
SKIP_PREFLIGHT: process.env.SKIP_PREFLIGHT ?? '1',
|
|
89
|
-
FORCE_COLOR: '0',
|
|
90
|
-
NO_COLOR: '1',
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
const wallDurationMs = Date.now() - started;
|
|
94
|
-
|
|
95
|
-
if (result.error) {
|
|
96
|
-
throw result.error;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const tapText = `${result.stdout ?? ''}${result.stderr ?? ''}`;
|
|
100
|
-
const tapPath = path.join(outDir, TAP_FILE);
|
|
101
|
-
const summaryPath = path.join(outDir, SUMMARY_FILE);
|
|
102
|
-
fsLike.writeFileSync(tapPath, tapText, { encoding: 'utf8' });
|
|
103
|
-
|
|
104
|
-
const profile = parseTapOutput(tapText);
|
|
105
|
-
const summary = renderProfileReport(profile, { topN, wallDurationMs });
|
|
106
|
-
fsLike.writeFileSync(summaryPath, summary, { encoding: 'utf8' });
|
|
107
|
-
|
|
108
|
-
process.stdout.write(summary);
|
|
109
|
-
process.stdout.write(`\nWrote ${tapPath}\nWrote ${summaryPath}\n`);
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
exitCode: result.status ?? 1,
|
|
113
|
-
tapPath,
|
|
114
|
-
summaryPath,
|
|
115
|
-
profile,
|
|
116
|
-
wallDurationMs,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
runAsCli(
|
|
121
|
-
import.meta.url,
|
|
122
|
-
async () => {
|
|
123
|
-
const outcome = runTestProfile();
|
|
124
|
-
if (outcome.exitCode !== 0) {
|
|
125
|
-
process.exit(outcome.exitCode);
|
|
126
|
-
}
|
|
127
|
-
},
|
|
128
|
-
{ source: 'run-test-profile' },
|
|
129
|
-
);
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Local full verification — a true CI mirror for the gates that CAN be proven
|
|
6
|
-
* locally, without epic-scoped MI projection or push semantics.
|
|
7
|
-
*
|
|
8
|
-
* Order: audit (SCA) → lint (includes docs:check + the arch-cycles ratchet) →
|
|
9
|
-
* full test suite → unified baselines → the standalone ratchets
|
|
10
|
-
* (dead-exports ×2, context-budget, workflow-citations, cyclomatic,
|
|
11
|
-
* schema-references).
|
|
12
|
-
*
|
|
13
|
-
* The `audit` step runs `npm audit --audit-level=high`, matching CI's
|
|
14
|
-
* "Dependency Vulnerability Audit (SCA)" gate so a local green no longer hides
|
|
15
|
-
* a high-severity advisory that CI would fail on. It is independent of the
|
|
16
|
-
* pre-push `PREPUSH_AUDIT` opt-in, which stays unchanged.
|
|
17
|
-
*
|
|
18
|
-
* The trailing ratchets complete the mirror of CI's "Architecture Cycle Check"
|
|
19
|
-
* step in the `baselines` job (Story #4549). That step runs three checks;
|
|
20
|
-
* `check-arch-cycles.js` is deliberately absent from STEPS because the `lint`
|
|
21
|
-
* step above already runs it (see run-lint.js) — re-running it here would
|
|
22
|
-
* double-pay a gate verify already covers. `check-dead-exports.js` and
|
|
23
|
-
* `check-context-budget.js` had no such cover: they were reachable locally only
|
|
24
|
-
* via the diff-scoped `npm run quality:preview` or a direct invocation, so a
|
|
25
|
-
* clean `verify` could still hide a CI-red — the failure Story #4531 / PR #4548
|
|
26
|
-
* paid for with a full push → CI → fix → push round-trip. Both are pure-Node
|
|
27
|
-
* and baseline-aware, adding ~15s on a cold cache (dominated by knip's
|
|
28
|
-
* full-tree scan in check-dead-exports.js) to a command that already carries
|
|
29
|
-
* the full test suite.
|
|
30
|
-
*
|
|
31
|
-
* Story #5004 closed the last two mirror gaps that were pure omission.
|
|
32
|
-
* `check-cyclomatic.js` (#4923) and `check-schema-references.js` (#4938) were
|
|
33
|
-
* each added to the `baselines` job's standalone-ratchet slot without ever
|
|
34
|
-
* being added here, so a green `verify` still hid both. Like their neighbours
|
|
35
|
-
* they are pure-Node and cost milliseconds.
|
|
36
|
-
*
|
|
37
|
-
* Story #5340 closed the `check-workflow-citations.js` gap the same way, once
|
|
38
|
-
* demoting it to a report made it free: it had been exempted here because
|
|
39
|
-
* `tests/check-workflow-citations.test.js` re-ran the same ratchet, so a
|
|
40
|
-
* `verify` step would have double-paid it. That test now asserts the report,
|
|
41
|
-
* not a ceiling, so the step is the only local surface that prints the count.
|
|
42
|
-
*
|
|
43
|
-
* Still NOT mirrored: `check-baseline-scope.js` runs in CI's `baselines` job
|
|
44
|
-
* only — `.agents/rules/known-tooling-behavior.md` entry 2 carries the current
|
|
45
|
-
* coverage table. (`prune-baseline-orphans.js --check` used to sit in that
|
|
46
|
-
* list; it no longer runs in CI at all — the un-attributed duplicate of the
|
|
47
|
-
* scope gate's `extra` direction reds every open PR on inherited rows.) Nor are the CI gates this command structurally cannot
|
|
48
|
-
* reproduce (action pinning, TruffleHog secret scan) — those are catalogued
|
|
49
|
-
* in docs/ci-contract.md. The nightly full-scope re-score
|
|
50
|
-
* (.github/workflows/baseline-drift.yml) is deliberately outside this
|
|
51
|
-
* mirror too: it re-scores the whole tree, which is the cost `verify` exists
|
|
52
|
-
* to avoid paying on every run.
|
|
53
|
-
*/
|
|
54
|
-
|
|
55
|
-
import { spawnSync } from 'node:child_process';
|
|
56
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* A gate step: `node .agents/scripts/<script>` plus any extra args. Eight of
|
|
60
|
-
* the eleven steps share exactly that shape, so spelling it once leaves the list
|
|
61
|
-
* below readable as what it actually is — a gate *order* — instead of a wall
|
|
62
|
-
* of spawn tuples.
|
|
63
|
-
*
|
|
64
|
-
* @param {string} label reported as `failedStep` when the gate exits non-zero
|
|
65
|
-
* @param {string} script basename under `.agents/scripts/`
|
|
66
|
-
* @param {...string} args extra CLI args
|
|
67
|
-
* @returns {{ label: string, cmd: string, args: string[] }}
|
|
68
|
-
*/
|
|
69
|
-
const gate = (label, script, ...args) => ({
|
|
70
|
-
label,
|
|
71
|
-
cmd: 'node',
|
|
72
|
-
args: [`.agents/scripts/${script}`, ...args],
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
const STEPS = [
|
|
76
|
-
{ label: 'audit', cmd: 'npm', args: ['audit', '--audit-level=high'] },
|
|
77
|
-
{ label: 'lint', cmd: 'npm', args: ['run', 'lint'] },
|
|
78
|
-
{ label: 'test', cmd: 'npm', args: ['test'] },
|
|
79
|
-
gate('baselines', 'check-baselines.js'),
|
|
80
|
-
// Ordered ahead of the dead-exports pair deliberately. When a new CLI is
|
|
81
|
-
// missing from knip.json's entry list, both gates fail — but only this one
|
|
82
|
-
// names the cause. Seeing the ratchet's whole-file diff first is what made
|
|
83
|
-
// "accept the diff" look like the fix during Story #5012.
|
|
84
|
-
gate('knip-entries', 'check-knip-entries.js'),
|
|
85
|
-
gate('dead-exports', 'check-dead-exports.js'),
|
|
86
|
-
gate('dead-exports-production', 'check-dead-exports.js', '--production'),
|
|
87
|
-
gate('context-budget', 'check-context-budget.js'),
|
|
88
|
-
gate('workflow-citations', 'check-workflow-citations.js'),
|
|
89
|
-
gate('cyclomatic', 'check-cyclomatic.js'),
|
|
90
|
-
gate('schema-references', 'check-schema-references.js'),
|
|
91
|
-
];
|
|
92
|
-
|
|
93
|
-
export function runVerifySteps({
|
|
94
|
-
spawn = spawnSync,
|
|
95
|
-
shell = process.platform === 'win32',
|
|
96
|
-
} = {}) {
|
|
97
|
-
for (const step of STEPS) {
|
|
98
|
-
const result = spawn(step.cmd, step.args, {
|
|
99
|
-
stdio: 'inherit',
|
|
100
|
-
shell,
|
|
101
|
-
});
|
|
102
|
-
if (result.error) {
|
|
103
|
-
throw result.error;
|
|
104
|
-
}
|
|
105
|
-
if ((result.status ?? 1) !== 0) {
|
|
106
|
-
return {
|
|
107
|
-
ok: false,
|
|
108
|
-
failedStep: step.label,
|
|
109
|
-
exitCode: result.status ?? 1,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return { ok: true };
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
runAsCli(
|
|
117
|
-
import.meta.url,
|
|
118
|
-
async () => {
|
|
119
|
-
const outcome = runVerifySteps();
|
|
120
|
-
if (!outcome.ok) {
|
|
121
|
-
process.exit(outcome.exitCode);
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
{ source: 'run-verify' },
|
|
125
|
-
);
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* test-isolate — diagnose test-pollution cascades.
|
|
6
|
-
*
|
|
7
|
-
* Runs the matching test files individually (`--test-concurrency=1`,
|
|
8
|
-
* one process per file), then again as a single suite under default
|
|
9
|
-
* concurrency. Files that pass alone but fail in the suite are
|
|
10
|
-
* **flippers**. For each flipper the script binary-bisects the
|
|
11
|
-
* remaining files to surface the smallest reproducing subset (the
|
|
12
|
-
* polluter suspect set).
|
|
13
|
-
*
|
|
14
|
-
* Files whose process exited with leftover `process.env` mutations are
|
|
15
|
-
* called out so an operator can spot global-state leaks at a glance —
|
|
16
|
-
* even when the failure cascade hasn't yet manifested. See
|
|
17
|
-
* `lib/test-isolate/env-snapshot-loader.js`.
|
|
18
|
-
*
|
|
19
|
-
* Usage:
|
|
20
|
-
*
|
|
21
|
-
* node .agents/scripts/test-isolate.js # all tests
|
|
22
|
-
* node .agents/scripts/test-isolate.js 'tests/lib/**' # glob subset
|
|
23
|
-
* node .agents/scripts/test-isolate.js tests/foo.test.js # single file
|
|
24
|
-
*
|
|
25
|
-
* Output: human-readable text by default; pass `--json` for the raw
|
|
26
|
-
* report envelope.
|
|
27
|
-
*
|
|
28
|
-
* **Shell only (Story #5316).** Nothing imports this file, so nothing here is
|
|
29
|
-
* reachable from a test — which is why every function it used to hold scored
|
|
30
|
-
* the CRAP formula's untested maximum. Argv parsing, report rendering,
|
|
31
|
-
* progress logging and the run orchestration now live under
|
|
32
|
-
* `lib/test-isolate/`, beside the `list-files` / `parse-tap` / `runner`
|
|
33
|
-
* modules that were always there. Keep this file a shell: anything with a
|
|
34
|
-
* branch in it belongs next door, where a test can reach it.
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
import path from 'node:path';
|
|
38
|
-
import { fileURLToPath } from 'node:url';
|
|
39
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
40
|
-
import { runTestIsolate } from './lib/test-isolate/run-isolate.js';
|
|
41
|
-
|
|
42
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
43
|
-
const ROOT = path.resolve(__dirname, '..', '..');
|
|
44
|
-
|
|
45
|
-
runAsCli(
|
|
46
|
-
import.meta.url,
|
|
47
|
-
async () => {
|
|
48
|
-
const { exitCode } = await runTestIsolate({
|
|
49
|
-
argv: process.argv.slice(2),
|
|
50
|
-
repoRoot: ROOT,
|
|
51
|
-
});
|
|
52
|
-
if (exitCode !== 0) process.exit(exitCode);
|
|
53
|
-
},
|
|
54
|
-
{ source: 'test-isolate' },
|
|
55
|
-
);
|