mandrel 2.60.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,34 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/ticketing/transition.js — Single-ticket state mutators
|
|
2
|
+
* lib/orchestration/ticketing/transition.js — Single-ticket state mutators:
|
|
3
|
+
* state-label transitions, tasklist checkbox toggling, structured comments.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `state.js ↔ bulk.js` import cycle: `bulk.js`'s cascade walk needs these
|
|
8
|
-
* single-ticket primitives, and `transitionTicketState` needs the upward
|
|
9
|
-
* cascade. Pulling the primitives down into this leaf lets both
|
|
10
|
-
* `state.js` and `bulk.js` depend **downward** on `transition.js`, so the
|
|
11
|
-
* dependency graph is a DAG.
|
|
12
|
-
*
|
|
13
|
-
* Cascade wiring: `transitionTicketState` fires the upward parent cascade
|
|
14
|
-
* (which lives in `bulk.js`) on every transition unless `cascade: false`.
|
|
15
|
-
* To keep this module a leaf, the cascade implementation is **injected**
|
|
16
|
-
* via {@link registerCascadeRunner} rather than imported. `bulk.js`
|
|
17
|
-
* registers the real runner at module-evaluation time; until it does,
|
|
18
|
-
* the cascade step is a safe no-op. Every production path that fires a
|
|
19
|
-
* transition reaches `bulk.js` (directly, through the `./ticketing.js`
|
|
20
|
-
* facade, or through `./state.js`, all of which load `bulk.js`), so the
|
|
21
|
-
* runner is always registered before a cascade-bearing transition runs.
|
|
22
|
-
*
|
|
23
|
-
* Story #3661 — `_columnSyncRegistry` is a module-level WeakMap that
|
|
24
|
-
* retains one `ColumnSync` instance per provider for the lifetime of the
|
|
25
|
-
* process. `ColumnSync` already caches the project metadata (projectId,
|
|
26
|
-
* fieldId, option ids) inside the instance after the first GraphQL fetch
|
|
27
|
-
* (`this._meta`), but that cache was discarded on every label transition
|
|
28
|
-
* because `syncProjectStatusColumn` constructed a fresh instance each
|
|
29
|
-
* call. The registry lets the instance — and therefore its `_meta`
|
|
30
|
-
* cache — survive across transitions, so the invariant metadata is
|
|
31
|
-
* resolved exactly once per run rather than once per label flip.
|
|
5
|
+
* A leaf module: the upward cascade lives in `bulk.js` and `state.js` injects
|
|
6
|
+
* it via {@link registerCascadeRunner}, so both depend downward on this file
|
|
7
|
+
* without a cycle.
|
|
32
8
|
*/
|
|
33
9
|
|
|
34
10
|
import { extractEpicIdFromBody } from '../../dependency-parser.js';
|
|
@@ -51,22 +27,15 @@ import {
|
|
|
51
27
|
} from './reads.js';
|
|
52
28
|
|
|
53
29
|
/**
|
|
54
|
-
* Injected upward-cascade runner
|
|
55
|
-
*
|
|
56
|
-
* module load via {@link registerCascadeRunner}; until then this no-op
|
|
57
|
-
* default keeps `transitionTicketState` safe to call in isolation (e.g.
|
|
58
|
-
* a unit test that imports only this module).
|
|
30
|
+
* Injected upward-cascade runner; a no-op until `state.js` registers the real
|
|
31
|
+
* one at module load, so this module is safe to use in isolation.
|
|
59
32
|
*
|
|
60
33
|
* @type {(provider: object, ticketId: number, opts: object) => Promise<void>}
|
|
61
34
|
*/
|
|
62
35
|
let _runUpwardCascade = async () => {};
|
|
63
36
|
|
|
64
37
|
/**
|
|
65
|
-
*
|
|
66
|
-
* module-evaluation time to wire its `cascadeParentState` /
|
|
67
|
-
* `logCascadePartialFailures` pair into `transitionTicketState` without
|
|
68
|
-
* `transition.js` importing `bulk.js` (which would re-introduce the
|
|
69
|
-
* Story #3995 cycle).
|
|
38
|
+
* Called once by `state.js` at module-evaluation time.
|
|
70
39
|
*
|
|
71
40
|
* @param {(provider: object, ticketId: number, opts: object) => Promise<void>} runner
|
|
72
41
|
*/
|
|
@@ -77,24 +46,12 @@ export function registerCascadeRunner(runner) {
|
|
|
77
46
|
}
|
|
78
47
|
|
|
79
48
|
/**
|
|
80
|
-
* One `ColumnSync`
|
|
81
|
-
*
|
|
82
|
-
* option ids) is fetched exactly once per run regardless of how many
|
|
83
|
-
* label transitions fire. The `ColumnSync` instance already caches
|
|
84
|
-
* the metadata internally (`_meta`), but that cache was thrown away on
|
|
85
|
-
* every call to `syncProjectStatusColumn` because the function
|
|
86
|
-
* constructed a fresh instance each time. Story #3661.
|
|
87
|
-
*
|
|
88
|
-
* `WeakMap` keys are GC-friendly: when a provider is collected the
|
|
89
|
-
* entry is automatically removed without a manual eviction step.
|
|
49
|
+
* One `ColumnSync` per provider for the process lifetime, so its cached
|
|
50
|
+
* project metadata is fetched once per run rather than once per label flip.
|
|
90
51
|
*/
|
|
91
52
|
const _columnSyncRegistry = new WeakMap();
|
|
92
53
|
|
|
93
54
|
/**
|
|
94
|
-
* Drop the cached `ColumnSync` for a given provider. Exposed as a
|
|
95
|
-
* named export so unit tests that swap providers between assertions can
|
|
96
|
-
* reset the registry without reloading the module.
|
|
97
|
-
*
|
|
98
55
|
* @param {object} provider
|
|
99
56
|
*/
|
|
100
57
|
export function _resetColumnSyncCache(provider) {
|
|
@@ -102,16 +59,6 @@ export function _resetColumnSyncCache(provider) {
|
|
|
102
59
|
}
|
|
103
60
|
|
|
104
61
|
/**
|
|
105
|
-
* Guard the inputs to {@link transitionTicketState}. Extracted from the
|
|
106
|
-
* outer function so that the per-method cyclomatic complexity of
|
|
107
|
-
* `transitionTicketState` lands below the CRAP-12 ceiling required by
|
|
108
|
-
* Story #1848 (was CRAP 16 prior to the split — see baselines/crap.json).
|
|
109
|
-
*
|
|
110
|
-
* Currently a single label-membership predicate, but extracting it as a
|
|
111
|
-
* named function lets future input guards (e.g. provider-shape checks,
|
|
112
|
-
* concurrency-token validation) accrete here without re-inflating the
|
|
113
|
-
* caller's complexity.
|
|
114
|
-
*
|
|
115
62
|
* @param {string} newState - Target `agent::*` label.
|
|
116
63
|
* @returns {string} The validated newState, returned for fluent reuse.
|
|
117
64
|
* @throws {Error} when `newState` is not a recognised state label.
|
|
@@ -124,25 +71,16 @@ function validateTransitionInputs(newState) {
|
|
|
124
71
|
}
|
|
125
72
|
|
|
126
73
|
/**
|
|
127
|
-
* Active states a
|
|
128
|
-
*
|
|
129
|
-
* other target (`done`, `closing`) is a real terminal outcome, not a
|
|
130
|
-
* recovery.
|
|
74
|
+
* Active states a blocked Story can recover into; `done`/`closing` are real
|
|
75
|
+
* terminal outcomes, not recoveries.
|
|
131
76
|
*/
|
|
132
77
|
const BLOCK_RECOVERY_TARGETS = [STATE_LABELS.EXECUTING, STATE_LABELS.READY];
|
|
133
78
|
|
|
134
79
|
/**
|
|
135
|
-
* Resolve the pre-transition
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* The snapshot is loaded when a caller threads `notify` (its `fromState`
|
|
141
|
-
* feeds the notification payload) OR when `needFromState` is set — Story
|
|
142
|
-
* #4622's recovery detection needs the *prior* state, and `getTicket` after
|
|
143
|
-
* `updateTicket` would already read the new label. Bounding the extra read
|
|
144
|
-
* to recovery-target transitions keeps every other flip on the snapshot-free
|
|
145
|
-
* fast path.
|
|
80
|
+
* Resolve the pre-transition snapshot, honoring `opts.ticketSnapshot`. Loaded
|
|
81
|
+
* only when `notify` needs `fromState` or `needFromState` is set (recovery
|
|
82
|
+
* detection must read the prior label before `updateTicket` overwrites it).
|
|
83
|
+
* Returns `null` on transient failure.
|
|
146
84
|
*
|
|
147
85
|
* @param {object} provider
|
|
148
86
|
* @param {{ notify?: Function, ticketSnapshot?: object|null }} opts
|
|
@@ -169,31 +107,9 @@ async function loadTicketSnapshot(provider, opts, ticketId, needFromState) {
|
|
|
169
107
|
}
|
|
170
108
|
|
|
171
109
|
/**
|
|
172
|
-
* Mirror the
|
|
173
|
-
*
|
|
174
|
-
* `
|
|
175
|
-
* `story-phase.js`, the LabelTransitioner lifecycle listener, the
|
|
176
|
-
* update-ticket-state CLI, batch transitions) update the board automatically.
|
|
177
|
-
* Prior to #2548 the sync was only wired from the deleted epic-runner against
|
|
178
|
-
* the Epic ticket, so Stories and Tasks never had their `agent::executing` /
|
|
179
|
-
* `agent::blocked` flips reflected on the board.
|
|
180
|
-
*
|
|
181
|
-
* Best-effort: a project-board misconfig, missing scope, or transient
|
|
182
|
-
* GraphQL failure MUST NOT block the label transition itself. Errors
|
|
183
|
-
* surface via `Logger.warn` and the function resolves cleanly.
|
|
184
|
-
*
|
|
185
|
-
* The `_makeColumnSync` default param is a DIP seam: production callers
|
|
186
|
-
* accept the default (which constructs a real `ColumnSync`); tests inject
|
|
187
|
-
* a factory stub that avoids the GraphQL dependency without mocking the
|
|
188
|
-
* module. Story #3645.
|
|
189
|
-
*
|
|
190
|
-
* Story #3661 — when the caller uses the default factory (i.e. did not
|
|
191
|
-
* inject a stub), the function looks up or creates a `ColumnSync`
|
|
192
|
-
* instance in `_columnSyncRegistry` keyed by `provider`. This keeps the
|
|
193
|
-
* instance — and therefore its `_meta` cache — alive across transitions
|
|
194
|
-
* so the invariant project metadata is fetched exactly once per run.
|
|
195
|
-
* Test-injected factories bypass the registry entirely; their synthetic
|
|
196
|
-
* stubs are never stored in `_columnSyncRegistry`.
|
|
110
|
+
* Mirror the new state onto the Projects v2 Status column. Best-effort: a
|
|
111
|
+
* board failure is logged and never blocks the label transition. An injected
|
|
112
|
+
* `_makeColumnSync` bypasses the registry so test stubs are never cached.
|
|
197
113
|
*
|
|
198
114
|
* @param {object} provider
|
|
199
115
|
* @param {number} ticketId
|
|
@@ -210,19 +126,10 @@ async function syncProjectStatusColumn(
|
|
|
210
126
|
try {
|
|
211
127
|
let sync;
|
|
212
128
|
if (_makeColumnSync) {
|
|
213
|
-
// Test-injected factory: bypass the registry so stubs are never
|
|
214
|
-
// accidentally cached and reused in subsequent calls.
|
|
215
129
|
sync = _makeColumnSync({ provider, logger: Logger });
|
|
216
130
|
} else {
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
// so the invariant project metadata (projectId, fieldId, options)
|
|
220
|
-
// is only fetched once per process run. Story #3661.
|
|
221
|
-
//
|
|
222
|
-
// Story #4252 — `config` is threaded so the on-disk board-metadata
|
|
223
|
-
// cache lands under the project's configured tempRoot. It is read at
|
|
224
|
-
// construction only; the registry caches the first instance per
|
|
225
|
-
// provider, so a later transition's config is intentionally ignored.
|
|
131
|
+
// `config` is read at construction only; the first instance per
|
|
132
|
+
// provider wins, so a later transition's config is ignored.
|
|
226
133
|
if (!_columnSyncRegistry.has(provider)) {
|
|
227
134
|
_columnSyncRegistry.set(
|
|
228
135
|
provider,
|
|
@@ -240,11 +147,8 @@ async function syncProjectStatusColumn(
|
|
|
240
147
|
}
|
|
241
148
|
|
|
242
149
|
/**
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
* stays below the CRAP-12 ceiling: this is where the severity gating,
|
|
246
|
-
* the ticket-type derivation, the level mapping, and the fire-and-forget
|
|
247
|
-
* dispatch all live.
|
|
150
|
+
* Fire-and-forget state-transition notification, posted to the Epic when one
|
|
151
|
+
* is referenced (else the ticket itself); failures are logged, not thrown.
|
|
248
152
|
*
|
|
249
153
|
* @param {{
|
|
250
154
|
* notify: Function,
|
|
@@ -271,20 +175,10 @@ function dispatchTransitionNotification(args) {
|
|
|
271
175
|
toState: newState,
|
|
272
176
|
};
|
|
273
177
|
const severity = eventSeverity(event);
|
|
274
|
-
//
|
|
275
|
-
//
|
|
276
|
-
// comment channel filtered these out via `commentMinLevel: medium`;
|
|
277
|
-
// post-migration the channel is event-allowlist gated and would
|
|
278
|
-
// surface every transition equally, so the noise filter moves to
|
|
279
|
-
// the emit point.
|
|
178
|
+
// The channel is event-allowlist gated, so the low-severity noise filter
|
|
179
|
+
// lives at the emit point.
|
|
280
180
|
if (severity === 'low') return;
|
|
281
181
|
const message = renderTransitionMessage(event);
|
|
282
|
-
// Post to the epic so operators get a single timeline feed; fall back
|
|
283
|
-
// to the transitioned ticket itself when no epic reference is present.
|
|
284
|
-
// The dispatch is fire-and-forget by design (a failed notification must
|
|
285
|
-
// not block the state transition itself), but surfacing the failure via
|
|
286
|
-
// the logger preserves operator visibility — the previous empty-handler
|
|
287
|
-
// .catch swallowed network blips and webhook 5xxs without any signal.
|
|
288
182
|
const targetId = epicId ?? ticketId;
|
|
289
183
|
const level =
|
|
290
184
|
ticketType === 'epic' || ticketType === 'wave' || ticketType === 'story'
|
|
@@ -306,32 +200,13 @@ function dispatchTransitionNotification(args) {
|
|
|
306
200
|
}
|
|
307
201
|
|
|
308
202
|
/**
|
|
309
|
-
* Emit a
|
|
310
|
-
*
|
|
203
|
+
* Emit a `story-blocked` friction signal on entering `agent::blocked` (the
|
|
204
|
+
* single HITL pause point, so this one hook catches every block), or a
|
|
205
|
+
* recovery marker on `blocked → active` so the retro can net out transient
|
|
206
|
+
* blocks. The terminal-envelope hook skips `blocked` to avoid double counting.
|
|
311
207
|
*
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
* one hook catches every block regardless of which path drove it (the
|
|
315
|
-
* `merge.unlanded` and `merge.flip-failed` paths in
|
|
316
|
-
* `single-story-close/phases/confirm-merge.js`, the review-block path, an
|
|
317
|
-
* operator's `update-ticket-state.js`, a Story worker giving up). Before
|
|
318
|
-
* this, a block was only ever a *label* — it left no trace in the friction
|
|
319
|
-
* stream the retro reads, so a run could park a worker and still produce a
|
|
320
|
-
* zero-signal roll-up.
|
|
321
|
-
*
|
|
322
|
-
* This is also why the terminal-envelope hook deliberately skips `blocked`
|
|
323
|
-
* (see `frictionForTerminal`): the two would otherwise count one incident
|
|
324
|
-
* twice.
|
|
325
|
-
*
|
|
326
|
-
* Story #4622 extends the hook to the inverse edge: a `blocked → active`
|
|
327
|
-
* transition emits a recovery marker so a transient block that self-resolved
|
|
328
|
-
* can be netted out of the retro's `story-blocked` recurrence total.
|
|
329
|
-
*
|
|
330
|
-
* Best-effort and awaited: the friction emitters swallow their own failures
|
|
331
|
-
* and resolve `false`, so this can neither throw nor block the transition.
|
|
332
|
-
* It is awaited rather than fire-and-forget because CLI entry points exit
|
|
333
|
-
* via `process.exit` as soon as `main` resolves (`cli-utils.runAsCli` with
|
|
334
|
-
* `propagateExitCode`), which would discard a still-pending append.
|
|
208
|
+
* Awaited, not fire-and-forget: CLI entry points `process.exit` as soon as
|
|
209
|
+
* `main` resolves, which would drop a pending append. The emitters never throw.
|
|
335
210
|
*
|
|
336
211
|
* @param {number} ticketId
|
|
337
212
|
* @param {string|null} fromState Prior state label, or null.
|
|
@@ -350,12 +225,6 @@ async function emitBlockedFriction(ticketId, fromState, newState, opts) {
|
|
|
350
225
|
});
|
|
351
226
|
return;
|
|
352
227
|
}
|
|
353
|
-
// Story #4622 — a transition *out* of `agent::blocked` into an active state
|
|
354
|
-
// is a recovery: the earlier block self-resolved. Emit its recovery marker
|
|
355
|
-
// so the retro composer can net the transient block out of the
|
|
356
|
-
// `story-blocked` recurrence total (swarm-os friction #581). Only a genuine
|
|
357
|
-
// block→active recovery qualifies; blocked→done/closing is a real
|
|
358
|
-
// terminal outcome, not a recovery, so it is left counted.
|
|
359
228
|
if (
|
|
360
229
|
fromState === STATE_LABELS.BLOCKED &&
|
|
361
230
|
BLOCK_RECOVERY_TARGETS.includes(newState)
|
|
@@ -370,44 +239,17 @@ async function emitBlockedFriction(ticketId, fromState, newState, opts) {
|
|
|
370
239
|
}
|
|
371
240
|
|
|
372
241
|
/**
|
|
373
|
-
*
|
|
374
|
-
*
|
|
242
|
+
* Set a ticket's `agent::*` state label, removing the others; `done` also
|
|
243
|
+
* closes the issue.
|
|
375
244
|
*
|
|
376
245
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
377
246
|
* @param {number} ticketId
|
|
378
247
|
* @param {string} newState - Must be one of STATE_LABELS.
|
|
379
248
|
* @param {{ notify?: Function, cascade?: boolean, ticketSnapshot?: object, _makeColumnSync?: Function }} [opts]
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
*
|
|
383
|
-
*
|
|
384
|
-
* transitions are `low` and filtered out at the default `medium` channel
|
|
385
|
-
* thresholds. The dispatched payload carries the typed envelope fields
|
|
386
|
-
* (`event: 'state-transition'`, `level: 'task'|'story'|'wave'|'epic'`,
|
|
387
|
-
* `epicId`) for routable webhook subscribers.
|
|
388
|
-
*
|
|
389
|
-
* `cascade` (default `true`) controls whether a `done` transition fans the
|
|
390
|
-
* `cascadeCompletion` upward to parents. Per-Task closes invoked mid-Story
|
|
391
|
-
* from the retired per-Task progress writer (4-tier era, removed under
|
|
392
|
-
* #3157) passed `cascade: false` so the Story/Epic only flipped to
|
|
393
|
-
* `agent::done` at story-close (after the merge lands), not when the
|
|
394
|
-
* last Task commit landed on the still-unmerged Story branch. The
|
|
395
|
-
* parameter is preserved for callers that still suppress cascade
|
|
396
|
-
* explicitly (`single-story-init.js`, and `bulk.js` where the upward
|
|
397
|
-
* recursion is driven by hand instead).
|
|
398
|
-
*
|
|
399
|
-
* `ticketSnapshot` (Story #1795 / Epic #1788) is an optional pre-fetched
|
|
400
|
-
* ticket object. When the caller already holds the ticket — e.g. it
|
|
401
|
-
* hydrated the ticket to inspect its labels first — passing the
|
|
402
|
-
* snapshot eliminates the two `getTicket` round-trips that
|
|
403
|
-
* `transitionTicketState` would otherwise issue — one for the notify
|
|
404
|
-
* `fromState` lookup and one inside `provider.updateTicket`'s label
|
|
405
|
-
* merge path. Backwards compatible: when omitted, behaviour is unchanged.
|
|
406
|
-
*
|
|
407
|
-
* `_makeColumnSync` (Story #3645 DIP seam) — factory for the board-sync
|
|
408
|
-
* object. Production callers omit it (the default constructs a real
|
|
409
|
-
* `ColumnSync`); tests inject a stub to avoid GraphQL calls without
|
|
410
|
-
* module-level mocking.
|
|
249
|
+
* `notify` fires a state-transition notification after success.
|
|
250
|
+
* `cascade: false` suppresses the upward parent cascade.
|
|
251
|
+
* `ticketSnapshot` is a pre-fetched ticket that saves the `fromState` read
|
|
252
|
+
* and the provider's label-merge read. `_makeColumnSync` is a test seam.
|
|
411
253
|
*/
|
|
412
254
|
export async function transitionTicketState(
|
|
413
255
|
provider,
|
|
@@ -419,16 +261,6 @@ export async function transitionTicketState(
|
|
|
419
261
|
|
|
420
262
|
const toRemove = ALL_STATES.filter((state) => state !== newState);
|
|
421
263
|
|
|
422
|
-
// Snapshot prior state for the notification payload (best-effort; skip on
|
|
423
|
-
// error). A transient read failure MUST NOT block a label transition —
|
|
424
|
-
// the transition itself is idempotent and `fromState: null` is a valid
|
|
425
|
-
// payload value.
|
|
426
|
-
//
|
|
427
|
-
// Story #1795 — when the caller threads `opts.ticketSnapshot` we reuse
|
|
428
|
-
// it as the notify snapshot without issuing a fresh `getTicket`. The
|
|
429
|
-
// snapshot is also forwarded to `provider.updateTicket` so the label
|
|
430
|
-
// merge path skips its own `getTicket` call (the second of the two
|
|
431
|
-
// round-trips this seam eliminates).
|
|
432
264
|
const ticketSnapshot = await loadTicketSnapshot(
|
|
433
265
|
provider,
|
|
434
266
|
opts,
|
|
@@ -438,8 +270,6 @@ export async function transitionTicketState(
|
|
|
438
270
|
const fromState =
|
|
439
271
|
ticketSnapshot?.labels?.find((l) => ALL_STATES.includes(l)) ?? null;
|
|
440
272
|
|
|
441
|
-
// Closing/reopening mirrors the label state so GitHub shows the correct
|
|
442
|
-
// issue state without requiring a separate manual close step.
|
|
443
273
|
const isDone = newState === STATE_LABELS.DONE;
|
|
444
274
|
|
|
445
275
|
await provider.updateTicket(ticketId, {
|
|
@@ -449,22 +279,12 @@ export async function transitionTicketState(
|
|
|
449
279
|
},
|
|
450
280
|
state: isDone ? 'closed' : 'open',
|
|
451
281
|
state_reason: isDone ? 'completed' : null,
|
|
452
|
-
//
|
|
453
|
-
// to `_applyLabelMutations`. Honored by `providers/github.js`; ignored
|
|
454
|
-
// by providers that don't recognise it. Underscore-prefixed to mark
|
|
455
|
-
// it as a provider-internal contract rather than part of the public
|
|
456
|
-
// `mutations` shape.
|
|
282
|
+
// Provider-internal: lets the label merge skip its own getTicket.
|
|
457
283
|
_ticketSnapshot: ticketSnapshot,
|
|
458
284
|
});
|
|
459
285
|
|
|
460
|
-
// Story #4578 — derive a friction signal from the block, at the point the
|
|
461
|
-
// runtime already knows. Story #4622 also emits the recovery marker on the
|
|
462
|
-
// inverse block→active transition. Best-effort; never blocks the transition.
|
|
463
286
|
await emitBlockedFriction(ticketId, fromState, newState, opts);
|
|
464
287
|
|
|
465
|
-
// Story #2548 — mirror the new state onto the Projects v2 Status
|
|
466
|
-
// column. Best-effort; never blocks the transition.
|
|
467
|
-
// Story #3645 — thread the DIP seam so callers can inject a stub.
|
|
468
288
|
await syncProjectStatusColumn(
|
|
469
289
|
provider,
|
|
470
290
|
ticketId,
|
|
@@ -473,32 +293,14 @@ export async function transitionTicketState(
|
|
|
473
293
|
opts.config,
|
|
474
294
|
);
|
|
475
295
|
|
|
476
|
-
//
|
|
477
|
-
//
|
|
478
|
-
// - delegates `agent::done` transitions to the legacy
|
|
479
|
-
// `cascadeCompletion` (preserving tasklist-checkbox toggling, the
|
|
480
|
-
// "All child tickets completed" progress comment, and the Epic
|
|
481
|
-
// close-exclusion);
|
|
482
|
-
// - for every other `agent::*` transition (`executing`, `blocked`,
|
|
483
|
-
// `closing`, …) walks the parent chain and updates each parent to
|
|
484
|
-
// the state derived from its children's current composition. This
|
|
485
|
-
// keeps the GitHub Project board accurate when work begins on a
|
|
486
|
-
// Task ("In Progress" surfaces up to the Story and Epic) or when a
|
|
487
|
-
// child enters the HITL pause state.
|
|
488
|
-
//
|
|
489
|
-
// The cascade implementation lives in `bulk.js` and is injected via
|
|
490
|
-
// `registerCascadeRunner` (Story #3995) so this module stays a leaf in
|
|
491
|
-
// the import graph. Callers that intentionally suppress propagation
|
|
492
|
-
// (historically the per-Task progress writer, which closed Tasks at
|
|
493
|
-
// commit-time but deferred the Story flip to story-close after the
|
|
494
|
-
// branch was merged) opt out by passing `cascade: false`.
|
|
296
|
+
// Every transition re-derives parent state from children (not just `done`),
|
|
297
|
+
// keeping the board accurate when work starts or a child blocks.
|
|
495
298
|
if (opts.cascade !== false) {
|
|
496
299
|
await _runUpwardCascade(provider, ticketId, {
|
|
497
300
|
notify: opts.notify,
|
|
498
301
|
});
|
|
499
302
|
}
|
|
500
303
|
|
|
501
|
-
// Fire the state-transition notification (fire-and-forget).
|
|
502
304
|
if (typeof opts.notify === 'function') {
|
|
503
305
|
dispatchTransitionNotification({
|
|
504
306
|
notify: opts.notify,
|
|
@@ -511,13 +313,7 @@ export async function transitionTicketState(
|
|
|
511
313
|
}
|
|
512
314
|
|
|
513
315
|
/**
|
|
514
|
-
*
|
|
515
|
-
* E.g., `- [ ] #123` to `- [x] #123`
|
|
516
|
-
*
|
|
517
|
-
* Story #3645 — positional `checked` boolean replaced with a named
|
|
518
|
-
* `{ checked }` options bag to eliminate the boolean-trap smell (SRP /
|
|
519
|
-
* naming clarity audit finding). All call sites updated in the same PR
|
|
520
|
-
* per the No-Shim cutover rule.
|
|
316
|
+
* Toggle `- [ ] #N` ↔ `- [x] #N` in the parent's body.
|
|
521
317
|
*
|
|
522
318
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
523
319
|
* @param {number} ticketId - ID of parent ticket
|
|
@@ -534,7 +330,7 @@ export async function toggleTasklistCheckbox(
|
|
|
534
330
|
const body = ticket.body || '';
|
|
535
331
|
|
|
536
332
|
if (!body.includes(`#${subIssueId}`)) {
|
|
537
|
-
return;
|
|
333
|
+
return;
|
|
538
334
|
}
|
|
539
335
|
|
|
540
336
|
const targetBox = checked ? '- [x]' : '- [ ]';
|
|
@@ -542,11 +338,9 @@ export async function toggleTasklistCheckbox(
|
|
|
542
338
|
let newBody = body;
|
|
543
339
|
|
|
544
340
|
if (checked) {
|
|
545
|
-
// replace `- [ ] #123` or `- [] #123` with `- [x] #123`
|
|
546
341
|
const re = new RegExp(`-\\s*\\[\\s*\\]\\s+#${subIssueId}\\b`, 'g');
|
|
547
342
|
newBody = newBody.replace(re, `${targetBox} #${subIssueId}`);
|
|
548
343
|
} else {
|
|
549
|
-
// replace `- [x] #123` or `- [X] #123` with `- [ ] #123`
|
|
550
344
|
const re = new RegExp(`-\\s*\\[[xX]\\]\\s+#${subIssueId}\\b`, 'g');
|
|
551
345
|
newBody = newBody.replace(re, `${targetBox} #${subIssueId}`);
|
|
552
346
|
}
|
|
@@ -559,23 +353,15 @@ export async function toggleTasklistCheckbox(
|
|
|
559
353
|
}
|
|
560
354
|
|
|
561
355
|
/**
|
|
562
|
-
* Post a structured comment
|
|
563
|
-
*
|
|
564
|
-
* Returns whatever the provider's `postComment` resolved to (Story #4543).
|
|
565
|
-
* Previously the result was swallowed, which made it impossible for a caller
|
|
566
|
-
* to reference the comment it had just written — the terminal envelope's
|
|
567
|
-
* `blocked.frictionCommentId` pointer needs exactly that, so an operator can
|
|
568
|
-
* be sent straight to the remediation instead of told to go find it. Callers
|
|
569
|
-
* that don't need the id simply ignore the return, so this is additive.
|
|
570
|
-
*
|
|
571
|
-
* The shape is provider-defined and may be `undefined` for providers that do
|
|
572
|
-
* not surface one; callers must treat the id as best-effort.
|
|
356
|
+
* Post a structured comment and evict the raw-comments cache so the next
|
|
357
|
+
* read sees it.
|
|
573
358
|
*
|
|
574
359
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
575
360
|
* @param {number} ticketId
|
|
576
361
|
* @param {'progress'|'friction'|'notification'} type
|
|
577
362
|
* @param {string} payload
|
|
578
|
-
* @returns {Promise<unknown>} The provider's `postComment` result
|
|
363
|
+
* @returns {Promise<unknown>} The provider's `postComment` result (may be
|
|
364
|
+
* `undefined`; treat any id as best-effort).
|
|
579
365
|
*/
|
|
580
366
|
export async function postStructuredComment(provider, ticketId, type, payload) {
|
|
581
367
|
assertValidStructuredCommentType(type);
|
|
@@ -583,9 +369,6 @@ export async function postStructuredComment(provider, ticketId, type, payload) {
|
|
|
583
369
|
type,
|
|
584
370
|
body: payload,
|
|
585
371
|
});
|
|
586
|
-
// Story #2465 — evict the raw-comments cache entry so the next
|
|
587
|
-
// `findStructuredComment` against this ticket re-fetches and sees the
|
|
588
|
-
// freshly-posted comment.
|
|
589
372
|
invalidateRawCommentsCache(provider, ticketId);
|
|
590
373
|
return posted;
|
|
591
374
|
}
|
|
@@ -1,39 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Stateless logic for updating ticket states, toggling checkboxes,
|
|
5
|
-
* posting comments, and cascading completions. This module delegates
|
|
6
|
-
* all API calls to the provided ITicketingProvider instance.
|
|
7
|
-
*
|
|
8
|
-
* Story #1848 — the implementation is split by verb family across the
|
|
9
|
-
* sibling `ticketing/` sub-directory:
|
|
10
|
-
*
|
|
11
|
-
* - `./ticketing/reads.js` — read-only helpers, validators, and the
|
|
12
|
-
* process-level structured-comment cache.
|
|
13
|
-
* - `./ticketing/state.js` — per-ticket mutators including
|
|
14
|
-
* `transitionTicketState` (below CRAP 12
|
|
15
|
-
* via predicate extraction).
|
|
16
|
-
* - `./ticketing/bulk.js` — cascade walk, per-parent serial lock,
|
|
17
|
-
* transient-error retry budget, and the
|
|
18
|
-
* partial-failure log helper.
|
|
19
|
-
*
|
|
20
|
-
* This file is a pure re-export facade: external callers continue to
|
|
21
|
-
* import every name from `./ticketing.js`, so the split is invisible at
|
|
22
|
-
* the import boundary.
|
|
2
|
+
* Re-export facade over `ticketing/` (reads, state mutators, bulk cascade)
|
|
3
|
+
* so callers import everything from one path.
|
|
23
4
|
*/
|
|
24
5
|
|
|
25
|
-
// Re-export the cascade + bulk surface.
|
|
26
6
|
export {
|
|
27
7
|
__resetParentCascadeLocks,
|
|
28
8
|
__setCascadeRetryDelays,
|
|
29
9
|
logCascadePartialFailures,
|
|
30
10
|
} from './ticketing/bulk.js';
|
|
31
|
-
// Re-export the read surface.
|
|
32
11
|
export {
|
|
33
12
|
_peekStructuredCommentCache,
|
|
34
13
|
_resetStructuredCommentCache,
|
|
35
14
|
assertValidStructuredCommentType,
|
|
36
|
-
// Story #3097 (Wave-0 additive, Epic #3078) — Storyless snapshot helper.
|
|
37
15
|
buildStorylessTicketSnapshot,
|
|
38
16
|
findStructuredComment,
|
|
39
17
|
isValidStructuredCommentType,
|
|
@@ -42,11 +20,9 @@ export {
|
|
|
42
20
|
structuredCommentMarker,
|
|
43
21
|
WAVE_TYPE_PATTERN,
|
|
44
22
|
} from './ticketing/reads.js';
|
|
45
|
-
// Re-export the per-ticket state-mutation surface.
|
|
46
23
|
export {
|
|
47
24
|
postStructuredComment,
|
|
48
25
|
toggleTasklistCheckbox,
|
|
49
|
-
// Story #3097 (Wave-0 additive, Epic #3078) — Storyless direct transition.
|
|
50
26
|
transitionStoryDirect,
|
|
51
27
|
transitionTicketState,
|
|
52
28
|
upsertStructuredComment,
|