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,74 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* git-utils.js —
|
|
3
|
-
*
|
|
4
|
-
* Centralizes all Git subprocess invocations for the orchestration
|
|
5
|
-
* engine, eliminating duplicated wrappers across the codebase.
|
|
6
|
-
*
|
|
7
|
-
* Two flavours are provided. Choose based on whether a non-zero git exit
|
|
8
|
-
* code represents a bug (use `gitSync`) or a recoverable runtime state
|
|
9
|
-
* (use `gitSpawn`):
|
|
10
|
-
*
|
|
11
|
-
* - `gitSync(cwd, ...args)` — throws on non-zero exit; returns trimmed
|
|
12
|
-
* stdout. Use when the operation must succeed for the caller to
|
|
13
|
-
* proceed (e.g. `rev-parse HEAD`, `merge-base --is-ancestor` inside a
|
|
14
|
-
* critical-path check). A non-zero exit is treated as a bug or a
|
|
15
|
-
* corrupted repo state, and the throw propagates to the caller's
|
|
16
|
-
* existing error path.
|
|
17
|
-
*
|
|
18
|
-
* - `gitSpawn(cwd, ...args)` — never throws; returns a {@link GitResult}
|
|
19
|
-
* object. Use when the caller needs to inspect or recover from the
|
|
20
|
-
* non-zero case (e.g. `merge-base --is-ancestor` as a boolean check,
|
|
21
|
-
* `branch -D` where "no such branch" is acceptable, fetch/push retry
|
|
22
|
-
* loops where the caller decides whether to retry on stderr content).
|
|
23
|
-
*
|
|
24
|
-
* The two functions are intentional siblings — they share argument shape so
|
|
25
|
-
* either can be substituted at a call site by changing the import. Do not
|
|
26
|
-
* unify into a single `git({ throwOnNonZero })` until the call-site split
|
|
27
|
-
* shows roughly even use of each contract.
|
|
2
|
+
* git-utils.js — git runners: `gitSync` throws on failure (a bug);
|
|
3
|
+
* `gitSpawn` returns a {@link GitResult} for recoverable failures.
|
|
28
4
|
*/
|
|
29
5
|
|
|
30
6
|
import { execFileSync, spawnSync } from 'node:child_process';
|
|
31
7
|
import { execFileCapture, spawnCapture } from './child-exec.js';
|
|
32
8
|
|
|
33
9
|
/**
|
|
34
|
-
*
|
|
35
|
-
* with two normalisations: `status` is coerced to `1` when null (e.g. when
|
|
36
|
-
* the child terminated by signal), and stdout/stderr are trimmed.
|
|
10
|
+
* `status` is 1 when null (signal); output is trimmed.
|
|
37
11
|
*
|
|
38
12
|
* @typedef {object} GitResult
|
|
39
|
-
* @property {number} status
|
|
40
|
-
* @property {string} stdout
|
|
41
|
-
* @property {string} stderr
|
|
13
|
+
* @property {number} status
|
|
14
|
+
* @property {string} stdout
|
|
15
|
+
* @property {string} stderr
|
|
42
16
|
*/
|
|
43
17
|
|
|
44
18
|
let _execFileSync = execFileSync;
|
|
45
19
|
let _spawnSync = spawnSync;
|
|
46
20
|
|
|
47
21
|
/**
|
|
48
|
-
* Memoized cleaned env shared by every `gitSync` / `gitSpawn` /
|
|
49
|
-
* `createGitInterface` invocation in this process. Built lazily on first
|
|
50
|
-
* use so cold imports pay nothing. Call sites pass the object through to
|
|
51
|
-
* `child_process` only — none mutate `GIT_*` (or any other key) between
|
|
52
|
-
* git calls, so reuse is safe. Tests that mutate `process.env` and need
|
|
53
|
-
* a fresh snapshot must call {@link __resetCleanGitEnv}.
|
|
54
|
-
*
|
|
55
22
|
* @type {NodeJS.ProcessEnv | null}
|
|
56
23
|
*/
|
|
57
24
|
let _cleanGitEnv = null;
|
|
58
25
|
|
|
59
26
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* pre-push) the parent git invocation exports GIT_DIR / GIT_WORK_TREE /
|
|
63
|
-
* GIT_INDEX_FILE / GIT_PREFIX / GIT_COMMON_DIR / etc. Those env vars
|
|
64
|
-
* override the explicit `cwd` we pass, so a `gitSync(tmpdir, 'init')` ends
|
|
65
|
-
* up operating on the parent worktree's `.git` rather than `tmpdir`. Tests
|
|
66
|
-
* that spin up real git fixtures break reproducibly under that shape.
|
|
67
|
-
*
|
|
68
|
-
* Stripping every `GIT_*` is broader than strictly necessary but cheap and
|
|
69
|
-
* impossible to drift out of sync with future git releases. The result is
|
|
70
|
-
* memoized per process (see `_cleanGitEnv`); author/committer identity is
|
|
71
|
-
* restored via per-call `env:` overrides where required.
|
|
27
|
+
* Memoised env with every `GIT_*` dropped: inside a git hook, the inherited
|
|
28
|
+
* GIT_DIR / GIT_WORK_TREE override the `cwd` we pass.
|
|
72
29
|
*
|
|
73
30
|
* @returns {NodeJS.ProcessEnv}
|
|
74
31
|
*/
|
|
@@ -82,26 +39,15 @@ function cleanGitEnv() {
|
|
|
82
39
|
return _cleanGitEnv;
|
|
83
40
|
}
|
|
84
41
|
|
|
85
|
-
/**
|
|
86
|
-
* Drop the memoized cleaned env so the next git call rebuilds from
|
|
87
|
-
* `process.env`. Testing-only seam — not part of the stable API.
|
|
88
|
-
*/
|
|
89
42
|
export function __resetCleanGitEnv() {
|
|
90
43
|
_cleanGitEnv = null;
|
|
91
44
|
}
|
|
92
45
|
|
|
93
46
|
/**
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* Production code must not call this. The double-underscore prefix is the
|
|
97
|
-
* contract: `__setGitRunners` exists so the test suite can inject mock
|
|
98
|
-
* child-process runners without requiring a broader DI refactor of every
|
|
99
|
-
* `gitSync`/`gitSpawn` call site. If more injection points become needed,
|
|
100
|
-
* replace this seam with a proper `createGitRunner({exec, spawn})` factory
|
|
101
|
-
* and thread it through the module graph.
|
|
47
|
+
* Test-only; prefer {@link createGitInterface}.
|
|
102
48
|
*
|
|
103
|
-
* @param {typeof execFileSync} exec
|
|
104
|
-
* @param {typeof spawnSync} spawn
|
|
49
|
+
* @param {typeof execFileSync} exec
|
|
50
|
+
* @param {typeof spawnSync} spawn
|
|
105
51
|
*/
|
|
106
52
|
export function __setGitRunners(exec, spawn) {
|
|
107
53
|
_execFileSync = exec;
|
|
@@ -109,18 +55,10 @@ export function __setGitRunners(exec, spawn) {
|
|
|
109
55
|
}
|
|
110
56
|
|
|
111
57
|
/**
|
|
112
|
-
* The **single** throwing git runner. Both the module-level {@link gitSync} and
|
|
113
|
-
* the interface returned by {@link createGitInterface} route through this —
|
|
114
|
-
* they differ only in which `execFileSync` they hand it.
|
|
115
|
-
*
|
|
116
|
-
* Buffer, shell and encoding policy belong to
|
|
117
|
-
* [`child-exec.js`](child-exec.js); this function contributes only the git
|
|
118
|
-
* specifics (argv prefix, cwd, scrubbed env).
|
|
119
|
-
*
|
|
120
58
|
* @param {typeof execFileSync} exec
|
|
121
59
|
* @param {string} cwd
|
|
122
60
|
* @param {string[]} args
|
|
123
|
-
* @returns {string}
|
|
61
|
+
* @returns {string}
|
|
124
62
|
*/
|
|
125
63
|
function runGitSync(exec, cwd, args) {
|
|
126
64
|
return String(
|
|
@@ -134,10 +72,6 @@ function runGitSync(exec, cwd, args) {
|
|
|
134
72
|
}
|
|
135
73
|
|
|
136
74
|
/**
|
|
137
|
-
* The **single** non-throwing git runner — the `spawnSync` counterpart of
|
|
138
|
-
* {@link runGitSync}, normalising `status`/stdout/stderr into a
|
|
139
|
-
* {@link GitResult} via the shared exec surface.
|
|
140
|
-
*
|
|
141
75
|
* @param {typeof spawnSync} spawn
|
|
142
76
|
* @param {string} cwd
|
|
143
77
|
* @param {string[]} args
|
|
@@ -152,23 +86,17 @@ function runGitSpawn(spawn, cwd, args) {
|
|
|
152
86
|
}
|
|
153
87
|
|
|
154
88
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* @param {string} cwd - Working directory for the git process.
|
|
159
|
-
* @param {...string} args - Git sub-command and arguments.
|
|
160
|
-
* @returns {string} Trimmed stdout text.
|
|
89
|
+
* @param {string} cwd
|
|
90
|
+
* @param {...string} args
|
|
91
|
+
* @returns {string} Trimmed stdout.
|
|
161
92
|
*/
|
|
162
93
|
export function gitSync(cwd, ...args) {
|
|
163
94
|
return runGitSync(_execFileSync, cwd, args);
|
|
164
95
|
}
|
|
165
96
|
|
|
166
97
|
/**
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* @param {string} cwd - Working directory for the git process.
|
|
171
|
-
* @param {...string} args - Git sub-command and arguments.
|
|
98
|
+
* @param {string} cwd
|
|
99
|
+
* @param {...string} args
|
|
172
100
|
* @returns {GitResult}
|
|
173
101
|
*/
|
|
174
102
|
export function gitSpawn(cwd, ...args) {
|
|
@@ -176,18 +104,13 @@ export function gitSpawn(cwd, ...args) {
|
|
|
176
104
|
}
|
|
177
105
|
|
|
178
106
|
/**
|
|
179
|
-
*
|
|
180
|
-
* seam for callers that want explicit injection without touching the
|
|
181
|
-
* module-global `__setGitRunners` state (which is a test-only override that
|
|
182
|
-
* leaks between suites). The returned object has the same shape as this
|
|
183
|
-
* module's namespace exports (`gitSync`, `gitSpawn`, `gitFetchWithRetry`,
|
|
184
|
-
* `gitPullWithRetry`) so it is drop-in as a `ctx.git` replacement.
|
|
107
|
+
* Same shape as this module's exports, over injected runners (`ctx.git`).
|
|
185
108
|
*
|
|
186
109
|
* @param {object} [deps]
|
|
187
|
-
* @param {typeof execFileSync} [deps.exec]
|
|
188
|
-
* @param {typeof spawnSync} [deps.spawn]
|
|
189
|
-
* @param {(ms: number) => Promise<void>} [deps.sleep]
|
|
190
|
-
* @param {number} [deps.jitter]
|
|
110
|
+
* @param {typeof execFileSync} [deps.exec]
|
|
111
|
+
* @param {typeof spawnSync} [deps.spawn]
|
|
112
|
+
* @param {(ms: number) => Promise<void>} [deps.sleep]
|
|
113
|
+
* @param {number} [deps.jitter]
|
|
191
114
|
*/
|
|
192
115
|
export function createGitInterface(deps = {}) {
|
|
193
116
|
const exec = deps.exec ?? execFileSync;
|
|
@@ -214,12 +137,7 @@ export function createGitInterface(deps = {}) {
|
|
|
214
137
|
};
|
|
215
138
|
}
|
|
216
139
|
|
|
217
|
-
/**
|
|
218
|
-
* Known lock-contention error signatures that occur when two worktrees
|
|
219
|
-
* fetch concurrently against the same repo. Matching any of these is the
|
|
220
|
-
* only condition under which `gitFetchWithRetry` will re-attempt —
|
|
221
|
-
* unrelated fetch failures surface immediately.
|
|
222
|
-
*/
|
|
140
|
+
/** Concurrent-worktree lock contention — the only failures retried. */
|
|
223
141
|
const PACKED_REFS_CONTENTION_PATTERNS = [
|
|
224
142
|
/packed-refs\.lock/i,
|
|
225
143
|
/cannot lock ref/i,
|
|
@@ -233,8 +151,6 @@ function isPackedRefsContention(stderr) {
|
|
|
233
151
|
}
|
|
234
152
|
|
|
235
153
|
/**
|
|
236
|
-
* Real wall-clock sleep — the default backoff delay for both the module-level
|
|
237
|
-
* retry helpers and {@link createGitInterface}.
|
|
238
154
|
* @param {number} ms
|
|
239
155
|
* @returns {Promise<void>}
|
|
240
156
|
*/
|
|
@@ -243,47 +159,32 @@ function defaultSleep(ms) {
|
|
|
243
159
|
}
|
|
244
160
|
|
|
245
161
|
/**
|
|
246
|
-
* Sleep helper for retry backoff. Overridable via `__setSleep` so tests
|
|
247
|
-
* can skip real wall-clock delays without relying on node:test timer mocks.
|
|
248
162
|
* @type {(ms: number) => Promise<void>}
|
|
249
163
|
*/
|
|
250
164
|
let _sleep = defaultSleep;
|
|
251
165
|
let _jitterFactor = 0.5;
|
|
252
166
|
|
|
253
167
|
/**
|
|
254
|
-
* Test-only seam: replace the sleep implementation used by
|
|
255
|
-
* `gitFetchWithRetry` to avoid real backoff in unit tests.
|
|
256
168
|
* @param {(ms: number) => Promise<void>} fn
|
|
257
|
-
* @param {{ jitter?: number }} [opts]
|
|
169
|
+
* @param {{ jitter?: number }} [opts]
|
|
258
170
|
*/
|
|
259
171
|
export function __setSleep(fn, opts = {}) {
|
|
260
172
|
_sleep = fn;
|
|
261
173
|
_jitterFactor = opts.jitter ?? 0;
|
|
262
174
|
}
|
|
263
175
|
|
|
264
|
-
/**
|
|
265
|
-
* Backoff schedule for {@link gitWithContentionRetry}: 250ms, 500ms, 1000ms
|
|
266
|
-
* (3 retries → 4 attempts total).
|
|
267
|
-
*/
|
|
176
|
+
/** 3 retries → 4 attempts total. */
|
|
268
177
|
const CONTENTION_BACKOFF_MS = Object.freeze([250, 500, 1000]);
|
|
269
178
|
|
|
270
179
|
/**
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* failures surface immediately, and success short-circuits the loop.
|
|
274
|
-
*
|
|
275
|
-
* Deliberately no global lock — a mutex would erase the parallelism the
|
|
276
|
-
* worktree-isolation model is designed to enable. The schedule and the jitter
|
|
277
|
-
* policy live only here, so a backoff tuning change has a single point of
|
|
278
|
-
* application: the module-level `gitFetchWithRetry` / `gitPullWithRetry` pass
|
|
279
|
-
* the `_sleep` / `_jitterFactor` seams, and {@link createGitInterface} passes
|
|
280
|
-
* its injected equivalents.
|
|
180
|
+
* Bounded retry on lock contention only. Deliberately no global lock — a
|
|
181
|
+
* mutex would erase the parallelism worktree isolation exists for.
|
|
281
182
|
*
|
|
282
183
|
* @param {{ spawnGit: (cwd: string, ...args: string[]) => GitResult,
|
|
283
184
|
* sleep: (ms: number) => Promise<void>, jitterFactor: number }} runners
|
|
284
185
|
* @param {string} cwd
|
|
285
|
-
* @param {string[]} argvPrefix
|
|
286
|
-
* @param {string[]} args
|
|
186
|
+
* @param {string[]} argvPrefix
|
|
187
|
+
* @param {string[]} args
|
|
287
188
|
* @returns {Promise<{ status: number, stdout: string, stderr: string, attempts: number }>}
|
|
288
189
|
*/
|
|
289
190
|
async function gitWithContentionRetry(
|
|
@@ -310,9 +211,7 @@ async function gitWithContentionRetry(
|
|
|
310
211
|
}
|
|
311
212
|
|
|
312
213
|
/**
|
|
313
|
-
*
|
|
314
|
-
* the module-global {@link gitSpawn}. Read lazily so `__setSleep` and
|
|
315
|
-
* `__setGitRunners` still take effect after import.
|
|
214
|
+
* Read lazily so `__setSleep` / `__setGitRunners` take effect after import.
|
|
316
215
|
*
|
|
317
216
|
* @returns {{ spawnGit: typeof gitSpawn, sleep: (ms: number) => Promise<void>,
|
|
318
217
|
* jitterFactor: number }}
|
|
@@ -322,11 +221,8 @@ function moduleRetryRunners() {
|
|
|
322
221
|
}
|
|
323
222
|
|
|
324
223
|
/**
|
|
325
|
-
* Run `git fetch …` with the bounded packed-refs-contention retry loop
|
|
326
|
-
* (see `gitWithContentionRetry`).
|
|
327
|
-
*
|
|
328
224
|
* @param {string} cwd
|
|
329
|
-
* @param {...string} args
|
|
225
|
+
* @param {...string} args
|
|
330
226
|
* @returns {Promise<{ status: number, stdout: string, stderr: string, attempts: number }>}
|
|
331
227
|
*/
|
|
332
228
|
export function gitFetchWithRetry(cwd, ...args) {
|
|
@@ -334,12 +230,8 @@ export function gitFetchWithRetry(cwd, ...args) {
|
|
|
334
230
|
}
|
|
335
231
|
|
|
336
232
|
/**
|
|
337
|
-
* Run `git pull --rebase …` with the same bounded retry loop as
|
|
338
|
-
* `gitFetchWithRetry`. Packed-refs contention can occur during pulls
|
|
339
|
-
* just as during fetches — particularly in multi-worktree setups.
|
|
340
|
-
*
|
|
341
233
|
* @param {string} cwd
|
|
342
|
-
* @param {...string} args
|
|
234
|
+
* @param {...string} args
|
|
343
235
|
* @returns {Promise<{ status: number, stdout: string, stderr: string, attempts: number }>}
|
|
344
236
|
*/
|
|
345
237
|
export function gitPullWithRetry(cwd, ...args) {
|
|
@@ -352,12 +244,8 @@ export function gitPullWithRetry(cwd, ...args) {
|
|
|
352
244
|
}
|
|
353
245
|
|
|
354
246
|
/**
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
* collapses multiple hyphens, and trims leading/trailing hyphens.
|
|
358
|
-
*
|
|
359
|
-
* @param {string} text - Raw text to slugify.
|
|
360
|
-
* @returns {string} Sanitized slug.
|
|
247
|
+
* @param {string} text
|
|
248
|
+
* @returns {string}
|
|
361
249
|
*/
|
|
362
250
|
export function slugify(text) {
|
|
363
251
|
return text
|
|
@@ -368,8 +256,6 @@ export function slugify(text) {
|
|
|
368
256
|
}
|
|
369
257
|
|
|
370
258
|
/**
|
|
371
|
-
* Resolves the canonical branch name for a Story.
|
|
372
|
-
* v5 Standard: story-[STORY_ID]
|
|
373
259
|
* @param {string|number} storyId
|
|
374
260
|
* @returns {string}
|
|
375
261
|
*/
|
|
@@ -382,19 +268,11 @@ export function getStoryBranch(storyId) {
|
|
|
382
268
|
return `story-${id}`;
|
|
383
269
|
}
|
|
384
270
|
|
|
385
|
-
/**
|
|
386
|
-
* Canonical `story-<id>` branch name matcher. Single source of truth for the
|
|
387
|
-
* Story-branch shape — `parseStoryBranch` and `isStoryBranch` both close over
|
|
388
|
-
* this so call sites never re-author the regex inline.
|
|
389
|
-
*/
|
|
390
271
|
const STORY_BRANCH_RE = /^story-(\d+)$/;
|
|
391
272
|
|
|
392
273
|
/**
|
|
393
|
-
*
|
|
394
|
-
*
|
|
395
|
-
* @param {string} name - Branch name to inspect (e.g. `story-3334`).
|
|
396
|
-
* @returns {number|null} The Story ID when `name` matches `story-<id>`,
|
|
397
|
-
* otherwise `null`.
|
|
274
|
+
* @param {string} name
|
|
275
|
+
* @returns {number|null}
|
|
398
276
|
*/
|
|
399
277
|
export function parseStoryBranch(name) {
|
|
400
278
|
if (typeof name !== 'string') return null;
|
|
@@ -403,9 +281,7 @@ export function parseStoryBranch(name) {
|
|
|
403
281
|
}
|
|
404
282
|
|
|
405
283
|
/**
|
|
406
|
-
*
|
|
407
|
-
*
|
|
408
|
-
* @param {string} name - Branch name to test.
|
|
284
|
+
* @param {string} name
|
|
409
285
|
* @returns {boolean}
|
|
410
286
|
*/
|
|
411
287
|
export function isStoryBranch(name) {
|
|
@@ -1,58 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* framework-repo.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* ## Three buckets, not two
|
|
7
|
-
*
|
|
8
|
-
* A defect surfaced by one repository's CI is not necessarily that
|
|
9
|
-
* repository's to fix. Ownership splits three ways:
|
|
10
|
-
*
|
|
11
|
-
* - `consumer` — the repo the run is standing in (`github.owner`/`repo`).
|
|
12
|
-
* - `framework` — the Mandrel framework itself
|
|
13
|
-
* (`github.followUpRepos.framework`, defaulted to the mirror constant).
|
|
14
|
-
* - `platform` — a shared platform / infrastructure repo that neither of
|
|
15
|
-
* the other two owns: a shared base config, a runner fleet, a
|
|
16
|
-
* cross-repo toolchain (`github.followUpRepos.platform`, **no default**
|
|
17
|
-
* — nothing can guess a shared repo's slug).
|
|
18
|
-
*
|
|
19
|
-
* ## Why there is no `?? currentRepo` fallback
|
|
20
|
-
*
|
|
21
|
-
* The two-bucket predecessor resolved a framework-tagged item with
|
|
22
|
-
* `frameworkRepo ? frameworkRepo : currentRepo`. When the config key was
|
|
23
|
-
* absent that expression filed framework-owned work into the **consumer's**
|
|
24
|
-
* repo while the rendered retro claimed it went to the framework repo — a
|
|
25
|
-
* silent mis-file, recorded in `retro-proposals-graduator.js`'s own file-top
|
|
26
|
-
* comment. The failure was invisible in this repository precisely because
|
|
27
|
-
* consumer === framework here.
|
|
28
|
-
*
|
|
29
|
-
* So an unresolvable bucket is a first-class outcome, never a fallback:
|
|
30
|
-
* `routeOwnership` returns `routable: false` plus the `missingKey` that
|
|
31
|
-
* would fix it, and every caller must decide **out loud** what to do with
|
|
32
|
-
* that — file locally and say so in the body (the CI-gap filer), or defer
|
|
33
|
-
* and surface it where an operator will see it (the graduators). What no
|
|
34
|
-
* caller may do is route it somewhere plausible and stay quiet.
|
|
2
|
+
* framework-repo.js — ownership routing SSOT across `consumer`, `framework`
|
|
3
|
+
* and `platform` buckets. Deliberately no `?? currentRepo` fallback: an
|
|
4
|
+
* unresolvable bucket is `routable: false` + `missingKey`, and the caller must
|
|
5
|
+
* say out loud what it did instead of silently mis-filing.
|
|
35
6
|
*/
|
|
36
7
|
|
|
37
|
-
/**
|
|
38
|
-
* Canonical framework repository slug, used when the consumer config does
|
|
39
|
-
* not supply `github.followUpRepos.framework`. The `framework` bucket is the
|
|
40
|
-
* one bucket with a knowable default: it is this framework.
|
|
41
|
-
*/
|
|
42
8
|
export const DEFAULT_FRAMEWORK_REPO = 'dsj1984/mandrel';
|
|
43
9
|
|
|
44
|
-
/** The closed ownership-bucket set. */
|
|
45
10
|
export const OWNERSHIP_BUCKETS = Object.freeze([
|
|
46
11
|
'consumer',
|
|
47
12
|
'framework',
|
|
48
13
|
'platform',
|
|
49
14
|
]);
|
|
50
15
|
|
|
51
|
-
/**
|
|
52
|
-
* The `.agentrc.json` key behind each bucket, quoted verbatim when a bucket
|
|
53
|
-
* is unroutable so the operator is told which key to set rather than that
|
|
54
|
-
* "routing failed".
|
|
55
|
-
*/
|
|
56
16
|
const OWNERSHIP_CONFIG_KEYS = Object.freeze({
|
|
57
17
|
consumer: 'github.owner / github.repo',
|
|
58
18
|
framework: 'github.followUpRepos.framework',
|
|
@@ -60,11 +20,6 @@ const OWNERSHIP_CONFIG_KEYS = Object.freeze({
|
|
|
60
20
|
});
|
|
61
21
|
|
|
62
22
|
/**
|
|
63
|
-
* Parse an `"<owner>/<repo>"` slug into `{ owner, repo }`, or `null` when the
|
|
64
|
-
* slug is absent, empty, or malformed. A `null` return is the signal an
|
|
65
|
-
* unroutable bucket is built from — never a reason to substitute another
|
|
66
|
-
* repo.
|
|
67
|
-
*
|
|
68
23
|
* @param {string|null|undefined} slug
|
|
69
24
|
* @returns {{ owner: string, repo: string } | null}
|
|
70
25
|
*/
|
|
@@ -78,9 +33,6 @@ export function parseRepoSlug(slug) {
|
|
|
78
33
|
}
|
|
79
34
|
|
|
80
35
|
/**
|
|
81
|
-
* Render a `{ owner, repo }` pair back to its slug, or `null` when the pair
|
|
82
|
-
* is absent/malformed.
|
|
83
|
-
*
|
|
84
36
|
* @param {{ owner?: string, repo?: string }|null|undefined} repo
|
|
85
37
|
* @returns {string|null}
|
|
86
38
|
*/
|
|
@@ -95,15 +47,7 @@ export function formatRepoSlug(repo) {
|
|
|
95
47
|
}
|
|
96
48
|
|
|
97
49
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* `framework` falls back to {@link DEFAULT_FRAMEWORK_REPO}; `platform` has no
|
|
101
|
-
* default and stays `null` when unconfigured; `consumer` is `null` when
|
|
102
|
-
* `github.owner`/`github.repo` are unset. A `null` bucket is an honest
|
|
103
|
-
* "unknown", which {@link routeOwnership} turns into a named, reportable
|
|
104
|
-
* outcome.
|
|
105
|
-
*
|
|
106
|
-
* @param {object} [config] — resolved `.agentrc` config.
|
|
50
|
+
* @param {object} [config]
|
|
107
51
|
* @returns {{ consumer: ({owner: string, repo: string}|null), framework: ({owner: string, repo: string}|null), platform: ({owner: string, repo: string}|null) }}
|
|
108
52
|
*/
|
|
109
53
|
export function resolveOwnershipRepos(config) {
|
|
@@ -121,19 +65,12 @@ export function resolveOwnershipRepos(config) {
|
|
|
121
65
|
}
|
|
122
66
|
|
|
123
67
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* Total: an unknown bucket, an absent repos map, and an unconfigured bucket
|
|
127
|
-
* all resolve to `routable: false` with the `missingKey` that would fix it —
|
|
128
|
-
* never to a substituted repository.
|
|
68
|
+
* Total: never a substituted repo.
|
|
129
69
|
*
|
|
130
70
|
* @param {object} opts
|
|
131
|
-
* @param {string} opts.bucket
|
|
71
|
+
* @param {string} opts.bucket
|
|
132
72
|
* @param {{consumer?: object|null, framework?: object|null, platform?: object|null}} opts.repos
|
|
133
|
-
*
|
|
134
|
-
* caller that already holds the repo objects.
|
|
135
|
-
* @param {{owner: string, repo: string}|null} [opts.currentRepo] — the repo
|
|
136
|
-
* the run is standing in, used only to report `crossRepo`.
|
|
73
|
+
* @param {{owner: string, repo: string}|null} [opts.currentRepo] — for `crossRepo`.
|
|
137
74
|
* @returns {{ bucket: string, routedRepo: ({owner: string, repo: string}|null), routable: boolean, missingKey: (string|null), crossRepo: boolean }}
|
|
138
75
|
*/
|
|
139
76
|
export function routeOwnership({ bucket, repos, currentRepo = null } = {}) {
|
|
@@ -1,21 +1,6 @@
|
|
|
1
|
-
// .agents/scripts/lib/github-url.js
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `code-review.js`, each with a subtly different regex. Story #3649.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Extract the PR number from a GitHub PR URL.
|
|
10
|
-
*
|
|
11
|
-
* Accepts any URL whose path contains `/pull/<digits>` — the fragment
|
|
12
|
-
* (`#diff-…`), query string (`?diff=split`), and trailing slash are all
|
|
13
|
-
* ignored. Returns `null` when the URL is not a string, does not contain
|
|
14
|
-
* a `/pull/` segment, or when the parsed integer is ≤ 0.
|
|
15
|
-
*
|
|
16
|
-
* This is the canonical implementation; the inline copies in `finalizer.js`,
|
|
17
|
-
* `watcher.js`, and `code-review.js` have been deleted in favour of this
|
|
18
|
-
* function.
|
|
2
|
+
* Ignores fragment, query and trailing slash; `null` for no `/pull/` or a
|
|
3
|
+
* non-positive number.
|
|
19
4
|
*
|
|
20
5
|
* @param {string|null|undefined} prUrl
|
|
21
6
|
* @returns {number|null}
|
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* import-graph.js — the shared static-import graph
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* import-graph builder in the repository and kept it private to its own
|
|
6
|
-
* cycle ratchet. A second consumer now needs the same graph for a very
|
|
7
|
-
* different question — `audit-baselines.js` ranks hotspot files by import
|
|
8
|
-
* in-degree — and re-deriving "which module imports which" a second time
|
|
9
|
-
* would guarantee the two answers drift.
|
|
10
|
-
*
|
|
11
|
-
* Note this is a **module** graph, not the task/DAG graph in `lib/Graph.js`;
|
|
12
|
-
* the two are unrelated despite the shared word.
|
|
13
|
-
*
|
|
14
|
-
* The extraction is behaviour-preserving: `check-arch-cycles.js` imports
|
|
15
|
-
* these helpers and re-exports them, so its public surface (and the ratchet's
|
|
16
|
-
* output) is unchanged.
|
|
2
|
+
* import-graph.js — the shared static-import (module) graph, used by the
|
|
3
|
+
* cycle ratchet and the hotspot in-degree ranking so both read one answer.
|
|
4
|
+
* Unrelated to the task DAG in `lib/Graph.js`.
|
|
17
5
|
*
|
|
18
6
|
* @module lib/import-graph
|
|
19
7
|
*/
|
|
@@ -22,21 +10,15 @@ import fs from 'node:fs';
|
|
|
22
10
|
import path from 'node:path';
|
|
23
11
|
|
|
24
12
|
/**
|
|
25
|
-
*
|
|
26
|
-
* directories published to npm via `package.json` `files[]`. Resolving
|
|
27
|
-
* them into one graph (relativized against the repo root) means a cycle
|
|
28
|
-
* crossing two roots is visible to consumers of the graph.
|
|
13
|
+
* The npm-published roots, resolved into one graph so cross-root cycles show.
|
|
29
14
|
*
|
|
30
15
|
* @type {string[]}
|
|
31
16
|
*/
|
|
32
17
|
export const DEFAULT_ROOTS = [path.join('.agents', 'scripts'), 'bin', 'lib'];
|
|
33
18
|
|
|
34
19
|
/**
|
|
35
|
-
* Recursively collect `.js` files under `rootDir`, skipping
|
|
36
|
-
* `node_modules`. Returns absolute paths, sorted for determinism.
|
|
37
|
-
*
|
|
38
20
|
* @param {string} rootDir
|
|
39
|
-
* @returns {string[]}
|
|
21
|
+
* @returns {string[]} absolute paths, sorted
|
|
40
22
|
*/
|
|
41
23
|
export function collectJsFiles(rootDir) {
|
|
42
24
|
const out = [];
|
|
@@ -64,8 +46,6 @@ export function collectJsFiles(rootDir) {
|
|
|
64
46
|
const IMPORT_RE = /from\s+['"](\.\.?\/[^'"]+\.js)['"]/g;
|
|
65
47
|
|
|
66
48
|
/**
|
|
67
|
-
* Pure helper: extract relative static-import specifiers from source text.
|
|
68
|
-
*
|
|
69
49
|
* @param {string} source
|
|
70
50
|
* @returns {string[]}
|
|
71
51
|
*/
|
|
@@ -78,12 +58,9 @@ export function parseRelativeImports(source) {
|
|
|
78
58
|
}
|
|
79
59
|
|
|
80
60
|
/**
|
|
81
|
-
*
|
|
82
|
-
* file path relative to `rootDir`, posix-separated, so the graph (and any
|
|
83
|
-
* cycles found in it) serializes identically across platforms. Edges that
|
|
84
|
-
* resolve outside the scanned file set are dropped.
|
|
61
|
+
* Posix ids relative to `rootDir` (platform-stable); external edges dropped.
|
|
85
62
|
*
|
|
86
|
-
* @param {string[]} files
|
|
63
|
+
* @param {string[]} files
|
|
87
64
|
* @param {string} rootDir
|
|
88
65
|
* @param {{ readFile?: (p: string) => string }} [opts]
|
|
89
66
|
* @returns {Map<string, string[]>}
|
|
@@ -116,12 +93,10 @@ export function buildGraph(files, rootDir, { readFile } = {}) {
|
|
|
116
93
|
}
|
|
117
94
|
|
|
118
95
|
/**
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* "no resolvable import graph" degradation every consumer must tolerate
|
|
122
|
-
* rather than treating an absent graph as a graph with no edges.
|
|
96
|
+
* `null` when no root exists — callers must not treat that as an edgeless
|
|
97
|
+
* graph.
|
|
123
98
|
*
|
|
124
|
-
* @param {string} cwd
|
|
99
|
+
* @param {string} cwd
|
|
125
100
|
* @param {{ roots?: string[] }} [opts]
|
|
126
101
|
* @returns {Map<string, string[]> | null}
|
|
127
102
|
*/
|
|
@@ -136,9 +111,7 @@ export function resolveRepoGraph(cwd, { roots = DEFAULT_ROOTS } = {}) {
|
|
|
136
111
|
}
|
|
137
112
|
|
|
138
113
|
/**
|
|
139
|
-
*
|
|
140
|
-
* the result with a count of 0, so callers never have to distinguish
|
|
141
|
-
* "unknown module" from "module nothing imports".
|
|
114
|
+
* Every node is present (0 when nothing imports it).
|
|
142
115
|
*
|
|
143
116
|
* @param {Map<string, string[]> | null} graph
|
|
144
117
|
* @returns {Map<string, number>} empty when `graph` is null
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* single-string injection vector — args are escaped individually even
|
|
7
|
-
* when shell:true is required for binary resolution.
|
|
8
|
-
*
|
|
9
|
-
* Whitespace tokenization (no quote handling) is deliberate: the input
|
|
10
|
-
* contract is a simple `binary arg arg …` form. Operators that need
|
|
11
|
-
* quoted args can pass a `runInstall` override directly.
|
|
2
|
+
* Spawn the operator's install command in argv form, removing the
|
|
3
|
+
* single-string injection vector. Shell only on Windows (`.cmd` shims,
|
|
4
|
+
* CVE-2024-27980). Whitespace tokenization with no quoting is the contract;
|
|
5
|
+
* quoted args need a `runInstall` override.
|
|
12
6
|
*/
|
|
13
7
|
|
|
14
8
|
import { spawnSync as defaultSpawnSync } from 'node:child_process';
|
|
@@ -32,9 +26,6 @@ function parseInstallCmd(installCmd) {
|
|
|
32
26
|
}
|
|
33
27
|
|
|
34
28
|
/**
|
|
35
|
-
* Default runInstall implementation. Tokenizes `installCmd`, then spawns
|
|
36
|
-
* synchronously with the correct shell flag per platform.
|
|
37
|
-
*
|
|
38
29
|
* @param {string} installCmd
|
|
39
30
|
* @param {string} cwd
|
|
40
31
|
* @param {{ spawnSync?: typeof defaultSpawnSync }} [deps] — test seam
|
|
@@ -1,22 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* json-utils.js —
|
|
3
|
-
*
|
|
4
|
-
* Hoisted out of five callers (`lib/baselines/writer.js`,
|
|
5
|
-
* `lib/config/defaults.js`, `lib/signals/schema.js`) which
|
|
6
|
-
* shipped functionally-equivalent copies of these predicates. See Story
|
|
7
|
-
* #2464.
|
|
8
|
-
*
|
|
9
|
-
* The helpers are scoped to JSON-shaped data — numbers, strings, booleans,
|
|
10
|
-
* null, arrays, and plain objects. They do not handle Dates, Maps, Sets,
|
|
11
|
-
* RegExps, or class instances; callers either JSON-roundtrip their inputs
|
|
12
|
-
* or only ever pass JSON-equivalent values (the on-disk baseline writer
|
|
13
|
-
* and the config defaults module both fall in the second bucket).
|
|
2
|
+
* json-utils.js — predicates for JSON-shaped data only (no Dates, Maps,
|
|
3
|
+
* Sets, RegExps or class instances).
|
|
14
4
|
*/
|
|
15
5
|
|
|
16
6
|
/**
|
|
17
|
-
* Return true when `v` is a plain object (not null, not an array). Used
|
|
18
|
-
* by readers and aggregators to defensively pre-flight record shapes.
|
|
19
|
-
*
|
|
20
7
|
* @param {unknown} v
|
|
21
8
|
* @returns {boolean}
|
|
22
9
|
*/
|
|
@@ -25,9 +12,7 @@ export function isObject(v) {
|
|
|
25
12
|
}
|
|
26
13
|
|
|
27
14
|
/**
|
|
28
|
-
*
|
|
29
|
-
* ignored. Array order is significant. NaN compares unequal (matches
|
|
30
|
-
* `===` semantics; callers must not pass NaN).
|
|
15
|
+
* Key order ignored, array order significant; NaN compares unequal.
|
|
31
16
|
*
|
|
32
17
|
* @param {unknown} a
|
|
33
18
|
* @param {unknown} b
|