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,34 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* branch before opening the PR.
|
|
9
|
-
* If the same gate has already passed against the current `git rev-parse
|
|
10
|
-
* HEAD` (recorded earlier in the local hot path), this wrapper logs a skip
|
|
11
|
-
* and exits 0 instead of re-spawning the runner. On run, a successful
|
|
12
|
-
* gate is recorded so the next invocation can skip in turn.
|
|
13
|
-
*
|
|
14
|
-
* Usage:
|
|
15
|
-
* node .agents/scripts/evidence-gate.js \
|
|
16
|
-
* --standalone --scope-id <storyId> --gate <name> \
|
|
17
|
-
* [--worktree <path>] [--no-evidence] -- <cmd> [args...]
|
|
18
|
-
*
|
|
19
|
-
* Examples:
|
|
20
|
-
* node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate lint \
|
|
21
|
-
* --worktree .worktrees/story-4250 -- npm run lint
|
|
22
|
-
* node .agents/scripts/evidence-gate.js --standalone --scope-id 4250 --gate test \
|
|
23
|
-
* --worktree .worktrees/story-4250 -- npm test
|
|
24
|
-
*
|
|
25
|
-
* `--standalone` (Story #4250) is required: the evidence file is anchored on
|
|
26
|
-
* the Story id at
|
|
27
|
-
* `<tempRoot>/standalone/stories/story-<sid>/validation-evidence.json` — the
|
|
28
|
-
* same keyspace the standalone close consults, so the acceptance-self-eval
|
|
29
|
-
* critic's verify[] runs (lint / typecheck) are shared with the close.
|
|
30
|
-
* v2.0.0 removed the Epic tier along with the `--epic-id` Epic-keyed
|
|
31
|
-
* keyspace.
|
|
4
|
+
* Runs one gate, skipping it when evidence shows the same gate already
|
|
5
|
+
* passed for the current HEAD and tree, and recording a pass for the next
|
|
6
|
+
* caller. `--standalone` is required: it keys evidence by Story id, the same
|
|
7
|
+
* keyspace close consults, so worker-side verify[] runs credit the close.
|
|
32
8
|
*/
|
|
33
9
|
|
|
34
10
|
import { spawnSync } from 'node:child_process';
|
|
@@ -44,12 +20,6 @@ import {
|
|
|
44
20
|
treeFingerprint,
|
|
45
21
|
} from './lib/validation-evidence.js';
|
|
46
22
|
|
|
47
|
-
/**
|
|
48
|
-
* Split argv at the first `--` and return both halves. The wrapper consumes
|
|
49
|
-
* everything before `--`; the runner receives everything after.
|
|
50
|
-
*
|
|
51
|
-
* Exported for testing.
|
|
52
|
-
*/
|
|
53
23
|
export function splitOnDashDash(argv) {
|
|
54
24
|
const idx = argv.indexOf('--');
|
|
55
25
|
if (idx === -1) return { wrapperArgs: argv, runnerArgs: [] };
|
|
@@ -59,11 +29,6 @@ export function splitOnDashDash(argv) {
|
|
|
59
29
|
};
|
|
60
30
|
}
|
|
61
31
|
|
|
62
|
-
/**
|
|
63
|
-
* Parse the wrapper-side argv (before `--`).
|
|
64
|
-
*
|
|
65
|
-
* Exported for testing.
|
|
66
|
-
*/
|
|
67
32
|
export function parseWrapperArgs(argv) {
|
|
68
33
|
const { values } = parseArgs({
|
|
69
34
|
args: argv,
|
|
@@ -96,16 +61,9 @@ function resolveHeadShaDefault(cwd, gitSpawnFn) {
|
|
|
96
61
|
}
|
|
97
62
|
|
|
98
63
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* Both are read from the **spawn** cwd — the Story worktree when one is
|
|
104
|
-
* supplied — so the keys describe the tree the gate actually saw. The tree
|
|
105
|
-
* fingerprint is what keeps this gate credited across close's own base-sync
|
|
106
|
-
* fast-forward, which moves HEAD between the deposit and the gates that would
|
|
107
|
-
* spend it; see `validation-evidence.js#treeFingerprint`.
|
|
108
|
-
*
|
|
64
|
+
* Read from the spawn cwd so the keys describe the tree the gate saw. The
|
|
65
|
+
* tree fingerprint keeps credit across close's base-sync fast-forward, which
|
|
66
|
+
* moves HEAD between deposit and spend.
|
|
109
67
|
* @param {{ spawnCwd: string, gitSpawnFn: Function, useEvidence: boolean }} args
|
|
110
68
|
* @returns {{ headSha: string|null, inputFingerprint: string|null }}
|
|
111
69
|
*/
|
|
@@ -118,34 +76,21 @@ function resolveEvidenceKeys({ spawnCwd, gitSpawnFn, useEvidence }) {
|
|
|
118
76
|
}
|
|
119
77
|
|
|
120
78
|
/**
|
|
121
|
-
* Runner-shaped entry-point: takes the parsed wrapper args + runner args and
|
|
122
|
-
* executes the gate. Pure-ish (modulo IO) — all side-effects are routed via
|
|
123
|
-
* the injection hooks so tests can stub `gitSpawn`, `spawnSync`, and the
|
|
124
|
-
* evidence store without touching disk or spawning processes.
|
|
125
|
-
*
|
|
126
|
-
* Exported for tests + the CLI `main()`.
|
|
127
|
-
*
|
|
128
79
|
* @param {object} params
|
|
129
|
-
* @param {number} params.scopeId
|
|
130
|
-
* @param {boolean} [params.standalone]
|
|
131
|
-
*
|
|
132
|
-
* @param {
|
|
133
|
-
* @param {
|
|
134
|
-
* @param {string}
|
|
135
|
-
*
|
|
136
|
-
* @param {
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* @param {
|
|
140
|
-
* @param {
|
|
141
|
-
* @param {
|
|
142
|
-
* @
|
|
143
|
-
* @param {Function} [deps.shouldSkipFn] — Stub for `shouldSkip`.
|
|
144
|
-
* @param {Function} [deps.recordPassFn] — Stub for `recordPass`.
|
|
145
|
-
* @param {object} [deps.logger] — Logger-shaped object (info/error/warn/fatal).
|
|
146
|
-
* @returns {{ status: number, skipped: boolean }} Outcome summary. `status`
|
|
147
|
-
* is the runner's exit code (0 = pass), `skipped` is true when evidence
|
|
148
|
-
* short-circuited the runner.
|
|
80
|
+
* @param {number} params.scopeId
|
|
81
|
+
* @param {boolean} [params.standalone]
|
|
82
|
+
* @param {string} params.gate
|
|
83
|
+
* @param {boolean} params.useEvidence
|
|
84
|
+
* @param {string} params.cwd — evidence cwd (locates the temp tree)
|
|
85
|
+
* @param {string|null} [params.worktreePath] — spawn cwd and HEAD source
|
|
86
|
+
* @param {string[]} params.runnerArgs
|
|
87
|
+
* @param {object} [deps]
|
|
88
|
+
* @param {Function} [deps.gitSpawnFn]
|
|
89
|
+
* @param {Function} [deps.spawnFn]
|
|
90
|
+
* @param {Function} [deps.shouldSkipFn]
|
|
91
|
+
* @param {Function} [deps.recordPassFn]
|
|
92
|
+
* @param {object} [deps.logger]
|
|
93
|
+
* @returns {{ status: number, skipped: boolean }}
|
|
149
94
|
*/
|
|
150
95
|
export async function runEvidenceGate(params, deps = {}) {
|
|
151
96
|
const {
|
|
@@ -165,9 +110,6 @@ export async function runEvidenceGate(params, deps = {}) {
|
|
|
165
110
|
runnerArgs,
|
|
166
111
|
} = params ?? {};
|
|
167
112
|
|
|
168
|
-
// `--standalone` (Story #4250) routes the evidence file to the
|
|
169
|
-
// storyId-anchored keyspace so the acceptance-self-eval critic can record
|
|
170
|
-
// verify[] evidence into the same keyspace the standalone close consults.
|
|
171
113
|
if (
|
|
172
114
|
!scopeId ||
|
|
173
115
|
!standalone ||
|
|
@@ -180,14 +122,10 @@ export async function runEvidenceGate(params, deps = {}) {
|
|
|
180
122
|
);
|
|
181
123
|
return { status: 1, skipped: false };
|
|
182
124
|
}
|
|
183
|
-
// Evidence-store opts shared by shouldSkip + recordPass below.
|
|
184
125
|
const evidenceStoreOpts = { cwd, standalone };
|
|
185
126
|
|
|
186
|
-
//
|
|
187
|
-
//
|
|
188
|
-
// to the main checkout so the temp tree resolves under the main
|
|
189
|
-
// `.git/`. The HEAD-SHA used as the cache key is read from the spawn cwd
|
|
190
|
-
// (the worktree), so cache entries key against the Story branch's HEAD.
|
|
127
|
+
// The gate runs in the worktree; evidence stays anchored to the main
|
|
128
|
+
// checkout so the temp tree resolves under the main `.git/`.
|
|
191
129
|
const spawnCwd = worktreePath ?? cwd;
|
|
192
130
|
const [cmd, ...cmdArgs] = runnerArgs;
|
|
193
131
|
const configHash = hashCommandConfig({ cmd, args: cmdArgs, cwd: spawnCwd });
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
*
|
|
7
|
-
* and fixing it is not this delivery's job". The rule used to say "file a
|
|
8
|
-
* `meta::framework-gap` issue" and stop, leaving the agent to hand-run
|
|
9
|
-
* `gh issue create` wherever it was standing. This is the mechanism behind
|
|
10
|
-
* that sentence: evidence from the CI digest, ownership routing, fingerprint
|
|
11
|
-
* dedup, the `friction` comment, and the `agent::blocked` flip in one call.
|
|
12
|
-
*
|
|
13
|
-
* It files an **intake** issue, never a Story: `/mandrel-plan <id>` graduates
|
|
14
|
-
* it on the next planning pass. Delivery never blocks on planning — see
|
|
15
|
-
* `lib/orchestration/ci-gap-intake.js` for why that split is load-bearing.
|
|
3
|
+
* CI-remediation Option-2 filing: for a red check that is real but not this
|
|
4
|
+
* delivery's to fix, files (or updates, by fingerprint) an intake issue in
|
|
5
|
+
* the owning repo, comments `friction` on the Story, and optionally blocks it.
|
|
6
|
+
* It files intake, never a Story, so delivery never blocks on planning.
|
|
16
7
|
*/
|
|
17
8
|
|
|
18
9
|
import { parseArgs } from 'node:util';
|
|
@@ -84,15 +75,9 @@ const USAGE = {
|
|
|
84
75
|
};
|
|
85
76
|
|
|
86
77
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* `gh` is the transport rather than the provider facade because a filing can
|
|
90
|
-
* target a repository other than the configured one, and `gh issue create
|
|
91
|
-
* --repo` is the surface that already does that (the graduators file
|
|
92
|
-
* cross-repo the same way).
|
|
93
|
-
*
|
|
78
|
+
* `gh` rather than the provider facade: a filing may target another repo.
|
|
94
79
|
* @param {object} opts
|
|
95
|
-
* @returns {object}
|
|
80
|
+
* @returns {object}
|
|
96
81
|
*/
|
|
97
82
|
function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
|
|
98
83
|
const labelCache = new Map();
|
|
@@ -104,9 +89,7 @@ function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
|
|
|
104
89
|
repo: searchRepo.repo,
|
|
105
90
|
}),
|
|
106
91
|
createIssue: async ({ owner, repo, title, body, labels }) => {
|
|
107
|
-
// `gh issue create
|
|
108
|
-
// routing label (meta::platform-gap, friction::unreproducible-tier)
|
|
109
|
-
// has to exist before the create — not after it errors.
|
|
92
|
+
// `gh issue create` fails outright on an absent label; ensure first.
|
|
110
93
|
const ensured = await ensureIssueLabels({
|
|
111
94
|
owner,
|
|
112
95
|
repo,
|
|
@@ -136,9 +119,6 @@ function liveIntakePorts({ provider, searchRepo, cwd, logger }) {
|
|
|
136
119
|
}
|
|
137
120
|
|
|
138
121
|
/**
|
|
139
|
-
* Render the `friction` comment the Story carries so the blocker is legible
|
|
140
|
-
* on the ticket itself, not only in the intake issue.
|
|
141
|
-
*
|
|
142
122
|
* @param {object} opts
|
|
143
123
|
* @returns {string}
|
|
144
124
|
*/
|
|
@@ -171,16 +151,10 @@ export function renderFrictionComment({
|
|
|
171
151
|
return lines.join('\n');
|
|
172
152
|
}
|
|
173
153
|
|
|
174
|
-
/** The graduation instruction every filing carries, verdict-independent. */
|
|
175
154
|
const GRADUATE_LINE =
|
|
176
155
|
'Graduate the intake issue with `/mandrel-plan <issue number>` to turn it into a Story.';
|
|
177
156
|
|
|
178
157
|
/**
|
|
179
|
-
* What this filing says about rerunning the failed job (Story #5343). An
|
|
180
|
-
* allowance is stated with its head SHA and its one-shot bound, because the
|
|
181
|
-
* comment is where an operator reads whether the rerun they are about to do
|
|
182
|
-
* is the sanctioned one.
|
|
183
|
-
*
|
|
184
158
|
* @param {{ headSha: string } | null} rerunAllowance
|
|
185
159
|
* @returns {string}
|
|
186
160
|
*/
|
|
@@ -193,14 +167,8 @@ function renderRerunLine(rerunAllowance) {
|
|
|
193
167
|
}
|
|
194
168
|
|
|
195
169
|
/**
|
|
196
|
-
* File the CI-gap intake issue for one Story, post the `friction` comment,
|
|
197
|
-
* and optionally flip the Story to `agent::blocked`.
|
|
198
|
-
*
|
|
199
|
-
* Every port is injectable so the unit tests exercise the whole command with
|
|
200
|
-
* no network and no live tracker.
|
|
201
|
-
*
|
|
202
170
|
* @param {object} opts
|
|
203
|
-
* @returns {Promise<object>}
|
|
171
|
+
* @returns {Promise<object>}
|
|
204
172
|
*/
|
|
205
173
|
export async function runFileCiGap({
|
|
206
174
|
storyId,
|
|
@@ -224,9 +192,7 @@ export async function runFileCiGap({
|
|
|
224
192
|
throw new Error('--story <id> is required (a positive issue number).');
|
|
225
193
|
}
|
|
226
194
|
const resolved = config ?? resolveConfig();
|
|
227
|
-
//
|
|
228
|
-
// resolves it when it WRITES the digest — the CLI never passed one, so the
|
|
229
|
-
// default read crashed on `undefined` before it could find the file.
|
|
195
|
+
// Must resolve exactly as `pr-watch-with-update.js` does when writing it.
|
|
230
196
|
const digestRoot = tempRoot ?? resolved?.project?.paths?.tempRoot ?? 'temp';
|
|
231
197
|
const ciDigest =
|
|
232
198
|
digest ?? readCiDigest({ storyId: sid, tempRoot: digestRoot, cwd });
|
|
@@ -268,9 +234,7 @@ export async function runFileCiGap({
|
|
|
268
234
|
now,
|
|
269
235
|
});
|
|
270
236
|
|
|
271
|
-
//
|
|
272
|
-
// rerun the watcher's guard will admit. Recorded on the digest, keyed to
|
|
273
|
-
// the head SHA the red was observed on, and never on a dry run.
|
|
237
|
+
// A proven-environmental verdict earns one same-SHA rerun; never on dry run.
|
|
274
238
|
const rerunAllowance = dryRun
|
|
275
239
|
? null
|
|
276
240
|
: recordRerunAllowance({
|
|
@@ -310,8 +274,6 @@ export async function runFileCiGap({
|
|
|
310
274
|
}
|
|
311
275
|
|
|
312
276
|
/**
|
|
313
|
-
* CLI entrypoint.
|
|
314
|
-
*
|
|
315
277
|
* @returns {Promise<void>}
|
|
316
278
|
*/
|
|
317
279
|
async function main() {
|
|
@@ -338,8 +300,6 @@ async function main() {
|
|
|
338
300
|
block: values.block,
|
|
339
301
|
});
|
|
340
302
|
|
|
341
|
-
// Single-line JSON per the script-output contract — an orchestrator parses
|
|
342
|
-
// this, and a pretty dump is noise in a delivery transcript.
|
|
343
303
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
344
304
|
for (const err of result.errors) {
|
|
345
305
|
Logger.error(`[file-ci-gap] ${err}`);
|
|
@@ -1,58 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `lib/config/gates/*`) is the single hand-authored enumeration of the
|
|
9
|
-
* `.agentrc.json` surface. `description` and `default` annotations live on
|
|
10
|
-
* those literals — AJV ignores both — and this generator emits everything
|
|
11
|
-
* downstream of them:
|
|
12
|
-
*
|
|
13
|
-
* 1. `.agents/schemas/agentrc.schema.json` — the JSON-Schema mirror every
|
|
14
|
-
* consumer `.agentrc.json` points `$schema` at. Serialized 2020-12,
|
|
15
|
-
* fully inlined (no `$defs`): it IS the runtime schema, so the class of
|
|
16
|
-
* bug where a key exists in the mirror but not in the runtime AJV — and
|
|
17
|
-
* a consumer's whole config is therefore dead on arrival (Epic #4131) —
|
|
18
|
-
* cannot be expressed any more.
|
|
19
|
-
* 2. `.agents/docs/agentrc-reference.json` — the defaults inventory
|
|
20
|
-
* `lib/config/defaults.js` reads for `mandrel explain` and the
|
|
21
|
-
* sync-agentrc redundancy advisory. Built from the `default`
|
|
22
|
-
* annotations: a node carrying one contributes its value verbatim and is
|
|
23
|
-
* not descended into; a node carrying none contributes nothing.
|
|
24
|
-
* 3. The bounded key-table region inside `.agents/docs/configuration.md`,
|
|
25
|
-
* delimited by:
|
|
26
|
-
*
|
|
27
|
-
* <!-- BEGIN GENERATED:agentrc -->
|
|
28
|
-
* ...generated tables...
|
|
29
|
-
* <!-- END GENERATED:agentrc -->
|
|
30
|
-
*
|
|
31
|
-
* One Markdown section per top-level schema key, each table columned
|
|
32
|
-
* `| Key | Required | Type | Default | Description |`, with nested
|
|
33
|
-
* properties flattened into dot-paths (`paths.agentRoot`,
|
|
34
|
-
* `branchProtection.requiredChecks[]`).
|
|
35
|
-
*
|
|
36
|
-
* Until this Story the first two were hand-maintained alongside the runtime
|
|
37
|
-
* schema and reconciled by two parity suites; those suites are now
|
|
38
|
-
* generator-fidelity checks.
|
|
39
|
-
*
|
|
40
|
-
* Modes:
|
|
41
|
-
* (default) — rewrite any artifact whose content is stale.
|
|
42
|
-
* --check — exit 0 when all three are current, exit 1 naming the stale
|
|
43
|
-
* ones. Wired into `npm run docs:check`, hence `npm run lint`.
|
|
44
|
-
*
|
|
45
|
-
* **Whitespace is not content.** The two JSON artifacts are re-formatted by
|
|
46
|
-
* Biome via lint-staged after they are written, so comparing raw bytes would
|
|
47
|
-
* make the check fail on formatting alone. Both comparison and write go
|
|
48
|
-
* through {@link canonicalJson}: parse, re-serialize, compare. That is
|
|
49
|
-
* insensitive to whitespace and *sensitive* to key order, which is what
|
|
50
|
-
* actually matters — key order drives the doc-table order and the ordering a
|
|
51
|
-
* consumer's editor offers completions in.
|
|
52
|
-
*
|
|
53
|
-
* Per `.agents/rules/orchestration-error-handling.md`, unrecoverable
|
|
54
|
-
* failures surface via `throw new Error(...)` so `runAsCli` can map the
|
|
55
|
-
* throw to `process.exit(1)` deterministically (no `Logger.fatal`).
|
|
3
|
+
* Generates the `.agentrc` config surface from the annotated runtime AJV
|
|
4
|
+
* schema (the single source): the JSON-Schema mirror (fully inlined, so it
|
|
5
|
+
* cannot disagree with runtime), the defaults inventory, and the key-table
|
|
6
|
+
* region of `configuration.md`. JSON artifacts compare canonically — Biome
|
|
7
|
+
* reformats them after write, so whitespace is ignored but key order counts.
|
|
56
8
|
*/
|
|
57
9
|
|
|
58
10
|
import fs from 'node:fs';
|
|
@@ -82,7 +34,6 @@ const DOC_PATH = path.join(PROJECT_ROOT, '.agents', 'docs', 'configuration.md');
|
|
|
82
34
|
const REGION_BEGIN = '<!-- BEGIN GENERATED:agentrc -->';
|
|
83
35
|
const REGION_END = '<!-- END GENERATED:agentrc -->';
|
|
84
36
|
|
|
85
|
-
/** Envelope keys prepended to the serialized runtime schema. */
|
|
86
37
|
const MIRROR_ENVELOPE = {
|
|
87
38
|
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
88
39
|
$id: 'https://github.com/dsj1984/mandrel/blob/main/.agents/schemas/agentrc.schema.json',
|
|
@@ -91,16 +42,12 @@ const MIRROR_ENVELOPE = {
|
|
|
91
42
|
'GENERATED — do not edit. Emitted by `node .agents/scripts/generate-config-docs.js` from the runtime AJV schema in `.agents/scripts/lib/config-settings-schema.js` (plus its `-delivery` / `-quality` / `config/gates/*` modules), which is the single source of truth for the `.agentrc.json` surface. This file exists for editor tooling and human readers; because it is a serialization of the runtime schema rather than a hand-kept mirror, the two cannot disagree. Edit the annotated schema literals and re-run `npm run docs:gen`.',
|
|
92
43
|
};
|
|
93
44
|
|
|
94
|
-
/** `$schema` pointer written into the generated defaults inventory. */
|
|
95
45
|
const REFERENCE_SCHEMA_POINTER = '../schemas/agentrc.schema.json';
|
|
96
46
|
|
|
97
|
-
// Order
|
|
47
|
+
// Order drives section emission.
|
|
98
48
|
const TOP_LEVEL_KEYS = ['project', 'github', 'planning', 'delivery', 'qa'];
|
|
99
49
|
|
|
100
50
|
/**
|
|
101
|
-
* Canonical JSON text for comparison and for writing. Key order is preserved
|
|
102
|
-
* (and therefore compared); whitespace is normalized away.
|
|
103
|
-
*
|
|
104
51
|
* @param {unknown} value
|
|
105
52
|
* @returns {string}
|
|
106
53
|
*/
|
|
@@ -109,10 +56,7 @@ function canonicalJson(value) {
|
|
|
109
56
|
}
|
|
110
57
|
|
|
111
58
|
/**
|
|
112
|
-
*
|
|
113
|
-
* is absent (first generation) or unparseable (a hand-mangled artifact is
|
|
114
|
-
* treated as stale, not as a crash).
|
|
115
|
-
*
|
|
59
|
+
* `null` when absent or unparseable — a mangled artifact is stale, not a crash.
|
|
116
60
|
* @param {string} file
|
|
117
61
|
* @returns {string | null}
|
|
118
62
|
*/
|
|
@@ -126,16 +70,7 @@ function readCanonicalJson(file) {
|
|
|
126
70
|
}
|
|
127
71
|
|
|
128
72
|
/**
|
|
129
|
-
*
|
|
130
|
-
* runtime schema verbatim.
|
|
131
|
-
*
|
|
132
|
-
* The runtime schema is a plain, cycle-free object literal (no RegExp or
|
|
133
|
-
* function values), so `structuredClone` is a faithful serialization. Shared
|
|
134
|
-
* sub-schema objects — `TOLERANCE_SCHEMA` and friends, referenced by several
|
|
135
|
-
* gates — are inlined at each use rather than hoisted into `$defs`. The
|
|
136
|
-
* inlined document is smaller than the hand-maintained `$defs` mirror it
|
|
137
|
-
* replaces, and it removes the naming heuristic a hoisting pass would need.
|
|
138
|
-
*
|
|
73
|
+
* Shared sub-schemas are inlined at each use rather than hoisted to `$defs`.
|
|
139
74
|
* @param {object} schema
|
|
140
75
|
* @returns {object}
|
|
141
76
|
*/
|
|
@@ -144,17 +79,10 @@ function buildMirrorSchema(schema) {
|
|
|
144
79
|
}
|
|
145
80
|
|
|
146
81
|
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
* A node carrying `default` contributes that value verbatim and is NOT
|
|
150
|
-
* descended into — that is what lets an object-shaped or array-shaped default
|
|
151
|
-
* (`github.branchProtection.requiredChecks`, `qa.environments`) be declared in
|
|
152
|
-
* one place. A properties-bearing node with no `default` contributes an object
|
|
153
|
-
* built from whichever children contributed something, or nothing at all when
|
|
154
|
-
* none did.
|
|
155
|
-
*
|
|
82
|
+
* A node carrying `default` contributes it verbatim and is not descended
|
|
83
|
+
* into, so an object- or array-shaped default is declared in one place.
|
|
156
84
|
* @param {object} node
|
|
157
|
-
* @returns {unknown}
|
|
85
|
+
* @returns {unknown} `undefined` when nothing is contributed.
|
|
158
86
|
*/
|
|
159
87
|
function collectDefaults(node) {
|
|
160
88
|
if (!node || typeof node !== 'object') return undefined;
|
|
@@ -169,8 +97,6 @@ function collectDefaults(node) {
|
|
|
169
97
|
}
|
|
170
98
|
|
|
171
99
|
/**
|
|
172
|
-
* Build the defaults inventory shipped as `.agents/docs/agentrc-reference.json`.
|
|
173
|
-
*
|
|
174
100
|
* @param {object} schema
|
|
175
101
|
* @returns {object}
|
|
176
102
|
*/
|
|
@@ -182,11 +108,9 @@ function buildReferenceInventory(schema) {
|
|
|
182
108
|
}
|
|
183
109
|
|
|
184
110
|
/**
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
* @param {object} node The schema node to flatten.
|
|
111
|
+
* `allOf` only hangs `if`/`then` constraints off a block, so the base type is
|
|
112
|
+
* what the docs need.
|
|
113
|
+
* @param {object} node
|
|
190
114
|
* @returns {object}
|
|
191
115
|
*/
|
|
192
116
|
function flattenAllOf(node) {
|
|
@@ -203,11 +127,7 @@ function flattenAllOf(node) {
|
|
|
203
127
|
}
|
|
204
128
|
|
|
205
129
|
/**
|
|
206
|
-
*
|
|
207
|
-
* schema: an enum item renders `array<enum>`, a typed item renders
|
|
208
|
-
* `array<type>`, and anything else collapses to a bare `array`.
|
|
209
|
-
*
|
|
210
|
-
* @param {object} flat Flattened array node.
|
|
130
|
+
* @param {object} flat
|
|
211
131
|
* @returns {string}
|
|
212
132
|
*/
|
|
213
133
|
function renderArrayType(flat) {
|
|
@@ -224,11 +144,7 @@ function renderArrayType(flat) {
|
|
|
224
144
|
}
|
|
225
145
|
|
|
226
146
|
/**
|
|
227
|
-
*
|
|
228
|
-
* carries an `additionalProperties` schema (the map form), `object`
|
|
229
|
-
* otherwise.
|
|
230
|
-
*
|
|
231
|
-
* @param {object} flat Flattened object node.
|
|
147
|
+
* @param {object} flat
|
|
232
148
|
* @returns {string}
|
|
233
149
|
*/
|
|
234
150
|
function renderObjectType(flat) {
|
|
@@ -242,20 +158,12 @@ function renderObjectType(flat) {
|
|
|
242
158
|
}
|
|
243
159
|
|
|
244
160
|
/**
|
|
245
|
-
*
|
|
246
|
-
* predicate with a `render(flat)` producer; {@link renderType} walks the
|
|
247
|
-
* table once and returns the first match, so a new schema shape becomes a new
|
|
248
|
-
* row here rather than another nested branch.
|
|
249
|
-
*
|
|
250
|
-
* Order is load-bearing — `oneOf` and `enum` are matched before the plain
|
|
251
|
-
* `type` rules.
|
|
252
|
-
*
|
|
161
|
+
* First match wins; `oneOf` and `enum` must precede the plain `type` rules.
|
|
253
162
|
* @type {Array<{ when: (flat: object) => boolean, render: (flat: object) => string }>}
|
|
254
163
|
*/
|
|
255
164
|
const TYPE_RULES = [
|
|
256
165
|
{
|
|
257
|
-
//
|
|
258
|
-
// `{ append?, prepend? }` object that deep-merges with the framework list.
|
|
166
|
+
// List-or-extender union: replace, or deep-merge with the framework list.
|
|
259
167
|
when: (flat) =>
|
|
260
168
|
Array.isArray(flat.oneOf) &&
|
|
261
169
|
flat.oneOf.some((m) => m?.properties?.append || m?.properties?.prepend),
|
|
@@ -290,10 +198,7 @@ const TYPE_RULES = [
|
|
|
290
198
|
];
|
|
291
199
|
|
|
292
200
|
/**
|
|
293
|
-
*
|
|
294
|
-
* falls through to a `?` so missing coverage is visible rather than silently
|
|
295
|
-
* wrong.
|
|
296
|
-
*
|
|
201
|
+
* An unmatched shape renders `?` so the gap is visible.
|
|
297
202
|
* @param {object} node
|
|
298
203
|
* @returns {string}
|
|
299
204
|
*/
|
|
@@ -305,10 +210,6 @@ function renderType(node) {
|
|
|
305
210
|
}
|
|
306
211
|
|
|
307
212
|
/**
|
|
308
|
-
* Render the "Default" cell. Nodes without an explicit `default` annotation
|
|
309
|
-
* get an em dash — see the annotation contract in `config-settings-schema.js`
|
|
310
|
-
* for why a key can have a runtime default and no annotation.
|
|
311
|
-
*
|
|
312
213
|
* @param {object} node
|
|
313
214
|
* @returns {string}
|
|
314
215
|
*/
|
|
@@ -328,8 +229,6 @@ function renderDefault(node) {
|
|
|
328
229
|
}
|
|
329
230
|
|
|
330
231
|
/**
|
|
331
|
-
* Escape pipe characters so they survive Markdown table cell parsing.
|
|
332
|
-
*
|
|
333
232
|
* @param {string} text
|
|
334
233
|
* @returns {string}
|
|
335
234
|
*/
|
|
@@ -338,11 +237,7 @@ function escapeCell(text) {
|
|
|
338
237
|
}
|
|
339
238
|
|
|
340
239
|
/**
|
|
341
|
-
*
|
|
342
|
-
* parent's description followed by the recursively-flattened child rows.
|
|
343
|
-
* Returns `null` when `flat` is not a properties-bearing object, so the
|
|
344
|
-
* caller can fall through to the next row shape.
|
|
345
|
-
*
|
|
240
|
+
* `null` when not a properties-bearing object, so the next builder runs.
|
|
346
241
|
* @param {{flat: object, keyPath: string, pathParts: string[], propName: string, isRequired: boolean, description: string}} ctx
|
|
347
242
|
* @returns {Array<object> | null}
|
|
348
243
|
*/
|
|
@@ -365,10 +260,7 @@ function nestedObjectRows(ctx) {
|
|
|
365
260
|
}
|
|
366
261
|
|
|
367
262
|
/**
|
|
368
|
-
*
|
|
369
|
-
* describing the item shape in the Description cell. Returns `null` when the
|
|
370
|
-
* property is not an array whose items are a properties-bearing object.
|
|
371
|
-
*
|
|
263
|
+
* One `[]`-suffixed row per array of objects, item keys in the Description.
|
|
372
264
|
* @param {{flat: object, keyPath: string, isRequired: boolean, description: string}} ctx
|
|
373
265
|
* @returns {Array<object> | null}
|
|
374
266
|
*/
|
|
@@ -393,10 +285,6 @@ function arrayOfObjectsRows(ctx) {
|
|
|
393
285
|
}
|
|
394
286
|
|
|
395
287
|
/**
|
|
396
|
-
* Emit the leaf (scalar / non-recursed) row for a property. Always matches —
|
|
397
|
-
* it is the fallthrough shape when neither the nested-object nor the
|
|
398
|
-
* array-of-objects builder applied.
|
|
399
|
-
*
|
|
400
288
|
* @param {{flat: object, keyPath: string, isRequired: boolean, description: string}} ctx
|
|
401
289
|
* @returns {Array<object>}
|
|
402
290
|
*/
|
|
@@ -413,24 +301,13 @@ function leafRow(ctx) {
|
|
|
413
301
|
];
|
|
414
302
|
}
|
|
415
303
|
|
|
416
|
-
//
|
|
417
|
-
// returns the first builder that yields rows (non-null): nested-object first,
|
|
418
|
-
// array-of-objects next, scalar leaf as the always-matching fallthrough.
|
|
304
|
+
// First builder returning non-null wins; leafRow always matches.
|
|
419
305
|
const ROW_BUILDERS = [nestedObjectRows, arrayOfObjectsRows, leafRow];
|
|
420
306
|
|
|
421
307
|
/**
|
|
422
|
-
*
|
|
423
|
-
*
|
|
424
|
-
*
|
|
425
|
-
*
|
|
426
|
-
* Arrays of objects (`requiredChecks[]`, `routes[]`, `bundles[]`) are emitted
|
|
427
|
-
* as a single row whose Key column carries a `[]` suffix; the item shape is
|
|
428
|
-
* captured in the Description cell. This keeps the output legible without
|
|
429
|
-
* exploding into per-item-property rows.
|
|
430
|
-
*
|
|
431
|
-
* @param {object} node Schema node to flatten.
|
|
432
|
-
* @param {string[]} pathParts Dot-path accumulator.
|
|
433
|
-
* @param {Set<string>} required Required-property names on the parent.
|
|
308
|
+
* @param {object} node
|
|
309
|
+
* @param {string[]} pathParts
|
|
310
|
+
* @param {Set<string>} required
|
|
434
311
|
* @returns {Array<{key:string, required:string, type:string, def:string, description:string}>}
|
|
435
312
|
*/
|
|
436
313
|
function flattenObject(node, pathParts, required) {
|
|
@@ -463,8 +340,6 @@ function flattenObject(node, pathParts, required) {
|
|
|
463
340
|
}
|
|
464
341
|
|
|
465
342
|
/**
|
|
466
|
-
* Render the Markdown body for one top-level section.
|
|
467
|
-
*
|
|
468
343
|
* @param {object} schema
|
|
469
344
|
* @param {string} topKey
|
|
470
345
|
* @returns {string}
|
|
@@ -508,8 +383,6 @@ function renderSection(schema, topKey) {
|
|
|
508
383
|
}
|
|
509
384
|
|
|
510
385
|
/**
|
|
511
|
-
* Render the full bounded-region body (excluding the markers themselves).
|
|
512
|
-
*
|
|
513
386
|
* @param {object} schema
|
|
514
387
|
* @returns {string}
|
|
515
388
|
*/
|
|
@@ -533,14 +406,10 @@ function renderRegion(schema) {
|
|
|
533
406
|
}
|
|
534
407
|
|
|
535
408
|
/**
|
|
536
|
-
*
|
|
537
|
-
*
|
|
538
|
-
* trailing horizontal rule (the first `---` after that heading) so the
|
|
539
|
-
* generated reference lands before the hand-authored per-section docs.
|
|
540
|
-
* If no anchor is found, prepend the markers above the first `## ` heading.
|
|
541
|
-
*
|
|
409
|
+
* Absent markers are inserted after the "## Top-level shape" block's `---`,
|
|
410
|
+
* else above the first `## ` heading, else appended.
|
|
542
411
|
* @param {string} original
|
|
543
|
-
* @param {string} body
|
|
412
|
+
* @param {string} body
|
|
544
413
|
* @returns {string}
|
|
545
414
|
*/
|
|
546
415
|
function spliceRegion(original, body) {
|
|
@@ -564,11 +433,9 @@ function spliceRegion(original, body) {
|
|
|
564
433
|
);
|
|
565
434
|
}
|
|
566
435
|
|
|
567
|
-
// Markers absent — insert them after the "## Top-level shape" block.
|
|
568
436
|
const anchor = '## Top-level shape';
|
|
569
437
|
const anchorIdx = original.indexOf(anchor);
|
|
570
438
|
if (anchorIdx !== -1) {
|
|
571
|
-
// Find the next `---` separator after the anchor.
|
|
572
439
|
const ruleIdx = original.indexOf('\n---\n', anchorIdx);
|
|
573
440
|
if (ruleIdx !== -1) {
|
|
574
441
|
const insertAt = ruleIdx + '\n---\n'.length;
|
|
@@ -579,7 +446,6 @@ function spliceRegion(original, body) {
|
|
|
579
446
|
}
|
|
580
447
|
}
|
|
581
448
|
|
|
582
|
-
// Fallback: insert above the first `## ` heading.
|
|
583
449
|
const headingMatch = original.match(/^## /m);
|
|
584
450
|
if (headingMatch && headingMatch.index !== undefined) {
|
|
585
451
|
const before = original.slice(0, headingMatch.index);
|
|
@@ -588,18 +454,12 @@ function spliceRegion(original, body) {
|
|
|
588
454
|
return `${before}${block}${after}`;
|
|
589
455
|
}
|
|
590
456
|
|
|
591
|
-
// Last-ditch: append.
|
|
592
457
|
return `${original}\n${REGION_BEGIN}\n${body}\n${REGION_END}\n`;
|
|
593
458
|
}
|
|
594
459
|
|
|
595
460
|
/**
|
|
596
|
-
*
|
|
597
|
-
*
|
|
598
|
-
*
|
|
599
|
-
* The JSON artifacts compare canonically (see the module header); the
|
|
600
|
-
* Markdown artifact compares raw, because its region is spliced into
|
|
601
|
-
* hand-authored prose that must survive byte-for-byte.
|
|
602
|
-
*
|
|
461
|
+
* The Markdown artifact compares raw: its hand-authored prose must survive
|
|
462
|
+
* byte-for-byte.
|
|
603
463
|
* @param {{ schema?: object, schemaPath?: string, referencePath?: string,
|
|
604
464
|
* docPath?: string }} [opts]
|
|
605
465
|
* @returns {Array<{ name: string, file: string, generated: string,
|