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,102 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* CLI: assert `package.json`'s pinned-override safety notes still describe
|
|
4
|
-
* the pins they document.
|
|
5
|
-
*
|
|
6
|
-
* The `"//"` notes on a pinned `overrides` entry are consulted at exactly one
|
|
7
|
-
* moment — when someone is deciding whether bumping it is safe. A note that
|
|
8
|
-
* quotes a version the pin has since moved past answers that question wrong,
|
|
9
|
-
* and nothing was checking. This gate makes the note unable to fall behind.
|
|
10
|
-
*
|
|
11
|
-
* Exit codes:
|
|
12
|
-
* 0 — every documented override matches its note and its direct range.
|
|
13
|
-
* 1 — drift: a stale note, a broken lockstep, or a note for a pin that is
|
|
14
|
-
* gone.
|
|
15
|
-
* 2 — the check could not run (no readable `package.json`).
|
|
16
|
-
*/
|
|
17
|
-
import { readFileSync } from 'node:fs';
|
|
18
|
-
import path from 'node:path';
|
|
19
|
-
import process from 'node:process';
|
|
20
|
-
|
|
21
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
22
|
-
import { Logger } from './lib/Logger.js';
|
|
23
|
-
import { auditPinnedOverrideNotes } from './lib/pinned-override-notes.js';
|
|
24
|
-
|
|
25
|
-
const EXIT_PASS = 0;
|
|
26
|
-
const EXIT_DRIFT = 1;
|
|
27
|
-
const EXIT_CANNOT_RUN = 2;
|
|
28
|
-
|
|
29
|
-
const HELP = {
|
|
30
|
-
invocation:
|
|
31
|
-
'node .agents/scripts/check-pinned-override-notes.js [--cwd <dir>] [--json]',
|
|
32
|
-
summary:
|
|
33
|
-
'Assert every "//" note documenting a pinned npm override states the range that override actually carries, and that its direct dependency range matches.',
|
|
34
|
-
flags: [
|
|
35
|
-
['--cwd <dir>', 'Repository root to check. Default: process.cwd().'],
|
|
36
|
-
['--json', 'Emit the findings as JSON instead of text.'],
|
|
37
|
-
],
|
|
38
|
-
notes: [
|
|
39
|
-
'Checks are derived from the "//" keys themselves — any `overrides.<name>`\nnote is covered, so a second pinned override is guarded by writing its note.',
|
|
40
|
-
'A note quoting no semver range at all is not scored: prose that names no\nversion cannot go stale.',
|
|
41
|
-
'Exit codes:\n 0 notes match their pins\n 1 drift (stale note, broken lockstep, or a note for a removed pin)\n 2 the check could not run',
|
|
42
|
-
],
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export function parseArgs(argv) {
|
|
46
|
-
const out = { cwd: process.cwd(), json: false };
|
|
47
|
-
for (let i = 2; i < argv.length; i += 1) {
|
|
48
|
-
if (argv[i] === '--cwd') out.cwd = argv[++i] ?? out.cwd;
|
|
49
|
-
else if (argv[i] === '--json') out.json = true;
|
|
50
|
-
}
|
|
51
|
-
return out;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* @param {string[]} [argv]
|
|
56
|
-
* @param {{ readPackage?: (cwd: string) => object, logger?: object }} [deps]
|
|
57
|
-
* @returns {number} process exit code
|
|
58
|
-
*/
|
|
59
|
-
export function runCheck(argv = process.argv, deps = {}) {
|
|
60
|
-
const { readPackage = defaultReadPackage, logger = Logger } = deps;
|
|
61
|
-
const args = parseArgs(argv);
|
|
62
|
-
|
|
63
|
-
let pkg;
|
|
64
|
-
try {
|
|
65
|
-
pkg = readPackage(args.cwd);
|
|
66
|
-
} catch (err) {
|
|
67
|
-
logger.error(
|
|
68
|
-
`[pinned-override-notes] ✖ could not read package.json: ${String(err?.message ?? err)}`,
|
|
69
|
-
);
|
|
70
|
-
return EXIT_CANNOT_RUN;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const report = auditPinnedOverrideNotes(pkg);
|
|
74
|
-
if (args.json) {
|
|
75
|
-
logger.info(JSON.stringify(report, null, 2));
|
|
76
|
-
return report.findings.length > 0 ? EXIT_DRIFT : EXIT_PASS;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (report.findings.length === 0) {
|
|
80
|
-
logger.info(
|
|
81
|
-
`[pinned-override-notes] ✅ ${report.checked.length} documented override pin(s) match their notes.`,
|
|
82
|
-
);
|
|
83
|
-
return EXIT_PASS;
|
|
84
|
-
}
|
|
85
|
-
for (const finding of report.findings) {
|
|
86
|
-
logger.error(
|
|
87
|
-
`[pinned-override-notes] ✖ ${finding.kind}: ${finding.detail}`,
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
return EXIT_DRIFT;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function defaultReadPackage(cwd) {
|
|
94
|
-
return JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf8'));
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
runAsCli(import.meta.url, async () => runCheck(), {
|
|
98
|
-
source: 'pinned-override-notes',
|
|
99
|
-
propagateExitCode: true,
|
|
100
|
-
errorPrefix: '[pinned-override-notes] ❌ Fatal error',
|
|
101
|
-
usage: HELP,
|
|
102
|
-
});
|
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* CLI: report every JSON Schema under `.agents/schemas/` that no code path
|
|
5
|
-
* compiles.
|
|
6
|
-
*
|
|
7
|
-
* A well-formed schema sitting in a schema directory reads as an enforced
|
|
8
|
-
* contract to every human reader and every audit lens — existence plus valid
|
|
9
|
-
* syntax is taken for authority. When nothing actually compiles it, that
|
|
10
|
-
* reading is wrong in the most expensive direction: the reader believes a
|
|
11
|
-
* shape the runtime rejects. `friction-event.schema.json` sat unreferenced
|
|
12
|
-
* from the Epic #4406 envelope cutover until Story #4938; in between, an
|
|
13
|
-
* `/audit-documentation` lens graded a High finding against it as the live
|
|
14
|
-
* contract, the finding became an acceptance criterion, and the delivering
|
|
15
|
-
* worker had to overrule that criterion to avoid writing a payload the
|
|
16
|
-
* enforced validator drops. Two verification layers accepted the file
|
|
17
|
-
* because it existed and parsed. Only reading the code caught it.
|
|
18
|
-
*
|
|
19
|
-
* This gate is that code read, run every time instead of once by accident.
|
|
20
|
-
*
|
|
21
|
-
* ## What counts as a compiling reference
|
|
22
|
-
*
|
|
23
|
-
* Resolution is evidence-ranked; the first kind that hits wins, and the
|
|
24
|
-
* report names both the kind and the file that supplied the evidence, so a
|
|
25
|
-
* pass is auditable rather than merely green.
|
|
26
|
-
*
|
|
27
|
-
* 1. `literal` — the schema's basename appears in a JS source. This is
|
|
28
|
-
* the ordinary idiom (`signal-validator.js` resolves
|
|
29
|
-
* `signal-event.schema.json` by literal path).
|
|
30
|
-
* 2. `schema-ref` — another schema `$ref`s this file by name, and that
|
|
31
|
-
* schema is itself referenced. A `$ref` is a compile
|
|
32
|
-
* edge: AJV pulls the target in when the parent
|
|
33
|
-
* compiles.
|
|
34
|
-
* 3. `dynamic` — the schema lives in a SUBDIRECTORY of the schema root
|
|
35
|
-
* that some JS source loads by computed path (a
|
|
36
|
-
* `` `${key}.schema.json` `` template), AND the
|
|
37
|
-
* schema's stem appears literally in a JS source as the
|
|
38
|
-
* key that would produce it. `lifecycle/` is loaded this
|
|
39
|
-
* way by `lifecycle/emit-ledger-event.js`, and
|
|
40
|
-
* `baselines/` by `lib/baselines/envelope.js`.
|
|
41
|
-
*
|
|
42
|
-
* BOTH halves are required. The directory evidence alone
|
|
43
|
-
* would bless every future file dropped into a
|
|
44
|
-
* dynamically-enumerated directory — the same blindness
|
|
45
|
-
* this gate exists to remove. Dynamic resolution is not
|
|
46
|
-
* offered for schemas sitting at the schema root: every
|
|
47
|
-
* root schema today is compiled by an explicit literal
|
|
48
|
-
* path, so a root-level stem match would be coincidence,
|
|
49
|
-
* not evidence.
|
|
50
|
-
*
|
|
51
|
-
* Anything left over is a finding — unless the schema says otherwise in its
|
|
52
|
-
* own body (see below). A finding is not an accusation of deadness; it is a
|
|
53
|
-
* demand that the file state which one it is.
|
|
54
|
-
*
|
|
55
|
-
* ## Recording a deliberate exemption
|
|
56
|
-
*
|
|
57
|
-
* A schema deliberately kept without a compiler declares it IN THE FILE, at
|
|
58
|
-
* the document root:
|
|
59
|
-
*
|
|
60
|
-
* ```json
|
|
61
|
-
* "x-mandrel-uncompiled": {
|
|
62
|
-
* "reason": "Documented SSOT; AJV is deliberately not in this path.",
|
|
63
|
-
* "runtimeGate": "lib/orchestration/foo.js#validateFooPayload"
|
|
64
|
-
* }
|
|
65
|
-
* ```
|
|
66
|
-
*
|
|
67
|
-
* In-file, never a side-car allowlist. The failure this gate answers was a
|
|
68
|
-
* reader trusting the schema document; the correction has to be legible to
|
|
69
|
-
* that same reader, in that same document. An allowlist elsewhere in the repo
|
|
70
|
-
* would leave the file itself still lying.
|
|
71
|
-
*
|
|
72
|
-
* Story #4938 left the tree with two: `friction-event.schema.json` was deleted
|
|
73
|
-
* outright (its shape preserved field-for-field in
|
|
74
|
-
* `docs/archive/data-dictionary-2026-08.md`), and
|
|
75
|
-
* `model-attribution.schema.json` — a documented SSOT with a hand-rolled
|
|
76
|
-
* validator behind it — declared the marker. Story #5367 deleted that one too,
|
|
77
|
-
* with the module whose validator was the gate, so the marker is now a
|
|
78
|
-
* facility with no current user rather than a practice with a live example.
|
|
79
|
-
*
|
|
80
|
-
* The gate answers "is anything compiling this?", not "is what compiles it
|
|
81
|
-
* faithful to it?". A schema whose hand-rolled mirror has silently drifted
|
|
82
|
-
* still passes here.
|
|
83
|
-
*
|
|
84
|
-
* Flags:
|
|
85
|
-
* --root <path> scan a different repository root (default: cwd)
|
|
86
|
-
* --json emit the structured envelope as single-line JSON
|
|
87
|
-
*/
|
|
88
|
-
|
|
89
|
-
import fs from 'node:fs';
|
|
90
|
-
import path from 'node:path';
|
|
91
|
-
import process from 'node:process';
|
|
92
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
93
|
-
import { stripJsComments } from './lib/source-text/strip-js-comments.js';
|
|
94
|
-
|
|
95
|
-
/** Schema root, relative to the repository root. */
|
|
96
|
-
const SCHEMA_ROOT = path.join('.agents', 'schemas');
|
|
97
|
-
|
|
98
|
-
/** Directories never worth walking for JS sources. */
|
|
99
|
-
const SKIP_DIRS = new Set([
|
|
100
|
-
'.git',
|
|
101
|
-
'.worktrees',
|
|
102
|
-
'node_modules',
|
|
103
|
-
'coverage',
|
|
104
|
-
'temp',
|
|
105
|
-
]);
|
|
106
|
-
|
|
107
|
-
/** Source extensions that can compile a schema. */
|
|
108
|
-
const JS_EXTENSIONS = new Set(['.js', '.mjs', '.cjs']);
|
|
109
|
-
|
|
110
|
-
/** Root keyword a schema uses to declare a deliberate exemption. */
|
|
111
|
-
const EXEMPTION_KEY = 'x-mandrel-uncompiled';
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* A computed schema path — `` `${something}.schema.json` `` — anywhere in a
|
|
115
|
-
* source file. Evidence that the file loads schemas by runtime key rather
|
|
116
|
-
* than by literal name.
|
|
117
|
-
*/
|
|
118
|
-
const COMPUTED_PATH_RE = /\$\{[^}]*\}\.schema\.json/;
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Parse argv. Exported so a unit test can pin the parser without spawning.
|
|
122
|
-
*
|
|
123
|
-
* @param {string[]} argv
|
|
124
|
-
* @returns {{ root: string, json: boolean }}
|
|
125
|
-
*/
|
|
126
|
-
export function parseArgv(argv = []) {
|
|
127
|
-
const out = { root: process.cwd(), json: false };
|
|
128
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
129
|
-
if (argv[i] === '--json') out.json = true;
|
|
130
|
-
else if (argv[i] === '--root' && argv[i + 1]) {
|
|
131
|
-
out.root = path.resolve(argv[i + 1]);
|
|
132
|
-
i += 1;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return out;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Recursively collect files under `dir` whose extension is in `extensions`.
|
|
140
|
-
*
|
|
141
|
-
* @param {string} dir absolute directory to walk
|
|
142
|
-
* @param {Set<string>} extensions lowercase extensions including the dot
|
|
143
|
-
* @param {string[]} [acc]
|
|
144
|
-
* @returns {string[]} absolute file paths
|
|
145
|
-
*/
|
|
146
|
-
function walk(dir, extensions, acc = []) {
|
|
147
|
-
let entries;
|
|
148
|
-
try {
|
|
149
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
150
|
-
} catch {
|
|
151
|
-
return acc;
|
|
152
|
-
}
|
|
153
|
-
for (const entry of entries) {
|
|
154
|
-
const full = path.join(dir, entry.name);
|
|
155
|
-
if (entry.isDirectory()) {
|
|
156
|
-
if (!SKIP_DIRS.has(entry.name)) walk(full, extensions, acc);
|
|
157
|
-
} else if (extensions.has(path.extname(entry.name).toLowerCase())) {
|
|
158
|
-
acc.push(full);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return acc;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Read every JS source in the repository once.
|
|
166
|
-
*
|
|
167
|
-
* @param {string} root absolute repository root
|
|
168
|
-
* @returns {Array<{ rel: string, text: string }>}
|
|
169
|
-
*/
|
|
170
|
-
function readSources(root) {
|
|
171
|
-
return walk(root, JS_EXTENSIONS).map((file) => ({
|
|
172
|
-
rel: path.relative(root, file),
|
|
173
|
-
text: stripJsComments(fs.readFileSync(file, 'utf8')),
|
|
174
|
-
}));
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Describe every `*.schema.json` under the schema root.
|
|
179
|
-
*
|
|
180
|
-
* @param {string} root absolute repository root
|
|
181
|
-
* @returns {Array<{ rel: string, basename: string, stem: string, dir: string, doc: object|null }>}
|
|
182
|
-
*/
|
|
183
|
-
function readSchemas(root) {
|
|
184
|
-
const schemaRoot = path.join(root, SCHEMA_ROOT);
|
|
185
|
-
return walk(schemaRoot, new Set(['.json']))
|
|
186
|
-
.filter((file) => file.endsWith('.schema.json'))
|
|
187
|
-
.map((file) => {
|
|
188
|
-
const basename = path.basename(file);
|
|
189
|
-
let doc = null;
|
|
190
|
-
try {
|
|
191
|
-
doc = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
192
|
-
} catch {
|
|
193
|
-
doc = null;
|
|
194
|
-
}
|
|
195
|
-
return {
|
|
196
|
-
rel: path.relative(root, file),
|
|
197
|
-
basename,
|
|
198
|
-
stem: basename.slice(0, -'.schema.json'.length),
|
|
199
|
-
dir: path.relative(schemaRoot, path.dirname(file)),
|
|
200
|
-
doc,
|
|
201
|
-
};
|
|
202
|
-
})
|
|
203
|
-
.sort((a, b) => a.rel.localeCompare(b.rel));
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Find the first source whose text contains `needle`.
|
|
208
|
-
*
|
|
209
|
-
* @param {Array<{ rel: string, text: string }>} sources
|
|
210
|
-
* @param {string} needle
|
|
211
|
-
* @returns {string | null} the relative path of the witness, or null
|
|
212
|
-
*/
|
|
213
|
-
function witness(sources, needle) {
|
|
214
|
-
const hit = sources.find((source) => source.text.includes(needle));
|
|
215
|
-
return hit ? hit.rel : null;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Find a source that loads schemas from `dir` by computed path.
|
|
220
|
-
*
|
|
221
|
-
* The file must both build a runtime-keyed schema path and name the
|
|
222
|
-
* directory — as a quoted `path.join` segment or as a `schemas/<dir>` path
|
|
223
|
-
* fragment.
|
|
224
|
-
*
|
|
225
|
-
* @param {Array<{ rel: string, text: string }>} sources
|
|
226
|
-
* @param {string} dir directory name relative to the schema root
|
|
227
|
-
* @returns {string | null}
|
|
228
|
-
*/
|
|
229
|
-
function dynamicLoaderFor(sources, dir) {
|
|
230
|
-
if (!dir) return null;
|
|
231
|
-
const hit = sources.find(
|
|
232
|
-
(source) =>
|
|
233
|
-
COMPUTED_PATH_RE.test(source.text) &&
|
|
234
|
-
(source.text.includes(`'${dir}'`) ||
|
|
235
|
-
source.text.includes(`"${dir}"`) ||
|
|
236
|
-
source.text.includes(`schemas/${dir}`)),
|
|
237
|
-
);
|
|
238
|
-
return hit ? hit.rel : null;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Read a schema's in-file exemption declaration.
|
|
243
|
-
*
|
|
244
|
-
* A bare string is accepted as the reason; the object form additionally
|
|
245
|
-
* carries `runtimeGate`, the `file.js#functionName` actually enforcing the
|
|
246
|
-
* shape at runtime. That field is what makes an exemption reviewable: a
|
|
247
|
-
* schema kept as a documented SSOT with a hand-rolled validator behind it is
|
|
248
|
-
* a different animal from one kept purely for provenance, and the report
|
|
249
|
-
* should not flatten the two.
|
|
250
|
-
*
|
|
251
|
-
* @param {object|null} doc parsed schema document
|
|
252
|
-
* @returns {{ reason: string, runtimeGate: string | null } | null}
|
|
253
|
-
*/
|
|
254
|
-
function exemption(doc) {
|
|
255
|
-
const block = doc?.[EXEMPTION_KEY];
|
|
256
|
-
const reason = typeof block === 'string' ? block : block?.reason;
|
|
257
|
-
if (typeof reason !== 'string' || !reason.trim()) return null;
|
|
258
|
-
const gate =
|
|
259
|
-
typeof block?.runtimeGate === 'string' ? block.runtimeGate : null;
|
|
260
|
-
return { reason: reason.trim(), runtimeGate: gate };
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Resolve one schema to a reference kind plus the evidence for it.
|
|
265
|
-
*
|
|
266
|
-
* @param {object} schema a `readSchemas` record
|
|
267
|
-
* @param {Array<{ rel: string, text: string }>} sources
|
|
268
|
-
* @param {Array<{ rel: string, text: string }>} schemaTexts raw schema bodies
|
|
269
|
-
* @returns {{ kind: string, evidence: string | object | null }}
|
|
270
|
-
*/
|
|
271
|
-
function resolveSchema(schema, sources, schemaTexts) {
|
|
272
|
-
const literal = witness(sources, schema.basename);
|
|
273
|
-
if (literal) return { kind: 'literal', evidence: literal };
|
|
274
|
-
|
|
275
|
-
const ref = schemaTexts.find(
|
|
276
|
-
(other) =>
|
|
277
|
-
other.rel !== schema.rel &&
|
|
278
|
-
other.text.includes(`"$ref"`) &&
|
|
279
|
-
other.text.includes(schema.basename),
|
|
280
|
-
);
|
|
281
|
-
if (ref) return { kind: 'schema-ref', evidence: ref.rel };
|
|
282
|
-
|
|
283
|
-
const loader = dynamicLoaderFor(sources, schema.dir);
|
|
284
|
-
if (loader) {
|
|
285
|
-
const key = witness(sources, schema.stem);
|
|
286
|
-
if (key) return { kind: 'dynamic', evidence: `${loader} (key: ${key})` };
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
const declared = exemption(schema.doc);
|
|
290
|
-
if (declared) return { kind: 'exempt', evidence: declared };
|
|
291
|
-
|
|
292
|
-
return { kind: 'unreferenced', evidence: null };
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Run the audit and return a structured envelope.
|
|
297
|
-
*
|
|
298
|
-
* @param {{ root?: string }} [opts]
|
|
299
|
-
* @returns {{ schemaCount: number, referenced: number, exempt: Array<object>, findings: Array<object> }}
|
|
300
|
-
*/
|
|
301
|
-
export function auditSchemaReferences(opts = {}) {
|
|
302
|
-
const root = opts.root ?? process.cwd();
|
|
303
|
-
const sources = readSources(root);
|
|
304
|
-
const schemas = readSchemas(root);
|
|
305
|
-
const schemaTexts = schemas.map((schema) => ({
|
|
306
|
-
rel: schema.rel,
|
|
307
|
-
text: fs.readFileSync(path.join(root, schema.rel), 'utf8'),
|
|
308
|
-
}));
|
|
309
|
-
|
|
310
|
-
const exempt = [];
|
|
311
|
-
const findings = [];
|
|
312
|
-
let referenced = 0;
|
|
313
|
-
|
|
314
|
-
for (const schema of schemas) {
|
|
315
|
-
const { kind, evidence } = resolveSchema(schema, sources, schemaTexts);
|
|
316
|
-
if (kind === 'unreferenced') findings.push({ schema: schema.rel });
|
|
317
|
-
else if (kind === 'exempt')
|
|
318
|
-
exempt.push({ schema: schema.rel, ...evidence });
|
|
319
|
-
else referenced += 1;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
return { schemaCount: schemas.length, referenced, exempt, findings };
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Render the human-readable report.
|
|
327
|
-
*
|
|
328
|
-
* @param {ReturnType<typeof auditSchemaReferences>} report
|
|
329
|
-
* @returns {string}
|
|
330
|
-
*/
|
|
331
|
-
function formatReport(report) {
|
|
332
|
-
const digest =
|
|
333
|
-
`[check-schema-references] ${report.schemaCount} schema(s): ` +
|
|
334
|
-
`${report.referenced} compiled, ${report.exempt.length} exempt, ` +
|
|
335
|
-
`${report.findings.length} unreferenced.`;
|
|
336
|
-
if (report.findings.length === 0) return digest;
|
|
337
|
-
const lines = report.findings.map(
|
|
338
|
-
(finding) => ` ✗ ${finding.schema} — no code path compiles it.`,
|
|
339
|
-
);
|
|
340
|
-
return [
|
|
341
|
-
digest,
|
|
342
|
-
...lines,
|
|
343
|
-
'',
|
|
344
|
-
'Every schema under .agents/schemas/ must be compiled by code, or say in',
|
|
345
|
-
`its own body why not. Either delete it, wire it, or add a root-level`,
|
|
346
|
-
`"${EXEMPTION_KEY}": { "reason": "…" } declaring the retention.`,
|
|
347
|
-
].join('\n');
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* CLI entry point.
|
|
352
|
-
*
|
|
353
|
-
* @param {string[]} [argv]
|
|
354
|
-
* @returns {Promise<number>} process exit code
|
|
355
|
-
*/
|
|
356
|
-
export async function main(argv = process.argv.slice(2)) {
|
|
357
|
-
const { root, json } = parseArgv(argv);
|
|
358
|
-
const report = auditSchemaReferences({ root });
|
|
359
|
-
process.stdout.write(
|
|
360
|
-
json ? `${JSON.stringify(report)}\n` : `${formatReport(report)}\n`,
|
|
361
|
-
);
|
|
362
|
-
return report.findings.length > 0 ? 1 : 0;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
runAsCli(import.meta.url, main, {
|
|
366
|
-
source: 'check-schema-references',
|
|
367
|
-
propagateExitCode: true,
|
|
368
|
-
});
|