mandrel 2.60.0 → 2.62.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/merge-queue.js +158 -0
- 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 +190 -280
- 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 +183 -485
- 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 +32 -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,40 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* A close runs base-sync and the Story-scope review against what everyone
|
|
8
|
-
* called "the base branch" — but the two meant different refs. Base-sync
|
|
9
|
-
* fetches and merges `origin/<base>`; the review passed the **bare** branch
|
|
10
|
-
* name, which git resolves to the LOCAL `refs/heads/<base>`, i.e. to whatever
|
|
11
|
-
* that ref last fast-forwarded to. On a checkout whose local base is behind
|
|
12
|
-
* its remote, the review's `<base>...<head>` diff therefore contains every
|
|
13
|
-
* commit the local ref is missing — other people's landed work, scored as if
|
|
14
|
-
* this Story had written it. Those findings gate the land, and the operator's
|
|
15
|
-
* only exit is a `review-block-overridden` on blockers that were never real.
|
|
16
|
-
*
|
|
17
|
-
* ## Contract
|
|
18
|
-
*
|
|
19
|
-
* One resolution, at the review phase boundary, threaded into the change-set
|
|
20
|
-
* enumeration, the provider review and the local lens pass — so both arms of
|
|
21
|
-
* the review agree about what changed and neither can inherit local drift.
|
|
22
|
-
*
|
|
23
|
-
* Resolution **fails safe rather than falling back**. Base-sync normally
|
|
24
|
-
* guarantees the remote ref is present, but a `--skip-sync` close or a
|
|
25
|
-
* remote-less checkout can reach the review with no `origin/<base>` at all.
|
|
26
|
-
* Reviewing the local ref anyway is the defect, so an unresolvable base
|
|
27
|
-
* produces a degradation record — carried on the review's existing
|
|
28
|
-
* `degraded` / `degradations[]` envelope — and no findings whatsoever.
|
|
2
|
+
* The base ref a Story-scope review measures against: `origin/<base>`, the ref
|
|
3
|
+
* base-sync merged — never the bare name, whose stale local ref would score
|
|
4
|
+
* others' landed commits as this Story's. Resolved once and threaded to every
|
|
5
|
+
* review arm. Unresolvable fails safe: a degradation record, no findings.
|
|
29
6
|
*/
|
|
30
7
|
|
|
31
8
|
import { gitSpawn } from '../git-utils.js';
|
|
32
9
|
import { degradationEnvelope } from './review-providers/degraded-gates.js';
|
|
33
10
|
|
|
34
11
|
/**
|
|
35
|
-
*
|
|
36
|
-
* Already-qualified input passes through, so a caller naming `origin/main`
|
|
37
|
-
* is not double-prefixed.
|
|
12
|
+
* `main` → `origin/main`; already-qualified input passes through.
|
|
38
13
|
*
|
|
39
14
|
* @param {unknown} baseBranch
|
|
40
15
|
* @returns {string|null} the remote-tracking ref, or `null` when unnameable.
|
|
@@ -46,8 +21,7 @@ export function remoteBaseRef(baseBranch) {
|
|
|
46
21
|
}
|
|
47
22
|
|
|
48
23
|
/**
|
|
49
|
-
*
|
|
50
|
-
* clone. See the module header for why there is no local-ref fallback.
|
|
24
|
+
* Verified present in this clone; no local-ref fallback.
|
|
51
25
|
*
|
|
52
26
|
* @param {{
|
|
53
27
|
* baseBranch: string,
|
|
@@ -55,8 +29,6 @@ export function remoteBaseRef(baseBranch) {
|
|
|
55
29
|
* gitSpawnFn?: typeof gitSpawn,
|
|
56
30
|
* }} args
|
|
57
31
|
* @returns {{ ref: string|null, resolved: boolean, remoteRef: string|null }}
|
|
58
|
-
* `ref` is non-null only when `resolved`; `remoteRef` is the ref that was
|
|
59
|
-
* probed, for the caller's degradation surface.
|
|
60
32
|
*/
|
|
61
33
|
export function resolveSharedBaseRef({
|
|
62
34
|
baseBranch,
|
|
@@ -79,20 +51,14 @@ export function resolveSharedBaseRef({
|
|
|
79
51
|
return { ref: remoteRef, resolved: true, remoteRef };
|
|
80
52
|
}
|
|
81
53
|
} catch {
|
|
82
|
-
// A spawn failure
|
|
83
|
-
// base cannot be vouched for.
|
|
54
|
+
// A spawn failure means the same as a missing ref.
|
|
84
55
|
}
|
|
85
56
|
return { ref: null, resolved: false, remoteRef };
|
|
86
57
|
}
|
|
87
58
|
|
|
88
59
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* Shaped as the same envelope a completed review returns — an all-zero
|
|
92
|
-
* severity tally, nothing posted, and the `degraded` / `degradations[]` pair
|
|
93
|
-
* the close and the rendered comment already read — so the surfaces reading
|
|
94
|
-
* it cannot mistake "no findings" for "reviewed and clean". Reported, not
|
|
95
|
-
* blocking, matching the posture of every other degraded review gate.
|
|
60
|
+
* A completed-review-shaped envelope whose `degraded` flag keeps "no findings"
|
|
61
|
+
* from reading as "clean". Reported, not blocking.
|
|
96
62
|
*
|
|
97
63
|
* @param {{
|
|
98
64
|
* storyId: number|string,
|
|
@@ -1,57 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* ## Why the level is derived, not authored
|
|
7
|
-
*
|
|
8
|
-
* This module used to consume `planningRisk.overallLevel` — a level the planner
|
|
9
|
-
* asserted about the plan it had just written. That signal was self-refereed and
|
|
10
|
-
* its fail-safe ran backwards: an *absent* verdict degraded toward MORE ceremony
|
|
11
|
-
* (standard depth), while a schema-valid all-low verdict bought `light`. Nothing
|
|
12
|
-
* cross-checked the claimed axes against the files actually touched, so the one
|
|
13
|
-
* input that could *reduce* review was exactly the one nobody verified. Story
|
|
14
|
-
* #4542 inverted that: the level is now derived at close time from the changed
|
|
15
|
-
* files themselves, which makes it a fact rather than a claim — and therefore
|
|
16
|
-
* trustworthy enough to reduce ceremony on.
|
|
17
|
-
*
|
|
18
|
-
* ## The two signals
|
|
19
|
-
*
|
|
20
|
-
* - **Sensitive paths** ({@link deriveChangeLevel}) — the changed-file set
|
|
21
|
-
* intersected with the `sensitivePaths` classes registered in
|
|
22
|
-
* `.agents/schemas/audit-rules.json` (auth, migrations, billing, destructive
|
|
23
|
-
* mutation, public API). Registered as **configuration**, matched with the
|
|
24
|
-
* audit-suite's existing picomatch machinery. This is what keeps a *narrow*
|
|
25
|
-
* high-stakes diff — a three-file auth fix, a small migration — at `deep`,
|
|
26
|
-
* the one thing a pure width heuristic would miss.
|
|
27
|
-
* - **Diff width** — the mechanical changed-file count, unchanged in role.
|
|
28
|
-
*
|
|
29
|
-
* ## Tier rules ({@link resolveDepth})
|
|
30
|
-
*
|
|
31
|
-
* - `deep` — `derivedLevel === 'high'` (a sensitive path was touched) OR
|
|
32
|
-
* the changed-file count exceeds the wide-change scale
|
|
33
|
-
* (`diffWidth.hardFiles`). A wide diff earns a deep pass on
|
|
34
|
-
* size alone even when it touches nothing sensitive.
|
|
35
|
-
* - `light` — `derivedLevel === 'low'` (the change set is known and touches
|
|
36
|
-
* no sensitive path) AND the count is at or below the
|
|
37
|
-
* small-change scale (`diffWidth.softFiles`). An *unknown*
|
|
38
|
-
* count does not block `light`: a missing width is treated as
|
|
39
|
-
* "not wide".
|
|
40
|
-
* - `standard` — everything else, including an absent/underivable level. Fail
|
|
41
|
-
* toward the middle, never toward `light`: when the diff cannot
|
|
42
|
-
* be enumerated there is no evidence the change is safe, and
|
|
43
|
-
* `standard` preserves today's behaviour.
|
|
44
|
-
*
|
|
45
|
-
* {@link resolveDepth} is pure and total: inputs in, tier out. No I/O, no
|
|
46
|
-
* throws. `null` / `undefined` / malformed inputs degrade to `standard` (or
|
|
47
|
-
* `deep`/`light` only when a signal unambiguously says so). {@link
|
|
48
|
-
* deriveChangeLevel} owns the one manifest read and is likewise total — any
|
|
49
|
-
* failure degrades to the `null` (fail-safe) level.
|
|
50
|
-
*
|
|
51
|
-
* v2 Stage 2: review depth is **decoupled** from the planning model-capacity
|
|
52
|
-
* advisory. Diff width is a mechanical review signal (files in the landed
|
|
53
|
-
* diff); planning capacity is an absolute authored-token session-mass signal.
|
|
54
|
-
* The two no longer share a constant.
|
|
2
|
+
* Review-depth authority. The change level is derived from the changed files
|
|
3
|
+
* (a fact, not a planner's claim), so it is safe to reduce ceremony on. Both
|
|
4
|
+
* functions are total; any failure degrades toward `standard`, never `light`.
|
|
55
5
|
*
|
|
56
6
|
* @typedef {'light'|'standard'|'deep'} ReviewDepth
|
|
57
7
|
* @typedef {'low'|'high'} ChangeLevel
|
|
@@ -59,40 +9,18 @@
|
|
|
59
9
|
|
|
60
10
|
import { selectSensitivePathClasses } from '../audit-suite/selector.js';
|
|
61
11
|
|
|
62
|
-
/**
|
|
63
|
-
* Mechanical diff-width scales for review-depth tiering. These are **not**
|
|
64
|
-
* planning Story-sizing ceilings (those are gone in v2) — they only classify
|
|
65
|
-
* the changed-file count of a diff under review.
|
|
66
|
-
*/
|
|
12
|
+
/** Classify review diff width only — not planning sizing ceilings. */
|
|
67
13
|
export const DEFAULT_DIFF_WIDTH = Object.freeze({
|
|
68
14
|
softFiles: 15,
|
|
69
15
|
hardFiles: 30,
|
|
70
16
|
});
|
|
71
17
|
|
|
72
18
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* ({@link resolveDepth}) and the dispatch-side complexity routing
|
|
79
|
-
* (`complexity-gate.js#deriveStoryShape`, Story #4722) both consume what this
|
|
80
|
-
* returns, so no risk decision can disagree about how risky a change is.
|
|
81
|
-
* Dispatch reads the **predicted** shape (the Story's declared `changes[]`
|
|
82
|
-
* footprint) and close reads the **actual** diff — one taxonomy, two read
|
|
83
|
-
* points, which is what keeps a lite-shaped Story whose footprint touches a
|
|
84
|
-
* sensitive path on the full route and under a deep review.
|
|
85
|
-
*
|
|
86
|
-
* The acceptance verdict owner is **not** downstream of this level: Story
|
|
87
|
-
* #5343 re-based `ceremony-routing.js#resolveCeremonyForRisk` on the ceremony
|
|
88
|
-
* profile alone, and Story #5366 removed the level from its signature.
|
|
89
|
-
*
|
|
90
|
-
* Returns `null` — the fail-safe "no derivable signal" level — when the change
|
|
91
|
-
* set is empty/unknown or the manifest cannot be read. Both consumers treat
|
|
92
|
-
* `null` as the more thorough posture (`standard` depth, the conservative
|
|
93
|
-
* `full` route), so a derivation failure never buys a change less checking.
|
|
94
|
-
*
|
|
95
|
-
* Total: never throws.
|
|
19
|
+
* `high` when the changed files hit a `sensitivePaths` class in
|
|
20
|
+
* `audit-rules.json` — this is what keeps a narrow auth or migration diff
|
|
21
|
+
* deep. Single source of the level for review depth and dispatch routing
|
|
22
|
+
* (predicted footprint vs actual diff). `null` on an empty set or unreadable
|
|
23
|
+
* manifest; consumers treat `null` as the more thorough posture. Never throws.
|
|
96
24
|
*
|
|
97
25
|
* @param {{
|
|
98
26
|
* changedFiles?: string[]|null,
|
|
@@ -122,9 +50,7 @@ export function deriveChangeLevel(input = {}) {
|
|
|
122
50
|
}
|
|
123
51
|
|
|
124
52
|
/**
|
|
125
|
-
*
|
|
126
|
-
* `null` when the count is unknown / unusable. A `null` count is the neutral
|
|
127
|
-
* "width unknown" signal: it neither triggers `deep` nor blocks `light`.
|
|
53
|
+
* `null` = width unknown: neither triggers `deep` nor blocks `light`.
|
|
128
54
|
*
|
|
129
55
|
* @param {unknown} value
|
|
130
56
|
* @returns {number|null}
|
|
@@ -137,9 +63,8 @@ function normalizeChangedFileCount(value) {
|
|
|
137
63
|
}
|
|
138
64
|
|
|
139
65
|
/**
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
* rules.
|
|
66
|
+
* `deep` on a sensitive path or a wide diff; `light` only when known-low and
|
|
67
|
+
* small; otherwise `standard`.
|
|
143
68
|
*
|
|
144
69
|
* @param {{
|
|
145
70
|
* derivedLevel?: (ChangeLevel|string|null|undefined),
|
|
@@ -164,17 +89,10 @@ export function resolveDepth(input = {}) {
|
|
|
164
89
|
};
|
|
165
90
|
const { softFiles, hardFiles } = mergedWidth;
|
|
166
91
|
|
|
167
|
-
// A known count strictly above the wide-change scale is wide.
|
|
168
92
|
const isWide = changedFileCount !== null && changedFileCount > hardFiles;
|
|
169
|
-
// An unknown count is treated as "not wide" — it does not block `light`.
|
|
170
93
|
const isSmall = changedFileCount === null || changedFileCount <= softFiles;
|
|
171
94
|
|
|
172
|
-
// deep — a sensitive path was touched OR the diff is wide.
|
|
173
95
|
if (derivedLevel === 'high' || isWide) return 'deep';
|
|
174
|
-
// light — nothing sensitive touched AND a (known-or-unknown-but-not-wide)
|
|
175
|
-
// small diff.
|
|
176
96
|
if (derivedLevel === 'low' && isSmall) return 'light';
|
|
177
|
-
// standard — everything else: an underivable level, or a non-sensitive diff
|
|
178
|
-
// whose width sits between softFiles and hardFiles.
|
|
179
97
|
return 'standard';
|
|
180
98
|
}
|
|
@@ -1,25 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/codex.js —
|
|
3
|
-
*
|
|
4
|
-
* Story #2830 (Epic #2815) — wires the
|
|
5
|
-
* [`openai/codex-plugin-cc`](https://github.com/openai/codex-plugin-cc)
|
|
6
|
-
* Claude Code plugin's `/codex:review` slash command into the
|
|
7
|
-
* pluggable ReviewProvider contract.
|
|
8
|
-
*
|
|
9
|
-
* Two halves shipped under one Story:
|
|
10
|
-
* - Task #2834 — schema enum + factory registration + hard-fail
|
|
11
|
-
* probe (this file's `createCodexProvider` + `*ForRegistry`).
|
|
12
|
-
* - Task #2836 — `runReview()` invokes `/codex:review --base <ref>
|
|
13
|
-
* --wait` through an injectable runner and parses the response
|
|
14
|
-
* into `Finding[]`, mapping the Codex severity vocabulary onto
|
|
15
|
-
* the canonical `critical|high|medium|suggestion` enum.
|
|
16
|
-
*
|
|
17
|
-
* The factory NEVER silently falls back to the native provider when
|
|
18
|
-
* `provider: codex` is configured. Operators who want native MUST set
|
|
19
|
-
* `provider: native` explicitly; the probe is the only thing that
|
|
20
|
-
* routes between "configured backend present" and "configured backend
|
|
21
|
-
* missing". The adapter never consults a GitHub provider — the
|
|
22
|
-
* orchestrator owns posting and upserting.
|
|
2
|
+
* review-providers/codex.js — ReviewProvider over `/codex:review`. A missing
|
|
3
|
+
* plugin hard-fails at construction; never a silent fallback to native.
|
|
23
4
|
*
|
|
24
5
|
* @typedef {import('./types.js').Finding} Finding
|
|
25
6
|
* @typedef {import('./types.js').ReviewInput} ReviewInput
|
|
@@ -34,11 +15,6 @@ import path from 'node:path';
|
|
|
34
15
|
import { parseProviderFindings } from './parse-findings.js';
|
|
35
16
|
import { renderDepthDirective } from './review-depth.js';
|
|
36
17
|
|
|
37
|
-
/**
|
|
38
|
-
* Canonical install/remediation guidance baked into every probe failure.
|
|
39
|
-
* Exported so tests (and any future error-renderer) can assert against
|
|
40
|
-
* the exact remediations rather than free-text matching.
|
|
41
|
-
*/
|
|
42
18
|
export const CODEX_REMEDIATIONS = Object.freeze({
|
|
43
19
|
install:
|
|
44
20
|
'Install the Codex plugin (https://github.com/openai/codex-plugin-cc) ' +
|
|
@@ -48,27 +24,14 @@ export const CODEX_REMEDIATIONS = Object.freeze({
|
|
|
48
24
|
'in-process maintainability/lint provider instead.',
|
|
49
25
|
});
|
|
50
26
|
|
|
51
|
-
/**
|
|
52
|
-
* Default Codex plugin marker locations searched by the probe. The
|
|
53
|
-
* Claude Code plugin manager (and its `claude plugin install` flow)
|
|
54
|
-
* unpacks plugins under one of these roots; presence of the
|
|
55
|
-
* `codex-plugin-cc` directory is treated as "the slash command is
|
|
56
|
-
* registered on the host".
|
|
57
|
-
*
|
|
58
|
-
* Exported so tests can extend the list without monkey-patching `os`.
|
|
59
|
-
*/
|
|
27
|
+
/** A present `codex-plugin-cc` directory means the slash command is registered. */
|
|
60
28
|
const DEFAULT_PLUGIN_MARKERS = Object.freeze([
|
|
61
29
|
path.join(os.homedir(), '.claude', 'plugins', 'codex-plugin-cc'),
|
|
62
30
|
path.join(os.homedir(), '.claude', 'plugins', 'openai', 'codex-plugin-cc'),
|
|
63
31
|
]);
|
|
64
32
|
|
|
65
33
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* The probe is intentionally cheap and synchronous — the factory runs
|
|
69
|
-
* it at construction time and the worst case (plugin absent) MUST
|
|
70
|
-
* surface immediately so the operator sees the remediation, not a
|
|
71
|
-
* deferred runtime failure during the first review run.
|
|
34
|
+
* Synchronous so a missing plugin surfaces at construction, not mid-review.
|
|
72
35
|
*
|
|
73
36
|
* @param {{ markers?: readonly string[], existsFn?: (p: string) => boolean }} [opts]
|
|
74
37
|
* @returns {boolean}
|
|
@@ -80,18 +43,13 @@ export function defaultProbeCodexCommand(opts = {}) {
|
|
|
80
43
|
try {
|
|
81
44
|
if (existsFn(marker)) return true;
|
|
82
45
|
} catch (_err) {
|
|
83
|
-
//
|
|
84
|
-
// remediation message, and the operator can inspect the path.
|
|
46
|
+
// An I/O error reads as absent.
|
|
85
47
|
}
|
|
86
48
|
}
|
|
87
49
|
return false;
|
|
88
50
|
}
|
|
89
51
|
|
|
90
52
|
/**
|
|
91
|
-
* Build the hard-fail Error thrown when the probe reports the
|
|
92
|
-
* `/codex:review` command is absent. Exported so the registry entry
|
|
93
|
-
* and tests use the same message shape.
|
|
94
|
-
*
|
|
95
53
|
* @returns {Error}
|
|
96
54
|
*/
|
|
97
55
|
export function buildCodexUnavailableError() {
|
|
@@ -103,35 +61,21 @@ export function buildCodexUnavailableError() {
|
|
|
103
61
|
}
|
|
104
62
|
|
|
105
63
|
/**
|
|
106
|
-
*
|
|
107
|
-
* token
|
|
108
|
-
* `Severity` enum. The table is intentionally explicit — drop-through
|
|
109
|
-
* to `'suggestion'` is reserved for tokens the table does NOT name.
|
|
110
|
-
*
|
|
111
|
-
* Exported so unit tests can drive a table-driven assertion across
|
|
112
|
-
* every documented Codex severity without re-listing the mapping
|
|
113
|
-
* inside the test file.
|
|
64
|
+
* Codex severity tokens (case-insensitive) → canonical `Severity`; an
|
|
65
|
+
* unnamed token falls through to `'suggestion'`.
|
|
114
66
|
*
|
|
115
67
|
* @type {Readonly<Record<string, Severity>>}
|
|
116
68
|
*/
|
|
117
69
|
export const CODEX_SEVERITY_MAP = Object.freeze({
|
|
118
|
-
// Codex "blocker" terminology → canonical critical (halts the
|
|
119
|
-
// review with an unresolved-finding gate).
|
|
120
70
|
blocker: 'critical',
|
|
121
71
|
critical: 'critical',
|
|
122
72
|
fatal: 'critical',
|
|
123
|
-
// Codex "major" terminology → canonical high (lint-error
|
|
124
|
-
// equivalent; non-halting but must be addressed before merge).
|
|
125
73
|
major: 'high',
|
|
126
74
|
high: 'high',
|
|
127
75
|
error: 'high',
|
|
128
|
-
// Codex "minor" terminology → canonical medium (size/volume
|
|
129
|
-
// warning equivalent; flagged but not gating).
|
|
130
76
|
minor: 'medium',
|
|
131
77
|
medium: 'medium',
|
|
132
78
|
warning: 'medium',
|
|
133
|
-
// Codex "info" / "nit" / "style" → canonical suggestion
|
|
134
|
-
// (advisory only, no gate).
|
|
135
79
|
info: 'suggestion',
|
|
136
80
|
nit: 'suggestion',
|
|
137
81
|
style: 'suggestion',
|
|
@@ -140,8 +84,6 @@ export const CODEX_SEVERITY_MAP = Object.freeze({
|
|
|
140
84
|
});
|
|
141
85
|
|
|
142
86
|
/**
|
|
143
|
-
* Map a single Codex severity string onto the canonical enum.
|
|
144
|
-
*
|
|
145
87
|
* @param {unknown} raw
|
|
146
88
|
* @returns {Severity}
|
|
147
89
|
*/
|
|
@@ -152,23 +94,6 @@ export function mapCodexSeverity(raw) {
|
|
|
152
94
|
}
|
|
153
95
|
|
|
154
96
|
/**
|
|
155
|
-
* Parse the raw `/codex:review` stdout into `Finding[]`.
|
|
156
|
-
*
|
|
157
|
-
* The plugin emits JSON; the adapter is liberal in what it accepts:
|
|
158
|
-
* - A bare array of finding objects.
|
|
159
|
-
* - An object with a `findings` array.
|
|
160
|
-
* - Either shape wrapped in an outer envelope with a `result` or
|
|
161
|
-
* `data` key (covers minor wire-format drift across plugin
|
|
162
|
-
* versions without re-shimming).
|
|
163
|
-
*
|
|
164
|
-
* Each entry's severity is funnelled through `mapCodexSeverity` so
|
|
165
|
-
* the canonical enum is the only thing that reaches the renderer.
|
|
166
|
-
* Entries without a `title` or `body` are skipped — the orchestrator
|
|
167
|
-
* cannot post an empty finding, and silently dropping the entry is
|
|
168
|
-
* safer than fabricating one.
|
|
169
|
-
*
|
|
170
|
-
* Exported for testing.
|
|
171
|
-
*
|
|
172
97
|
* @param {string} rawStdout
|
|
173
98
|
* @returns {Finding[]}
|
|
174
99
|
* @throws {Error} when stdout is not parseable JSON.
|
|
@@ -181,15 +106,7 @@ export function parseCodexFindings(rawStdout) {
|
|
|
181
106
|
}
|
|
182
107
|
|
|
183
108
|
/**
|
|
184
|
-
*
|
|
185
|
-
* command for a review input. The risk-derived `depth` lever (Story #3937) is
|
|
186
|
-
* appended via `renderDepthDirective` so a high-risk Epic instructs Codex
|
|
187
|
-
* toward a deeper second-pass review while a low-risk one keeps it light; an
|
|
188
|
-
* absent depth renders the `standard` directive. The `/codex:review` slash
|
|
189
|
-
* command and its `--wait` flag are unchanged — the directive rides as
|
|
190
|
-
* trailing prompt prose the plugin's wrapping model reads.
|
|
191
|
-
*
|
|
192
|
-
* Pure. Exported for testing.
|
|
109
|
+
* The depth directive rides as trailing prompt prose after the slash command.
|
|
193
110
|
*
|
|
194
111
|
* @param {{ baseRef: string, headRef: string, depth?: import('./types.js').ReviewDepth }} args
|
|
195
112
|
* @returns {string}
|
|
@@ -202,14 +119,8 @@ function buildCodexReviewPrompt({ baseRef, headRef, depth }) {
|
|
|
202
119
|
}
|
|
203
120
|
|
|
204
121
|
/**
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
* JSON document to stdout when `--wait` is passed; non-zero exits
|
|
208
|
-
* propagate as an Error so the orchestrator records the run as
|
|
209
|
-
* `status=invalid` rather than burying the failure.
|
|
210
|
-
*
|
|
211
|
-
* Exported for testing — the production adapter accepts an
|
|
212
|
-
* `invokeFn` override so tests never spawn a real process.
|
|
122
|
+
* Run `/codex:review` through the host's `claude` CLI; `--wait` makes the
|
|
123
|
+
* plugin print JSON to stdout.
|
|
213
124
|
*
|
|
214
125
|
* @param {{ baseRef: string, headRef: string, depth?: import('./types.js').ReviewDepth }} args
|
|
215
126
|
* @returns {{ status: number, stdout: string, stderr: string }}
|
|
@@ -231,14 +142,6 @@ function defaultInvokeCodexReview({ baseRef, headRef, depth }) {
|
|
|
231
142
|
}
|
|
232
143
|
|
|
233
144
|
/**
|
|
234
|
-
* Build a `ReviewProvider` instance backed by the Codex plugin.
|
|
235
|
-
*
|
|
236
|
-
* The `deps` overload is the test seam — production callers (the
|
|
237
|
-
* factory) invoke `createCodexProvider()` with no arguments and get
|
|
238
|
-
* the default dependency chain (probe via plugin marker, invoker via
|
|
239
|
-
* the `claude` CLI). Tests inject `probeFn` (to bypass the marker
|
|
240
|
-
* check) and `invokeFn` (to return canned stdout).
|
|
241
|
-
*
|
|
242
145
|
* @param {{
|
|
243
146
|
* probeFn?: () => boolean,
|
|
244
147
|
* invokeFn?: (args: { baseRef: string, headRef: string, scope: string, ticketId: number, depth?: import('./types.js').ReviewDepth }) => { status: number, stdout: string, stderr: string },
|
|
@@ -297,10 +200,6 @@ export function createCodexProvider(deps = {}) {
|
|
|
297
200
|
}
|
|
298
201
|
|
|
299
202
|
/**
|
|
300
|
-
* Zero-arg factory entry point used by the `review-provider-factory`
|
|
301
|
-
* registry. Mirrors `createNativeProviderForRegistry` so the registry
|
|
302
|
-
* signature stays `() => ReviewProvider`.
|
|
303
|
-
*
|
|
304
203
|
* @returns {ReviewProvider}
|
|
305
204
|
*/
|
|
306
205
|
export function createCodexProviderForRegistry() {
|
|
@@ -1,54 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* review-providers/degraded-gates.js — the
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* ## The defect this closes
|
|
6
|
-
*
|
|
7
|
-
* Story #4699 correctly decided that a tool which **could not execute** is an
|
|
8
|
-
* operational degradation, not a code finding: it is routed to friction
|
|
9
|
-
* telemetry so severity tiers keep reflecting code findings only. What #4699
|
|
10
|
-
* did not add was any *other* channel, so the review's own verdict became
|
|
11
|
-
* unable to distinguish "lint ran and found nothing" from "lint never ran" —
|
|
12
|
-
* both rendered `✅ No findings` with an all-zero severity tally, and the close
|
|
13
|
-
* pipeline read the second as the first. A gate that reports success when it
|
|
14
|
-
* did not run is worse than no gate, because it is trusted.
|
|
15
|
-
*
|
|
16
|
-
* This module is that missing channel. A degradation travels **beside** the
|
|
17
|
-
* `Finding[]`, never inside it:
|
|
18
|
-
*
|
|
19
|
-
* - it never becomes a `Finding`, so `countBySeverity` is untouched and no
|
|
20
|
-
* execution failure can appear as a critical / high / medium (or even a
|
|
21
|
-
* suggestion) — #4699's intent survives intact;
|
|
22
|
-
* - it is rendered as its own section in the structured comment, and it
|
|
23
|
-
* suppresses the false `✅ No findings` claim;
|
|
24
|
-
* - it is carried on the `runCodeReview` envelope as `degraded` /
|
|
25
|
-
* `degradations[]`, so the close pipeline sees it too.
|
|
26
|
-
*
|
|
27
|
-
* ## Report, not block — and why
|
|
28
|
-
*
|
|
29
|
-
* A degraded gate is reported loudly and does **not** halt the close. The close
|
|
30
|
-
* pipeline already runs the canonical `npm run lint` as a hard
|
|
31
|
-
* close-validation gate *before* the review phase; the review's scoped lint is
|
|
32
|
-
* a second, narrower read of the same surface. Failing a merge because a
|
|
33
|
-
* *secondary* read of an already-gated surface could not start would block
|
|
34
|
-
* delivery on an operational condition the hard gate has already covered. What
|
|
35
|
-
* was actually broken was the silence, so the fix is to make the silence
|
|
36
|
-
* impossible: every surface that reads the review outcome now states the
|
|
37
|
-
* degradation explicitly. Escalating to a block is a one-line change here if
|
|
38
|
-
* the operator posture ever needs it.
|
|
2
|
+
* review-providers/degraded-gates.js — the "a gate did not run" channel,
|
|
3
|
+
* travelling beside `Finding[]` so "never ran" cannot read as clean. It
|
|
4
|
+
* reports rather than blocks: close already hard-gates `npm run lint`.
|
|
39
5
|
*/
|
|
40
6
|
|
|
41
7
|
/**
|
|
42
8
|
* @typedef {object} GateDegradation
|
|
43
|
-
* @property {string} tool
|
|
44
|
-
* @property {string} gate
|
|
45
|
-
* @property {string} surface Sub-surface that could not run
|
|
46
|
-
* @property {string} reason
|
|
9
|
+
* @property {string} tool
|
|
10
|
+
* @property {string} gate
|
|
11
|
+
* @property {string} surface Sub-surface that could not run.
|
|
12
|
+
* @property {string} reason
|
|
47
13
|
*/
|
|
48
14
|
|
|
49
15
|
/**
|
|
50
|
-
*
|
|
51
|
-
* not be able to corrupt the rendered comment or the envelope.
|
|
16
|
+
* Keep only well-formed records, so a misbehaving provider cannot corrupt output.
|
|
52
17
|
*
|
|
53
18
|
* @param {unknown} input
|
|
54
19
|
* @returns {GateDegradation[]}
|
|
@@ -72,13 +37,8 @@ export function normalizeDegradations(input) {
|
|
|
72
37
|
}
|
|
73
38
|
|
|
74
39
|
/**
|
|
75
|
-
* Feature-
|
|
76
|
-
* `
|
|
77
|
-
* carry no `getDegradations`, so the empty array keeps their output byte-stable;
|
|
78
|
-
* a throw degrades to empty (observability must never fail a review).
|
|
79
|
-
*
|
|
80
|
-
* MUST be called **after** `runReview` — a provider records its degradations
|
|
81
|
-
* during the run.
|
|
40
|
+
* Feature-detected; a throw degrades to empty. MUST be called after
|
|
41
|
+
* `runReview`, which is when a provider records its degradations.
|
|
82
42
|
*
|
|
83
43
|
* @param {{ getDegradations?: Function }} reviewProvider
|
|
84
44
|
* @param {{ warn?: Function }} [logger]
|
|
@@ -99,9 +59,7 @@ export async function collectProviderDegradations(reviewProvider, logger) {
|
|
|
99
59
|
}
|
|
100
60
|
|
|
101
61
|
/**
|
|
102
|
-
*
|
|
103
|
-
* output and comment tallies. Empty input renders `none` so the field is always
|
|
104
|
-
* present — a missing degradation line must never be read as "no degradation".
|
|
62
|
+
* Empty renders `none`, so the field is always present.
|
|
105
63
|
*
|
|
106
64
|
* @param {ReadonlyArray<GateDegradation>} degradations
|
|
107
65
|
* @returns {string}
|
|
@@ -113,10 +71,6 @@ export function summarizeDegradations(degradations) {
|
|
|
113
71
|
}
|
|
114
72
|
|
|
115
73
|
/**
|
|
116
|
-
* Pure: the `{ degraded, degradations }` pair every outcome envelope carries, so
|
|
117
|
-
* a caller adds the channel by spreading one helper rather than restating the
|
|
118
|
-
* derivation (and cannot ship `degradations` without `degraded`).
|
|
119
|
-
*
|
|
120
74
|
* @param {unknown} degradations
|
|
121
75
|
* @returns {{ degraded: boolean, degradations: GateDegradation[] }}
|
|
122
76
|
*/
|
|
@@ -126,10 +80,7 @@ export function degradationEnvelope(degradations) {
|
|
|
126
80
|
}
|
|
127
81
|
|
|
128
82
|
/**
|
|
129
|
-
*
|
|
130
|
-
* channel. A provider predating the contract contributes nothing; a throw is
|
|
131
|
-
* logged and skipped, because a chain must never lose a "this gate did not run"
|
|
132
|
-
* signal *or* fail a review over reporting one.
|
|
83
|
+
* A throwing entry is logged and skipped; reporting must never fail a review.
|
|
133
84
|
*
|
|
134
85
|
* @param {ReadonlyArray<{ name: string, provider: { getDegradations?: Function } }>} entries
|
|
135
86
|
* @param {{ warn?: Function }} [logger]
|
|
@@ -155,9 +106,6 @@ export async function mergeChainDegradations(entries, logger) {
|
|
|
155
106
|
}
|
|
156
107
|
|
|
157
108
|
/**
|
|
158
|
-
* Pure: the header field naming how many gates did not run. Empty when the
|
|
159
|
-
* review was healthy, so a healthy body stays byte-identical to pre-#4839.
|
|
160
|
-
*
|
|
161
109
|
* @param {ReadonlyArray<GateDegradation>} degraded Already normalized.
|
|
162
110
|
* @returns {string[]}
|
|
163
111
|
*/
|
|
@@ -167,9 +115,7 @@ export function renderDegradedHeaderLines(degraded) {
|
|
|
167
115
|
}
|
|
168
116
|
|
|
169
117
|
/**
|
|
170
|
-
*
|
|
171
|
-
* turned into a lie — with a degraded gate present, an all-zero tally is not a
|
|
172
|
-
* clean verdict and must not read like one.
|
|
118
|
+
* With a degraded gate, an all-zero tally must not read as a clean verdict.
|
|
173
119
|
*
|
|
174
120
|
* @param {ReadonlyArray<GateDegradation>} degraded Already normalized.
|
|
175
121
|
* @returns {string[]}
|
|
@@ -191,10 +137,6 @@ export function renderNoFindingsBlock(degraded) {
|
|
|
191
137
|
}
|
|
192
138
|
|
|
193
139
|
/**
|
|
194
|
-
* Pure: render the "Degraded Gates" section of the structured comment. Returns
|
|
195
|
-
* an empty array when nothing degraded, so a healthy review's body stays
|
|
196
|
-
* byte-identical to the pre-#4839 output.
|
|
197
|
-
*
|
|
198
140
|
* @param {ReadonlyArray<GateDegradation>} degradations
|
|
199
141
|
* @returns {string[]} markdown lines
|
|
200
142
|
*/
|