mandrel 2.59.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 +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- 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 +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- 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 +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- 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 +57 -49
- 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 +7 -19
- 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 +39 -121
- 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 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- 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 +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- 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 +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- 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 -124
- 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 +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- 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 +123 -191
- 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 +22 -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 +28 -156
- 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 +121 -157
- 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 +118 -462
- 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 +37 -307
- 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 +55 -318
- 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 +16 -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 +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- 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 -91
- 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 +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- 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 +20 -82
- 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 +96 -0
- 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 +180 -273
- 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 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- 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 -135
- 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 +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- 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 +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- 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 +67 -209
- 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 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- 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 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- 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/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- 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/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- 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 +60 -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 +326 -523
- 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 +17 -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 +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- 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/schemas/model-attribution.schema.json +0 -53
- 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 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- 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/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- 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 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,50 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 1. **Every route has a persona nav door** — a route registered in the route
|
|
10
|
-
* tree that no nav-registry entry surfaces for an entitled persona is an
|
|
11
|
-
* **orphaned route**.
|
|
12
|
-
* 2. **No nav href is dead** — a nav-registry door whose target does not
|
|
13
|
-
* resolve to a real route is a **dead nav href**.
|
|
14
|
-
*
|
|
15
|
-
* Both invariants are a set-difference over two identifier lists, not a
|
|
16
|
-
* judgement call, so they belong in a script rather than in lens prose that
|
|
17
|
-
* asks the agent to eyeball the two files. The lens enumerates the route tree
|
|
18
|
-
* (from `planning.navigation.routeGlobs`) and the nav registry (from
|
|
19
|
-
* `planning.navigation.navRegistry`), hands both to this tool, and triages the
|
|
20
|
-
* structured diff it prints.
|
|
21
|
-
*
|
|
22
|
-
* The one subtlety a naive set-difference gets wrong is **false orphans**: a
|
|
23
|
-
* dynamic detail route (`/users/:id`) is reachable through its surfaced parent,
|
|
24
|
-
* a system route (`/login`, `/404`) is reachable by construction, and a route
|
|
25
|
-
* reached only by an in-app link is not orphaned either. This tool applies that
|
|
26
|
-
* **orphan-verification exemption taxonomy** so the lens reports only genuine
|
|
27
|
-
* orphans (Story #4630, AC-5).
|
|
28
|
-
*
|
|
29
|
-
* Input is two JSON files (route tree + nav registry); a third optional file
|
|
30
|
-
* lists in-app inbound references. Route and door **identifiers only** are read
|
|
31
|
-
* — never route bodies or persona PII (the navigability lens's logging
|
|
32
|
-
* constraint). The tool prints the diff and exits 0 on a successful run; pass
|
|
33
|
-
* `--strict` to exit non-zero when genuine findings remain (a CI gate posture).
|
|
34
|
-
*
|
|
35
|
-
* This is a one-shot deterministic reporter, not an orchestrator: it takes no
|
|
36
|
-
* ticket, mutates no state, and spawns no process.
|
|
3
|
+
* nav-registry-diff.js — route ↔ nav-registry cross-check for the
|
|
4
|
+
* navigability lens: reports orphaned routes (no persona nav door) and dead
|
|
5
|
+
* nav hrefs. System routes, dynamic children of a surfaced parent, explicit
|
|
6
|
+
* exemptions, and routes with an in-app inbound link are not orphans. Reads
|
|
7
|
+
* identifiers only, never route bodies or persona PII. `--strict` exits
|
|
8
|
+
* non-zero on findings.
|
|
37
9
|
*/
|
|
38
10
|
|
|
39
11
|
import fs from 'node:fs';
|
|
40
12
|
import { parseArgs } from 'node:util';
|
|
41
13
|
import { runAsCli } from './lib/cli-utils.js';
|
|
42
14
|
|
|
43
|
-
/**
|
|
44
|
-
* Last-segment tokens (or whole-path tokens) that mark a **system route** —
|
|
45
|
-
* reachable by construction (auth walls, error pages) rather than through a
|
|
46
|
-
* persona nav door, so their absence from the nav registry is never an orphan.
|
|
47
|
-
*/
|
|
15
|
+
/** Last-segment tokens of routes reachable by construction (auth, errors). */
|
|
48
16
|
const SYSTEM_ROUTE_TOKENS = Object.freeze([
|
|
49
17
|
'login',
|
|
50
18
|
'logout',
|
|
@@ -69,7 +37,6 @@ const SYSTEM_ROUTE_TOKENS = Object.freeze([
|
|
|
69
37
|
'maintenance',
|
|
70
38
|
]);
|
|
71
39
|
|
|
72
|
-
/** The exemption reasons a verified non-orphan can carry, for triage clarity. */
|
|
73
40
|
const EXEMPTION_REASONS = Object.freeze({
|
|
74
41
|
EXPLICIT: 'explicit-exempt',
|
|
75
42
|
SYSTEM: 'system-route',
|
|
@@ -78,10 +45,7 @@ const EXEMPTION_REASONS = Object.freeze({
|
|
|
78
45
|
});
|
|
79
46
|
|
|
80
47
|
/**
|
|
81
|
-
*
|
|
82
|
-
* a single leading slash, collapse duplicate slashes, and drop a trailing slash
|
|
83
|
-
* (except for the root `/`). Returns `''` for a nullish or empty input so the
|
|
84
|
-
* caller can reject it.
|
|
48
|
+
* `''` for a non-string or empty input so the caller can reject it.
|
|
85
49
|
*
|
|
86
50
|
* @param {unknown} p
|
|
87
51
|
* @returns {string}
|
|
@@ -96,8 +60,6 @@ export function normalizePath(p) {
|
|
|
96
60
|
}
|
|
97
61
|
|
|
98
62
|
/**
|
|
99
|
-
* Split a normalized path into its non-empty segments (`'/'` → `[]`).
|
|
100
|
-
*
|
|
101
63
|
* @param {string} normalized
|
|
102
64
|
* @returns {string[]}
|
|
103
65
|
*/
|
|
@@ -106,9 +68,7 @@ function segmentsOf(normalized) {
|
|
|
106
68
|
}
|
|
107
69
|
|
|
108
70
|
/**
|
|
109
|
-
*
|
|
110
|
-
* Router `:param`, a Next.js `[param]` / `[...catchAll]`, a bare wildcard `*`,
|
|
111
|
-
* or a `{param}` template.
|
|
71
|
+
* `:param`, `[param]` / `[...catchAll]`, `*`, or `{param}`.
|
|
112
72
|
*
|
|
113
73
|
* @param {string} segment
|
|
114
74
|
* @returns {boolean}
|
|
@@ -122,14 +82,11 @@ export function isDynamicSegment(segment) {
|
|
|
122
82
|
);
|
|
123
83
|
}
|
|
124
84
|
|
|
125
|
-
/** True when the segment is a catch-all (`[...slug]` / `*`) that eats the rest. */
|
|
126
85
|
function isCatchAllSegment(segment) {
|
|
127
86
|
return segment === '*' || segment.startsWith('[...');
|
|
128
87
|
}
|
|
129
88
|
|
|
130
89
|
/**
|
|
131
|
-
* True when a normalized route path contains at least one dynamic segment.
|
|
132
|
-
*
|
|
133
90
|
* @param {string} normalized
|
|
134
91
|
* @returns {boolean}
|
|
135
92
|
*/
|
|
@@ -138,9 +95,6 @@ export function isDynamicPath(normalized) {
|
|
|
138
95
|
}
|
|
139
96
|
|
|
140
97
|
/**
|
|
141
|
-
* True when a normalized route path is a system route (its last segment, or the
|
|
142
|
-
* whole path, is a recognized system token).
|
|
143
|
-
*
|
|
144
98
|
* @param {string} normalized
|
|
145
99
|
* @returns {boolean}
|
|
146
100
|
*/
|
|
@@ -152,9 +106,6 @@ export function isSystemRoute(normalized) {
|
|
|
152
106
|
}
|
|
153
107
|
|
|
154
108
|
/**
|
|
155
|
-
* The parent of a normalized path — the path with its last segment removed
|
|
156
|
-
* (`/users/:id` → `/users`, `/users` → `/`, `/` → `/`).
|
|
157
|
-
*
|
|
158
109
|
* @param {string} normalized
|
|
159
110
|
* @returns {string}
|
|
160
111
|
*/
|
|
@@ -165,13 +116,10 @@ export function parentPath(normalized) {
|
|
|
165
116
|
}
|
|
166
117
|
|
|
167
118
|
/**
|
|
168
|
-
*
|
|
169
|
-
* concrete **href**. A dynamic segment matches any single href segment; a
|
|
170
|
-
* catch-all matches one-or-more trailing href segments. A template with no
|
|
171
|
-
* dynamic segment matches only an identical href.
|
|
119
|
+
* A dynamic segment matches one href segment; a catch-all matches one or more.
|
|
172
120
|
*
|
|
173
|
-
* @param {string} routeNorm
|
|
174
|
-
* @param {string} hrefNorm
|
|
121
|
+
* @param {string} routeNorm
|
|
122
|
+
* @param {string} hrefNorm
|
|
175
123
|
* @returns {boolean}
|
|
176
124
|
*/
|
|
177
125
|
export function routeTemplateMatchesHref(routeNorm, hrefNorm) {
|
|
@@ -180,21 +128,17 @@ export function routeTemplateMatchesHref(routeNorm, hrefNorm) {
|
|
|
180
128
|
for (let i = 0; i < routeSegs.length; i += 1) {
|
|
181
129
|
const rSeg = routeSegs[i];
|
|
182
130
|
if (isCatchAllSegment(rSeg)) {
|
|
183
|
-
// A catch-all consumes every remaining href segment (>= 1).
|
|
184
131
|
return hrefSegs.length >= i + 1;
|
|
185
132
|
}
|
|
186
133
|
if (i >= hrefSegs.length) return false;
|
|
187
|
-
if (isDynamicSegment(rSeg)) continue;
|
|
134
|
+
if (isDynamicSegment(rSeg)) continue;
|
|
188
135
|
if (rSeg !== hrefSegs[i]) return false;
|
|
189
136
|
}
|
|
190
137
|
return routeSegs.length === hrefSegs.length;
|
|
191
138
|
}
|
|
192
139
|
|
|
193
140
|
/**
|
|
194
|
-
*
|
|
195
|
-
* kind }` object) into the internal route shape. Throws on an entry with no
|
|
196
|
-
* usable path so a malformed fixture fails loudly rather than silently
|
|
197
|
-
* dropping a route.
|
|
141
|
+
* Throws on a pathless entry rather than silently dropping a route.
|
|
198
142
|
*
|
|
199
143
|
* @param {unknown} entry
|
|
200
144
|
* @returns {{ path: string, personas: string[], exempt: boolean }}
|
|
@@ -214,9 +158,6 @@ export function toRoute(entry) {
|
|
|
214
158
|
}
|
|
215
159
|
|
|
216
160
|
/**
|
|
217
|
-
* Coerce a nav-registry entry (a bare href string or a `{ href, persona }`
|
|
218
|
-
* object) into the internal door shape. Throws on an entry with no usable href.
|
|
219
|
-
*
|
|
220
161
|
* @param {unknown} entry
|
|
221
162
|
* @returns {{ href: string, persona: string|null }}
|
|
222
163
|
*/
|
|
@@ -236,11 +177,8 @@ export function toDoor(entry) {
|
|
|
236
177
|
}
|
|
237
178
|
|
|
238
179
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* both sides name personas — the door renders in a persona entitled to the
|
|
242
|
-
* route. A route with no declared personas is surfaced by any resolving door; a
|
|
243
|
-
* door with no persona surfaces for any entitled persona.
|
|
180
|
+
* The door resolves to the route and, when both name personas, the door's
|
|
181
|
+
* persona is entitled to it.
|
|
244
182
|
*
|
|
245
183
|
* @param {{ path: string, personas: string[] }} route
|
|
246
184
|
* @param {{ href: string, persona: string|null }} door
|
|
@@ -255,15 +193,10 @@ function doorSurfacesRoute(route, door) {
|
|
|
255
193
|
}
|
|
256
194
|
|
|
257
195
|
/**
|
|
258
|
-
* Resolve why an unsurfaced route is exempt from the orphan report, or `null`
|
|
259
|
-
* when it is a genuine orphan. The taxonomy (Story #4630, AC-5): an explicitly
|
|
260
|
-
* exempt route, a system route, a dynamic-segment child of a surfaced parent,
|
|
261
|
-
* or a route reached by an in-app inbound reference.
|
|
262
|
-
*
|
|
263
196
|
* @param {{ path: string, exempt: boolean }} route
|
|
264
|
-
* @param {Set<string>} surfacedPaths
|
|
265
|
-
* @param {Set<string>} inboundRefs
|
|
266
|
-
* @returns {string|null} an {@link EXEMPTION_REASONS} value, or null
|
|
197
|
+
* @param {Set<string>} surfacedPaths
|
|
198
|
+
* @param {Set<string>} inboundRefs
|
|
199
|
+
* @returns {string|null} an {@link EXEMPTION_REASONS} value, or null for a genuine orphan
|
|
267
200
|
*/
|
|
268
201
|
function orphanExemption(route, surfacedPaths, inboundRefs) {
|
|
269
202
|
if (route.exempt) return EXEMPTION_REASONS.EXPLICIT;
|
|
@@ -276,8 +209,6 @@ function orphanExemption(route, surfacedPaths, inboundRefs) {
|
|
|
276
209
|
}
|
|
277
210
|
|
|
278
211
|
/**
|
|
279
|
-
* Compute the two-way route ↔ nav-registry diff with orphan verification.
|
|
280
|
-
*
|
|
281
212
|
* @param {{
|
|
282
213
|
* routes?: unknown[],
|
|
283
214
|
* nav?: unknown[],
|
|
@@ -295,7 +226,6 @@ export function computeNavDiff({ routes = [], nav = [], refs = [] } = {}) {
|
|
|
295
226
|
const doorList = nav.map(toDoor);
|
|
296
227
|
const inboundRefs = new Set(refs.map(normalizePath).filter((p) => p !== ''));
|
|
297
228
|
|
|
298
|
-
// Which route paths does at least one door surface (persona-aware)?
|
|
299
229
|
const surfacedPaths = new Set();
|
|
300
230
|
for (const route of routeList) {
|
|
301
231
|
if (doorList.some((door) => doorSurfacesRoute(route, door))) {
|
|
@@ -315,7 +245,6 @@ export function computeNavDiff({ routes = [], nav = [], refs = [] } = {}) {
|
|
|
315
245
|
}
|
|
316
246
|
}
|
|
317
247
|
|
|
318
|
-
// A door is dead when its href resolves to no route (identical or template).
|
|
319
248
|
const deadHrefs = [];
|
|
320
249
|
for (const door of doorList) {
|
|
321
250
|
const resolves = routeList.some(
|
|
@@ -335,12 +264,9 @@ export function computeNavDiff({ routes = [], nav = [], refs = [] } = {}) {
|
|
|
335
264
|
}
|
|
336
265
|
|
|
337
266
|
/**
|
|
338
|
-
*
|
|
339
|
-
* is unreadable, not JSON, or not an array.
|
|
340
|
-
*
|
|
341
|
-
* @param {string} label human-readable role for the error message
|
|
267
|
+
* @param {string} label
|
|
342
268
|
* @param {string} file
|
|
343
|
-
* @param {typeof fs} [fsImpl]
|
|
269
|
+
* @param {typeof fs} [fsImpl]
|
|
344
270
|
* @returns {unknown[]}
|
|
345
271
|
*/
|
|
346
272
|
function readJsonArray(label, file, fsImpl = fs) {
|
|
@@ -373,8 +299,6 @@ function readJsonArray(label, file, fsImpl = fs) {
|
|
|
373
299
|
}
|
|
374
300
|
|
|
375
301
|
/**
|
|
376
|
-
* Render the diff as a human-readable, triage-friendly text report.
|
|
377
|
-
*
|
|
378
302
|
* @param {ReturnType<typeof computeNavDiff>} diff
|
|
379
303
|
* @returns {string}
|
|
380
304
|
*/
|
|
@@ -401,15 +325,6 @@ export function formatDiffText(diff) {
|
|
|
401
325
|
}
|
|
402
326
|
|
|
403
327
|
/**
|
|
404
|
-
* The reporter core, extracted from the CLI shell so the argv → read → diff →
|
|
405
|
-
* render → exit-code path is reachable without touching the real filesystem or
|
|
406
|
-
* the real stdout.
|
|
407
|
-
*
|
|
408
|
-
* Both seams on the optional final `deps` parameter default to the real
|
|
409
|
-
* implementation (`.agents/rules/test-seams.md` rules 1-2, 4 — `readJsonArray`
|
|
410
|
-
* forwards `fsImpl` rather than re-acquiring `fs`), so `main` and every
|
|
411
|
-
* production invocation are unchanged.
|
|
412
|
-
*
|
|
413
328
|
* @param {string[]} [argv]
|
|
414
329
|
* @param {{ fsImpl?: typeof fs, stdout?: { write: (s: string) => void } }} [deps]
|
|
415
330
|
* @returns {Promise<number>} process exit code
|
|
@@ -443,8 +358,7 @@ export async function runNavRegistryDiff(
|
|
|
443
358
|
|
|
444
359
|
const diff = computeNavDiff({ routes, nav, refs });
|
|
445
360
|
|
|
446
|
-
//
|
|
447
|
-
// clean, machine-parseable report the lens can pipe or `JSON.parse`.
|
|
361
|
+
// Straight to stdout (not Logger) so the report stays machine-parseable.
|
|
448
362
|
const rendered = values.json
|
|
449
363
|
? JSON.stringify(diff, null, 2)
|
|
450
364
|
: formatDiffText(diff);
|
|
@@ -2,41 +2,11 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* notify.js
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Direct inline calls at phase boundaries are the only path: `notify()`
|
|
11
|
-
* is invoked from the caller that has something to say. Direct CLI /
|
|
12
|
-
* library invocations are equally supported, for one-shot operator
|
|
13
|
-
* commands and the structured-comment back-channel.
|
|
14
|
-
*
|
|
15
|
-
* Channels:
|
|
16
|
-
*
|
|
17
|
-
* 1. GITHUB COMMENT — gated by `notifications.commentEvents` (event
|
|
18
|
-
* allowlist). Only dispatches whose `event` name appears in the
|
|
19
|
-
* allowlist reach the ticket. @mentions operator on `high` severity;
|
|
20
|
-
* on `medium` when `mentionOperator` is set. Callers may pass
|
|
21
|
-
* `opts.skipComment: true` to suppress the comment for a single
|
|
22
|
-
* dispatch while still firing the webhook (used for structured-
|
|
23
|
-
* comment writers that already posted the ticket-side body themselves).
|
|
24
|
-
* 2. WEBHOOK — gated by `notifications.webhookEvents` (event allowlist).
|
|
25
|
-
* Only dispatches whose `event` name appears in the allowlist reach
|
|
26
|
-
* the webhook. The webhook channel is curated for the epic narrative
|
|
27
|
-
* (% progress + blockers), not the firehose of per-story transitions;
|
|
28
|
-
* the default allowlist is the five `epic-*` events. Payload envelope:
|
|
29
|
-
* `{ text, severity, event?, level?, ticketId?, epicId?, phase? }` —
|
|
30
|
-
* `text` is the primary human-readable body (Slack-style incoming
|
|
31
|
-
* webhooks read this field).
|
|
32
|
-
*
|
|
33
|
-
* Each channel filters independently — no fallback chain. Severity is
|
|
34
|
-
* carried as envelope metadata (so Slack consumers can color-code by it
|
|
35
|
-
* and high-severity comments still `@mention` the operator) but is no
|
|
36
|
-
* longer a routing factor for either channel.
|
|
37
|
-
*
|
|
38
|
-
* Severity vocabulary: low | medium | high. See `lib/notifications/notifier.js`
|
|
39
|
-
* for the `eventSeverity()` helper used by ticket-state-transition events.
|
|
5
|
+
* notify.js — dispatch a notification to two independently gated channels:
|
|
6
|
+
* a GitHub comment (`notifications.commentEvents` allowlist) and a webhook
|
|
7
|
+
* (`notifications.webhookEvents` allowlist; `text` is the body Slack-style
|
|
8
|
+
* hooks read). Severity never routes; it only drives @mentions and rides the
|
|
9
|
+
* webhook envelope as metadata.
|
|
40
10
|
*/
|
|
41
11
|
|
|
42
12
|
import { createHmac } from 'node:crypto';
|
|
@@ -49,18 +19,13 @@ import {
|
|
|
49
19
|
} from './lib/notifications/notifier.js';
|
|
50
20
|
import { createProvider } from './lib/provider-factory.js';
|
|
51
21
|
|
|
52
|
-
/** Map notification severity to a `postComment` badge style. */
|
|
53
22
|
const SEVERITY_TO_COMMENT_TYPE = {
|
|
54
23
|
low: 'progress',
|
|
55
24
|
medium: 'notification',
|
|
56
25
|
high: 'friction',
|
|
57
26
|
};
|
|
58
27
|
|
|
59
|
-
/**
|
|
60
|
-
* Resolve a channel's event allowlist. Returns a `Set<string>` for O(1)
|
|
61
|
-
* membership lookups. An absent/empty allowlist suppresses the channel
|
|
62
|
-
* entirely — there is no implicit fallback to a severity-based gate.
|
|
63
|
-
*/
|
|
28
|
+
/** An absent or empty allowlist suppresses the channel entirely. */
|
|
64
29
|
function resolveEventAllowlist(notifications, key) {
|
|
65
30
|
const list = notifications?.[key];
|
|
66
31
|
if (!Array.isArray(list)) return new Set();
|
|
@@ -88,8 +53,6 @@ function buildWebhookPayload({
|
|
|
88
53
|
: '';
|
|
89
54
|
const text = `${prefix}${ticketPart}: ${cleanMessage}`;
|
|
90
55
|
|
|
91
|
-
// `text` is the primary human-readable body; typed fields follow for
|
|
92
|
-
// routable subscribers.
|
|
93
56
|
const envelope = { text, severity };
|
|
94
57
|
if (Number.isFinite(numericTicketId) && numericTicketId > 0) {
|
|
95
58
|
envelope.ticketId = numericTicketId;
|
|
@@ -127,11 +90,7 @@ async function sendWebhook(url, payloadBody, fetchImpl = globalThis.fetch) {
|
|
|
127
90
|
}
|
|
128
91
|
|
|
129
92
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* @param {number} ticketId - GitHub Issue number to post the notification on.
|
|
133
|
-
* Pass 0 (or any non-positive) to skip the GitHub comment and fire the
|
|
134
|
-
* webhook only.
|
|
93
|
+
* @param {number} ticketId - Non-positive skips the comment (webhook only).
|
|
135
94
|
* @param {{
|
|
136
95
|
* severity?: 'low'|'medium'|'high',
|
|
137
96
|
* message: string,
|
|
@@ -139,21 +98,15 @@ async function sendWebhook(url, payloadBody, fetchImpl = globalThis.fetch) {
|
|
|
139
98
|
* level?: 'task'|'story'|'wave'|'epic',
|
|
140
99
|
* epicId?: number,
|
|
141
100
|
* phase?: string,
|
|
142
|
-
* }} payload -
|
|
143
|
-
* @mention behavior on the comment channel and is carried as webhook
|
|
144
|
-
* envelope metadata, but does not gate either channel. `event` is
|
|
145
|
-
* required for any channel to fire — event-less dispatches are no-ops.
|
|
101
|
+
* }} payload - Without `event` no channel fires.
|
|
146
102
|
* @param {{
|
|
147
103
|
* config?: object,
|
|
148
104
|
* provider?: object,
|
|
149
105
|
* webhookUrl?: string|null,
|
|
150
106
|
* skipComment?: boolean,
|
|
151
107
|
* fetchImpl?: typeof fetch,
|
|
152
|
-
* }} [opts] - `
|
|
153
|
-
*
|
|
154
|
-
* never pass it. Tests inject a fake to assert the request body,
|
|
155
|
-
* `X-Signature-256` header, and the 4xx/5xx response branches without a
|
|
156
|
-
* live network call or a global monkeypatch.
|
|
108
|
+
* }} [opts] - `skipComment` suppresses the comment for writers that already
|
|
109
|
+
* posted the ticket-side body.
|
|
157
110
|
*/
|
|
158
111
|
export async function notify(ticketId, payload, opts = {}) {
|
|
159
112
|
const config = opts.config || resolveConfig();
|
|
@@ -177,8 +130,6 @@ export async function notify(ticketId, payload, opts = {}) {
|
|
|
177
130
|
const fireComment = !noTicket && !callerSuppressed && eventAllowedOnComments;
|
|
178
131
|
|
|
179
132
|
if (fireComment) {
|
|
180
|
-
// High always @mentions; medium @mentions when `mentionOperator` is set;
|
|
181
|
-
// low never @mentions.
|
|
182
133
|
const mention =
|
|
183
134
|
severity === 'high' ||
|
|
184
135
|
(severity === 'medium' && notifications?.mentionOperator);
|
|
@@ -190,12 +141,8 @@ export async function notify(ticketId, payload, opts = {}) {
|
|
|
190
141
|
});
|
|
191
142
|
}
|
|
192
143
|
|
|
193
|
-
// Webhook channel: gated by event-name allowlist. A dispatch without an
|
|
194
|
-
// `event` field can never reach the webhook — there is no implicit
|
|
195
|
-
// category for unlabelled notifications.
|
|
196
144
|
if (event && webhookEvents.has(event)) {
|
|
197
|
-
// `
|
|
198
|
-
// Explicit `null` or string → caller was explicit; don't resolve.
|
|
145
|
+
// Only `undefined` resolves from env; an explicit `null` means none.
|
|
199
146
|
const webhookUrl =
|
|
200
147
|
opts.webhookUrl === undefined ? resolveWebhookUrl() : opts.webhookUrl;
|
|
201
148
|
if (webhookUrl) {
|
|
@@ -213,9 +160,7 @@ export async function notify(ticketId, payload, opts = {}) {
|
|
|
213
160
|
});
|
|
214
161
|
await sendWebhook(webhookUrl, payloadBody, opts.fetchImpl);
|
|
215
162
|
} else {
|
|
216
|
-
//
|
|
217
|
-
// so the operator notices a missing/empty NOTIFICATION_WEBHOOK_URL
|
|
218
|
-
// instead of silently dropping the dispatch.
|
|
163
|
+
// Allowlisted but no URL: warn rather than drop silently.
|
|
219
164
|
Logger.warn(
|
|
220
165
|
`[Notify] Webhook event (${event}) suppressed — no webhook URL resolved (NOTIFICATION_WEBHOOK_URL unset or empty).`,
|
|
221
166
|
);
|
|
@@ -290,8 +235,6 @@ async function main() {
|
|
|
290
235
|
const args = process.argv.slice(2);
|
|
291
236
|
const { ticketId, message, severity } = parseNotifyArgs(args);
|
|
292
237
|
|
|
293
|
-
// CLI fires always carry the `operator-message` event so they route
|
|
294
|
-
// through the same event-name allowlist as the rest of the system.
|
|
295
238
|
await notify(ticketId, {
|
|
296
239
|
severity,
|
|
297
240
|
message,
|