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,9 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dead-exports-knip.js —
|
|
3
|
-
*
|
|
4
|
-
* Owns everything about talking to knip and normalising what comes back:
|
|
5
|
-
* spawning it, reading a pre-captured report, and flattening its report into
|
|
6
|
-
* `{ file, symbol }` rows. `check-dead-exports.js` stays a thin CLI over this.
|
|
2
|
+
* dead-exports-knip.js — run knip and flatten its report into
|
|
3
|
+
* `{ file, symbol }` rows for the dead-export ratchet.
|
|
7
4
|
*
|
|
8
5
|
* @module lib/dead-exports-knip
|
|
9
6
|
*/
|
|
@@ -13,19 +10,12 @@ import fs from 'node:fs';
|
|
|
13
10
|
import process from 'node:process';
|
|
14
11
|
|
|
15
12
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* empty, which surfaces every baseline row as "removed": loud, but safe.
|
|
19
|
-
*
|
|
20
|
-
* `production` adds knip's `--production` flag, which restricts analysis to
|
|
21
|
-
* entry/project patterns carrying the `!` suffix in `knip.json`. The test globs
|
|
22
|
-
* deliberately lack that suffix, so production mode drops them as entry points
|
|
23
|
-
* and an export reachable only from a test reads as dead. Without those
|
|
24
|
-
* suffixes production mode has no entry patterns at all and reports nothing —
|
|
25
|
-
* `knip.json` and this flag are a matched pair.
|
|
13
|
+
* Never throws; on error the caller treats current rows as empty, which
|
|
14
|
+
* surfaces every baseline row as removed — loud but safe.
|
|
26
15
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
16
|
+
* `production` requires the `!`-suffixed entry patterns in `knip.json`
|
|
17
|
+
* (test globs deliberately lack it, so test-only exports read as dead);
|
|
18
|
+
* without them production mode silently reports nothing.
|
|
29
19
|
*
|
|
30
20
|
* @param {{ cwd?: string, spawn?: typeof spawnSync, production?: boolean }} [opts]
|
|
31
21
|
* @returns {{ ok: true, envelope: unknown } | { ok: false, error: string }}
|
|
@@ -61,9 +51,6 @@ export function runKnip({
|
|
|
61
51
|
}
|
|
62
52
|
|
|
63
53
|
/**
|
|
64
|
-
* Read a pre-captured knip JSON envelope from disk (the `--knip-output` test
|
|
65
|
-
* seam). Returns the parsed envelope or `null` on failure.
|
|
66
|
-
*
|
|
67
54
|
* @param {string} filePath
|
|
68
55
|
* @returns {unknown}
|
|
69
56
|
*/
|
|
@@ -75,26 +62,15 @@ export function readKnipOutput(filePath) {
|
|
|
75
62
|
}
|
|
76
63
|
}
|
|
77
64
|
|
|
78
|
-
/**
|
|
79
|
-
* Sentinel `symbol` recorded for a **whole-file death** row.
|
|
80
|
-
*
|
|
81
|
-
* Knip's `files` category names a module nothing in the graph imports. There
|
|
82
|
-
* is no per-export identity to record — the whole file is the finding — so the
|
|
83
|
-
* ratchet encodes exactly one row per dead file carrying this symbol. `*` is
|
|
84
|
-
* not a legal JavaScript identifier, so a whole-file row can never collide
|
|
85
|
-
* with a real export row for the same path.
|
|
86
|
-
*/
|
|
65
|
+
/** Whole-file death row symbol; not a legal identifier, so it cannot collide. */
|
|
87
66
|
const WHOLE_FILE_SYMBOL = '*';
|
|
88
67
|
|
|
89
68
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* Knip emits `files: [{ name: '<path>' }]`, but tolerate a bare string and
|
|
93
|
-
* fall back to the issue's own `file` so a reporter-shape change degrades to
|
|
94
|
-
* "one row for this path" rather than to silence.
|
|
69
|
+
* Tolerates bare strings and falls back to the issue's own `file`, so a
|
|
70
|
+
* reporter-shape change degrades to one row rather than silence.
|
|
95
71
|
*
|
|
96
72
|
* @param {{ files?: unknown }} issue
|
|
97
|
-
* @param {string} fallbackFile
|
|
73
|
+
* @param {string} fallbackFile
|
|
98
74
|
* @returns {string[]}
|
|
99
75
|
*/
|
|
100
76
|
function extractDeadFileNames(issue, fallbackFile) {
|
|
@@ -111,8 +87,7 @@ function extractDeadFileNames(issue, fallbackFile) {
|
|
|
111
87
|
}
|
|
112
88
|
|
|
113
89
|
/**
|
|
114
|
-
*
|
|
115
|
-
* category. Knip emits `exports: [{ name, ... }]`; older shapes used `symbol`.
|
|
90
|
+
* Accepts `name` or the older `symbol` field.
|
|
116
91
|
*
|
|
117
92
|
* @param {{ exports?: unknown }} issue
|
|
118
93
|
* @returns {string[]}
|
|
@@ -131,26 +106,13 @@ function extractDeadExportSymbols(issue) {
|
|
|
131
106
|
}
|
|
132
107
|
|
|
133
108
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* - **`exports`** → one row per unused export, `{ file, symbol: '<name>' }`.
|
|
140
|
-
* - **`files`** → one row per module nothing imports,
|
|
141
|
-
* `{ file, symbol: '*' }`. Story #5001 added this leg: mapping only
|
|
142
|
-
* `exports` made the ratchet structurally blind to *whole-file* death, so a
|
|
143
|
-
* module could lose its last caller and every one of its exports go unused
|
|
144
|
-
* without a single row changing. Knip reports such a module once, under
|
|
145
|
-
* `files`, and suppresses its per-export rows — which is exactly why the
|
|
146
|
-
* export-only reading saw nothing.
|
|
147
|
-
*
|
|
148
|
-
* Whole-file rows are de-duplicated by path so the row set is stable across
|
|
149
|
-
* runs regardless of how many issue records mention the same file. Dependency-
|
|
150
|
-
* and duplicate-level issues stay ignored; knip surfaces those under their own
|
|
151
|
-
* `rules` keys and they are not a code-death signal.
|
|
109
|
+
* Maps `exports` (one row per unused export) and `files` (one `'*'` row per
|
|
110
|
+
* unimported module, de-duplicated). The `files` leg is required: knip
|
|
111
|
+
* suppresses a dead module's per-export rows, so an export-only reading is
|
|
112
|
+
* blind to whole-file death. Dependency issues are not code death and are
|
|
113
|
+
* ignored.
|
|
152
114
|
*
|
|
153
|
-
* @param {unknown} knipEnvelope
|
|
115
|
+
* @param {unknown} knipEnvelope
|
|
154
116
|
* @returns {Array<{ file: string, symbol: string }>}
|
|
155
117
|
*/
|
|
156
118
|
export function extractRowsFromKnip(knipEnvelope) {
|
|
@@ -1,42 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dead-exports-mode.js — the
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* place keeps the three from drifting apart — a pass that ran production knip
|
|
8
|
-
* against the default baseline would report every test-only export as newly
|
|
9
|
-
* dead and fail the build for no reason.
|
|
10
|
-
*
|
|
11
|
-
* - **default** — `tests/**` are knip entry points, so an export imported only
|
|
12
|
-
* by a test reads as used. This is the historical gate.
|
|
13
|
-
* - **production** — knip's `--production` drops the test entries, so an export
|
|
14
|
-
* no production code reaches reads as dead. Depends on the `!` pattern
|
|
15
|
-
* suffixes in `knip.json`; without them production mode has no entry points
|
|
16
|
-
* and silently reports nothing.
|
|
17
|
-
*
|
|
18
|
-
* The two ratchet against separate baselines on purpose. This repo sanctions
|
|
19
|
-
* exporting purely for a test (`.agents/rules/test-seams.md`), so the
|
|
20
|
-
* production row set is large and mostly intentional; merging it into the
|
|
21
|
-
* default baseline would destroy that baseline's meaning.
|
|
2
|
+
* dead-exports-mode.js — the matched knip-mode / baseline / label triple for
|
|
3
|
+
* each dead-export pass; mixing them (production knip against the default
|
|
4
|
+
* baseline) would flag every test-only export as newly dead. Separate
|
|
5
|
+
* baselines on purpose: exporting for tests is sanctioned, so the production
|
|
6
|
+
* row set is large and mostly intentional.
|
|
22
7
|
*
|
|
23
8
|
* @module lib/dead-exports-mode
|
|
24
9
|
*/
|
|
25
10
|
|
|
26
11
|
import path from 'node:path';
|
|
27
12
|
|
|
28
|
-
/** Baseline for the default pass (test entry points included). */
|
|
29
13
|
const DEFAULT_BASELINE = path.join('baselines', 'dead-exports.json');
|
|
30
14
|
|
|
31
|
-
/** Baseline for the `--production` pass (test-only-importer discount). */
|
|
32
15
|
const PRODUCTION_BASELINE = path.join(
|
|
33
16
|
'baselines',
|
|
34
17
|
'dead-exports-production.json',
|
|
35
18
|
);
|
|
36
19
|
|
|
37
20
|
/**
|
|
38
|
-
* Resolve the baseline / label / mode-tag triple for a pass.
|
|
39
|
-
*
|
|
40
21
|
* @param {boolean} production
|
|
41
22
|
* @returns {{ mode: 'production'|'default', label: string, baseline: string }}
|
|
42
23
|
*/
|
|
@@ -1,21 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* (audit-suite selector diff-timeout, lint-baseline JSON-parse, baseline-refresh
|
|
6
|
-
* guardrail git-diff) historically returned a silent zero/empty result. Two
|
|
7
|
-
* remain; the lint-baseline site left with its CLI. The contract is:
|
|
8
|
-
*
|
|
9
|
-
* { ok: false, degraded: true, reason: <code>, detail: <human> }
|
|
10
|
-
*
|
|
11
|
-
* with a non-zero CLI exit so the operator/agent has explicit visibility, OR
|
|
12
|
-
* a hard-fail closed when `--gate-mode` / `MANDREL_GATE_MODE=1` is set
|
|
13
|
-
* (CI invocations).
|
|
2
|
+
* Explicit-degraded contract for soft-failing gates: return the degraded
|
|
3
|
+
* envelope (with a non-zero CLI exit) instead of a silent empty result, or
|
|
4
|
+
* hard-fail when `--gate-mode` / `MANDREL_GATE_MODE=1` is set (CI).
|
|
14
5
|
*/
|
|
15
6
|
|
|
16
7
|
/**
|
|
17
|
-
* Build the canonical degraded envelope.
|
|
18
|
-
*
|
|
19
8
|
* @param {string} reason Machine-readable code (e.g. `GIT_DIFF_TIMEOUT`).
|
|
20
9
|
* @param {string} [detail] Human-readable explanation for operators.
|
|
21
10
|
* @returns {{ ok: false, degraded: true, reason: string, detail: string }}
|
|
@@ -24,9 +13,6 @@ export function degraded(reason, detail = '') {
|
|
|
24
13
|
return { ok: false, degraded: true, reason, detail };
|
|
25
14
|
}
|
|
26
15
|
|
|
27
|
-
/**
|
|
28
|
-
* True when `value` carries the degraded envelope shape.
|
|
29
|
-
*/
|
|
30
16
|
export function isDegraded(value) {
|
|
31
17
|
return Boolean(
|
|
32
18
|
value &&
|
|
@@ -37,11 +23,6 @@ export function isDegraded(value) {
|
|
|
37
23
|
);
|
|
38
24
|
}
|
|
39
25
|
|
|
40
|
-
/**
|
|
41
|
-
* Decide whether the caller is running in gate-mode (hard-fail closed) based
|
|
42
|
-
* on argv and env. CI invocations set `--gate-mode` or
|
|
43
|
-
* `MANDREL_GATE_MODE=1`; local invocations leave both unset.
|
|
44
|
-
*/
|
|
45
26
|
export function isGateMode({ argv = process.argv, env = process.env } = {}) {
|
|
46
27
|
if (Array.isArray(argv) && argv.includes('--gate-mode')) return true;
|
|
47
28
|
if (env && env.MANDREL_GATE_MODE === '1') return true;
|
|
@@ -49,10 +30,6 @@ export function isGateMode({ argv = process.argv, env = process.env } = {}) {
|
|
|
49
30
|
}
|
|
50
31
|
|
|
51
32
|
/**
|
|
52
|
-
* In gate-mode, throw a hard-fail Error keyed to `reason`. Otherwise return
|
|
53
|
-
* the degraded envelope. Centralises the if-gate-mode branch so each site has
|
|
54
|
-
* a single call site.
|
|
55
|
-
*
|
|
56
33
|
* @param {string} reason
|
|
57
34
|
* @param {string} [detail]
|
|
58
35
|
* @param {{ argv?: string[], env?: NodeJS.ProcessEnv }} [opts]
|
|
@@ -1,31 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dependency-parser.js —
|
|
3
|
-
*
|
|
4
|
-
* Canonical implementation of dependency-related regex parsing and
|
|
5
|
-
* ticket metadata extraction, shared by the ticketing provider and the
|
|
6
|
-
* orchestration layer (e.g. providers/github/tickets.js,
|
|
7
|
-
* lib/story-adjacency.js, lib/branch-name-guard.js).
|
|
2
|
+
* dependency-parser.js — dependency-edge and ticket-metadata parsing shared
|
|
3
|
+
* by the ticketing provider and orchestration layer.
|
|
8
4
|
*/
|
|
9
5
|
|
|
10
6
|
import { parseFooterBlockedByIds } from './story-body/footer-block.js';
|
|
11
7
|
|
|
12
8
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* Only a `blocked by #N` line standing alone inside the `---` footer block
|
|
17
|
-
* declares an edge. The unanchored predecessor scanned the whole body for
|
|
18
|
-
* `blocked by|depends on #N` anywhere, so a Story whose prose merely mentioned
|
|
19
|
-
* a blocker — an example, a changelog note, an acceptance criterion describing
|
|
20
|
-
* this very defect — minted a real dispatch gate that withheld the Story until
|
|
21
|
-
* an unrelated issue closed.
|
|
22
|
-
*
|
|
23
|
-
* The behaviour change is deliberate and user-visible: prose-only mentions
|
|
24
|
-
* outside the footer no longer gate. Every machine-authored body already
|
|
25
|
-
* carries the canonical footer form (`plan-persist` has always serialized it),
|
|
26
|
-
* so only hand-written prose edges are affected — those must be moved into the
|
|
27
|
-
* footer block to keep gating. The grammar itself lives in
|
|
28
|
-
* `lib/story-body/footer-block.js`, shared with the body parser.
|
|
9
|
+
* Footer-scoped and strict: only a standalone `blocked by #N` line in the
|
|
10
|
+
* `---` footer declares an edge. Prose mentions elsewhere never gate, so a
|
|
11
|
+
* hand-written edge must live in the footer.
|
|
29
12
|
*
|
|
30
13
|
* @param {string} body - Issue body or freeform text.
|
|
31
14
|
* @returns {number[]} Array of issue numbers this body declares as blockers.
|
|
@@ -35,8 +18,6 @@ export function parseBlockedBy(body) {
|
|
|
35
18
|
}
|
|
36
19
|
|
|
37
20
|
/**
|
|
38
|
-
* Parse `blocks #NNN` references from text.
|
|
39
|
-
*
|
|
40
21
|
* @param {string} body - Issue body or freeform text.
|
|
41
22
|
* @returns {number[]} Array of issue numbers this text declares as blocked.
|
|
42
23
|
*/
|
|
@@ -47,11 +28,7 @@ export function parseBlocks(body) {
|
|
|
47
28
|
}
|
|
48
29
|
|
|
49
30
|
/**
|
|
50
|
-
*
|
|
51
|
-
* anchored to the start of a line (multiline + case-insensitive). The
|
|
52
|
-
* anchored form prevents accidental matches inside prose ("...this Epic:
|
|
53
|
-
* #...follow-on..."). Used during state-transition notification dispatch
|
|
54
|
-
* and Story-level execution planning.
|
|
31
|
+
* Line-anchored `Epic: #N`, so prose like "this Epic: #…" cannot match.
|
|
55
32
|
*
|
|
56
33
|
* @param {string|null|undefined} body
|
|
57
34
|
* @returns {number|null}
|
|
@@ -63,22 +40,15 @@ export function extractEpicIdFromBody(body) {
|
|
|
63
40
|
}
|
|
64
41
|
|
|
65
42
|
/**
|
|
66
|
-
*
|
|
67
|
-
* Rejects shell metacharacters, whitespace, and other dangerous patterns.
|
|
43
|
+
* Allow-list: alphanumerics, `.`, `_`, `-`, `/`.
|
|
68
44
|
*
|
|
69
45
|
* @param {string} value - The value to validate.
|
|
70
46
|
* @returns {boolean} True if safe for use in branch names.
|
|
71
47
|
*/
|
|
72
48
|
export function isSafeBranchComponent(value) {
|
|
73
|
-
// Allow: alphanumeric, hyphens, underscores, dots, forward slashes
|
|
74
|
-
// Reject: everything else (shell metacharacters, spaces, etc.)
|
|
75
49
|
return /^[a-zA-Z0-9._\-/]+$/.test(value);
|
|
76
50
|
}
|
|
77
51
|
|
|
78
|
-
/**
|
|
79
|
-
* Pre-compiled `**Key**: value` matchers for every metadata key we extract.
|
|
80
|
-
* Construction cost is paid once at module load rather than per task.
|
|
81
|
-
*/
|
|
82
52
|
const METADATA_FIELD_KEYS = [
|
|
83
53
|
'Persona',
|
|
84
54
|
'Mode',
|
|
@@ -94,9 +64,7 @@ const METADATA_FIELD_RES = new Map(
|
|
|
94
64
|
);
|
|
95
65
|
|
|
96
66
|
/**
|
|
97
|
-
* Parse
|
|
98
|
-
* Returns a plain object with `persona`, `mode`, `skills`, `focusAreas`,
|
|
99
|
-
* and `protocolVersion`.
|
|
67
|
+
* Parse the `## Metadata` section's `**Key**: value` fields.
|
|
100
68
|
*
|
|
101
69
|
* @param {string} body - Issue body text.
|
|
102
70
|
* @returns {{ persona: string, mode: string, skills: string[], focusAreas: string[], protocolVersion: string }}
|
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dependency-version.js — read an installed package's version
|
|
3
|
-
* evaluating the package (
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* — pays the package's whole module-initialisation cost for a string that is
|
|
8
|
-
* sitting in a manifest a few kilobytes long. For `typescript` that was ~65 ms
|
|
9
|
-
* of CPU and ~75 MB of RSS on every `check-baselines --gate crap` and every
|
|
10
|
-
* `quality-preview` run, in a repository with no TypeScript in it at all.
|
|
11
|
-
*
|
|
12
|
-
* `require.resolve` walks the resolver without reading or executing the
|
|
13
|
-
* target, so everything here is path arithmetic plus one small `JSON.parse`.
|
|
14
|
-
*
|
|
15
|
-
* This deliberately does **not** replace `crap-utils.js#resolveEscomplexVersion`,
|
|
16
|
-
* which answers a different question: it walks `node_modules` upward from a
|
|
17
|
-
* caller-supplied `cwd` rather than resolving from this module's own location,
|
|
18
|
-
* because the escomplex stamp must describe the tree being scanned.
|
|
2
|
+
* dependency-version.js — read an installed package's version from its
|
|
3
|
+
* manifest without evaluating the package (`require(pkg).version` pays the
|
|
4
|
+
* whole module init; for `typescript` that is tens of ms and MB per gate).
|
|
5
|
+
* Unlike `crap-utils.js#resolveEscomplexVersion`, this resolves from this
|
|
6
|
+
* module's location, not a scanned `cwd`.
|
|
19
7
|
*
|
|
20
8
|
* @module lib/dependency-version
|
|
21
9
|
*/
|
|
@@ -24,17 +12,12 @@ import fs from 'node:fs';
|
|
|
24
12
|
import path from 'node:path';
|
|
25
13
|
|
|
26
14
|
/**
|
|
27
|
-
*
|
|
15
|
+
* Tries `<pkg>/package.json` first; when `exports` withholds it, resolves the
|
|
16
|
+
* main entry and walks up — still evaluation-free.
|
|
28
17
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* `package.json`, which is still evaluation-free.
|
|
33
|
-
*
|
|
34
|
-
* @param {string} name Package name, e.g. `'typescript'`.
|
|
35
|
-
* @param {NodeJS.Require} requireFn A `createRequire`-produced require whose
|
|
36
|
-
* resolution base is the calling module.
|
|
37
|
-
* @returns {string | null} Absolute manifest path, or `null` when unresolvable.
|
|
18
|
+
* @param {string} name
|
|
19
|
+
* @param {NodeJS.Require} requireFn
|
|
20
|
+
* @returns {string | null}
|
|
38
21
|
*/
|
|
39
22
|
function resolveManifestPath(name, requireFn) {
|
|
40
23
|
try {
|
|
@@ -60,15 +43,10 @@ function resolveManifestPath(name, requireFn) {
|
|
|
60
43
|
}
|
|
61
44
|
|
|
62
45
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* Returns `null` — never a guess and never a throw — when the package cannot
|
|
66
|
-
* be resolved, its manifest cannot be read or parsed, or it declares no
|
|
67
|
-
* usable `version`. Callers map that onto their own sentinel (the baseline
|
|
68
|
-
* writers use `'0.0.0'`, meaning "unknown environment").
|
|
46
|
+
* `null` — never a guess or a throw — when unresolvable or versionless.
|
|
69
47
|
*
|
|
70
|
-
* @param {string} name
|
|
71
|
-
* @param {NodeJS.Require} requireFn
|
|
48
|
+
* @param {string} name
|
|
49
|
+
* @param {NodeJS.Require} requireFn
|
|
72
50
|
* @returns {string | null}
|
|
73
51
|
*/
|
|
74
52
|
export function resolveDependencyVersion(name, requireFn) {
|
|
@@ -1,39 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* detect-package-manager —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* codebase before this consolidation:
|
|
6
|
-
* - `lib/cli/update.js#detectPackageManager`
|
|
7
|
-
* - `lib/bootstrap/project-bootstrap.js#detectPackageManager`
|
|
8
|
-
* - `lib/runtime-deps/preflight.js#detectPackageManager`
|
|
9
|
-
* - `lib/worktree/node-modules-strategy.js#selectInstallCommand` (inline)
|
|
10
|
-
*
|
|
11
|
-
* This module is the single authoritative implementation. It uses the
|
|
12
|
-
* strictest semantics from the prior copies: detects `bun` in addition to
|
|
13
|
-
* pnpm/yarn/npm, returns `null` when the directory has no Node manifest at
|
|
14
|
-
* all (not even `package.json`), and optionally reports `workspaceRoot` for
|
|
15
|
-
* pnpm (the `update.js` caller's unique requirement).
|
|
16
|
-
*
|
|
17
|
-
* All callers must handle `null` explicitly — it means the directory carries
|
|
18
|
-
* no recognizable Node toolchain, so callers that need a concrete fallback
|
|
19
|
-
* should coerce: `detectPm(root) ?? 'npm'`.
|
|
20
|
-
*
|
|
21
|
-
* Injectable seams: the `exists` parameter replaces `fs.existsSync` so
|
|
22
|
-
* callers can drive the function with an in-memory fixture in unit tests.
|
|
23
|
-
*
|
|
24
|
-
* Builtins only — this module runs before third-party packages are
|
|
25
|
-
* guaranteed to be present and is also imported from the worktree and
|
|
26
|
-
* runtime-deps preflight guards.
|
|
2
|
+
* detect-package-manager — the single lockfile probe. `null` means no Node
|
|
3
|
+
* manifest at all; callers needing a default coerce (`?? 'npm'`). Builtins
|
|
4
|
+
* only: it runs before third-party packages are guaranteed present.
|
|
27
5
|
*/
|
|
28
6
|
|
|
29
7
|
import fs from 'node:fs';
|
|
30
8
|
import path from 'node:path';
|
|
31
9
|
|
|
32
10
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* Precedence: `pnpm-lock.yaml` > `yarn.lock` > `bun.lockb` >
|
|
36
|
-
* `package-lock.json` > `package.json` (npm without a lockfile yet) > `null`.
|
|
11
|
+
* Precedence: pnpm > yarn > bun > package-lock > bare `package.json` (npm).
|
|
37
12
|
*
|
|
38
13
|
* @param {string} root - Absolute directory to probe (consumer project root).
|
|
39
14
|
* @param {(p: string) => boolean} [exists=fs.existsSync] - Path existence probe.
|
|
@@ -49,13 +24,8 @@ export function detectPackageManager(root, exists = fs.existsSync) {
|
|
|
49
24
|
}
|
|
50
25
|
|
|
51
26
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* `pnpm-workspace.yaml` is present alongside the lockfile — the signal that
|
|
55
|
-
* `pnpm add` must carry `-w` to target the workspace-root manifest.
|
|
56
|
-
*
|
|
57
|
-
* Used by `lib/cli/update.js` which needs both pieces of information to
|
|
58
|
-
* construct the correct install command.
|
|
27
|
+
* `workspaceRoot` is true only for pnpm with `pnpm-workspace.yaml` — then
|
|
28
|
+
* `pnpm add` needs `-w`.
|
|
59
29
|
*
|
|
60
30
|
* @param {string} root - Absolute directory to probe.
|
|
61
31
|
* @param {(p: string) => boolean} [exists=fs.existsSync] - Path existence probe.
|