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,29 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// .agents/scripts/lint-issue-body.js
|
|
3
3
|
/**
|
|
4
|
-
* Issue
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `type::story` issue body and reports whether the body
|
|
8
|
-
* round-trips. This is the drift guard between the generated GitHub Issue
|
|
9
|
-
* Forms (`lib/bootstrap/issue-forms-template.js`) and the parser: if a
|
|
10
|
-
* human files a ticket whose body `parse()` rejects (or which lacks the
|
|
11
|
-
* binding `goal` / `acceptance` / `verify` sections), the lint surfaces a
|
|
12
|
-
* **comment** on the issue rather than failing silently — the supported
|
|
13
|
-
* human entry points (`/mandrel-plan` from an existing Epic ID, the qa-assist →
|
|
14
|
-
* `/mandrel-plan` handoff) depend on a parseable body.
|
|
15
|
-
*
|
|
16
|
-
* ## Design
|
|
17
|
-
*
|
|
18
|
-
* - `evaluateIssueBody(body)` is **pure** (no I/O): it parses the body and
|
|
19
|
-
* returns a structured conformance verdict. This is the unit-tested core.
|
|
20
|
-
* - The CLI wrapper reads the issue body + labels (via `gh` or env), runs
|
|
21
|
-
* the evaluator, and posts/updates a single marker comment when the body
|
|
22
|
-
* is non-conformant. Network-touching, exercised in CI.
|
|
23
|
-
*
|
|
24
|
-
* GitHub Issue Forms render a skipped optional field as the literal
|
|
25
|
-
* `_No response_`; the evaluator strips that sentinel so an empty optional
|
|
26
|
-
* section does not masquerade as content.
|
|
4
|
+
* Drift guard between the generated Issue Forms and the Story-body parser:
|
|
5
|
+
* a human-filed Story whose body does not round-trip gets an informational
|
|
6
|
+
* marker comment (never a CI failure).
|
|
27
7
|
*
|
|
28
8
|
* @module lint-issue-body
|
|
29
9
|
*/
|
|
@@ -32,17 +12,9 @@ import { spawnSync } from 'node:child_process';
|
|
|
32
12
|
import { runAsCli } from './lib/cli-utils.js';
|
|
33
13
|
import { parse, StoryBodyParseError } from './lib/story-body/story-body.js';
|
|
34
14
|
|
|
35
|
-
/**
|
|
36
|
-
* Marker that identifies the lint's own comment so re-runs update rather
|
|
37
|
-
* than duplicate it.
|
|
38
|
-
*/
|
|
39
15
|
export const LINT_COMMENT_MARKER = '<!-- mandrel:issue-body-conformance -->';
|
|
40
16
|
|
|
41
|
-
/**
|
|
42
|
-
* The binding sections every conformant ticket body MUST carry. `changes`
|
|
43
|
-
* and `references` are advisory (per the Engineer persona's implementation
|
|
44
|
-
* latitude), so they are not required here.
|
|
45
|
-
*/
|
|
17
|
+
/** `changes` and `references` are advisory, so not required. */
|
|
46
18
|
const REQUIRED_SECTIONS = [
|
|
47
19
|
{ field: 'goal', label: 'Goal' },
|
|
48
20
|
{ field: 'acceptance', label: 'Acceptance' },
|
|
@@ -50,9 +22,7 @@ const REQUIRED_SECTIONS = [
|
|
|
50
22
|
];
|
|
51
23
|
|
|
52
24
|
/**
|
|
53
|
-
*
|
|
54
|
-
* field is treated as absent rather than literal content.
|
|
55
|
-
*
|
|
25
|
+
* Issue Forms render a skipped field as `_No response_`; treat it as absent.
|
|
56
26
|
* @param {string} body
|
|
57
27
|
* @returns {string}
|
|
58
28
|
*/
|
|
@@ -65,22 +35,16 @@ function stripNoResponseSentinel(body) {
|
|
|
65
35
|
|
|
66
36
|
/**
|
|
67
37
|
* @typedef {object} ConformanceVerdict
|
|
68
|
-
* @property {boolean} conformant
|
|
69
|
-
*
|
|
70
|
-
* @property {string[]}
|
|
71
|
-
*
|
|
72
|
-
* @property {string[]} warnings - Non-fatal parser warnings surfaced for
|
|
73
|
-
* transparency (e.g. legacy-path-entry).
|
|
74
|
-
* @property {boolean} parseFailed - True when `parse()` threw (fail-closed).
|
|
38
|
+
* @property {boolean} conformant
|
|
39
|
+
* @property {string[]} problems
|
|
40
|
+
* @property {string[]} warnings
|
|
41
|
+
* @property {boolean} parseFailed
|
|
75
42
|
*/
|
|
76
43
|
|
|
77
44
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* to *comment*, not to crash CI.
|
|
82
|
-
*
|
|
83
|
-
* @param {string} body - Raw issue-body markdown.
|
|
45
|
+
* Pure. Parse errors become a non-conformant verdict, never a throw: the
|
|
46
|
+
* caller's job is to comment, not crash CI.
|
|
47
|
+
* @param {string} body
|
|
84
48
|
* @returns {ConformanceVerdict}
|
|
85
49
|
*/
|
|
86
50
|
export function evaluateIssueBody(body) {
|
|
@@ -114,8 +78,6 @@ export function evaluateIssueBody(body) {
|
|
|
114
78
|
|
|
115
79
|
const problems = [];
|
|
116
80
|
|
|
117
|
-
// An unstructured body parses but carries no structured sections — that
|
|
118
|
-
// is exactly the human-filed shape this lint exists to catch.
|
|
119
81
|
if (result.info.isUnstructuredBody) {
|
|
120
82
|
problems.push(
|
|
121
83
|
'The body has no recognised `## Goal` / `## Acceptance` / `## Verify` sections. ' +
|
|
@@ -145,9 +107,6 @@ export function evaluateIssueBody(body) {
|
|
|
145
107
|
}
|
|
146
108
|
|
|
147
109
|
/**
|
|
148
|
-
* Render the markdown comment body the lint posts on a non-conformant
|
|
149
|
-
* issue. Carries {@link LINT_COMMENT_MARKER} so re-runs update in place.
|
|
150
|
-
*
|
|
151
110
|
* @param {ConformanceVerdict} verdict
|
|
152
111
|
* @returns {string}
|
|
153
112
|
*/
|
|
@@ -179,9 +138,6 @@ export function renderConformanceComment(verdict) {
|
|
|
179
138
|
}
|
|
180
139
|
|
|
181
140
|
/**
|
|
182
|
-
* Thin `gh` wrapper. Returns the trimmed stdout, throwing on a non-zero
|
|
183
|
-
* exit so the CLI surfaces the failure (orchestration-error-handling rule).
|
|
184
|
-
*
|
|
185
141
|
* @param {string[]} args
|
|
186
142
|
* @returns {string}
|
|
187
143
|
*/
|
|
@@ -196,8 +152,6 @@ function gh(args) {
|
|
|
196
152
|
}
|
|
197
153
|
|
|
198
154
|
/**
|
|
199
|
-
* Stage 5: only `type::story` tickets are in scope (type::epic retired).
|
|
200
|
-
*
|
|
201
155
|
* @param {string[]} labelNames
|
|
202
156
|
* @returns {boolean}
|
|
203
157
|
*/
|
|
@@ -206,10 +160,6 @@ export function isStoryTicket(labelNames) {
|
|
|
206
160
|
}
|
|
207
161
|
|
|
208
162
|
/**
|
|
209
|
-
* Evaluate an issue payload and optionally post a conformance comment.
|
|
210
|
-
* Pure with respect to GitHub when `ghFn` is injected — the CLI `main`
|
|
211
|
-
* is a thin argv wrapper around this helper.
|
|
212
|
-
*
|
|
213
163
|
* @param {{
|
|
214
164
|
* issue: string|number,
|
|
215
165
|
* repo?: string,
|
|
@@ -266,12 +216,6 @@ export function runLintIssueBody({
|
|
|
266
216
|
return { conformant: false, problems: verdict.problems };
|
|
267
217
|
}
|
|
268
218
|
|
|
269
|
-
/**
|
|
270
|
-
* CLI entry. Reads the target issue (number from `--issue` or the
|
|
271
|
-
* `ISSUE_NUMBER` env), fetches its body + labels, and — when the body is
|
|
272
|
-
* non-conformant — upserts a single marker comment. Always exits 0 (the
|
|
273
|
-
* lint *informs*, it does not block), unless an unexpected I/O error occurs.
|
|
274
|
-
*/
|
|
275
219
|
async function main() {
|
|
276
220
|
const args = process.argv.slice(2);
|
|
277
221
|
const get = (flag) => {
|
|
@@ -1,42 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* mandrel-update-preflight.js —
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* bump:
|
|
11
|
-
*
|
|
12
|
-
* 1. **Wrong project (hard stop).** Running the updater in the framework
|
|
13
|
-
* repo itself or in a non-consumer (no `mandrel` dependency in
|
|
14
|
-
* `package.json`, or no materialized `.agents/` directory) silently
|
|
15
|
-
* does the wrong thing. The consumer-shape check is a BLOCKER: it
|
|
16
|
-
* exits non-zero so the workflow halts before bumping anything.
|
|
17
|
-
* 2. **Dirty git index (warn).** `mandrel update` deliberately leaves the
|
|
18
|
-
* lockfile *staged* (see `lib/cli/update.js`); the workflow's commit
|
|
19
|
-
* step then `git add`s and commits. If the index already holds
|
|
20
|
-
* unrelated staged changes, that step would sweep them into the
|
|
21
|
-
* `chore: update mandrel` commit. Warn so the operator can unstage
|
|
22
|
-
* first.
|
|
23
|
-
* 3. **Offline (warn).** The CLI throws a usable error on a failed
|
|
24
|
-
* `npm view`, but a one-line up-front reachability check gives a
|
|
25
|
-
* friendlier "you're offline" signal before any version probe.
|
|
26
|
-
*
|
|
27
|
-
* Severity is consistent with framework preflight conventions
|
|
28
|
-
* (cf. `single-story-close.js` runStoryClosePreflight, `mandrel-update-preflight.js`):
|
|
29
|
-
* the consumer-shape check is a hard stop (blocker), dirty-index and offline
|
|
30
|
-
* are warn-only and never block the run.
|
|
31
|
-
*
|
|
32
|
-
* Out of scope (per the Story): folding these checks into
|
|
33
|
-
* `lib/cli/update.js` itself — the CLI stays git-free and
|
|
34
|
-
* side-effect-scoped; this is a workflow-layer concern.
|
|
35
|
-
*
|
|
36
|
-
* The detection logic is a pure function (`runMandrelUpdatePreflight`) that
|
|
37
|
-
* takes injectable probes so it is unit-testable without touching the real
|
|
38
|
-
* filesystem, git index, or network. The CLI wrapper wires the real probes
|
|
39
|
-
* and maps a blocker finding to a non-zero exit code.
|
|
4
|
+
* mandrel-update-preflight.js — first-run guard for `/mandrel-update`, run
|
|
5
|
+
* before the version bump. Hard-stops outside a consumer repo (no `mandrel`
|
|
6
|
+
* dependency or no `.agents/`). Warns on a dirty index (the update leaves the
|
|
7
|
+
* lockfile staged, so the commit step would sweep unrelated staged files in)
|
|
8
|
+
* and when the registry is unreachable. Kept out of `lib/cli/update.js`, which
|
|
9
|
+
* stays git-free.
|
|
40
10
|
*/
|
|
41
11
|
|
|
42
12
|
import { execFileSync } from 'node:child_process';
|
|
@@ -54,16 +24,11 @@ import { Logger } from './lib/Logger.js';
|
|
|
54
24
|
*/
|
|
55
25
|
|
|
56
26
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* @param {string} projectRoot Absolute consumer repo root.
|
|
27
|
+
* @param {string} projectRoot
|
|
60
28
|
*/
|
|
61
29
|
export function makeProbes(projectRoot) {
|
|
62
30
|
return {
|
|
63
|
-
/**
|
|
64
|
-
* Read + parse `package.json`. Returns the parsed object, or `null`
|
|
65
|
-
* when the file is missing or unparseable.
|
|
66
|
-
*/
|
|
31
|
+
/** `null` when missing or unparseable. */
|
|
67
32
|
readPackageJson() {
|
|
68
33
|
const pkgPath = path.join(projectRoot, 'package.json');
|
|
69
34
|
if (!existsSync(pkgPath)) return null;
|
|
@@ -73,16 +38,10 @@ export function makeProbes(projectRoot) {
|
|
|
73
38
|
return null;
|
|
74
39
|
}
|
|
75
40
|
},
|
|
76
|
-
/** Does the materialized `.agents/` directory exist? */
|
|
77
41
|
agentsDirExists() {
|
|
78
42
|
return existsSync(path.join(projectRoot, '.agents'));
|
|
79
43
|
},
|
|
80
|
-
/**
|
|
81
|
-
* Are there staged (index) changes? Returns true when
|
|
82
|
-
* `git diff --cached --name-only` is non-empty. Returns false on any
|
|
83
|
-
* git error (not a repo, git missing) — a missing index is not a
|
|
84
|
-
* dirty index.
|
|
85
|
-
*/
|
|
44
|
+
/** False on any git error: a missing index is not a dirty one. */
|
|
86
45
|
hasStagedChanges() {
|
|
87
46
|
try {
|
|
88
47
|
const out = execFileSync('git', ['diff', '--cached', '--name-only'], {
|
|
@@ -95,11 +54,6 @@ export function makeProbes(projectRoot) {
|
|
|
95
54
|
return false;
|
|
96
55
|
}
|
|
97
56
|
},
|
|
98
|
-
/**
|
|
99
|
-
* Is the npm registry reachable? Probes `npm ping` (a PM-agnostic
|
|
100
|
-
* reachability query that does not mutate anything). Returns true when
|
|
101
|
-
* the ping succeeds, false on any failure (offline / registry down).
|
|
102
|
-
*/
|
|
103
57
|
registryReachable() {
|
|
104
58
|
try {
|
|
105
59
|
execFileSync('npm', ['ping'], {
|
|
@@ -117,22 +71,16 @@ export function makeProbes(projectRoot) {
|
|
|
117
71
|
}
|
|
118
72
|
|
|
119
73
|
/**
|
|
120
|
-
* Pure
|
|
121
|
-
* probes and returns a structured result. Never throws; never performs
|
|
122
|
-
* I/O directly (all I/O is behind `probes`).
|
|
74
|
+
* Pure: all I/O is behind `probes`. `ok` means no findings at all.
|
|
123
75
|
*
|
|
124
76
|
* @param {object} options
|
|
125
77
|
* @param {ReturnType<typeof makeProbes>} options.probes
|
|
126
78
|
* @returns {{ ok: boolean, blocked: boolean, findings: PreflightFinding[] }}
|
|
127
|
-
* `blocked` is true when any blocker-severity finding fired (the
|
|
128
|
-
* consumer-shape hard stop). `ok` is true when there are no findings of
|
|
129
|
-
* any severity.
|
|
130
79
|
*/
|
|
131
80
|
export function runMandrelUpdatePreflight({ probes }) {
|
|
132
81
|
/** @type {PreflightFinding[]} */
|
|
133
82
|
const findings = [];
|
|
134
83
|
|
|
135
|
-
// 1. Consumer-shape check — BLOCKER (hard stop).
|
|
136
84
|
const pkg = probes.readPackageJson();
|
|
137
85
|
const deps = pkg
|
|
138
86
|
? {
|
|
@@ -158,7 +106,6 @@ export function runMandrelUpdatePreflight({ probes }) {
|
|
|
158
106
|
});
|
|
159
107
|
}
|
|
160
108
|
|
|
161
|
-
// 2. Dirty-index check — WARN only.
|
|
162
109
|
if (probes.hasStagedChanges()) {
|
|
163
110
|
findings.push({
|
|
164
111
|
id: 'dirty-index',
|
|
@@ -169,7 +116,6 @@ export function runMandrelUpdatePreflight({ probes }) {
|
|
|
169
116
|
});
|
|
170
117
|
}
|
|
171
118
|
|
|
172
|
-
// 3. Offline check — WARN only.
|
|
173
119
|
if (!probes.registryReachable()) {
|
|
174
120
|
findings.push({
|
|
175
121
|
id: 'offline',
|
|
@@ -185,9 +131,6 @@ export function runMandrelUpdatePreflight({ probes }) {
|
|
|
185
131
|
}
|
|
186
132
|
|
|
187
133
|
/**
|
|
188
|
-
* Render the findings to a logger. Blockers go to `error`, warnings to
|
|
189
|
-
* `warn`. A clean result logs a single `info` line.
|
|
190
|
-
*
|
|
191
134
|
* @param {{ ok: boolean, blocked: boolean, findings: PreflightFinding[] }} result
|
|
192
135
|
* @param {{ info: Function, warn: Function, error: Function }} logger
|
|
193
136
|
*/
|
|
@@ -222,9 +165,6 @@ async function main() {
|
|
|
222
165
|
const probes = makeProbes(projectRoot);
|
|
223
166
|
const result = runMandrelUpdatePreflight({ probes });
|
|
224
167
|
reportPreflight(result, Logger);
|
|
225
|
-
// Machine-parsable JSON envelope on stdout for tooling / the workflow to
|
|
226
|
-
// read. Use process.stdout.write (not console.log) per the no-console
|
|
227
|
-
// enforcement boundary: human-facing output goes through Logger above.
|
|
228
168
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
229
169
|
return result.blocked ? 2 : 0;
|
|
230
170
|
}
|
|
@@ -1,45 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* merge-baseline.js — git merge driver for `baselines/*.json
|
|
4
|
+
* merge-baseline.js — git merge driver for `baselines/*.json`.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* completely disjoint rows. Git merges JSON as text, so whether it can
|
|
11
|
-
* separate that hunk from the moved rows is an accident of proximity:
|
|
12
|
-
*
|
|
13
|
-
* - it cannot → a conflict on work that never overlapped (the observed
|
|
14
|
-
* `coverage.json` / `maintainability.json` "always conflicts" pattern);
|
|
15
|
-
* - it can → it splices both sides' row lines into a row set neither side
|
|
16
|
-
* scored, and the ratchet then guards a number no scorer produced (the
|
|
17
|
-
* observed `crap.json` "silently auto-merges" pattern).
|
|
18
|
-
*
|
|
19
|
-
* The quiet one is the worse one. A baseline is a set of rows keyed by
|
|
20
|
-
* identity plus a rollup derived from them, so this driver merges it as
|
|
21
|
-
* that — see `lib/baselines/merge-envelopes.js` for the semantics.
|
|
22
|
-
*
|
|
23
|
-
* ## Contract
|
|
6
|
+
* A text merge of a baseline either conflicts on the always-different
|
|
7
|
+
* `generatedAt` stamp or, worse, silently splices both sides' rows into a set
|
|
8
|
+
* no scorer produced. This merges rows by identity and re-derives the rollup.
|
|
9
|
+
* Files that are not a known row baseline go to `git merge-file` unchanged.
|
|
24
10
|
*
|
|
25
11
|
* node .agents/scripts/merge-baseline.js %O %A %B %P
|
|
26
12
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* pathname being merged. Exit 0 merged clean, non-zero conflicted.
|
|
30
|
-
*
|
|
31
|
-
* Registered per clone (registration is per-clone, so `mandrel doctor` is
|
|
32
|
-
* the guard that it happened, not `mandrel sync`):
|
|
33
|
-
*
|
|
34
|
-
* .gitattributes: baselines/*.json merge=mandrel-baseline
|
|
35
|
-
* git config: merge.mandrel-baseline.driver
|
|
36
|
-
*
|
|
37
|
-
* ## Not every `baselines/*.json` is an envelope
|
|
38
|
-
*
|
|
39
|
-
* That glob also matches arch-cycles, cyclomatic, dead-exports, audit-ledger
|
|
40
|
-
* and context-budget — files with their own shapes and no row identity. Anything whose `$schema` is not a known per-kind envelope is
|
|
41
|
-
* handed straight back to `git merge-file`, so registering the driver cannot
|
|
42
|
-
* change their behaviour.
|
|
13
|
+
* `%A` is ours and MUST hold the result. Exit 0 clean, non-zero conflicted.
|
|
14
|
+
* Registration is per-clone git config, so `mandrel doctor` guards it.
|
|
43
15
|
*/
|
|
44
16
|
|
|
45
17
|
import fs from 'node:fs';
|
|
@@ -70,13 +42,11 @@ function rowBlock(row) {
|
|
|
70
42
|
}
|
|
71
43
|
|
|
72
44
|
/**
|
|
73
|
-
* Wrap each conflicting row in
|
|
74
|
-
*
|
|
75
|
-
* non-conflicting remainder of the file is byte-identical to what a clean
|
|
76
|
-
* merge would have written.
|
|
45
|
+
* Wrap each conflicting row in markers within the canonical text, so the rest
|
|
46
|
+
* is byte-identical to a clean merge.
|
|
77
47
|
*
|
|
78
|
-
* @param {string} text
|
|
79
|
-
* @param {Array<object>} conflicts
|
|
48
|
+
* @param {string} text
|
|
49
|
+
* @param {Array<object>} conflicts
|
|
80
50
|
* @returns {string}
|
|
81
51
|
*/
|
|
82
52
|
export function renderConflictMarkers(text, conflicts) {
|
|
@@ -85,8 +55,7 @@ export function renderConflictMarkers(text, conflicts) {
|
|
|
85
55
|
const placed = conflict.ours ?? conflict.theirs;
|
|
86
56
|
if (placed === undefined) continue;
|
|
87
57
|
const block = rowBlock(placed);
|
|
88
|
-
//
|
|
89
|
-
// separator follows it on both sides so the markers wrap whole lines.
|
|
58
|
+
// Keep the row's trailing separator (if any) so markers wrap whole lines.
|
|
90
59
|
const withComma = `${block},`;
|
|
91
60
|
const [needle, suffix] = out.includes(withComma)
|
|
92
61
|
? [withComma, ',']
|
|
@@ -124,18 +93,13 @@ function readSide(file) {
|
|
|
124
93
|
}
|
|
125
94
|
|
|
126
95
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* is too damaged to parse — in both cases the driver must not invent a
|
|
130
|
-
* result, and git's behaviour is exactly what the repo had before.
|
|
96
|
+
* Fall back to git's text merge for unknown or unparseable files; the driver
|
|
97
|
+
* never invents a result.
|
|
131
98
|
*
|
|
132
99
|
* @returns {number} git merge-file's own exit code.
|
|
133
100
|
*/
|
|
134
101
|
function delegateToGit(basePath, oursPath, theirsPath) {
|
|
135
|
-
//
|
|
136
|
-
// exactly as it would have with no driver registered. `spawnChild` returns
|
|
137
|
-
// the RAW result deliberately: a `status` of null means the child was
|
|
138
|
-
// killed, and that must never be read as a clean merge.
|
|
102
|
+
// A null status means the child was killed — never a clean merge.
|
|
139
103
|
const result = spawnChild(
|
|
140
104
|
'git',
|
|
141
105
|
['merge-file', oursPath, basePath, theirsPath],
|
|
@@ -151,20 +115,8 @@ function delegateToGit(basePath, oursPath, theirsPath) {
|
|
|
151
115
|
}
|
|
152
116
|
|
|
153
117
|
/**
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
* Two families answer, and neither is "all of `baselines/*.json`":
|
|
157
|
-
*
|
|
158
|
-
* - **Envelope kinds** — the eight kernel kinds, merged by the kind
|
|
159
|
-
* module's own `rowIdentity` with the rollup RE-DERIVED.
|
|
160
|
-
* - **Plain row baselines** — `cyclomatic`, `dead-exports` and
|
|
161
|
-
* `dead-exports-production`, which are row sets with a real identity but
|
|
162
|
-
* no kernel protocol. Until Story #5277 these fell through to
|
|
163
|
-
* `git merge-file` even though `.gitattributes` routes them here, so the
|
|
164
|
-
* attribute promised a row merge the driver never performed.
|
|
165
|
-
*
|
|
166
|
-
* Anything else — arch-cycles, audit-ledger, context-budget — resolves `null`
|
|
167
|
-
* and is handed back to git unchanged.
|
|
118
|
+
* Envelope kinds (rollup re-derived) or plain row baselines (cyclomatic,
|
|
119
|
+
* dead-exports*); anything else resolves `null` and goes back to git.
|
|
168
120
|
*
|
|
169
121
|
* @param {unknown} ours
|
|
170
122
|
* @param {unknown} theirs
|
|
@@ -179,11 +131,8 @@ function resolveMergeTarget(ours, theirs) {
|
|
|
179
131
|
}
|
|
180
132
|
|
|
181
133
|
/**
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
* written with the same `JSON.stringify(…, null, 2)` + trailing newline their
|
|
185
|
-
* own generators use, which is what keeps a clean merge byte-identical to a
|
|
186
|
-
* regeneration.
|
|
134
|
+
* Plain baselines use their generators' exact serialization so a clean merge
|
|
135
|
+
* is byte-identical to a regeneration.
|
|
187
136
|
*
|
|
188
137
|
* @param {string} oursPath
|
|
189
138
|
* @param {{ envelope: object }} merged
|
|
@@ -198,15 +147,8 @@ function writeMerged(oursPath, merged, isEnvelopeKind) {
|
|
|
198
147
|
}
|
|
199
148
|
|
|
200
149
|
/**
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
* The driver script installs its own registration because the registration is
|
|
204
|
-
* the half that cannot travel: `.gitattributes` is tracked and ships with the
|
|
205
|
-
* repo, `merge.mandrel-baseline.driver` is per-clone git config and is absent
|
|
206
|
-
* in every fresh clone — silently, with git falling back to a text merge and
|
|
207
|
-
* reporting nothing. Wired into this repo's `prepare` script so `npm install`
|
|
208
|
-
* completes the registration, and idempotent so every later `prepare` is a
|
|
209
|
-
* no-op.
|
|
150
|
+
* `--install`: the per-clone git config does not travel with the repo and its
|
|
151
|
+
* absence is silent, so `prepare` runs this (idempotent).
|
|
210
152
|
*
|
|
211
153
|
* @returns {number} Process exit code.
|
|
212
154
|
*/
|
|
@@ -238,11 +180,8 @@ export function runMergeBaseline(argv) {
|
|
|
238
180
|
return 2;
|
|
239
181
|
}
|
|
240
182
|
|
|
241
|
-
// Git
|
|
242
|
-
//
|
|
243
|
-
// use — the shared writer refuses a relative path, and that refusal only
|
|
244
|
-
// shows up under a real `git merge`, never when the driver is called
|
|
245
|
-
// directly with absolute paths.
|
|
183
|
+
// Git passes worktree-relative temp names; the shared writer refuses
|
|
184
|
+
// relative paths.
|
|
246
185
|
const [basePath, oursPath, theirsPath] = [baseArg, oursArg, theirsArg].map(
|
|
247
186
|
(p) => path.resolve(p),
|
|
248
187
|
);
|
|
@@ -268,9 +207,7 @@ export function runMergeBaseline(argv) {
|
|
|
268
207
|
}
|
|
269
208
|
|
|
270
209
|
/**
|
|
271
|
-
*
|
|
272
|
-
* `%A`. A merge that throws is handed back to git rather than half-written:
|
|
273
|
-
* the driver must never invent a result for a baseline it could not model.
|
|
210
|
+
* A merge that throws is handed back to git rather than half-written.
|
|
274
211
|
*
|
|
275
212
|
* @param {object} ctx
|
|
276
213
|
* @returns {number} Process exit code.
|
|
@@ -296,9 +233,7 @@ function mergeResolved({
|
|
|
296
233
|
return delegateToGit(basePath, oursPath, theirsPath);
|
|
297
234
|
}
|
|
298
235
|
|
|
299
|
-
//
|
|
300
|
-
// rendering operates on exactly the bytes a clean merge would have left,
|
|
301
|
-
// so the merged remainder of a conflicted file is identical to it.
|
|
236
|
+
// Written even when conflicted: markers are rendered onto these bytes.
|
|
302
237
|
writeMerged(oursPath, merged, isEnvelopeKind);
|
|
303
238
|
|
|
304
239
|
if (merged.conflicts.length === 0) {
|
|
@@ -309,15 +244,11 @@ function mergeResolved({
|
|
|
309
244
|
}
|
|
310
245
|
|
|
311
246
|
/**
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
* Both scopes get markers. An envelope-level conflict used to be reported on
|
|
315
|
-
* stderr alone, leaving a file that looked cleanly merged while git held the
|
|
316
|
-
* path unmerged — the operator had to reconstruct from scrollback which stamp
|
|
317
|
-
* disagreed.
|
|
247
|
+
* Both row and envelope conflicts get in-file markers, so the file never
|
|
248
|
+
* looks cleanly merged while git holds it unmerged.
|
|
318
249
|
*
|
|
319
250
|
* @param {{ kind: string, merged: object, oursPath: string, label: string }} ctx
|
|
320
|
-
* @returns {number} Always 1
|
|
251
|
+
* @returns {number} Always 1.
|
|
321
252
|
*/
|
|
322
253
|
function markConflicts({ kind, merged, oursPath, label }) {
|
|
323
254
|
const rowConflicts = merged.conflicts.filter((c) => c.scope === 'row');
|
|
@@ -338,13 +269,8 @@ function markConflicts({ kind, merged, oursPath, label }) {
|
|
|
338
269
|
}
|
|
339
270
|
|
|
340
271
|
/**
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* The regenerate line is not decoration. The merged file's rollup was derived
|
|
344
|
-
* from a row set that still carries conflict markers, so resolving the markers
|
|
345
|
-
* by hand leaves the rollup describing a tree nobody scored — the same silent
|
|
346
|
-
* wrong number the driver exists to prevent, arrived at from the other
|
|
347
|
-
* direction. Saying it here is the only place an operator sees it.
|
|
272
|
+
* Names the regenerate command: the rollup was derived from unresolved rows,
|
|
273
|
+
* so hand-resolving the markers leaves it describing a tree nobody scored.
|
|
348
274
|
*
|
|
349
275
|
* @param {{ kind: string, label: string, rowConflicts: Array<object>, envelopeConflicts: Array<object> }} args
|
|
350
276
|
*/
|