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,18 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub Provider — IssuesGateway
|
|
3
|
-
*
|
|
4
|
-
* Owns the remaining read-side surface that did not belong to any of the
|
|
5
|
-
* earlier six gateways: the raw GraphQL shim (`graphql` / `_ghGraphql`),
|
|
6
|
-
* epic reads (`getEpic`), repository-wide label scans
|
|
7
|
-
* (`listIssuesByLabel`), branch existence probes (`branchExists`), and the
|
|
8
|
-
* three-strategy sub-ticket aggregator (`getSubTickets`).
|
|
9
|
-
*
|
|
10
|
-
* Extracted from `../github.js` in Story #2462 / Task #2481 — the final
|
|
11
|
-
* slice that brings `GitHubProvider` down to a thin composition root.
|
|
12
|
-
* Public surface on `GitHubProvider` is unchanged: every method here is
|
|
13
|
-
* exposed by a one-line delegating wrapper on the parent provider.
|
|
14
|
-
*
|
|
15
|
-
* @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
|
|
2
|
+
* GitHub Provider — IssuesGateway: the raw GraphQL shim, epic reads, label
|
|
3
|
+
* scans, branch probes, issue search, and the sub-ticket aggregator.
|
|
16
4
|
*/
|
|
17
5
|
|
|
18
6
|
import { GhRateLimitError } from '../../lib/gh-exec.js';
|
|
@@ -33,12 +21,8 @@ import {
|
|
|
33
21
|
import { composeBoundedQuery } from './search-query.js';
|
|
34
22
|
|
|
35
23
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* owns the wait, so the call must fail fast rather than burn its retry budget
|
|
39
|
-
* re-issuing into an empty window. Every other error keeps the global
|
|
40
|
-
* classification, so a 5xx/network blip still retries. `classifyGithubError`
|
|
41
|
-
* itself is unchanged: other endpoints legitimately retry on rate-limit.
|
|
24
|
+
* Rate-limit is non-transient for search: the shared search budget owns the
|
|
25
|
+
* wait, so retrying would only re-issue into an empty window.
|
|
42
26
|
*
|
|
43
27
|
* @param {unknown} err
|
|
44
28
|
* @returns {string}
|
|
@@ -48,20 +32,11 @@ function classifySearchRetry(err) {
|
|
|
48
32
|
return classifyGithubError(err);
|
|
49
33
|
}
|
|
50
34
|
|
|
51
|
-
/**
|
|
52
|
-
* Concurrency budget for the `getSubTickets` fan-out — preserved from
|
|
53
|
-
* the old `./github/issues.js` predecessor.
|
|
54
|
-
*/
|
|
55
35
|
export const SUBTICKET_HYDRATION_CONCURRENCY = 8;
|
|
56
36
|
|
|
57
37
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* Node selection is deliberately identical to `SUB_ISSUES_QUERY`'s, so the
|
|
61
|
-
* parent and the children a caller holds come back in one shape and
|
|
62
|
-
* `subIssueNodeToTicket` maps both. Addressed by `owner/repo/number` rather
|
|
63
|
-
* than by node id because every caller starts from an issue number and would
|
|
64
|
-
* otherwise pay a round-trip just to learn the node id.
|
|
38
|
+
* Node selection matches `SUB_ISSUES_QUERY` so `subIssueNodeToTicket` maps
|
|
39
|
+
* parent and children alike; addressed by number to skip a node-id lookup.
|
|
65
40
|
*/
|
|
66
41
|
const PARENT_ISSUE_QUERY = `query($owner: String!, $repo: String!, $number: Int!) {
|
|
67
42
|
repository(owner: $owner, name: $repo) {
|
|
@@ -80,9 +55,6 @@ const PARENT_ISSUE_QUERY = `query($owner: String!, $repo: String!, $number: Int!
|
|
|
80
55
|
}
|
|
81
56
|
}`;
|
|
82
57
|
|
|
83
|
-
// Re-export so existing test consumers that previously imported
|
|
84
|
-
// `paginateRest` from this module continue to work without an extra
|
|
85
|
-
// migration step.
|
|
86
58
|
export { paginateRest };
|
|
87
59
|
|
|
88
60
|
export class IssuesGateway {
|
|
@@ -104,16 +76,13 @@ export class IssuesGateway {
|
|
|
104
76
|
this.owner = owner;
|
|
105
77
|
this.repo = repo;
|
|
106
78
|
this._hooks = hooks;
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
// so unit tests drive it deterministically (Story #4678).
|
|
79
|
+
// Process-wide singleton by default so all gateways share one 30/min
|
|
80
|
+
// `/search/issues` window.
|
|
110
81
|
this._searchBudget = searchBudget ?? defaultSearchBudget;
|
|
111
82
|
}
|
|
112
83
|
|
|
113
84
|
/**
|
|
114
|
-
*
|
|
115
|
-
* JSON `{ query, variables }` body on stdin). Returns the `data` field.
|
|
116
|
-
* Throws when the response contains a non-empty `errors[]`.
|
|
85
|
+
* Returns the response's `data`; throws on a non-empty `errors[]`.
|
|
117
86
|
*/
|
|
118
87
|
async ghGraphql(query, variables = {}, _opts = {}) {
|
|
119
88
|
const body = { query };
|
|
@@ -135,9 +104,7 @@ export class IssuesGateway {
|
|
|
135
104
|
}
|
|
136
105
|
|
|
137
106
|
/**
|
|
138
|
-
*
|
|
139
|
-
* REST). Used by the dispatcher / reconciler to scan for `agent::*`
|
|
140
|
-
* state.
|
|
107
|
+
* Raw REST issues (PRs excluded); `labels` is GitHub's comma-separated form.
|
|
141
108
|
*
|
|
142
109
|
* @field-manifest /repos/{owner}/{repo}/issues: number, title, body, labels,
|
|
143
110
|
* state, assignees, pull_request
|
|
@@ -151,21 +118,9 @@ export class IssuesGateway {
|
|
|
151
118
|
}
|
|
152
119
|
|
|
153
120
|
/**
|
|
154
|
-
*
|
|
155
|
-
* `
|
|
156
|
-
*
|
|
157
|
-
* The two differ in exactly the field that keeps biting: the REST payload
|
|
158
|
-
* calls the issue number `number` and the database id `id`, while every
|
|
159
|
-
* mapped read calls the issue number `id`. Consumers that could be handed
|
|
160
|
-
* either wrote `number ?? id` to cope, and that fallback is not a
|
|
161
|
-
* defensive nicety — it is a live bug, because on a *mapped* ticket `id`
|
|
162
|
-
* is the number and on a *raw* one it is the database id. A caller that
|
|
163
|
-
* ever receives the raw shape silently addresses issues by database id.
|
|
164
|
-
*
|
|
165
|
-
* `url` is carried alongside the mapped fields because two consumers
|
|
166
|
-
* (`epic-candidates`, `dependency-candidates`) render a link and
|
|
167
|
-
* `issueToTicket` drops `html_url`. It is the only addition; everything
|
|
168
|
-
* else is exactly what every other single-issue read returns.
|
|
121
|
+
* {@link listIssuesByLabel} mapped through `issueToTicket`, plus `url`.
|
|
122
|
+
* Prefer this: on a raw payload `id` is the database id, on a mapped one it
|
|
123
|
+
* is the issue number, and a `number ?? id` fallback silently mis-addresses.
|
|
169
124
|
*
|
|
170
125
|
* @param {{ state?: 'open'|'closed'|'all', labels?: string }} [opts]
|
|
171
126
|
* @returns {Promise<Array<object>>} Mapped tickets (`id` is the issue number).
|
|
@@ -182,20 +137,9 @@ export class IssuesGateway {
|
|
|
182
137
|
}
|
|
183
138
|
|
|
184
139
|
/**
|
|
185
|
-
* Resolve an issue's container parent in
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
* issue and read each one's children looking for the Story it was handed:
|
|
189
|
-
* O(open Epics) requests to answer a question the API answers directly.
|
|
190
|
-
* `Issue.parent` is the native sub-issue edge read backwards, so a Story
|
|
191
|
-
* with a container costs one call and a Story without one costs the same.
|
|
192
|
-
*
|
|
193
|
-
* Returns `null` — never throws — when the issue has no parent, when the
|
|
194
|
-
* response is shaped unexpectedly, or when the sub-issues feature is
|
|
195
|
-
* unavailable on this repo. A null is "no parent resolved here", which is
|
|
196
|
-
* exactly what the caller's body-checklist fallback exists for; turning a
|
|
197
|
-
* disabled feature into an exception would convert a degraded lookup into a
|
|
198
|
-
* failed lifecycle edge.
|
|
140
|
+
* Resolve an issue's container parent in one request via `Issue.parent`.
|
|
141
|
+
* Never throws: no parent, an odd shape, or sub-issues being unavailable all
|
|
142
|
+
* return `null`, leaving the caller's checklist fallback to run.
|
|
199
143
|
*
|
|
200
144
|
* @param {number} number Issue number whose parent to resolve.
|
|
201
145
|
* @returns {Promise<object|null>} Mapped parent ticket, or null.
|
|
@@ -230,25 +174,10 @@ export class IssuesGateway {
|
|
|
230
174
|
}
|
|
231
175
|
|
|
232
176
|
/**
|
|
233
|
-
* Search issues
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
* search rides the same `gh api` REST surface + transient-retry shim as
|
|
238
|
-
* every other read here.
|
|
239
|
-
*
|
|
240
|
-
* The caller (`audit-to-stories.js` `loadProvider()`) passes a 40-char
|
|
241
|
-
* fingerprint sha as the query so the search resolves the handful of
|
|
242
|
-
* issues whose fingerprint footer carries that sha; `route-finding.js`
|
|
243
|
-
* then confirms identity against the footer. Both open and closed issues
|
|
244
|
-
* are returned (no `state:` qualifier is appended) so a closed-fingerprint
|
|
245
|
-
* match can surface as `regression-of-closed`.
|
|
246
|
-
*
|
|
247
|
-
* Returns the trimmed `[{ number, state, body, title, html_url }]`
|
|
248
|
-
* projection. Dedup callers use `{ number, state, body }`; duplicate-
|
|
249
|
-
* search also needs `title` / `html_url`. `state` is normalised to the
|
|
250
|
-
* REST lowercase form (`open` / `closed`). Results are capped at one
|
|
251
|
-
* Search API page (`per_page=100`).
|
|
177
|
+
* Search issues (open and closed, so a closed match can surface as a
|
|
178
|
+
* regression) in this repo via REST — not GraphQL, whose transient 401s
|
|
179
|
+
* would make the dedup port silently no-op. Capped at one 100-item page;
|
|
180
|
+
* `state` is lowercase.
|
|
252
181
|
*
|
|
253
182
|
* @param {{ query: string, owner?: string, repo?: string }} params
|
|
254
183
|
* @returns {Promise<Array<{ number: number, state: string, body: string, title: string, html_url?: string }>>}
|
|
@@ -260,18 +189,12 @@ export class IssuesGateway {
|
|
|
260
189
|
}
|
|
261
190
|
const scopeOwner = owner ?? this.owner;
|
|
262
191
|
const scopeRepo = repo ?? this.repo;
|
|
263
|
-
//
|
|
264
|
-
//
|
|
265
|
-
// issue body where the `<!-- audit-fingerprints: ... -->` footer lives.
|
|
266
|
-
// The composed `q` is bounded to GitHub Search's 256-char limit here — the
|
|
267
|
-
// only place that knows both the free text and the qualifiers it appends —
|
|
268
|
-
// truncating the free-text portion on a whole-token boundary (Story #4678).
|
|
192
|
+
// Bounded here — the only place that sees both the free text and the
|
|
193
|
+
// qualifiers — to Search's 256-char `q` limit.
|
|
269
194
|
const qualifiers = [`repo:${scopeOwner}/${scopeRepo}`, 'type:issue'];
|
|
270
195
|
const q = composeBoundedQuery(query, qualifiers);
|
|
271
196
|
const params = new URLSearchParams({ q, per_page: '100' });
|
|
272
197
|
const endpoint = `/search/issues?${params}`;
|
|
273
|
-
// Await the shared 30/min budget before every call so the whole scan's
|
|
274
|
-
// fan-out is throttled at the endpoint, not per caller (Story #4678).
|
|
275
198
|
await this._searchBudget.take();
|
|
276
199
|
let result;
|
|
277
200
|
try {
|
|
@@ -284,9 +207,8 @@ export class IssuesGateway {
|
|
|
284
207
|
},
|
|
285
208
|
);
|
|
286
209
|
} catch (err) {
|
|
287
|
-
//
|
|
288
|
-
//
|
|
289
|
-
// retrying independently into the exhausted window.
|
|
210
|
+
// Drain the budget until reset so the next call pauses once instead of
|
|
211
|
+
// every caller retrying into the exhausted window.
|
|
290
212
|
if (err instanceof GhRateLimitError) {
|
|
291
213
|
this._searchBudget.noteRateLimited(parseRateLimitResetMs(err));
|
|
292
214
|
}
|
|
@@ -320,9 +242,8 @@ export class IssuesGateway {
|
|
|
320
242
|
}
|
|
321
243
|
|
|
322
244
|
/**
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
* error so auth/scope failures don't masquerade as a missing branch.
|
|
245
|
+
* `false` only on 404; other errors propagate so auth failures don't
|
|
246
|
+
* masquerade as a missing branch.
|
|
326
247
|
*
|
|
327
248
|
* @field-manifest GET /repos/{owner}/{repo}/branches/{branch}: name
|
|
328
249
|
*/
|
|
@@ -340,7 +261,6 @@ export class IssuesGateway {
|
|
|
340
261
|
}
|
|
341
262
|
}
|
|
342
263
|
|
|
343
|
-
/** Strategy 2 — Markdown checklist links `- [ ] #N` / `- [x] #N`. */
|
|
344
264
|
_getChecklistChildren(parentBody) {
|
|
345
265
|
const re = /-\s*\[[ xX]\]\s+#(\d+)/g;
|
|
346
266
|
return [...(parentBody ?? '').matchAll(re)].map((m) =>
|
|
@@ -348,10 +268,7 @@ export class IssuesGateway {
|
|
|
348
268
|
);
|
|
349
269
|
}
|
|
350
270
|
|
|
351
|
-
/**
|
|
352
|
-
* Strategy 3 — reverse-search for issues that reference the parent
|
|
353
|
-
* (`Epic: #N` / `parent: #N`). Non-fatal on error.
|
|
354
|
-
*/
|
|
271
|
+
/** Reverse-search for issues referencing the parent; non-fatal on error. */
|
|
355
272
|
async _getReferencedChildren(parentId) {
|
|
356
273
|
const getTickets = this._hooks.getTickets;
|
|
357
274
|
const primeTicketCache = this._hooks.primeTicketCache;
|
|
@@ -370,32 +287,23 @@ export class IssuesGateway {
|
|
|
370
287
|
}
|
|
371
288
|
|
|
372
289
|
/**
|
|
373
|
-
*
|
|
374
|
-
*
|
|
375
|
-
* parallel because checklist parsing is pure/synchronous.
|
|
376
|
-
* 2. Reverse-search (`_getReferencedChildren`) — a full-repo label
|
|
377
|
-
* scan that is **only** executed when both strategy 1 sources
|
|
378
|
-
* return empty. This avoids the unconditional full-repo scan that
|
|
379
|
-
* fired on every call in the old `Promise.all` path.
|
|
290
|
+
* Union of native sub-issues and body checklist links; the full-repo
|
|
291
|
+
* reverse search runs only when both are empty.
|
|
380
292
|
*
|
|
381
293
|
* @param {number} parentId
|
|
382
|
-
* @param {{ fresh?: boolean }} [opts] -
|
|
383
|
-
*
|
|
384
|
-
* by the cascade logic to skip a redundant second fan-out.
|
|
294
|
+
* @param {{ fresh?: boolean }} [opts] - `fresh` bypasses the ticket cache
|
|
295
|
+
* for every child fetch.
|
|
385
296
|
*/
|
|
386
297
|
async getSubTickets(parentId, opts = {}) {
|
|
387
298
|
const getTicket = this._hooks.getTicket;
|
|
388
299
|
const getNativeSubIssues = this._hooks.getNativeSubIssues;
|
|
389
300
|
const parent = await getTicket(parentId);
|
|
390
301
|
|
|
391
|
-
// Strategy 1: native sub-issues (GraphQL) + checklist (synchronous).
|
|
392
302
|
const [nativeChildIds, checklistChildIds] = await Promise.all([
|
|
393
303
|
getNativeSubIssues(parent.nodeId, parentId),
|
|
394
304
|
Promise.resolve(this._getChecklistChildren(parent.body)),
|
|
395
305
|
]);
|
|
396
306
|
|
|
397
|
-
// Strategy 2 (fallback): full-repo reverse-search — only when strategy
|
|
398
|
-
// 1 produced nothing, avoiding the unconditional scan on every call.
|
|
399
307
|
let referencedChildIds = [];
|
|
400
308
|
if (nativeChildIds.length === 0 && checklistChildIds.length === 0) {
|
|
401
309
|
referencedChildIds = await this._getReferencedChildren(parentId);
|
|
@@ -1,57 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub Provider — LabelGateway
|
|
3
|
-
*
|
|
4
|
-
* Owns `ensureLabels` (idempotent label create) plus the live-set
|
|
5
|
-
* reconciliation helper (`_reconcileLabelsPresence` /
|
|
6
|
-
* `_normalizeLabelListResult`). `gh label create` is the canonical CLI
|
|
7
|
-
* surface for label creation; this gateway swallows the "already exists"
|
|
8
|
-
* signal across all three surfaces (CLI stderr, API 422 body, legacy test
|
|
9
|
-
* mock) so re-runs are idempotent.
|
|
10
|
-
*
|
|
11
|
-
* Extracted from `../github.js` in Story #2462 / Task #2478. Public
|
|
12
|
-
* surface on `GitHubProvider` is unchanged — `ensureLabels`,
|
|
13
|
-
* `_reconcileLabelsPresence`, and `_normalizeLabelListResult` all
|
|
14
|
-
* delegate here.
|
|
15
|
-
*
|
|
16
|
-
* @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
|
|
2
|
+
* GitHub Provider — LabelGateway: idempotent label create with live-set
|
|
3
|
+
* reconciliation, paginated listing, and delete.
|
|
17
4
|
*/
|
|
18
5
|
|
|
19
6
|
import { withTransientRetry } from './errors.js';
|
|
20
7
|
import { paginateRest } from './request-helpers.js';
|
|
21
8
|
|
|
22
9
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* `! Label "<name>" already exists`
|
|
27
|
-
*
|
|
28
|
-
* to stderr and exits non-zero; the underlying API surfaces a 422 with
|
|
29
|
-
* `errors[].code === 'already_exists'`. The test mock throws
|
|
30
|
-
* `Error('... code 422')`. Match all three — but require the patterns to
|
|
31
|
-
* be **anchored to the label-create lexicon** so unrelated stderr lines
|
|
32
|
-
* that happen to mention "already exists" don't get misclassified as
|
|
33
|
-
* idempotent skips and let real creation failures look successful.
|
|
34
|
-
*
|
|
35
|
-
* Story #2018 (Bug 2) tightened the regexes after a fresh-repo bootstrap
|
|
36
|
-
* counted 23 labels as "skipped" when none were actually created.
|
|
10
|
+
* "Label already exists" across CLI stderr, the API 422 `already_exists`
|
|
11
|
+
* body, and the legacy mock shape. Anchored to the label lexicon so an
|
|
12
|
+
* unrelated "already exists" can't turn a real create failure into a skip.
|
|
37
13
|
*/
|
|
38
14
|
export function isLabelAlreadyExistsError(err) {
|
|
39
15
|
if (!err) return false;
|
|
40
16
|
const message = err?.message ?? '';
|
|
41
17
|
const stderr = err?.stderr ?? '';
|
|
42
|
-
// CLI shapes (vary by gh version):
|
|
43
|
-
// `! Label "<name>" already exists`
|
|
44
|
-
// `label with name "<name>" already exists; use ` + '`--force`' + ` ...`
|
|
45
|
-
// Require both the "label" lexicon and the "already exists" signal (with
|
|
46
|
-
// anything in between) so unrelated errors are not misclassified as skips.
|
|
47
18
|
if (/label\b[\s\S]*?already exists/i.test(stderr)) return true;
|
|
48
19
|
if (/label\b[\s\S]*?already exists/i.test(message)) return true;
|
|
49
|
-
// REST API shape: 422 + `already_exists` code in the error body.
|
|
50
20
|
if (/already_exists/i.test(stderr) || /already_exists/i.test(message)) {
|
|
51
21
|
return true;
|
|
52
22
|
}
|
|
53
|
-
// Test-mock legacy shape: `Error('... code 422 ...')` combined with the
|
|
54
|
-
// word "already exists" anywhere in the message.
|
|
55
23
|
if (
|
|
56
24
|
/\bcode\s+422\b/i.test(message) &&
|
|
57
25
|
/already exists/i.test(message + stderr)
|
|
@@ -62,15 +30,8 @@ export function isLabelAlreadyExistsError(err) {
|
|
|
62
30
|
}
|
|
63
31
|
|
|
64
32
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* carries `"message": "Not Found"`. Both are matched, and the numeric status
|
|
68
|
-
* is matched on its own so a transport that surfaces only `err.status` still
|
|
69
|
-
* classifies.
|
|
70
|
-
*
|
|
71
|
-
* Deliberately narrow: only a 404 counts. A 403 (scope) or a 422 must stay
|
|
72
|
-
* loud, because reading either as "already gone" would let a sweep report
|
|
73
|
-
* labels as reaped that are all still there.
|
|
33
|
+
* Only a 404 counts: reading a 403 or 422 as "already gone" would let a
|
|
34
|
+
* sweep report labels reaped that still exist.
|
|
74
35
|
*
|
|
75
36
|
* @param {unknown} err
|
|
76
37
|
* @returns {boolean}
|
|
@@ -83,33 +44,13 @@ export function isLabelNotFoundError(err) {
|
|
|
83
44
|
);
|
|
84
45
|
}
|
|
85
46
|
|
|
86
|
-
/**
|
|
87
|
-
* GitHub's cap on a label description. A longer one is refused with an HTTP
|
|
88
|
-
* 422 that `gh label create` reports as a bare exit 1 — a deterministic
|
|
89
|
-
* create failure, never a truncation. Lives here rather than in the
|
|
90
|
-
* provider-agnostic label vocabulary because it is an API constraint of this
|
|
91
|
-
* provider (Story #5201, where two over-long `plan-persist` descriptions made
|
|
92
|
-
* the `plan-run::<id>` cohort label uncreatable on every run).
|
|
93
|
-
*/
|
|
94
|
-
// Module-private on purpose: nothing in production reads the number outside
|
|
95
|
-
// the guard below, and the suite pins GitHub's published cap as a literal
|
|
96
|
-
// rather than against our own constant.
|
|
47
|
+
/** GitHub's description cap; longer is a 422 that `gh` reports as exit 1. */
|
|
97
48
|
const LABEL_DESCRIPTION_MAX_LENGTH = 100;
|
|
98
49
|
|
|
99
50
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* The API caps a description at {@link LABEL_DESCRIPTION_MAX_LENGTH}
|
|
104
|
-
* characters and answers a longer one with an HTTP 422 that `gh label create`
|
|
105
|
-
* surfaces as a bare exit 1 — legible only to a caller that digs the reason
|
|
106
|
-
* out of stderr. Failing at the call site instead names the label and its
|
|
107
|
-
* actual length, so the fix is obvious from the message alone.
|
|
108
|
-
*
|
|
109
|
-
* Deliberately a throw rather than a silent truncation: a truncated
|
|
110
|
-
* description is a label whose text nobody chose, and every `ensureLabels`
|
|
111
|
-
* caller already handles a throw — the bootstrap paths surface it, and
|
|
112
|
-
* `plan-persist` degrades to creating its Stories without the cosmetic label.
|
|
51
|
+
* Fail before spawning `gh`, naming the label and its length. A throw, not a
|
|
52
|
+
* truncation: every caller already handles a throw, and a truncated
|
|
53
|
+
* description is text nobody chose.
|
|
113
54
|
*
|
|
114
55
|
* @param {{ name?: string, description?: string }} def
|
|
115
56
|
* @throws {Error} when the description exceeds the cap.
|
|
@@ -134,22 +75,10 @@ export class LabelGateway {
|
|
|
134
75
|
}
|
|
135
76
|
|
|
136
77
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* <name> --color <hex> --description <text>`. The CLI prints
|
|
142
|
-
* "label already exists" (or the API surfaces a 422 "already_exists"
|
|
143
|
-
* error) when the name is taken; we swallow that and count it as
|
|
144
|
-
* `skipped`. Any other error propagates so transport faults stay loud.
|
|
145
|
-
*
|
|
146
|
-
* After the per-def loop, **reconcile against the live label set** by
|
|
147
|
-
* listing the labels actually present on the remote. Anything counted
|
|
148
|
-
* in `created` or `skipped` that isn't actually present is moved to a
|
|
149
|
-
* `missing[]` envelope — the bootstrap caller surfaces this loudly so a
|
|
150
|
-
* silent classification miss (Story #2018, Bug 2) can't pretend success.
|
|
151
|
-
* Verification failures (rate-limit, scope) are best-effort: they leave
|
|
152
|
-
* `missing` empty rather than aborting the bootstrap.
|
|
78
|
+
* Create each label, counting "already exists" as `skipped`; other errors
|
|
79
|
+
* propagate. Then reconcile against the live set: anything believed
|
|
80
|
+
* created/skipped but absent moves to `missing[]`, so a misclassification
|
|
81
|
+
* can't pass as success. A failed verification leaves `missing` empty.
|
|
153
82
|
*
|
|
154
83
|
* Returns `{ created: string[], skipped: string[], missing: string[] }`.
|
|
155
84
|
*/
|
|
@@ -182,10 +111,6 @@ export class LabelGateway {
|
|
|
182
111
|
if (missing.length === 0) {
|
|
183
112
|
return { created, skipped, missing };
|
|
184
113
|
}
|
|
185
|
-
// Anything we believed we created/skipped that isn't actually on the
|
|
186
|
-
// remote is by definition a silent failure — drop it from those lists
|
|
187
|
-
// so the consumer's `created.length + skipped.length` math stays
|
|
188
|
-
// honest. The full label name survives in `missing[]`.
|
|
189
114
|
const missingSet = new Set(missing);
|
|
190
115
|
return {
|
|
191
116
|
created: created.filter((n) => !missingSet.has(n)),
|
|
@@ -195,13 +120,9 @@ export class LabelGateway {
|
|
|
195
120
|
}
|
|
196
121
|
|
|
197
122
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
* Accepts either the real `gh-exec` --json shape (returns an `Array`
|
|
203
|
-
* directly) or the legacy/test shape (`{stdout: '<json>', ...}`) so
|
|
204
|
-
* the verification path stays harness-agnostic.
|
|
123
|
+
* Names from `labelDefs` absent from the live set. Best-effort: an
|
|
124
|
+
* unreadable or empty listing means "verification unavailable", not
|
|
125
|
+
* "everything missing".
|
|
205
126
|
*/
|
|
206
127
|
async _reconcileLabelsPresence(labelDefs) {
|
|
207
128
|
let result;
|
|
@@ -212,9 +133,6 @@ export class LabelGateway {
|
|
|
212
133
|
}
|
|
213
134
|
const liveLabels = this._normalizeLabelListResult(result);
|
|
214
135
|
if (!Array.isArray(liveLabels) || liveLabels.length === 0) {
|
|
215
|
-
// Listing returned nothing parseable. Treat as "verification
|
|
216
|
-
// unavailable" rather than "every label is missing" — false
|
|
217
|
-
// positives on this path would derail an otherwise-clean bootstrap.
|
|
218
136
|
return [];
|
|
219
137
|
}
|
|
220
138
|
const liveNames = new Set();
|
|
@@ -230,19 +148,9 @@ export class LabelGateway {
|
|
|
230
148
|
}
|
|
231
149
|
|
|
232
150
|
/**
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* `gh label list --limit 500`. That hard cap is fine for its own job —
|
|
237
|
-
* "are these 20 bootstrap labels present?" — and fatal for this one: a
|
|
238
|
-
* caller deciding which labels to delete from a truncated view would skip
|
|
239
|
-
* exactly the labels that sort after an accumulated pile, which is the
|
|
240
|
-
* failure Story #5189 exists to stop reproducing. `paginateRest` walks
|
|
241
|
-
* pages until a short one lands and throws (loudly) rather than truncating
|
|
242
|
-
* if the repository somehow exceeds its ceiling.
|
|
243
|
-
*
|
|
244
|
-
* Rows are projected to the fields a caller can rely on; a row without a
|
|
245
|
-
* usable `name` is dropped rather than passed on as a deletable target.
|
|
151
|
+
* The full label vocabulary, paginated — never the capped `--limit 500`
|
|
152
|
+
* list, since a caller choosing deletions from a truncated view would skip
|
|
153
|
+
* labels past the cap. Rows without a usable `name` are dropped.
|
|
246
154
|
*
|
|
247
155
|
* @returns {Promise<Array<{ name: string, color: string|null, description: string|null }>>}
|
|
248
156
|
* @field-manifest /repos/{owner}/{repo}/labels: name, color, description
|
|
@@ -262,17 +170,8 @@ export class LabelGateway {
|
|
|
262
170
|
}
|
|
263
171
|
|
|
264
172
|
/**
|
|
265
|
-
* Delete
|
|
266
|
-
*
|
|
267
|
-
* Goes through the REST surface (`DELETE /repos/{owner}/{repo}/labels/{name}`)
|
|
268
|
-
* rather than `gh label delete`, so the "already gone" signal arrives as a
|
|
269
|
-
* structured 404 on the same facade every other read here uses instead of
|
|
270
|
-
* as CLI prose — and so this gateway needs no new verb on the `gh` facade.
|
|
271
|
-
*
|
|
272
|
-
* A missing label resolves as a successful no-op. That is not leniency: the
|
|
273
|
-
* sweep this port exists for is expected to run repeatedly and concurrently
|
|
274
|
-
* with the close-path reap, so "someone else already deleted it" is the
|
|
275
|
-
* normal case, not an error.
|
|
173
|
+
* Delete via REST so "already gone" is a structured 404. A missing label is
|
|
174
|
+
* a normal no-op: sweeps run repeatedly and concurrently with the close reap.
|
|
276
175
|
*
|
|
277
176
|
* @param {string} name
|
|
278
177
|
* @returns {Promise<{ deleted: boolean, reason: string|null }>}
|
|
@@ -294,6 +193,7 @@ export class LabelGateway {
|
|
|
294
193
|
}
|
|
295
194
|
}
|
|
296
195
|
|
|
196
|
+
/** Accepts the `gh-exec` array shape or a `{ stdout }` JSON wrapper. */
|
|
297
197
|
_normalizeLabelListResult(result) {
|
|
298
198
|
if (Array.isArray(result)) return result;
|
|
299
199
|
if (result && typeof result.stdout === 'string') {
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub Provider — pure REST/GraphQL
|
|
3
|
-
*
|
|
4
|
-
* Pure functions that translate raw GitHub API payloads (REST `Issue`,
|
|
5
|
-
* GraphQL sub-issue node) into the normalized ticket shape consumed
|
|
6
|
-
* throughout the dispatcher / reconciler layer. No I/O, no state, no
|
|
7
|
-
* `execSync` —
|
|
8
|
-
* verified by the sibling test which exercises the mappers without `gh`
|
|
9
|
-
* installed.
|
|
10
|
-
*
|
|
11
|
-
* Extracted from `../github.js` in Story #1846 / Task #1859.
|
|
2
|
+
* GitHub Provider — pure mappers from REST issues / GraphQL sub-issue nodes
|
|
3
|
+
* to the normalized ticket shape.
|
|
12
4
|
*/
|
|
13
5
|
|
|
14
6
|
function normalizeLabels(issue) {
|
|
@@ -35,10 +27,7 @@ export function issueToTicket(issue) {
|
|
|
35
27
|
labelSet: new Set(labels),
|
|
36
28
|
assignees: (issue.assignees ?? []).map((a) => a.login),
|
|
37
29
|
state: issue.state,
|
|
38
|
-
//
|
|
39
|
-
// tell a Story that landed from one closed as superseded — both read
|
|
40
|
-
// `closed` — so the close path needs this to avoid reporting a
|
|
41
|
-
// never-merged Story as landed.
|
|
30
|
+
// Distinguishes a landed Story from a superseded one; both are `closed`.
|
|
42
31
|
stateReason: issue.state_reason ?? null,
|
|
43
32
|
};
|
|
44
33
|
}
|
|
@@ -57,13 +46,7 @@ export function issueToEpic(issue) {
|
|
|
57
46
|
}
|
|
58
47
|
|
|
59
48
|
export function subIssueNodeToTicket(node) {
|
|
60
|
-
//
|
|
61
|
-
// for absent sub-issue nodes instead of dereferencing properties on
|
|
62
|
-
// `null`/`undefined`. In 2-tier mode a Story can legitimately have zero
|
|
63
|
-
// Task children, which surfaces as an empty / missing sub-issue node
|
|
64
|
-
// when callers iterate the GraphQL response and pass each entry through
|
|
65
|
-
// this mapper. The legacy 4-tier path also benefits — a transient
|
|
66
|
-
// empty node returned mid-pagination no longer throws.
|
|
49
|
+
// Absent nodes are legitimate (childless Story, empty page entry).
|
|
67
50
|
if (node == null) return null;
|
|
68
51
|
const labels = normalizeLabels(node);
|
|
69
52
|
return {
|
|
@@ -81,12 +64,7 @@ export function subIssueNodeToTicket(node) {
|
|
|
81
64
|
}
|
|
82
65
|
|
|
83
66
|
/**
|
|
84
|
-
*
|
|
85
|
-
* any null/undefined entries. Story #3097 (Wave-0 additive, Epic #3078
|
|
86
|
-
* Strategy B) — gives callers a single Storyless-tolerant entry point so
|
|
87
|
-
* the existing per-node mappers can stay strict for the 4-tier path while
|
|
88
|
-
* the 2-tier path (Storyless: a Story with zero child Tasks) gets a
|
|
89
|
-
* well-defined empty-array result.
|
|
67
|
+
* Skips null entries; a non-array yields `[]`.
|
|
90
68
|
*
|
|
91
69
|
* @param {Array<object|null|undefined>|null|undefined} nodes
|
|
92
70
|
* @returns {object[]}
|
|
@@ -1,24 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub Provider — MergeMethodsGateway.
|
|
3
|
-
*
|
|
4
|
-
* Owns `getMergeMethods` / `setMergeMethods` against `/repos/{owner}/{repo}`.
|
|
5
|
-
* The narrow field list (`MERGE_METHOD_FIELDS`) keeps `getMergeMethods` and
|
|
6
|
-
* `setMergeMethods` aligned on which keys they mirror — operators may have
|
|
7
|
-
* tuned other repo flags and we deliberately do not surface them through
|
|
8
|
-
* this interface.
|
|
9
|
-
*
|
|
10
|
-
* Extracted from `../github.js` in Story #2462 / Task #2479. Public
|
|
11
|
-
* surface on `GitHubProvider` is unchanged — both merge-method methods
|
|
12
|
-
* delegate here.
|
|
13
|
-
*
|
|
14
|
-
* @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
|
|
2
|
+
* GitHub Provider — MergeMethodsGateway. Reads and writes only
|
|
3
|
+
* `MERGE_METHOD_FIELDS`, leaving other operator-tuned repo flags alone.
|
|
15
4
|
*/
|
|
16
5
|
|
|
17
6
|
import { parseApiJson } from './request-helpers.js';
|
|
18
7
|
|
|
19
|
-
/**
|
|
20
|
-
* Fields the merge-method bootstrap reads/writes.
|
|
21
|
-
*/
|
|
22
8
|
export const MERGE_METHOD_FIELDS = [
|
|
23
9
|
'allow_squash_merge',
|
|
24
10
|
'allow_rebase_merge',
|
|
@@ -38,10 +24,6 @@ export class MergeMethodsGateway {
|
|
|
38
24
|
}
|
|
39
25
|
|
|
40
26
|
/**
|
|
41
|
-
* Read the repo's current merge-method-related settings. Returns only
|
|
42
|
-
* the fields the bootstrap cares about so the diff layer can compare
|
|
43
|
-
* apples to apples regardless of what other knobs the repo exposes.
|
|
44
|
-
*
|
|
45
27
|
* @field-manifest GET /repos/{owner}/{repo}: allow_squash_merge,
|
|
46
28
|
* allow_rebase_merge, allow_merge_commit,
|
|
47
29
|
* allow_auto_merge, delete_branch_on_merge
|
|
@@ -60,8 +42,7 @@ export class MergeMethodsGateway {
|
|
|
60
42
|
}
|
|
61
43
|
|
|
62
44
|
/**
|
|
63
|
-
* PATCH
|
|
64
|
-
* only the supplied fields are sent / touched.
|
|
45
|
+
* Sparse PATCH: only supplied fields are sent.
|
|
65
46
|
*
|
|
66
47
|
* @field-manifest PATCH /repos/{owner}/{repo}: allow_squash_merge,
|
|
67
48
|
* allow_rebase_merge, allow_merge_commit,
|
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub Provider — ProjectBoardGateway
|
|
3
|
-
*
|
|
4
|
-
* Owns the Projects V2 bootstrap surface: `resolveOrCreateProject`,
|
|
5
|
-
* `ensureStatusField`, `ensureProjectFields`. The low-level GraphQL
|
|
6
|
-
* mutations live in `./projects-v2-graphql.js`; this class threads the
|
|
7
|
-
* parent provider's `_ctx` (which carries `projectNumber`, `projectOwner`,
|
|
8
|
-
* `state`, and the shared cache) into each call so the legacy shim contract
|
|
9
|
-
* is preserved.
|
|
10
|
-
*
|
|
11
|
-
* Extracted from `../github.js` in Story #2462 / Task #2479. Public
|
|
12
|
-
* surface on `GitHubProvider` is unchanged — every project-board method
|
|
13
|
-
* delegates here.
|
|
14
|
-
*
|
|
15
|
-
* @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
|
|
2
|
+
* GitHub Provider — ProjectBoardGateway: threads the provider's shared
|
|
3
|
+
* `_ctx` into the Projects V2 shim.
|
|
16
4
|
*/
|
|
17
5
|
|
|
18
6
|
import * as projects from './projects-v2-graphql.js';
|
|
@@ -20,9 +8,6 @@ import * as projects from './projects-v2-graphql.js';
|
|
|
20
8
|
export class ProjectBoardGateway {
|
|
21
9
|
/**
|
|
22
10
|
* @param {{ ctx: object }} deps
|
|
23
|
-
* `ctx` is the shared `_ctx` object the parent provider builds —
|
|
24
|
-
* carries `projectOwner`, `projectName`, `projectNumber`,
|
|
25
|
-
* `operatorHandle`, `cache`, `state`, and `hooks`.
|
|
26
11
|
*/
|
|
27
12
|
constructor({ ctx } = {}) {
|
|
28
13
|
this._ctx = ctx;
|