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,66 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Audit the board's Projects v2 built-in workflows. `ColumnSync` owns the
|
|
3
|
+
* Status column; built-ins that also write it land after the orchestrator
|
|
4
|
+
* and leave closed Stories stuck `In Progress`.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `transitionTicketState` call and documents "I own Status" at
|
|
9
|
-
* [`column-sync.js:21-27`]. GitHub Projects v2 ships several built-in
|
|
10
|
-
* workflows that *also* write the Status column as side-effects of
|
|
11
|
-
* issue / PR events. When both are enabled, the bot frequently gets
|
|
12
|
-
* the last write on `agent::done` transitions (PR merged ~2 minutes
|
|
13
|
-
* after the orchestrator's flip), leaving closed Stories stuck at
|
|
14
|
-
* `In Progress` on the board even though the issue is closed and
|
|
15
|
-
* labeled `agent::done`. Reproduced on Story #2813.
|
|
16
|
-
*
|
|
17
|
-
* Surface:
|
|
18
|
-
* - {@link CONFLICTING_WORKFLOWS} / {@link COMPATIBLE_WORKFLOWS} —
|
|
19
|
-
* frozen allowlists keyed by GitHub's built-in workflow `name`
|
|
20
|
-
* field.
|
|
21
|
-
* - {@link auditProjectWorkflows} — pure-ish (one GraphQL read) that
|
|
22
|
-
* classifies the project's currently-enabled workflows and returns
|
|
23
|
-
* a structured envelope.
|
|
24
|
-
* - {@link reapConflictingWorkflows} — opt-in destructive helper
|
|
25
|
-
* that issues `deleteProjectV2Workflow` for every entry in the
|
|
26
|
-
* audit's `conflicting` set. Fails fast on the first mutation
|
|
27
|
-
* error (no partial-reap state).
|
|
28
|
-
*
|
|
29
|
-
* GraphQL surface note:
|
|
30
|
-
* `ProjectV2Workflow` exposes `enabled` as `NON_NULL` but **read-only**
|
|
31
|
-
* — GraphQL ships no `updateProjectV2Workflow` mutation at the time
|
|
32
|
-
* of this Story. The only programmatic action is
|
|
33
|
-
* `deleteProjectV2Workflow`, which is irreversible from the API
|
|
34
|
-
* (the operator must re-create deleted built-ins from the GitHub UI).
|
|
35
|
-
* If GitHub later adds a toggle mutation, swap delete for toggle in
|
|
36
|
-
* {@link reapConflictingWorkflows}.
|
|
6
|
+
* GraphQL exposes `enabled` read-only, so the only remedy is the irreversible
|
|
7
|
+
* `deleteProjectV2Workflow`; swap to a toggle if GitHub ever adds one.
|
|
37
8
|
*/
|
|
38
9
|
|
|
39
10
|
import { resolveProjectMeta } from '../orchestration/project-meta-resolver.js';
|
|
40
11
|
|
|
41
|
-
/**
|
|
42
|
-
* Workflows that **must not** be enabled when the orchestrator owns
|
|
43
|
-
* the Status column. Each entry writes Status as a side-effect of an
|
|
44
|
-
* event the orchestrator already handles (close, PR merge, PR link),
|
|
45
|
-
* and the bot's write typically arrives *after* the orchestrator's
|
|
46
|
-
* — clobbering the intended terminal state.
|
|
47
|
-
*
|
|
48
|
-
* Names match GitHub's built-in `ProjectV2Workflow.name` literals.
|
|
49
|
-
*/
|
|
12
|
+
/** Built-ins whose Status writes clobber the orchestrator's; `ProjectV2Workflow.name` literals. */
|
|
50
13
|
export const CONFLICTING_WORKFLOWS = Object.freeze([
|
|
51
14
|
'Pull request merged',
|
|
52
15
|
'Pull request linked to issue',
|
|
53
16
|
]);
|
|
54
17
|
|
|
55
|
-
/**
|
|
56
|
-
* Workflows that are safe to leave on. Either they don't touch the
|
|
57
|
-
* Status column, or they touch it in a way the orchestrator's writes
|
|
58
|
-
* agree with (`Item closed` sets Status to `Done`, which matches
|
|
59
|
-
* `agent::done`).
|
|
60
|
-
*
|
|
61
|
-
* Surfaced informationally in the audit envelope so operators can see
|
|
62
|
-
* what was inspected without re-querying.
|
|
63
|
-
*/
|
|
18
|
+
/** Built-ins that leave Status alone or agree with the orchestrator. */
|
|
64
19
|
export const COMPATIBLE_WORKFLOWS = Object.freeze([
|
|
65
20
|
'Item closed',
|
|
66
21
|
'Item added to project',
|
|
@@ -91,10 +46,6 @@ const DELETE_WORKFLOW_MUTATION = `
|
|
|
91
46
|
}`;
|
|
92
47
|
|
|
93
48
|
/**
|
|
94
|
-
* Classify a single workflow row against the allowlists.
|
|
95
|
-
*
|
|
96
|
-
* Pure helper — exported for test pinning.
|
|
97
|
-
*
|
|
98
49
|
* @param {{ name: string, enabled: boolean }} workflow
|
|
99
50
|
* @returns {'conflicting'|'compatible'|'unknown'|'disabled-conflicting'|'disabled-other'}
|
|
100
51
|
*/
|
|
@@ -111,10 +62,6 @@ export function classifyWorkflow(workflow) {
|
|
|
111
62
|
}
|
|
112
63
|
|
|
113
64
|
/**
|
|
114
|
-
* Query the project's built-in workflows and classify each one. Returns
|
|
115
|
-
* a structured envelope the bootstrap step can render and the reap
|
|
116
|
-
* helper can act on.
|
|
117
|
-
*
|
|
118
65
|
* @param {{
|
|
119
66
|
* provider: { graphql: Function },
|
|
120
67
|
* projectId: string,
|
|
@@ -163,15 +110,8 @@ export async function auditProjectWorkflows(args) {
|
|
|
163
110
|
}
|
|
164
111
|
|
|
165
112
|
/**
|
|
166
|
-
* Delete every workflow
|
|
167
|
-
* the
|
|
168
|
-
* rather than producing a partially-reaped board, because the operator
|
|
169
|
-
* cannot easily tell which workflows were deleted versus which were
|
|
170
|
-
* preserved when looking at the post-failure board state.
|
|
171
|
-
*
|
|
172
|
-
* Returns the per-workflow outcome so callers can log a deterministic
|
|
173
|
-
* summary even on partial success (the failure path will throw, but the
|
|
174
|
-
* happy path returns the full ordered list for printing).
|
|
113
|
+
* Delete every conflicting workflow; fails fast, naming what was already
|
|
114
|
+
* deleted, since the board alone cannot tell the operator.
|
|
175
115
|
*
|
|
176
116
|
* @param {{
|
|
177
117
|
* provider: { graphql: Function },
|
|
@@ -209,18 +149,8 @@ export async function reapConflictingWorkflows(args) {
|
|
|
209
149
|
}
|
|
210
150
|
|
|
211
151
|
/**
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
* id required by {@link auditProjectWorkflows}.
|
|
215
|
-
*
|
|
216
|
-
* Walks the shared owner-type ladder — `organization(login:$owner)` →
|
|
217
|
-
* `user(login:$owner)` → `viewer` — via {@link resolveProjectMeta}, so an
|
|
218
|
-
* **org-owned** board resolves here the same way it does for `ColumnSync`
|
|
219
|
-
* (Story #4237). The owner login is read from `provider.projectOwner`
|
|
220
|
-
* (explicit board owner) and falls back to `provider.owner` (the repo
|
|
221
|
-
* owner) so org boards resolve even when no separate `projectOwner` is
|
|
222
|
-
* configured. Returns `null` when no owner scope can see the project
|
|
223
|
-
* (e.g. missing scope) so the caller can degrade gracefully.
|
|
152
|
+
* Walks the shared org → user → viewer ladder so org-owned boards resolve as
|
|
153
|
+
* they do for `ColumnSync`. `null` when no owner scope sees the project.
|
|
224
154
|
*
|
|
225
155
|
* @param {{
|
|
226
156
|
* provider: { graphql: Function, owner?: string|null, projectOwner?: string|null },
|
|
@@ -254,9 +184,6 @@ export async function resolveProjectIdByNumber(args) {
|
|
|
254
184
|
}
|
|
255
185
|
|
|
256
186
|
/**
|
|
257
|
-
* Render a human-readable summary line for the audit. Pure — exported
|
|
258
|
-
* so the bootstrap CLI and tests share the same formatting.
|
|
259
|
-
*
|
|
260
187
|
* @param {Awaited<ReturnType<typeof auditProjectWorkflows>>} audit
|
|
261
188
|
* @returns {string}
|
|
262
189
|
*/
|
|
@@ -1,27 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* logic that previously lived in `git-branch-lifecycle.js` and
|
|
7
|
-
* `git-branch-cleanup.js`, so the two sites cannot drift apart.
|
|
8
|
-
*
|
|
9
|
-
* The default check is the **union** of every assertion either previous
|
|
10
|
-
* site performed:
|
|
11
|
-
* - reject `null` / `undefined` / non-string values
|
|
12
|
-
* - reject empty string
|
|
13
|
-
* - reject any character outside `[a-zA-Z0-9._\-/]` (catches whitespace,
|
|
14
|
-
* shell metacharacters, glob characters, etc.)
|
|
15
|
-
* - reject leading `-` (would otherwise be parsed as a CLI flag by git,
|
|
16
|
-
* even though the regex character class allows hyphens elsewhere)
|
|
17
|
-
*
|
|
18
|
-
* Callers performing destructive operations (`branch -D`, `push --delete`)
|
|
19
|
-
* can opt into the protected-branch deny list by passing `{ protected: true }`,
|
|
20
|
-
* which additionally rejects `main`, `master`, `HEAD`, and any name
|
|
21
|
-
* starting with `refs/`.
|
|
22
|
-
*
|
|
23
|
-
* All exports are pure: they read no config, spawn no subprocesses, and
|
|
24
|
-
* make no network calls.
|
|
2
|
+
* The one check that a string is safe to pass to `git` as a branch name:
|
|
3
|
+
* a non-empty string of `[a-zA-Z0-9._\-/]` with no leading `-` (git would
|
|
4
|
+
* read it as a flag). Destructive callers pass `{ protected: true }` to also
|
|
5
|
+
* reject `main`, `master`, `HEAD` and `refs/*`. Pure.
|
|
25
6
|
*/
|
|
26
7
|
|
|
27
8
|
import { isSafeBranchComponent } from './dependency-parser.js';
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { createGitInterface } from './git-utils.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* The single rule for the ref a pre-push step diffs against: a named ref
|
|
5
|
+
* wins, then `crap.incrementalCoverage.baseRef`, then `main`. The named ref
|
|
6
|
+
* must win so coverage capture and the CRAP preview score the same change
|
|
7
|
+
* set. Every consumer routes through here rather than reading `baseRef`.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
* @param {{ crap: object, ref: string | null | undefined }} opts
|
|
10
|
+
* @returns {string}
|
|
11
|
+
*/
|
|
12
|
+
export function resolveChangedFilesRef({ crap, ref }) {
|
|
13
|
+
return ref ?? crap?.incrementalCoverage?.baseRef ?? 'main';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Forward-slash separators so set membership matches scorer paths on Windows.
|
|
17
18
|
*
|
|
18
19
|
* @param {string | null | undefined} stdout
|
|
19
20
|
* @returns {string[]}
|
|
@@ -28,30 +29,16 @@ function parseNameOnlyStdout(stdout) {
|
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
/**
|
|
31
|
-
*
|
|
32
|
-
* forward-slash-normalised file list. Throws on non-zero git exit so callers
|
|
33
|
-
* that must fail-closed can propagate the error; callers that prefer
|
|
34
|
-
* best-effort behaviour wrap this in a try/catch.
|
|
35
|
-
*
|
|
36
|
-
* Accepts either a pre-built `range` string **or** `baseRef`+`headRef`
|
|
37
|
-
* (assembled into `<baseRef>...<headRef>` when `threeDot` is true, or
|
|
38
|
-
* `<baseRef>..<headRef>` otherwise). When both `range` and
|
|
39
|
-
* `baseRef`/`headRef` are supplied, `range` takes precedence.
|
|
40
|
-
*
|
|
41
|
-
* The `gitSpawn` injection matches the signature used by `createGitInterface`:
|
|
42
|
-
* `(cwd: string, ...gitArgs: string[]) => { status: number, stdout: string, stderr: string }`.
|
|
43
|
-
* Production callers omit it (the default uses `createGitInterface({})`);
|
|
44
|
-
* tests pass a stub.
|
|
32
|
+
* `git diff --name-only`; `range` wins over `baseRef`/`headRef`.
|
|
45
33
|
*
|
|
46
34
|
* @param {object} params
|
|
47
|
-
* @param {string} [params.range]
|
|
48
|
-
* @param {string} [params.baseRef]
|
|
49
|
-
* @param {string} [params.headRef='HEAD']
|
|
50
|
-
* @param {boolean} [params.threeDot=true]
|
|
51
|
-
* when `range` is absent. Set to `false` for a two-dot direct diff.
|
|
35
|
+
* @param {string} [params.range]
|
|
36
|
+
* @param {string} [params.baseRef]
|
|
37
|
+
* @param {string} [params.headRef='HEAD']
|
|
38
|
+
* @param {boolean} [params.threeDot=true] Merge-base (`...`) semantics.
|
|
52
39
|
* @param {string} [params.cwd=process.cwd()]
|
|
53
40
|
* @param {((cwd: string, ...args: string[]) => { status: number, stdout: string, stderr: string }) | null} [params.gitSpawn]
|
|
54
|
-
* @returns {string[]}
|
|
41
|
+
* @returns {string[]}
|
|
55
42
|
* @throws {Error} When git exits non-zero.
|
|
56
43
|
*/
|
|
57
44
|
export function diffNameOnly({
|
|
@@ -76,35 +63,16 @@ export function diffNameOnly({
|
|
|
76
63
|
}
|
|
77
64
|
|
|
78
65
|
/**
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* `--changed-since <ref>` diff-scoped mode — the quality gates limit both
|
|
83
|
-
* scoring and comparison to this file set so the pre-push / PR CI feedback
|
|
84
|
-
* loop stays fast on large consumer repos.
|
|
85
|
-
*
|
|
86
|
-
* Semantics:
|
|
87
|
-
* - Runs `git diff --name-only <ref>...HEAD` so the comparison is against
|
|
88
|
-
* the merge-base (three-dot range). This matches how GitHub computes the
|
|
89
|
-
* "files changed" view for a PR and deliberately excludes anything that
|
|
90
|
-
* was merged into the base branch after the PR branched off.
|
|
91
|
-
* - Returns relative paths with forward-slash separators so set-membership
|
|
92
|
-
* checks line up with the normalized paths produced by `scanAndScore` and
|
|
93
|
-
* `calculateAll` on Windows checkouts.
|
|
94
|
-
* - A non-zero git exit is surfaced as a thrown Error — `--changed-since`
|
|
95
|
-
* must **never** silently degrade to "no regressions found"; that is the
|
|
96
|
-
* entire reason the CLIs fail closed on a bad ref.
|
|
66
|
+
* Files changed on `ref...HEAD` (merge-base, like a PR's "files changed").
|
|
67
|
+
* Throws on a bad ref: `--changed-since` must never degrade to "no
|
|
68
|
+
* regressions found".
|
|
97
69
|
*
|
|
98
70
|
* @param {object} [params]
|
|
99
|
-
* @param {string} [params.ref='main']
|
|
100
|
-
* @param {string} [params.cwd=process.cwd()]
|
|
101
|
-
* @param {ReturnType<typeof createGitInterface>} [params.git]
|
|
102
|
-
*
|
|
103
|
-
* @
|
|
104
|
-
* whatever `git diff --name-only` produces (stable per invocation).
|
|
105
|
-
* @throws {Error} When git exits non-zero (unresolvable ref, corrupt repo,
|
|
106
|
-
* etc.). The error message names the ref so the operator can react without
|
|
107
|
-
* re-reading the CLI flags.
|
|
71
|
+
* @param {string} [params.ref='main']
|
|
72
|
+
* @param {string} [params.cwd=process.cwd()]
|
|
73
|
+
* @param {ReturnType<typeof createGitInterface>} [params.git]
|
|
74
|
+
* @returns {string[]}
|
|
75
|
+
* @throws {Error} When git exits non-zero.
|
|
108
76
|
*/
|
|
109
77
|
export function getChangedFiles({
|
|
110
78
|
ref = 'main',
|
|
@@ -122,43 +90,17 @@ export function getChangedFiles({
|
|
|
122
90
|
return parseNameOnlyStdout(res.stdout);
|
|
123
91
|
}
|
|
124
92
|
|
|
125
|
-
/**
|
|
126
|
-
* A full-length hex object id, as `git rev-parse` prints it. Used to reject
|
|
127
|
-
* anything that is not a resolved commit — a stubbed git interface in a test
|
|
128
|
-
* answers every `gitSpawn` with the same canned stdout, and a file list must
|
|
129
|
-
* never be mistaken for a merge head.
|
|
130
|
-
*/
|
|
93
|
+
/** A full object id; rejects canned stub output posing as a merge head. */
|
|
131
94
|
const OBJECT_ID_RE = /^[0-9a-f]{40}(?:[0-9a-f]{24})?$/;
|
|
132
95
|
|
|
133
96
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* Story #5131. `git diff --cached` with no commit argument diffs the index
|
|
138
|
-
* against `HEAD`, and during a merge `HEAD` is still the pre-merge tip — so a
|
|
139
|
-
* base-sync merge commit (`git merge --no-edit origin/<base>`, which
|
|
140
|
-
* `single-story-close`'s base-sync phase tells the operator to run by hand)
|
|
141
|
-
* put every file the base branch had landed into the staged scope. The
|
|
142
|
-
* pre-commit MI/CRAP gate then blocked the resolution commit for deltas
|
|
143
|
-
* belonging to already-landed, already-gated work, with no remedy: the preview
|
|
144
|
-
* is a delta against the baseline, not a baseline comparison, so no baseline
|
|
145
|
-
* refresh could silence it.
|
|
146
|
-
*
|
|
147
|
-
* Two details are load-bearing:
|
|
97
|
+
* The commit an in-progress merge is merging in, or `null`. During a merge
|
|
98
|
+
* `HEAD` is the pre-merge tip, so a plain `--cached` diff would pull the base
|
|
99
|
+
* branch's landed work into the staged scope.
|
|
148
100
|
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* where deliveries happen. `rev-parse --verify` resolves the ref through
|
|
153
|
-
* git's own worktree-aware lookup.
|
|
154
|
-
* - **`--verify` fails closed on an octopus merge.** It refuses a
|
|
155
|
-
* `MERGE_HEAD` naming more than one head, which lands here as `null` — the
|
|
156
|
-
* pre-#5131 behaviour. Narrowing the scope wrongly would hide a real
|
|
157
|
-
* regression; widening it only restores the status quo.
|
|
158
|
-
*
|
|
159
|
-
* Never throws: a merge is either detectable or it is not, and an
|
|
160
|
-
* undetectable one must degrade to the plain cached diff rather than fail the
|
|
161
|
-
* gate.
|
|
101
|
+
* Ask git, never the filesystem: in a linked worktree `.git` is a file. An
|
|
102
|
+
* octopus `MERGE_HEAD` fails `--verify` and yields `null` (wider scope is
|
|
103
|
+
* safe; wrongly narrower would hide a regression). Never throws.
|
|
162
104
|
*
|
|
163
105
|
* @param {object} [params]
|
|
164
106
|
* @param {string} [params.cwd=process.cwd()]
|
|
@@ -179,10 +121,6 @@ export function resolveMergeHead({ cwd = process.cwd(), git } = {}) {
|
|
|
179
121
|
}
|
|
180
122
|
|
|
181
123
|
/**
|
|
182
|
-
* Read the index file list against an explicit base, shared by
|
|
183
|
-
* `getStagedFiles` and `resolvePreviewScope` so the merge head is resolved
|
|
184
|
-
* once per scope resolution rather than once per caller.
|
|
185
|
-
*
|
|
186
124
|
* @param {object} params
|
|
187
125
|
* @param {string} params.cwd
|
|
188
126
|
* @param {ReturnType<typeof createGitInterface>} params.git
|
|
@@ -201,21 +139,9 @@ function stagedFilesAgainst({ cwd, git, mergeHead }) {
|
|
|
201
139
|
}
|
|
202
140
|
|
|
203
141
|
/**
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* Semantics:
|
|
209
|
-
* - Runs `git diff --name-only --cached`, which diffs the index against
|
|
210
|
-
* `HEAD`.
|
|
211
|
-
* - **During a merge**, diffs the index against `MERGE_HEAD` instead
|
|
212
|
-
* (Story #5131), so the scope is the merging branch's own contribution
|
|
213
|
-
* plus its conflict resolutions — not the base branch's incoming work.
|
|
214
|
-
* `git merge-base HEAD MERGE_HEAD` would *not* do: diffing the index
|
|
215
|
-
* against the fork point re-admits everything the base branch landed since
|
|
216
|
-
* it, which is the whole defect.
|
|
217
|
-
* - Returns forward-slash-normalized repo-relative paths.
|
|
218
|
-
* - Non-zero git exit throws — staged mode must not silently widen scope.
|
|
142
|
+
* Staged paths. During a merge the index is diffed against `MERGE_HEAD`, not
|
|
143
|
+
* the merge-base (which would re-admit everything the base landed since the
|
|
144
|
+
* fork). Throws on git failure rather than widen scope.
|
|
219
145
|
*
|
|
220
146
|
* @param {object} [params]
|
|
221
147
|
* @param {string} [params.cwd=process.cwd()]
|
|
@@ -232,16 +158,8 @@ export function getStagedFiles({ cwd = process.cwd(), git } = {}) {
|
|
|
232
158
|
}
|
|
233
159
|
|
|
234
160
|
/**
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
* When `staged` is true, only index paths are returned and `changedSinceRef`
|
|
238
|
-
* is ignored. Otherwise a `changedSinceRef` limits to that three-dot diff;
|
|
239
|
-
* when both are absent the caller runs in full-repo mode (`scopeSet: null`).
|
|
240
|
-
*
|
|
241
|
-
* In `staged` scope, `diffRef` carries the in-progress merge head when there
|
|
242
|
-
* is one (Story #5131) and `null` otherwise, so a caller can tell the operator
|
|
243
|
-
* *why* the scope narrowed. `scope` stays `'staged'` either way — the merge is
|
|
244
|
-
* a property of the base the index is read against, not a different mode.
|
|
161
|
+
* `staged` wins over `changedSinceRef`; neither means full scope. In staged
|
|
162
|
+
* scope `diffRef` is the merge head, if any.
|
|
245
163
|
*
|
|
246
164
|
* @param {object} [params]
|
|
247
165
|
* @param {boolean} [params.staged=false]
|
|
@@ -1,32 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* core
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* to `true`. This guards the old failure mode where an `npm test` path
|
|
6
|
-
* mis-set `core.bare=true` on the main checkout, after which
|
|
7
|
-
* `single-story-close.js`'s post-rebase `git checkout` aborted with
|
|
8
|
-
* `fatal: this operation must be run in a work tree`. `cleanGitEnv`
|
|
9
|
-
* already lands the live fix; this check is the regression guard.
|
|
10
|
-
*
|
|
11
|
-
* Severity is `blocker` because single-story-close cannot recover on its own
|
|
12
|
-
* — the operator must run `git config --unset core.bare` (or rely on
|
|
13
|
-
* `cleanGitEnv` to do it before the rebase). The check is
|
|
14
|
-
* refuse-and-print: the `fixCommand` is the literal unset, and the
|
|
15
|
-
* operator runs it deliberately. We do not auto-fix because mutating
|
|
16
|
-
* the parent repo's git config from a check is exactly the
|
|
17
|
-
* "no commits to integration branches" cousin of the autoCorrect
|
|
18
|
-
* disallowed list — config writes outside the local worktree boundary.
|
|
19
|
-
*
|
|
20
|
-
* Detection reads `state.git.coreBare`, the string returned by
|
|
21
|
-
* `git config --get core.bare` (or `null` when unset). The check fires
|
|
22
|
-
* when the string is the literal `'true'`.
|
|
2
|
+
* Blocks on `core.bare=true` in the main checkout, which aborts close's
|
|
3
|
+
* post-rebase checkout (`cleanGitEnv` is the live fix; this is the regression
|
|
4
|
+
* guard). Refuse-and-print: a check must not write config outside its worktree.
|
|
23
5
|
*/
|
|
24
6
|
export default {
|
|
25
7
|
id: 'core-bare-clean',
|
|
26
8
|
severity: 'blocker',
|
|
27
|
-
// 'npm-test'
|
|
28
|
-
// poisoned shared config is caught before a suite (or N concurrent
|
|
29
|
-
// /mandrel-deliver workers) inherits it, not only at close/retro time (#4580).
|
|
9
|
+
// 'npm-test' catches a poisoned shared config before a suite inherits it.
|
|
30
10
|
scope: ['story-close', 'retro', 'npm-test'],
|
|
31
11
|
autoCorrect: 'refuse-and-print',
|
|
32
12
|
detect(state) {
|
|
@@ -1,49 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `mandrel-update-preflight.js`, the
|
|
7
|
-
* `npm test` wrapper, the `diagnose.js` CLI viewer, and the retro hook in
|
|
8
|
-
* `retro-runner.js`). Each surface calls `runChecks({ scope, autoFix, state })`
|
|
9
|
-
* with its own scope and gets back `{ findings, fixed }`.
|
|
10
|
-
*
|
|
11
|
-
* Registry shape (each sibling module exports):
|
|
12
|
-
*
|
|
13
|
-
* {
|
|
14
|
-
* id: string,
|
|
15
|
-
* severity: 'blocker' | 'warning' | 'info',
|
|
16
|
-
* scope: string[], // may include 'retro'
|
|
17
|
-
* autoCorrect: 'auto' | 'refuse-and-print',
|
|
18
|
-
* detect(state): Promise<Finding | null>,
|
|
19
|
-
* fix?(state): Promise<{ ok: boolean, message: string }>,
|
|
20
|
-
* }
|
|
21
|
-
*
|
|
22
|
-
* Invariants enforced here (defense-in-depth — see README for the full
|
|
23
|
-
* contract):
|
|
24
|
-
*
|
|
25
|
-
* 1. `scope === 'retro'` is read-only. `runChecks({ scope: 'retro',
|
|
26
|
-
* autoFix: true })` throws `'retro scope is read-only: autoFix must
|
|
27
|
-
* be false'` before any check runs. The retro-runner relies on this
|
|
28
|
-
* to keep retro stateless even if a future call site flips the flag.
|
|
29
|
-
*
|
|
30
|
-
* 2. `autoCorrect: 'refuse-and-print'` is hard-refusal. The runner will
|
|
31
|
-
* NEVER invoke a check's `fix()` unless `autoCorrect === 'auto'`,
|
|
32
|
-
* even if the check author later adds a `fix` body. This is what
|
|
33
|
-
* makes new fix implementations harmless until their author also
|
|
34
|
-
* opts in.
|
|
35
|
-
*
|
|
36
|
-
* 3. Phase split: `detect()` invocations fan out concurrently via
|
|
37
|
-
* `Promise.all` (Story #2463 — preflight subprocess batching), while
|
|
38
|
-
* `fix()` invocations remain strictly serial. `detect()` is
|
|
39
|
-
* read-only against the frozen `assembleState` object, so concurrent
|
|
40
|
-
* reads cannot race it; `fix()` may mutate the worktree, so its
|
|
41
|
-
* ordering is preserved by walking the registry-ordered findings
|
|
42
|
-
* array sequentially.
|
|
43
|
-
*
|
|
44
|
-
* Discovery happens once per process via `loadRegistry()`. The result is
|
|
45
|
-
* cached; `clearRegistryCache()` is exported for tests that want to
|
|
46
|
-
* exercise a different fixture directory.
|
|
2
|
+
* Discovery-based registry and runner for self-healing checks; every surface
|
|
3
|
+
* calls `runChecks({ scope, autoFix, state })`. Invariants: `retro` scope is
|
|
4
|
+
* read-only; `fix()` runs only when `autoCorrect === 'auto'`; `detect()` fans
|
|
5
|
+
* out concurrently, `fix()` stays serial.
|
|
47
6
|
*/
|
|
48
7
|
|
|
49
8
|
import { readdirSync, statSync } from 'node:fs';
|
|
@@ -85,40 +44,24 @@ const __filename = fileURLToPath(import.meta.url);
|
|
|
85
44
|
const __dirname = path.dirname(__filename);
|
|
86
45
|
|
|
87
46
|
/**
|
|
88
|
-
*
|
|
89
|
-
* loaded from so tests with fixture directories don't poison the cache
|
|
90
|
-
* for the real `lib/checks/` directory.
|
|
47
|
+
* Keyed by absolute directory so fixture registries never poison the real one.
|
|
91
48
|
*
|
|
92
49
|
* @type {Map<string, Check[]>}
|
|
93
50
|
*/
|
|
94
51
|
const registryCache = new Map();
|
|
95
52
|
|
|
96
|
-
/**
|
|
97
|
-
* Module names that are part of the runner infrastructure, not checks.
|
|
98
|
-
* `loadRegistry()` filters these out of the readdir scan.
|
|
99
|
-
*
|
|
100
|
-
* @type {Set<string>}
|
|
101
|
-
*/
|
|
53
|
+
/** @type {Set<string>} */
|
|
102
54
|
const NON_CHECK_FILES = new Set(['index.js', 'state.js']);
|
|
103
55
|
|
|
104
|
-
/**
|
|
105
|
-
* Clear the registry cache. Tests call this between cases that load from
|
|
106
|
-
* a fixture directory so a fresh registry is observed.
|
|
107
|
-
*/
|
|
108
56
|
export function clearRegistryCache() {
|
|
109
57
|
registryCache.clear();
|
|
110
58
|
}
|
|
111
59
|
|
|
112
60
|
/**
|
|
113
|
-
*
|
|
114
|
-
* module lives in (`lib/checks/`). Synchronously enumerates `.js` files,
|
|
115
|
-
* filters out the runner infrastructure (`index.js`, `state.js`), and
|
|
116
|
-
* dynamically imports each remaining file. Each module must default-export
|
|
117
|
-
* a check object (see contract above).
|
|
61
|
+
* Import every check module in `dir`; each must default-export a {@link Check}.
|
|
118
62
|
*
|
|
119
63
|
* @param {object} [opts]
|
|
120
|
-
* @param {string} [opts.dir]
|
|
121
|
-
* from a fixture directory.
|
|
64
|
+
* @param {string} [opts.dir]
|
|
122
65
|
* @returns {Promise<Check[]>}
|
|
123
66
|
*/
|
|
124
67
|
export async function loadRegistry({ dir = __dirname } = {}) {
|
|
@@ -130,10 +73,7 @@ export async function loadRegistry({ dir = __dirname } = {}) {
|
|
|
130
73
|
try {
|
|
131
74
|
entries = readdirSync(absDir);
|
|
132
75
|
} catch {
|
|
133
|
-
// No directory → empty registry
|
|
134
|
-
// returns `{ findings: [], fixed: [] }` for every scope. This is the
|
|
135
|
-
// shape the diagnose viewer expects when invoked on a fresh checkout
|
|
136
|
-
// before any check modules have been authored.
|
|
76
|
+
// No directory → empty registry, not an error.
|
|
137
77
|
registryCache.set(absDir, []);
|
|
138
78
|
return [];
|
|
139
79
|
}
|
|
@@ -162,9 +102,6 @@ export async function loadRegistry({ dir = __dirname } = {}) {
|
|
|
162
102
|
}
|
|
163
103
|
|
|
164
104
|
/**
|
|
165
|
-
* Look up a single check by id from the default registry. Returns
|
|
166
|
-
* `undefined` if no check has that id.
|
|
167
|
-
*
|
|
168
105
|
* @param {string} id
|
|
169
106
|
* @param {object} [opts]
|
|
170
107
|
* @param {string} [opts.dir]
|
|
@@ -176,19 +113,12 @@ export async function getCheck(id, opts) {
|
|
|
176
113
|
}
|
|
177
114
|
|
|
178
115
|
/**
|
|
179
|
-
* Run all checks matching `scope` against `state`. The retro-readonly and
|
|
180
|
-
* refuse-and-print invariants are enforced here, not in the check
|
|
181
|
-
* modules — see the JSDoc on the file for the rationale.
|
|
182
|
-
*
|
|
183
116
|
* @param {object} opts
|
|
184
|
-
* @param {string} [opts.scope]
|
|
185
|
-
*
|
|
186
|
-
* @param {
|
|
187
|
-
*
|
|
188
|
-
* @param {
|
|
189
|
-
* @param {object} [opts.registry] Pre-loaded registry — bypasses
|
|
190
|
-
* `loadRegistry()`. Used by tests with fixture checks.
|
|
191
|
-
* @param {string} [opts.dir] Fixture directory for `loadRegistry`.
|
|
117
|
+
* @param {string} [opts.scope] Omitted runs every check.
|
|
118
|
+
* @param {boolean} [opts.autoFix=false] Forbidden when `scope === 'retro'`.
|
|
119
|
+
* @param {object} opts.state From `assembleState()`.
|
|
120
|
+
* @param {object} [opts.registry] Pre-loaded registry.
|
|
121
|
+
* @param {string} [opts.dir]
|
|
192
122
|
* @returns {Promise<{ findings: Finding[], fixed: Array<Finding & { fixResult: FixResult }> }>}
|
|
193
123
|
*/
|
|
194
124
|
export async function runChecks({
|
|
@@ -206,12 +136,8 @@ export async function runChecks({
|
|
|
206
136
|
? checks.filter((c) => Array.isArray(c.scope) && c.scope.includes(scope))
|
|
207
137
|
: checks;
|
|
208
138
|
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
// `assembleState()`, so concurrent reads are race-free. Promise.all
|
|
212
|
-
// preserves input order in its resolved array, so the
|
|
213
|
-
// findings-by-registry-order contract that downstream consumers rely on
|
|
214
|
-
// is upheld even though the detects themselves overlap in flight.
|
|
139
|
+
// `state` is frozen, so concurrent detects are race-free; Promise.all keeps
|
|
140
|
+
// registry order.
|
|
215
141
|
const detected = await Promise.all(
|
|
216
142
|
filtered.map((check) => Promise.resolve(check.detect(state))),
|
|
217
143
|
);
|
|
@@ -221,16 +147,12 @@ export async function runChecks({
|
|
|
221
147
|
/** @type {Array<Finding & { fixResult: FixResult }>} */
|
|
222
148
|
const fixed = [];
|
|
223
149
|
|
|
224
|
-
//
|
|
225
|
-
// detection results and apply fix() one at a time. fix() may mutate the
|
|
226
|
-
// worktree (delete branches, rewrite refs), so running it concurrently
|
|
227
|
-
// would race those mutations and scramble logs.
|
|
150
|
+
// fix() mutates the worktree, so it runs serially.
|
|
228
151
|
for (let i = 0; i < filtered.length; i += 1) {
|
|
229
152
|
const check = filtered[i];
|
|
230
153
|
const finding = detected[i];
|
|
231
154
|
if (!finding) continue;
|
|
232
|
-
//
|
|
233
|
-
// regardless of whether the author defined one. The flag is the gate.
|
|
155
|
+
// refuse-and-print never runs fix(), even if one is defined.
|
|
234
156
|
if (
|
|
235
157
|
autoFix &&
|
|
236
158
|
check.autoCorrect === 'auto' &&
|
|
@@ -241,8 +163,6 @@ export async function runChecks({
|
|
|
241
163
|
fixed.push({ ...finding, fixResult: result });
|
|
242
164
|
continue;
|
|
243
165
|
}
|
|
244
|
-
// fix() ran and failed → surface the finding as unfixed so the
|
|
245
|
-
// operator sees both the original problem AND the failure detail.
|
|
246
166
|
findings.push({
|
|
247
167
|
...finding,
|
|
248
168
|
detail: [
|
|
@@ -260,9 +180,6 @@ export async function runChecks({
|
|
|
260
180
|
}
|
|
261
181
|
|
|
262
182
|
/**
|
|
263
|
-
* Shape-validate a check module. Used by `loadRegistry()` to fail fast on
|
|
264
|
-
* malformed modules rather than crashing later inside `runChecks()`.
|
|
265
|
-
*
|
|
266
183
|
* @param {unknown} candidate
|
|
267
184
|
* @returns {candidate is Check}
|
|
268
185
|
*/
|