mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,196 +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
|
-
'plan-run-sibling-coherence',
|
|
81
40
|
'epic-run-state',
|
|
82
41
|
'epic-run-progress',
|
|
83
42
|
'epic-plan-state',
|
|
84
|
-
// `parked-follow-ons` retired in Story #5114 with the module that was its
|
|
85
|
-
// only writer. A kind the reader still recognises but nothing emits is the
|
|
86
|
-
// same dead wiring in a new place.
|
|
87
|
-
// Story #566 — per-phase wall-clock summary posted by single-story-close.js.
|
|
88
43
|
'phase-timings',
|
|
89
|
-
// Story #831 — story-init upserts a `story-init` comment that
|
|
90
|
-
// surfaces `dependenciesInstalled` (and the underlying installStatus) so
|
|
91
|
-
// downstream workflow steps don't have to infer install state from
|
|
92
|
-
// node_modules presence.
|
|
93
|
-
'story-init',
|
|
94
|
-
// Story #2128 — Phase 6 Epic Clarity Gate (CLI retired). Historical
|
|
95
|
-
// `clarity-gate-update` comments may still exist on older tickets.
|
|
96
44
|
'clarity-gate-update',
|
|
97
|
-
//
|
|
98
|
-
// upserts a `spec-freshness` comment on the Epic listing any
|
|
99
|
-
// path-shaped references that don't exist at the base branch, so the
|
|
100
|
-
// operator can correct drift before Phase 8 decomposes from a stale
|
|
101
|
-
// spec. Advisory: the run continues regardless of the report contents.
|
|
45
|
+
// Advisory: path references missing at the base branch.
|
|
102
46
|
'spec-freshness',
|
|
103
|
-
// Story #2813 — the per-Task progress writer (since retired under
|
|
104
|
-
// #3157) upserted a `model-attribution` comment on a Task ticket at
|
|
105
|
-
// the moment it transitioned to `agent::executing`, recording which
|
|
106
|
-
// Claude model was actively executing the work. One entry per Task
|
|
107
|
-
// (upsert is idempotent across resume re-runs). Story- and Epic-level
|
|
108
|
-
// rollups are computed at query time by `rollupModelAttribution` in
|
|
109
|
-
// `lib/orchestration/model-attribution.js` — no Story/Epic-scope
|
|
110
|
-
// emissions are written. Schema:
|
|
111
|
-
// `.agents/schemas/model-attribution.schema.json`.
|
|
112
|
-
'model-attribution',
|
|
113
|
-
// Story #2894 — `finalize/post-handoff-comment.js` upserts an
|
|
114
|
-
// `epic-handoff` comment on the Epic at the end of the bus-owned
|
|
115
|
-
// finalize flow (after `open-or-locate-pr`
|
|
116
|
-
// succeed). The marker carries the freshly opened/located PR URL and
|
|
117
|
-
// its number so operators can jump straight to the PR from the Epic
|
|
118
|
-
// ticket. Re-invocations upsert the same marker rather than appending
|
|
119
|
-
// duplicates.
|
|
120
47
|
'epic-handoff',
|
|
121
|
-
// Story #2899 (Epic #2880, F13) — the deleted `epic-deliver-preflight.js`
|
|
122
|
-
// upserted a `delivery-preflight` comment on the Epic at the start of
|
|
123
|
-
// pre-v2 Epic `/mandrel-deliver` Phase 1, surfacing estimated story count, install cost,
|
|
124
|
-
// wave count, GitHub API request volume, Claude quota burn, and any
|
|
125
|
-
// threshold breaches against `delivery.preflight.max*`. One entry per
|
|
126
|
-
// Epic; re-runs replace prior content.
|
|
127
48
|
'delivery-preflight',
|
|
128
|
-
// Story #3062 (Epic #3051) — the deleted `wave-tick.js` upserted a
|
|
129
|
-
// `recurring-failure-class` comment on the Epic when the cross-Story
|
|
130
|
-
// detector finds two or more Stories that hit the same `failedGate` in
|
|
131
|
-
// `close-validate.end`. One entry per Epic; re-ticks with the same
|
|
132
|
-
// findings upsert in place (`upsertStructuredComment` diffs by body).
|
|
133
49
|
'recurring-failure-class',
|
|
134
|
-
// Story #3061 (Epic #3051) — the pre-v2 `/mandrel-deliver` idle-watchdog prose
|
|
135
|
-
// instructed the parent host LLM to upsert a `wave-stall` comment on the
|
|
136
|
-
// Epic whenever an in-flight Story had been silent for longer than the
|
|
137
|
-
// configured cadence. The deleted `wave-tick.js --check-idle` CLI emitted
|
|
138
|
-
// the matching envelope; registering the kind here keeps historical
|
|
139
|
-
// the documented remediation actually executable
|
|
140
|
-
// (assertValidStructuredCommentType would otherwise throw).
|
|
141
50
|
'wave-stall',
|
|
142
|
-
//
|
|
143
|
-
//
|
|
144
|
-
// claim timestamp. Nothing emits a per-run liveness beat, so this
|
|
145
|
-
// claim-time is the only age signal a reader has when reasoning about the
|
|
146
|
-
// documented `--steal` contract. The guard itself fails closed regardless
|
|
147
|
-
// (it anchors liveness to `now`), so a stranded claim is cleared with
|
|
148
|
-
// `--steal`, not by TTL expiry. One entry per ticket; re-acquires upsert
|
|
149
|
-
// in place.
|
|
51
|
+
// Records claimant + claim time; the guard fails closed, so a stranded
|
|
52
|
+
// claim is cleared with `--steal`, not by TTL.
|
|
150
53
|
'plan-lease',
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
// `cross-repo-deferred` comment listing findings that route
|
|
154
|
-
// to a different repository and were therefore not filed here. Replaces
|
|
155
|
-
// the prior log-line-only trace so the deferral survives the finalize
|
|
156
|
-
// run as a durable, operator-visible record. Discriminated by a
|
|
157
|
-
// `graduator="<name>"` attr so independent graduators do not clobber each
|
|
158
|
-
// other's comment; re-runs upsert in place.
|
|
54
|
+
// Discriminated by a `graduator="<name>"` attr so graduators don't clobber
|
|
55
|
+
// each other.
|
|
159
56
|
'cross-repo-deferred',
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
// success, carrying risk / routing receipts and the depends_on order
|
|
163
|
-
// table. One entry per plan; a re-persist upserts in place.
|
|
164
|
-
'plan-summary',
|
|
165
|
-
// v2 Stage 3 — flat Story persist checkpoint on every created Story
|
|
166
|
-
// (replaces epic-plan-state for new plans). plan-summary stays primary-only.
|
|
57
|
+
// The only comment persist posts on each Story; the marker makes a
|
|
58
|
+
// re-persist upsert in place.
|
|
167
59
|
'story-plan-state',
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
// Story that claims it (plus any per-supersede note the plan authored),
|
|
171
|
-
// immediately before closing the issue as `not_planned`. Keying off this
|
|
172
|
-
// marker rather than a bare `postComment` is what makes a re-run
|
|
173
|
-
// 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.
|
|
174
62
|
'superseded-by',
|
|
175
63
|
]);
|
|
176
64
|
|
|
177
65
|
export const WAVE_TYPE_PATTERN = WAVE_MARKER_RE;
|
|
178
66
|
|
|
179
67
|
/**
|
|
180
|
-
* Pool-mode claim
|
|
181
|
-
*
|
|
182
|
-
* authoritative entry — the label set is the actual race-detection signal).
|
|
183
|
-
* 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.
|
|
184
70
|
*/
|
|
185
71
|
const CLAIM_TYPE_PATTERN = /^claim-([0-9]{1,9})$/;
|
|
186
72
|
|
|
187
|
-
/**
|
|
188
|
-
* Lifecycle-listener marker pattern (Story #2239 / #2241 / #2242). The
|
|
189
|
-
* lifecycle StructuredCommentPoster writes minimal markers prefixed with
|
|
190
|
-
* `lifecycle-` (e.g. `lifecycle-wave-0-start`, `lifecycle-epic-blocked`,
|
|
191
|
-
* `lifecycle-epic-unblocked`). Treated as a generic prefix so future
|
|
192
|
-
* listener-owned events can mint new markers without touching this enum.
|
|
193
|
-
*/
|
|
73
|
+
/** Generic `lifecycle-*` prefix so listeners can mint markers freely. */
|
|
194
74
|
const LIFECYCLE_TYPE_PATTERN = /^lifecycle-[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
195
75
|
|
|
196
76
|
/**
|
|
@@ -208,10 +88,6 @@ export function isValidStructuredCommentType(type) {
|
|
|
208
88
|
}
|
|
209
89
|
|
|
210
90
|
/**
|
|
211
|
-
* Throws if `type` is not a recognized structured-comment type. Error
|
|
212
|
-
* message lists the accepted enum plus the wave pattern to make the
|
|
213
|
-
* schema discoverable from the failure alone.
|
|
214
|
-
*
|
|
215
91
|
* @param {string} type
|
|
216
92
|
*/
|
|
217
93
|
export function assertValidStructuredCommentType(type) {
|
|
@@ -223,18 +99,9 @@ export function assertValidStructuredCommentType(type) {
|
|
|
223
99
|
}
|
|
224
100
|
|
|
225
101
|
/**
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
* `findStructuredComment`.
|
|
230
|
-
*
|
|
231
|
-
* `attrs` lets a single `type` namespace coexist with multiple in-place
|
|
232
|
-
* snapshots keyed by an additional dimension. The canonical use is the
|
|
233
|
-
* per-wave `wave-run-progress` comment: each wave upserts its own snapshot
|
|
234
|
-
* via `{ wave: N }` so subsequent waves don't overwrite prior rows.
|
|
235
|
-
* Without the discriminator the next wave's upsert finds (and deletes) the
|
|
236
|
-
* prior wave's comment, leaving the cross-wave epic-run-progress rollup
|
|
237
|
-
* 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.
|
|
238
105
|
*
|
|
239
106
|
* @param {string} type
|
|
240
107
|
* @param {Record<string, string|number>} [attrs]
|
|
@@ -252,46 +119,14 @@ export function structuredCommentMarker(type, attrs = null) {
|
|
|
252
119
|
}
|
|
253
120
|
|
|
254
121
|
/**
|
|
255
|
-
* Per-provider
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
* Story #1795 — every Epic run owns its process for the duration of
|
|
259
|
-
* the run, so a single seed-then-reuse window saves one
|
|
260
|
-
* `getTicketComments` per repeat upsert on the hot path (`story-init`,
|
|
261
|
-
* `verification-results`, etc).
|
|
262
|
-
*
|
|
263
|
-
* Lifecycle:
|
|
264
|
-
* - First call to `findStructuredComment(provider, t, type, attrs)`
|
|
265
|
-
* hits `getTicketComments` and seeds the cache with the resolved
|
|
266
|
-
* comment (or `null` to record the "no comment yet" miss).
|
|
267
|
-
* - Subsequent calls with the same provider return the cached row
|
|
268
|
-
* without a list call.
|
|
269
|
-
* - `upsertStructuredComment` refreshes the cache to the new
|
|
270
|
-
* comment id after `postComment` succeeds.
|
|
271
|
-
* - `deleteComment` paths inside this module evict the entry.
|
|
272
|
-
*
|
|
273
|
-
* Cache is scoped to the provider instance via a WeakMap — different
|
|
274
|
-
* providers (including per-test fakes) get isolated caches so state
|
|
275
|
-
* cannot leak across boundaries. Tests reset via the exported
|
|
276
|
-
* `_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.
|
|
277
125
|
*/
|
|
278
126
|
const _structuredCommentCache = new WeakMap();
|
|
279
127
|
|
|
280
128
|
/**
|
|
281
|
-
*
|
|
282
|
-
* Tasks. Story #3097 (Wave-0 additive, Epic #3078 Strategy B) — the
|
|
283
|
-
* 2-tier hierarchy collapses Epic → Story → Task into
|
|
284
|
-
* Epic → Story, so a Story may legitimately have no Task
|
|
285
|
-
* children. Read-side callers that expect a `subTickets` array on the
|
|
286
|
-
* Story can route through this helper to materialise an empty-children
|
|
287
|
-
* snapshot without paying a provider round-trip and without risk of
|
|
288
|
-
* `undefined.map` dereferences. Pure / synchronous; never touches the
|
|
289
|
-
* provider.
|
|
290
|
-
*
|
|
291
|
-
* The function preserves every field on the input `ticket` and merely
|
|
292
|
-
* pins `subTickets` to `[]` when omitted. Callers that already hold a
|
|
293
|
-
* resolved children list pass it through; the Storyless path is the
|
|
294
|
-
* default.
|
|
129
|
+
* Snapshot of a ticket with `subTickets` pinned (default `[]`); pure.
|
|
295
130
|
*
|
|
296
131
|
* @param {object|null|undefined} ticket
|
|
297
132
|
* @param {{ subTickets?: Array<object> }} [opts]
|
|
@@ -305,7 +140,6 @@ export function buildStorylessTicketSnapshot(ticket, opts = {}) {
|
|
|
305
140
|
}
|
|
306
141
|
|
|
307
142
|
/**
|
|
308
|
-
* Lookup (or lazily create) the per-provider cache map.
|
|
309
143
|
* @param {object} provider
|
|
310
144
|
* @returns {Map<string, object|null>}
|
|
311
145
|
*/
|
|
@@ -320,8 +154,7 @@ export function getProviderCommentCache(provider) {
|
|
|
320
154
|
}
|
|
321
155
|
|
|
322
156
|
/**
|
|
323
|
-
*
|
|
324
|
-
* is normalised by sorted JSON so equivalent keys collide. Story #1795.
|
|
157
|
+
* Attrs are key-sorted so equivalent bags collide.
|
|
325
158
|
*
|
|
326
159
|
* @param {number} ticketId
|
|
327
160
|
* @param {string} type
|
|
@@ -340,31 +173,12 @@ export function structuredCommentCacheKey(ticketId, type, attrs) {
|
|
|
340
173
|
}
|
|
341
174
|
|
|
342
175
|
/**
|
|
343
|
-
* Per-provider
|
|
344
|
-
*
|
|
345
|
-
* call. Story #2465 — `findStructuredComment` is invoked back-to-back for
|
|
346
|
-
* different `type` discriminators against the same ticket (e.g.
|
|
347
|
-
* `story-init` + `verification-results` + a `friction` probe during a
|
|
348
|
-
* single close). Without this cache each lookup pays a full
|
|
349
|
-
* pagination round-trip even when the prior call already fetched the
|
|
350
|
-
* same comments. The structured-comment-id cache short-circuits *repeat*
|
|
351
|
-
* lookups for the same `(type, attrs)` tuple but does not help across
|
|
352
|
-
* different types on the same ticket.
|
|
353
|
-
*
|
|
354
|
-
* Lifecycle:
|
|
355
|
-
* - `findStructuredComment` consults this raw cache before issuing
|
|
356
|
-
* `provider.getTicketComments`; on cache miss it seeds the entry
|
|
357
|
-
* from the response.
|
|
358
|
-
* - `postStructuredComment` and `upsertStructuredComment` evict the
|
|
359
|
-
* entry for the mutated ticketId — any cached array is stale once
|
|
360
|
-
* a new comment lands.
|
|
361
|
-
* - Scoped per-provider via WeakMap so test fakes never share state
|
|
362
|
-
* 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.
|
|
363
178
|
*/
|
|
364
179
|
const _rawCommentsCache = new WeakMap();
|
|
365
180
|
|
|
366
181
|
/**
|
|
367
|
-
* Lookup (or lazily create) the per-provider raw-comments cache.
|
|
368
182
|
* @param {object} provider
|
|
369
183
|
* @returns {Map<number, object[]>}
|
|
370
184
|
*/
|
|
@@ -379,10 +193,6 @@ export function getProviderRawCommentsCache(provider) {
|
|
|
379
193
|
}
|
|
380
194
|
|
|
381
195
|
/**
|
|
382
|
-
* Evict the cached raw-comments array for a given ticket on a provider.
|
|
383
|
-
* Called from the structured-comment write paths after a `postComment`
|
|
384
|
-
* lands. Safe to call when no entry exists.
|
|
385
|
-
*
|
|
386
196
|
* @param {object} provider
|
|
387
197
|
* @param {number} ticketId
|
|
388
198
|
*/
|
|
@@ -394,9 +204,6 @@ export function invalidateRawCommentsCache(provider, ticketId) {
|
|
|
394
204
|
}
|
|
395
205
|
|
|
396
206
|
/**
|
|
397
|
-
* Test seam — reset the raw-comments cache for a provider. Mirrors
|
|
398
|
-
* `_resetStructuredCommentCache` for the structured-id cache.
|
|
399
|
-
*
|
|
400
207
|
* @param {object} [provider]
|
|
401
208
|
*/
|
|
402
209
|
export function _resetRawCommentsCache(provider) {
|
|
@@ -406,17 +213,7 @@ export function _resetRawCommentsCache(provider) {
|
|
|
406
213
|
}
|
|
407
214
|
|
|
408
215
|
/**
|
|
409
|
-
*
|
|
410
|
-
* Exported so unit tests can isolate cases without restarting the
|
|
411
|
-
* process. Without arguments the entire WeakMap is dropped by
|
|
412
|
-
* reassigning the per-provider map of every known provider — in
|
|
413
|
-
* practice tests just hand in their fresh provider instance which
|
|
414
|
-
* has no cached state yet. Production callers never invoke this.
|
|
415
|
-
*
|
|
416
|
-
* @param {object} [provider] When supplied, clears just that
|
|
417
|
-
* provider's cache; otherwise no-op (per-provider caches are
|
|
418
|
-
* already isolated by WeakMap and tests creating fresh providers
|
|
419
|
-
* get clean state automatically).
|
|
216
|
+
* @param {object} [provider] Clears that provider's cache; otherwise no-op.
|
|
420
217
|
*/
|
|
421
218
|
export function _resetStructuredCommentCache(provider) {
|
|
422
219
|
if (provider && typeof provider === 'object') {
|
|
@@ -425,12 +222,9 @@ export function _resetStructuredCommentCache(provider) {
|
|
|
425
222
|
}
|
|
426
223
|
|
|
427
224
|
/**
|
|
428
|
-
*
|
|
429
|
-
* Map for read-only inspection (do not mutate). Story #1795.
|
|
225
|
+
* Read-only view of a provider's cache (do not mutate).
|
|
430
226
|
*
|
|
431
|
-
* @param {object} [provider]
|
|
432
|
-
* cache Map; otherwise returns an empty Map for callers that just
|
|
433
|
-
* want a stable shape.
|
|
227
|
+
* @param {object} [provider]
|
|
434
228
|
*/
|
|
435
229
|
export function _peekStructuredCommentCache(provider) {
|
|
436
230
|
if (provider && typeof provider === 'object') {
|
|
@@ -440,20 +234,8 @@ export function _peekStructuredCommentCache(provider) {
|
|
|
440
234
|
}
|
|
441
235
|
|
|
442
236
|
/**
|
|
443
|
-
*
|
|
444
|
-
*
|
|
445
|
-
* `structuredCommentMarker(type, attrs)`.
|
|
446
|
-
*
|
|
447
|
-
* When `attrs` is provided, only comments whose marker carries the same
|
|
448
|
-
* discriminator attributes are returned — see `structuredCommentMarker` for
|
|
449
|
-
* the per-wave `wave-run-progress` use case.
|
|
450
|
-
*
|
|
451
|
-
* Story #1795 — results are memoised in a process-level cache keyed by
|
|
452
|
-
* `(ticketId, type, attrsHash)`. The first call seeds the cache with
|
|
453
|
-
* the resolved comment (or `null` for the "no such comment yet" miss);
|
|
454
|
-
* every subsequent call returns the cached row without issuing another
|
|
455
|
-
* `getTicketComments`. `upsertStructuredComment` refreshes the cache
|
|
456
|
-
* 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.
|
|
457
239
|
*
|
|
458
240
|
* @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
|
|
459
241
|
* @param {number} ticketId
|
|
@@ -473,10 +255,6 @@ export async function findStructuredComment(
|
|
|
473
255
|
return cache.get(cacheKey);
|
|
474
256
|
}
|
|
475
257
|
const marker = structuredCommentMarker(type, attrs);
|
|
476
|
-
// Story #2465 — consult the per-ticketId raw-comments cache before
|
|
477
|
-
// hitting the wire. Two back-to-back `findStructuredComment` calls for
|
|
478
|
-
// different types against the same ticket would otherwise both pay a
|
|
479
|
-
// full `getTicketComments` round-trip.
|
|
480
258
|
const rawCache = getProviderRawCommentsCache(provider);
|
|
481
259
|
let comments;
|
|
482
260
|
if (rawCache.has(ticketId)) {
|
|
@@ -485,7 +263,7 @@ export async function findStructuredComment(
|
|
|
485
263
|
comments = (await provider.getTicketComments(ticketId)) ?? [];
|
|
486
264
|
rawCache.set(ticketId, comments);
|
|
487
265
|
}
|
|
488
|
-
//
|
|
266
|
+
// Comments sort ascending by creation; take the last match.
|
|
489
267
|
const matches = comments.filter(
|
|
490
268
|
(c) => typeof c.body === 'string' && c.body.includes(marker),
|
|
491
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
|