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,185 +1,76 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/ticketing/reads.js — Ticketing read-side surface
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* structured-comment cache. Pure of state mutations; importing this
|
|
6
|
-
* module never issues a `ticket-mutating` call to the provider.
|
|
7
|
-
*
|
|
8
|
-
* Split out of `../ticketing.js` under Story #1848 to keep the verb
|
|
9
|
-
* families separated (`reads` / `state` / `bulk`). External callers
|
|
10
|
-
* continue importing the same names from `../ticketing.js`, which
|
|
11
|
-
* re-exports the surface defined here.
|
|
2
|
+
* lib/orchestration/ticketing/reads.js — Ticketing read-side surface:
|
|
3
|
+
* validators, markers, and the per-provider structured-comment caches.
|
|
4
|
+
* Never issues a mutating provider call.
|
|
12
5
|
*/
|
|
13
6
|
|
|
14
7
|
import { AGENT_LABELS } from '../../label-constants.js';
|
|
15
8
|
|
|
16
9
|
const WAVE_MARKER_RE = /^wave-([0-9]{1,3})-(start|end)$/;
|
|
17
10
|
|
|
18
|
-
/**
|
|
19
|
-
* Canonical agent-state label triad used by every state mutator. Kept on
|
|
20
|
-
* the read side so `state.js` and `bulk.js` can both import without
|
|
21
|
-
* pulling in any mutation helpers.
|
|
22
|
-
*/
|
|
23
11
|
export const STATE_LABELS = {
|
|
24
12
|
READY: AGENT_LABELS.READY,
|
|
25
13
|
EXECUTING: AGENT_LABELS.EXECUTING,
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
// the state enum so `transitionTicketState` can apply the label via
|
|
29
|
-
// the canonical one-state-at-a-time path (which removes every other
|
|
30
|
-
// `agent::*` label in the same call) and so the read-side `ALL_STATES`
|
|
31
|
-
// export — consumed by `state.js`'s `fromState` lookup — recognises
|
|
32
|
-
// `agent::closing` as a valid prior state when a `--resume` flip back
|
|
33
|
-
// to `done` fires post-merge.
|
|
14
|
+
// Held between close-preflight and a confirmed PR merge; must be a valid
|
|
15
|
+
// prior state for the post-merge `--resume` flip to `done`.
|
|
34
16
|
CLOSING: AGENT_LABELS.CLOSING,
|
|
35
17
|
DONE: AGENT_LABELS.DONE,
|
|
36
|
-
//
|
|
37
|
-
// HITL pause point (see `.agents/instructions.md` §1.J). Adding it to the
|
|
38
|
-
// state enum lets `transitionTicketState` (and the
|
|
39
|
-
// `update-ticket-state.js` CLI) apply the label through the canonical
|
|
40
|
-
// one-state-at-a-time path; without it the workflow contract that names
|
|
41
|
-
// `agent::blocked` cannot be honoured by the tooling.
|
|
18
|
+
// The single HITL pause point (instructions.md § 1.J).
|
|
42
19
|
BLOCKED: AGENT_LABELS.BLOCKED,
|
|
43
20
|
};
|
|
44
21
|
|
|
45
|
-
/**
|
|
46
|
-
* Frozen list of every recognised `agent::*` state label. Exposed for
|
|
47
|
-
* downstream guards (e.g. transition predicates) that need to match
|
|
48
|
-
* against the full set without re-enumerating `STATE_LABELS`.
|
|
49
|
-
*/
|
|
50
22
|
export const ALL_STATES = Object.values(STATE_LABELS);
|
|
51
23
|
|
|
52
24
|
/**
|
|
53
|
-
*
|
|
54
|
-
* `
|
|
55
|
-
*
|
|
25
|
+
* Structured-comment types accepted by the post/upsert paths; parametric
|
|
26
|
+
* `wave-N-start|end` types match {@link WAVE_TYPE_PATTERN}. A kind nothing
|
|
27
|
+
* emits any more is dead wiring and is removed. Some kinds stay registered
|
|
28
|
+
* only so historical comments remain readable.
|
|
56
29
|
*/
|
|
57
30
|
export const STRUCTURED_COMMENT_TYPES = Object.freeze([
|
|
58
|
-
// Legacy core set
|
|
59
31
|
'progress',
|
|
60
32
|
'friction',
|
|
61
33
|
'notification',
|
|
62
|
-
//
|
|
63
|
-
// Story #4411 (Epic #4405) — the former `code-review` structured comment
|
|
64
|
-
// is unified with the former `audit-results` comment into the single
|
|
65
|
-
// `verification-results` findings contract. `runCodeReview` (the sole code
|
|
66
|
-
// producer) upserts `verification-results`; the feedback-loop graduators and
|
|
67
|
-
// the auto-merge integration gate read it. Both the `code-review` and (as of
|
|
68
|
-
// Story #4412's slim-Epic-close cutover) the `audit-results` markers are
|
|
69
|
-
// retired here — the Phase 4 standalone lens walk folded into the Phase 5
|
|
70
|
-
// code-review pass, whose single `verification-results` comment now carries
|
|
71
|
-
// the Epic-close lens findings. Hard cutover, no dual-shape reader per
|
|
72
|
-
// `git-conventions.md`.
|
|
34
|
+
// Single findings contract for code review and lens findings.
|
|
73
35
|
'verification-results',
|
|
74
36
|
'retro',
|
|
75
37
|
'retro-partial',
|
|
76
|
-
// v2 Story closeout — actionable follow-ups from friction signals
|
|
77
38
|
'follow-ups',
|
|
78
|
-
// v2 plan-run epilogue artifacts (posted on the primary Story)
|
|
79
39
|
'plan-run-audit-roster',
|
|
80
40
|
'epic-run-state',
|
|
81
41
|
'epic-run-progress',
|
|
82
42
|
'epic-plan-state',
|
|
83
|
-
// `parked-follow-ons` retired in Story #5114 with the module that was its
|
|
84
|
-
// only writer, and `plan-run-sibling-coherence` in Story #5341 with the
|
|
85
|
-
// epilogue step that was its. Story #5367 retired two more on the same
|
|
86
|
-
// rule: `story-init` (its write went away in #5343 — the receipt is read
|
|
87
|
-
// off disk now) and `model-attribution` (its writer went with the per-Task
|
|
88
|
-
// progress writer in #3157, and its reader modules are deleted). A kind the
|
|
89
|
-
// reader still recognises but nothing emits is the same dead wiring in a
|
|
90
|
-
// new place.
|
|
91
|
-
// Story #566 — per-phase wall-clock summary posted by single-story-close.js.
|
|
92
43
|
'phase-timings',
|
|
93
|
-
// Story #2128 — Phase 6 Epic Clarity Gate (CLI retired). Historical
|
|
94
|
-
// `clarity-gate-update` comments may still exist on older tickets.
|
|
95
44
|
'clarity-gate-update',
|
|
96
|
-
//
|
|
97
|
-
// upserts a `spec-freshness` comment on the Epic listing any
|
|
98
|
-
// path-shaped references that don't exist at the base branch, so the
|
|
99
|
-
// operator can correct drift before Phase 8 decomposes from a stale
|
|
100
|
-
// spec. Advisory: the run continues regardless of the report contents.
|
|
45
|
+
// Advisory: path references missing at the base branch.
|
|
101
46
|
'spec-freshness',
|
|
102
|
-
// Story #2894 — `finalize/post-handoff-comment.js` upserts an
|
|
103
|
-
// `epic-handoff` comment on the Epic at the end of the bus-owned
|
|
104
|
-
// finalize flow (after `open-or-locate-pr`
|
|
105
|
-
// succeed). The marker carries the freshly opened/located PR URL and
|
|
106
|
-
// its number so operators can jump straight to the PR from the Epic
|
|
107
|
-
// ticket. Re-invocations upsert the same marker rather than appending
|
|
108
|
-
// duplicates.
|
|
109
47
|
'epic-handoff',
|
|
110
|
-
// Story #2899 (Epic #2880, F13) — the deleted `epic-deliver-preflight.js`
|
|
111
|
-
// upserted a `delivery-preflight` comment on the Epic at the start of
|
|
112
|
-
// pre-v2 Epic `/mandrel-deliver` Phase 1, surfacing estimated story count, install cost,
|
|
113
|
-
// wave count, GitHub API request volume, Claude quota burn, and any
|
|
114
|
-
// threshold breaches against `delivery.preflight.max*`. One entry per
|
|
115
|
-
// Epic; re-runs replace prior content.
|
|
116
48
|
'delivery-preflight',
|
|
117
|
-
// Story #3062 (Epic #3051) — the deleted `wave-tick.js` upserted a
|
|
118
|
-
// `recurring-failure-class` comment on the Epic when the cross-Story
|
|
119
|
-
// detector finds two or more Stories that hit the same `failedGate` in
|
|
120
|
-
// `close-validate.end`. One entry per Epic; re-ticks with the same
|
|
121
|
-
// findings upsert in place (`upsertStructuredComment` diffs by body).
|
|
122
49
|
'recurring-failure-class',
|
|
123
|
-
// Story #3061 (Epic #3051) — the pre-v2 `/mandrel-deliver` idle-watchdog prose
|
|
124
|
-
// instructed the parent host LLM to upsert a `wave-stall` comment on the
|
|
125
|
-
// Epic whenever an in-flight Story had been silent for longer than the
|
|
126
|
-
// configured cadence. The deleted `wave-tick.js --check-idle` CLI emitted
|
|
127
|
-
// the matching envelope; registering the kind here keeps historical
|
|
128
|
-
// the documented remediation actually executable
|
|
129
|
-
// (assertValidStructuredCommentType would otherwise throw).
|
|
130
50
|
'wave-stall',
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
// claim timestamp. Nothing emits a per-run liveness beat, so this
|
|
134
|
-
// claim-time is the only age signal a reader has when reasoning about the
|
|
135
|
-
// documented `--steal` contract. The guard itself fails closed regardless
|
|
136
|
-
// (it anchors liveness to `now`), so a stranded claim is cleared with
|
|
137
|
-
// `--steal`, not by TTL expiry. One entry per ticket; re-acquires upsert
|
|
138
|
-
// in place.
|
|
51
|
+
// Records claimant + claim time; the guard fails closed, so a stranded
|
|
52
|
+
// claim is cleared with `--steal`, not by TTL.
|
|
139
53
|
'plan-lease',
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
// `cross-repo-deferred` comment listing findings that route
|
|
143
|
-
// to a different repository and were therefore not filed here. Replaces
|
|
144
|
-
// the prior log-line-only trace so the deferral survives the finalize
|
|
145
|
-
// run as a durable, operator-visible record. Discriminated by a
|
|
146
|
-
// `graduator="<name>"` attr so independent graduators do not clobber each
|
|
147
|
-
// other's comment; re-runs upsert in place.
|
|
54
|
+
// Discriminated by a `graduator="<name>"` attr so graduators don't clobber
|
|
55
|
+
// each other.
|
|
148
56
|
'cross-repo-deferred',
|
|
149
|
-
//
|
|
150
|
-
//
|
|
151
|
-
// ONLY comment persist posts: the primary-Story-only `plan-summary` marker
|
|
152
|
-
// was retired and its content — story set, delivery order, deliver command
|
|
153
|
-
// — rides this marker on every Story. Story #5367 deleted the machine
|
|
154
|
-
// checkpoint that used to lead the body; the marker remains, and it is what
|
|
155
|
-
// makes a re-persist upsert in place.
|
|
57
|
+
// The only comment persist posts on each Story; the marker makes a
|
|
58
|
+
// re-persist upsert in place.
|
|
156
59
|
'story-plan-state',
|
|
157
|
-
//
|
|
158
|
-
//
|
|
159
|
-
// Story that claims it (plus any per-supersede note the plan authored),
|
|
160
|
-
// immediately before closing the issue as `not_planned`. Keying off this
|
|
161
|
-
// marker rather than a bare `postComment` is what makes a re-run
|
|
162
|
-
// non-double-commenting. One entry per source issue.
|
|
60
|
+
// Posted before closing a superseded source issue; the marker keeps
|
|
61
|
+
// re-runs from double-commenting.
|
|
163
62
|
'superseded-by',
|
|
164
63
|
]);
|
|
165
64
|
|
|
166
65
|
export const WAVE_TYPE_PATTERN = WAVE_MARKER_RE;
|
|
167
66
|
|
|
168
67
|
/**
|
|
169
|
-
* Pool-mode claim
|
|
170
|
-
*
|
|
171
|
-
* authoritative entry — the label set is the actual race-detection signal).
|
|
172
|
-
* Bounded to 1-9 digits to mirror the wave-marker safety margin.
|
|
68
|
+
* Pool-mode claim marker, upserted per story-id; the label set, not the
|
|
69
|
+
* comment, is the race-detection signal.
|
|
173
70
|
*/
|
|
174
71
|
const CLAIM_TYPE_PATTERN = /^claim-([0-9]{1,9})$/;
|
|
175
72
|
|
|
176
|
-
/**
|
|
177
|
-
* Lifecycle-listener marker pattern (Story #2239 / #2241 / #2242). The
|
|
178
|
-
* lifecycle StructuredCommentPoster writes minimal markers prefixed with
|
|
179
|
-
* `lifecycle-` (e.g. `lifecycle-wave-0-start`, `lifecycle-epic-blocked`,
|
|
180
|
-
* `lifecycle-epic-unblocked`). Treated as a generic prefix so future
|
|
181
|
-
* listener-owned events can mint new markers without touching this enum.
|
|
182
|
-
*/
|
|
73
|
+
/** Generic `lifecycle-*` prefix so listeners can mint markers freely. */
|
|
183
74
|
const LIFECYCLE_TYPE_PATTERN = /^lifecycle-[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
184
75
|
|
|
185
76
|
/**
|
|
@@ -197,10 +88,6 @@ export function isValidStructuredCommentType(type) {
|
|
|
197
88
|
}
|
|
198
89
|
|
|
199
90
|
/**
|
|
200
|
-
* Throws if `type` is not a recognized structured-comment type. Error
|
|
201
|
-
* message lists the accepted enum plus the wave pattern to make the
|
|
202
|
-
* schema discoverable from the failure alone.
|
|
203
|
-
*
|
|
204
91
|
* @param {string} type
|
|
205
92
|
*/
|
|
206
93
|
export function assertValidStructuredCommentType(type) {
|
|
@@ -212,18 +99,9 @@ export function assertValidStructuredCommentType(type) {
|
|
|
212
99
|
}
|
|
213
100
|
|
|
214
101
|
/**
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
* `findStructuredComment`.
|
|
219
|
-
*
|
|
220
|
-
* `attrs` lets a single `type` namespace coexist with multiple in-place
|
|
221
|
-
* snapshots keyed by an additional dimension. The canonical use is the
|
|
222
|
-
* per-wave `wave-run-progress` comment: each wave upserts its own snapshot
|
|
223
|
-
* via `{ wave: N }` so subsequent waves don't overwrite prior rows.
|
|
224
|
-
* Without the discriminator the next wave's upsert finds (and deletes) the
|
|
225
|
-
* prior wave's comment, leaving the cross-wave epic-run-progress rollup
|
|
226
|
-
* with a single row.
|
|
102
|
+
* HTML marker identifying a structured comment. `attrs` discriminates
|
|
103
|
+
* several snapshots of one type (e.g. one per wave) so an upsert doesn't
|
|
104
|
+
* overwrite a sibling.
|
|
227
105
|
*
|
|
228
106
|
* @param {string} type
|
|
229
107
|
* @param {Record<string, string|number>} [attrs]
|
|
@@ -241,46 +119,14 @@ export function structuredCommentMarker(type, attrs = null) {
|
|
|
241
119
|
}
|
|
242
120
|
|
|
243
121
|
/**
|
|
244
|
-
* Per-provider
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
* Story #1795 — every Epic run owns its process for the duration of
|
|
248
|
-
* the run, so a single seed-then-reuse window saves one
|
|
249
|
-
* `getTicketComments` per repeat upsert on the hot path (`story-init`,
|
|
250
|
-
* `verification-results`, etc).
|
|
251
|
-
*
|
|
252
|
-
* Lifecycle:
|
|
253
|
-
* - First call to `findStructuredComment(provider, t, type, attrs)`
|
|
254
|
-
* hits `getTicketComments` and seeds the cache with the resolved
|
|
255
|
-
* comment (or `null` to record the "no comment yet" miss).
|
|
256
|
-
* - Subsequent calls with the same provider return the cached row
|
|
257
|
-
* without a list call.
|
|
258
|
-
* - `upsertStructuredComment` refreshes the cache to the new
|
|
259
|
-
* comment id after `postComment` succeeds.
|
|
260
|
-
* - `deleteComment` paths inside this module evict the entry.
|
|
261
|
-
*
|
|
262
|
-
* Cache is scoped to the provider instance via a WeakMap — different
|
|
263
|
-
* providers (including per-test fakes) get isolated caches so state
|
|
264
|
-
* cannot leak across boundaries. Tests reset via the exported
|
|
265
|
-
* `_resetStructuredCommentCache()` seam.
|
|
122
|
+
* Per-provider `(ticketId, type, attrs)` → resolved comment (or `null` miss).
|
|
123
|
+
* Upsert refreshes and delete evicts entries. WeakMap-scoped so fakes stay
|
|
124
|
+
* isolated.
|
|
266
125
|
*/
|
|
267
126
|
const _structuredCommentCache = new WeakMap();
|
|
268
127
|
|
|
269
128
|
/**
|
|
270
|
-
*
|
|
271
|
-
* Tasks. Story #3097 (Wave-0 additive, Epic #3078 Strategy B) — the
|
|
272
|
-
* 2-tier hierarchy collapses Epic → Story → Task into
|
|
273
|
-
* Epic → Story, so a Story may legitimately have no Task
|
|
274
|
-
* children. Read-side callers that expect a `subTickets` array on the
|
|
275
|
-
* Story can route through this helper to materialise an empty-children
|
|
276
|
-
* snapshot without paying a provider round-trip and without risk of
|
|
277
|
-
* `undefined.map` dereferences. Pure / synchronous; never touches the
|
|
278
|
-
* provider.
|
|
279
|
-
*
|
|
280
|
-
* The function preserves every field on the input `ticket` and merely
|
|
281
|
-
* pins `subTickets` to `[]` when omitted. Callers that already hold a
|
|
282
|
-
* resolved children list pass it through; the Storyless path is the
|
|
283
|
-
* default.
|
|
129
|
+
* Snapshot of a ticket with `subTickets` pinned (default `[]`); pure.
|
|
284
130
|
*
|
|
285
131
|
* @param {object|null|undefined} ticket
|
|
286
132
|
* @param {{ subTickets?: Array<object> }} [opts]
|
|
@@ -294,7 +140,6 @@ export function buildStorylessTicketSnapshot(ticket, opts = {}) {
|
|
|
294
140
|
}
|
|
295
141
|
|
|
296
142
|
/**
|
|
297
|
-
* Lookup (or lazily create) the per-provider cache map.
|
|
298
143
|
* @param {object} provider
|
|
299
144
|
* @returns {Map<string, object|null>}
|
|
300
145
|
*/
|
|
@@ -309,8 +154,7 @@ export function getProviderCommentCache(provider) {
|
|
|
309
154
|
}
|
|
310
155
|
|
|
311
156
|
/**
|
|
312
|
-
*
|
|
313
|
-
* is normalised by sorted JSON so equivalent keys collide. Story #1795.
|
|
157
|
+
* Attrs are key-sorted so equivalent bags collide.
|
|
314
158
|
*
|
|
315
159
|
* @param {number} ticketId
|
|
316
160
|
* @param {string} type
|
|
@@ -329,31 +173,12 @@ export function structuredCommentCacheKey(ticketId, type, attrs) {
|
|
|
329
173
|
}
|
|
330
174
|
|
|
331
175
|
/**
|
|
332
|
-
* Per-provider
|
|
333
|
-
*
|
|
334
|
-
* call. Story #2465 — `findStructuredComment` is invoked back-to-back for
|
|
335
|
-
* different `type` discriminators against the same ticket (e.g.
|
|
336
|
-
* `story-init` + `verification-results` + a `friction` probe during a
|
|
337
|
-
* single close). Without this cache each lookup pays a full
|
|
338
|
-
* pagination round-trip even when the prior call already fetched the
|
|
339
|
-
* same comments. The structured-comment-id cache short-circuits *repeat*
|
|
340
|
-
* lookups for the same `(type, attrs)` tuple but does not help across
|
|
341
|
-
* different types on the same ticket.
|
|
342
|
-
*
|
|
343
|
-
* Lifecycle:
|
|
344
|
-
* - `findStructuredComment` consults this raw cache before issuing
|
|
345
|
-
* `provider.getTicketComments`; on cache miss it seeds the entry
|
|
346
|
-
* from the response.
|
|
347
|
-
* - `postStructuredComment` and `upsertStructuredComment` evict the
|
|
348
|
-
* entry for the mutated ticketId — any cached array is stale once
|
|
349
|
-
* a new comment lands.
|
|
350
|
-
* - Scoped per-provider via WeakMap so test fakes never share state
|
|
351
|
-
* with the real GitHubProvider.
|
|
176
|
+
* Per-provider ticketId → full comment array, so lookups for different types
|
|
177
|
+
* on one ticket share one fetch. Structured-comment writes evict the entry.
|
|
352
178
|
*/
|
|
353
179
|
const _rawCommentsCache = new WeakMap();
|
|
354
180
|
|
|
355
181
|
/**
|
|
356
|
-
* Lookup (or lazily create) the per-provider raw-comments cache.
|
|
357
182
|
* @param {object} provider
|
|
358
183
|
* @returns {Map<number, object[]>}
|
|
359
184
|
*/
|
|
@@ -368,10 +193,6 @@ export function getProviderRawCommentsCache(provider) {
|
|
|
368
193
|
}
|
|
369
194
|
|
|
370
195
|
/**
|
|
371
|
-
* Evict the cached raw-comments array for a given ticket on a provider.
|
|
372
|
-
* Called from the structured-comment write paths after a `postComment`
|
|
373
|
-
* lands. Safe to call when no entry exists.
|
|
374
|
-
*
|
|
375
196
|
* @param {object} provider
|
|
376
197
|
* @param {number} ticketId
|
|
377
198
|
*/
|
|
@@ -383,9 +204,6 @@ export function invalidateRawCommentsCache(provider, ticketId) {
|
|
|
383
204
|
}
|
|
384
205
|
|
|
385
206
|
/**
|
|
386
|
-
* Test seam — reset the raw-comments cache for a provider. Mirrors
|
|
387
|
-
* `_resetStructuredCommentCache` for the structured-id cache.
|
|
388
|
-
*
|
|
389
207
|
* @param {object} [provider]
|
|
390
208
|
*/
|
|
391
209
|
export function _resetRawCommentsCache(provider) {
|
|
@@ -395,17 +213,7 @@ export function _resetRawCommentsCache(provider) {
|
|
|
395
213
|
}
|
|
396
214
|
|
|
397
215
|
/**
|
|
398
|
-
*
|
|
399
|
-
* Exported so unit tests can isolate cases without restarting the
|
|
400
|
-
* process. Without arguments the entire WeakMap is dropped by
|
|
401
|
-
* reassigning the per-provider map of every known provider — in
|
|
402
|
-
* practice tests just hand in their fresh provider instance which
|
|
403
|
-
* has no cached state yet. Production callers never invoke this.
|
|
404
|
-
*
|
|
405
|
-
* @param {object} [provider] When supplied, clears just that
|
|
406
|
-
* provider's cache; otherwise no-op (per-provider caches are
|
|
407
|
-
* already isolated by WeakMap and tests creating fresh providers
|
|
408
|
-
* get clean state automatically).
|
|
216
|
+
* @param {object} [provider] Clears that provider's cache; otherwise no-op.
|
|
409
217
|
*/
|
|
410
218
|
export function _resetStructuredCommentCache(provider) {
|
|
411
219
|
if (provider && typeof provider === 'object') {
|
|
@@ -414,12 +222,9 @@ export function _resetStructuredCommentCache(provider) {
|
|
|
414
222
|
}
|
|
415
223
|
|
|
416
224
|
/**
|
|
417
|
-
*
|
|
418
|
-
* Map for read-only inspection (do not mutate). Story #1795.
|
|
225
|
+
* Read-only view of a provider's cache (do not mutate).
|
|
419
226
|
*
|
|
420
|
-
* @param {object} [provider]
|
|
421
|
-
* cache Map; otherwise returns an empty Map for callers that just
|
|
422
|
-
* want a stable shape.
|
|
227
|
+
* @param {object} [provider]
|
|
423
228
|
*/
|
|
424
229
|
export function _peekStructuredCommentCache(provider) {
|
|
425
230
|
if (provider && typeof provider === 'object') {
|
|
@@ -429,20 +234,8 @@ export function _peekStructuredCommentCache(provider) {
|
|
|
429
234
|
}
|
|
430
235
|
|
|
431
236
|
/**
|
|
432
|
-
*
|
|
433
|
-
*
|
|
434
|
-
* `structuredCommentMarker(type, attrs)`.
|
|
435
|
-
*
|
|
436
|
-
* When `attrs` is provided, only comments whose marker carries the same
|
|
437
|
-
* discriminator attributes are returned — see `structuredCommentMarker` for
|
|
438
|
-
* the per-wave `wave-run-progress` use case.
|
|
439
|
-
*
|
|
440
|
-
* Story #1795 — results are memoised in a process-level cache keyed by
|
|
441
|
-
* `(ticketId, type, attrsHash)`. The first call seeds the cache with
|
|
442
|
-
* the resolved comment (or `null` for the "no such comment yet" miss);
|
|
443
|
-
* every subsequent call returns the cached row without issuing another
|
|
444
|
-
* `getTicketComments`. `upsertStructuredComment` refreshes the cache
|
|
445
|
-
* after a successful repost, and its delete path evicts the entry.
|
|
237
|
+
* Latest comment carrying `structuredCommentMarker(type, attrs)`; memoised
|
|
238
|
+
* per `(ticketId, type, attrs)`, including misses.
|
|
446
239
|
*
|
|
447
240
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
448
241
|
* @param {number} ticketId
|
|
@@ -462,10 +255,6 @@ export async function findStructuredComment(
|
|
|
462
255
|
return cache.get(cacheKey);
|
|
463
256
|
}
|
|
464
257
|
const marker = structuredCommentMarker(type, attrs);
|
|
465
|
-
// Story #2465 — consult the per-ticketId raw-comments cache before
|
|
466
|
-
// hitting the wire. Two back-to-back `findStructuredComment` calls for
|
|
467
|
-
// different types against the same ticket would otherwise both pay a
|
|
468
|
-
// full `getTicketComments` round-trip.
|
|
469
258
|
const rawCache = getProviderRawCommentsCache(provider);
|
|
470
259
|
let comments;
|
|
471
260
|
if (rawCache.has(ticketId)) {
|
|
@@ -474,7 +263,7 @@ export async function findStructuredComment(
|
|
|
474
263
|
comments = (await provider.getTicketComments(ticketId)) ?? [];
|
|
475
264
|
rawCache.set(ticketId, comments);
|
|
476
265
|
}
|
|
477
|
-
//
|
|
266
|
+
// Comments sort ascending by creation; take the last match.
|
|
478
267
|
const matches = comments.filter(
|
|
479
268
|
(c) => typeof c.body === 'string' && c.body.includes(marker),
|
|
480
269
|
);
|
|
@@ -1,25 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* lib/orchestration/ticketing/state.js — Ticket state-mutation facade
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* the single-ticket mutators that now live in `./transition.js`
|
|
7
|
-
* (`transitionTicketState`, `toggleTasklistCheckbox`,
|
|
8
|
-
* `postStructuredComment`, `_resetColumnSyncCache`). Pulled out of
|
|
9
|
-
* `../ticketing.js` under Story #1848 so the read-side (`./reads.js`) and
|
|
10
|
-
* the cascade/bulk side (`./bulk.js`) each live behind a narrower import
|
|
11
|
-
* contract.
|
|
12
|
-
*
|
|
13
|
-
* Story #3995 — the single-ticket mutators were extracted into the leaf
|
|
14
|
-
* `./transition.js` to break the `state.js ↔ bulk.js` import cycle.
|
|
15
|
-
* `bulk.js`'s cascade walk depends on those primitives, and the primitives
|
|
16
|
-
* fire the upward cascade; lifting them into a leaf lets `state.js` and
|
|
17
|
-
* `bulk.js` both depend **downward** on `transition.js`. This module is
|
|
18
|
-
* the wiring point that injects `bulk.js`'s cascade pair
|
|
19
|
-
* (`cascadeParentState` / `logCascadePartialFailures`) into
|
|
20
|
-
* `transition.js` via `registerCascadeRunner`, so importing `state.js`
|
|
21
|
-
* (or the `../ticketing.js` facade that re-exports through it) always
|
|
22
|
-
* loads `bulk.js` and arms the real cascade before any transition runs.
|
|
2
|
+
* lib/orchestration/ticketing/state.js — Ticket state-mutation facade:
|
|
3
|
+
* structured-comment upsert, the direct Story transition, and re-exports of
|
|
4
|
+
* `./transition.js`. Importing this module wires `bulk.js`'s cascade into
|
|
5
|
+
* `transition.js`, so the real cascade is armed before any transition runs.
|
|
23
6
|
*/
|
|
24
7
|
|
|
25
8
|
import { Logger } from '../../Logger.js';
|
|
@@ -40,10 +23,6 @@ import {
|
|
|
40
23
|
transitionTicketState,
|
|
41
24
|
} from './transition.js';
|
|
42
25
|
|
|
43
|
-
// Re-export the single-ticket mutators that moved to `./transition.js`
|
|
44
|
-
// (Story #3995) so existing consumers that import them from `./state.js`
|
|
45
|
-
// — and the `../ticketing.js` facade — keep working without an import
|
|
46
|
-
// path change.
|
|
47
26
|
export {
|
|
48
27
|
_resetColumnSyncCache,
|
|
49
28
|
postStructuredComment,
|
|
@@ -51,11 +30,6 @@ export {
|
|
|
51
30
|
transitionTicketState,
|
|
52
31
|
};
|
|
53
32
|
|
|
54
|
-
// Story #3995 — inject `bulk.js`'s upward-cascade pair into
|
|
55
|
-
// `transition.js`. `transition.js` stays a leaf (it does not import
|
|
56
|
-
// `bulk.js`); this wiring runs once at module-evaluation time and is the
|
|
57
|
-
// single home for the legacy `transitionTicketState → cascadeParentState`
|
|
58
|
-
// behaviour, preserving the `cascade` flag and the partial-failure log.
|
|
59
33
|
registerCascadeRunner(async (provider, ticketId, opts) => {
|
|
60
34
|
const cascade = await cascadeParentState(provider, ticketId, {
|
|
61
35
|
notify: opts.notify,
|
|
@@ -64,19 +38,8 @@ registerCascadeRunner(async (provider, ticketId, opts) => {
|
|
|
64
38
|
});
|
|
65
39
|
|
|
66
40
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* Strategy B) — in the 2-tier hierarchy a Story has no Task children, so
|
|
70
|
-
* the canonical `transitionTicketState` upward-cascade path
|
|
71
|
-
* (`cascadeParentState`) is the only meaningful walk. This helper is a
|
|
72
|
-
* thin wrapper that pins `cascade: true` (so the parent Epic
|
|
73
|
-
* still receives derived-state updates) and is intentionally a no-op
|
|
74
|
-
* difference from `transitionTicketState` in 4-tier mode — the helper
|
|
75
|
-
* exists so 2-tier callers can opt into a name that documents intent
|
|
76
|
-
* (and so F8 can pivot the implementation to skip the now-impossible
|
|
77
|
-
* Task-fan-in without rewriting call sites). The wrapper preserves every
|
|
78
|
-
* `opts` field the caller supplies; only `cascade` defaults to `true`
|
|
79
|
-
* when omitted.
|
|
41
|
+
* `transitionTicketState` with `cascade` defaulting to `true`, so the parent
|
|
42
|
+
* Epic still receives derived-state updates; every other opt passes through.
|
|
80
43
|
*
|
|
81
44
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
82
45
|
* @param {number} storyId
|
|
@@ -94,20 +57,13 @@ export async function transitionStoryDirect(
|
|
|
94
57
|
}
|
|
95
58
|
|
|
96
59
|
/**
|
|
97
|
-
* Idempotently post a structured comment
|
|
98
|
-
*
|
|
99
|
-
* `attrs
|
|
100
|
-
* posted. The marker is prepended to the body automatically.
|
|
101
|
-
*
|
|
102
|
-
* `attrs` lets the same `type` carry multiple in-place snapshots keyed by
|
|
103
|
-
* an additional dimension — e.g., one `wave-run-progress` comment per wave
|
|
104
|
-
* via `{ wave: N }` so the cross-wave rollup can read every wave's snapshot
|
|
105
|
-
* instead of only the most recent one.
|
|
60
|
+
* Idempotently post a marker-identified structured comment: delete any
|
|
61
|
+
* existing one with the same `type` (and `attrs`), then post with the marker
|
|
62
|
+
* prepended. `attrs` keeps several snapshots of one type side by side.
|
|
106
63
|
*
|
|
107
64
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
108
65
|
* @param {number} ticketId
|
|
109
|
-
* @param {string} type -
|
|
110
|
-
* `dispatch-manifest`, `retro`, `code-review`).
|
|
66
|
+
* @param {string} type - a registered structured-comment type.
|
|
111
67
|
* @param {string} body - markdown payload.
|
|
112
68
|
* @param {Record<string, string|number>} [attrs]
|
|
113
69
|
* @returns {Promise<{ commentId: number }>}
|
|
@@ -128,11 +84,9 @@ export async function upsertStructuredComment(
|
|
|
128
84
|
if (existing && typeof provider.deleteComment === 'function') {
|
|
129
85
|
try {
|
|
130
86
|
await provider.deleteComment(existing.id);
|
|
131
|
-
//
|
|
132
|
-
//
|
|
87
|
+
// Evict before the repost so a failed post can't leave the caches
|
|
88
|
+
// pointing at a deleted comment.
|
|
133
89
|
cache.delete(cacheKey);
|
|
134
|
-
// Story #2465 — the raw-comments array still holds the
|
|
135
|
-
// just-deleted comment; drop it so subsequent reads re-fetch.
|
|
136
90
|
invalidateRawCommentsCache(provider, ticketId);
|
|
137
91
|
} catch (err) {
|
|
138
92
|
Logger.warn(
|
|
@@ -146,17 +100,9 @@ export async function upsertStructuredComment(
|
|
|
146
100
|
type,
|
|
147
101
|
body: annotated,
|
|
148
102
|
});
|
|
149
|
-
// Story #2465 — evict the raw-comments cache so a follow-up
|
|
150
|
-
// `findStructuredComment` for a different type on the same ticket
|
|
151
|
-
// re-fetches and observes the new comment.
|
|
152
103
|
invalidateRawCommentsCache(provider, ticketId);
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
// post result carries the new comment id; we synthesise a minimal
|
|
156
|
-
// cached row that `findStructuredComment` callers can rely on (only
|
|
157
|
-
// `id` and `body` are read by upstream). Accept either `commentId`
|
|
158
|
-
// (production GitHubProvider shape) or `id` (test-fake shape) so the
|
|
159
|
-
// cache update fires uniformly across providers.
|
|
104
|
+
// Seed the cache with a minimal `{ id, body }` row so the next upsert
|
|
105
|
+
// skips the list call. Providers return `commentId` (GitHub) or `id` (fakes).
|
|
160
106
|
const newCommentId =
|
|
161
107
|
typeof result?.commentId === 'number'
|
|
162
108
|
? result.commentId
|