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,59 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Signals schema — single source of
|
|
3
|
-
*
|
|
2
|
+
* Signals schema — the single source of event-kind constants, field names
|
|
3
|
+
* and the envelope guard for the NDJSON signal streams. Pure, no I/O.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* (
|
|
7
|
-
*
|
|
8
|
-
* on-disk NDJSON shape stays under one schema.
|
|
9
|
-
*
|
|
10
|
-
* Pure module: importing has **no I/O side effects**. The exported
|
|
11
|
-
* `EVENT_KINDS` object is `Object.freeze`'d so consumers can use it as a
|
|
12
|
-
* compile-time-ish constant without worrying about mutation.
|
|
13
|
-
*
|
|
14
|
-
* ## Event-kind enumeration
|
|
15
|
-
*
|
|
16
|
-
* The set below is the audited union of `kind:` literals emitted via
|
|
17
|
-
* `signals-writer.appendSignal` across the codebase as of Epic #1181
|
|
18
|
-
* (audit-snapshot 2026-05-11):
|
|
19
|
-
*
|
|
20
|
-
* Signals-writer `appendSignal` call sites:
|
|
21
|
-
* - `friction` — quality-gate / runtime friction (diagnose-friction.js,
|
|
22
|
-
* lib/gates/friction.js)
|
|
23
|
-
* - `acceptance-eval` — acceptance-eval.js per-criterion terminus signal.
|
|
24
|
-
* - `wave-start` / `wave-complete` — wave-window anchors.
|
|
25
|
-
* - `wave-end` — wave-window pairing anchor.
|
|
26
|
-
* - `state-transition` — notification-derived window anchor.
|
|
27
|
-
*
|
|
28
|
-
* The `dispatched` kind was deleted in the Epic #4406 signal-contract
|
|
29
|
-
* cutover — it had no live emitter and no consumer.
|
|
30
|
-
*
|
|
31
|
-
* Producerless kinds, pinned in the enum so a re-introduction needs no schema
|
|
32
|
-
* bump. Story #5003 deleted the last emitters of `trace` (the tool-trace hook
|
|
33
|
-
* and its `appendTrace` writer limb) and of `rework` / `retry` (the detector
|
|
34
|
-
* pair the hook fed); `hotspot`, `churn`, `idle` never had one:
|
|
35
|
-
* - `trace`, `hotspot`, `rework`, `churn`, `idle`, `retry`
|
|
36
|
-
*
|
|
37
|
-
* ## Common envelope (canonical — Epic #4406 / Story #4413)
|
|
38
|
-
*
|
|
39
|
-
* Every signal MUST carry at minimum:
|
|
40
|
-
* - `ts` — ISO-8601 timestamp string. The single canonical
|
|
41
|
-
* timestamp key; the legacy `timestamp:` alias was deleted
|
|
42
|
-
* from every writer and this guard in the same PR.
|
|
43
|
-
* - `kind` — one of `EVENT_KINDS`.
|
|
44
|
-
*
|
|
45
|
-
* Scoped signals additionally carry:
|
|
46
|
-
* - `epicId` — integer Epic ID (or `null` for standalone-Story
|
|
47
|
-
* friction). The single canonical epic-id key; the legacy
|
|
48
|
-
* `epic:` alias was deleted.
|
|
49
|
-
*
|
|
50
|
-
* Optional but commonly carried:
|
|
51
|
-
* - `storyId` — integer Story ID
|
|
52
|
-
* - `taskId` — integer Task ID (nullable)
|
|
53
|
-
* - `emitter` — `{ tool: string, command?: string }` provenance
|
|
54
|
-
* - `source` — `"framework" | "consumer"` classifier tag
|
|
55
|
-
* - `category` — top-level friction category string
|
|
56
|
-
* - `details` — kind-specific payload (always an object)
|
|
5
|
+
* Envelope: `ts` (ISO string), `kind` (an `EVENT_KINDS` value) and `epicId`
|
|
6
|
+
* (integer, or `null` for standalone-Story friction). No legacy aliases
|
|
7
|
+
* (`timestamp`, `epic`, …) are tolerated.
|
|
57
8
|
*
|
|
58
9
|
* @module lib/signals/schema
|
|
59
10
|
*/
|
|
@@ -62,71 +13,42 @@ import { isObject } from '../json-utils.js';
|
|
|
62
13
|
import { isPositiveInt } from './detectors/common.js';
|
|
63
14
|
|
|
64
15
|
/**
|
|
65
|
-
*
|
|
66
|
-
* `
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* Field names are kebab-cased to match the on-disk literals.
|
|
16
|
+
* Every emitted kind, plus producerless kinds (`trace`, wave-*, `hotspot`,
|
|
17
|
+
* `rework`, `churn`, `idle`, `retry`) pinned so a re-introduced emitter or
|
|
18
|
+
* reader needs no schema bump.
|
|
70
19
|
*/
|
|
71
20
|
export const EVENT_KINDS = Object.freeze({
|
|
72
21
|
FRICTION: 'friction',
|
|
73
22
|
TRACE: 'trace',
|
|
74
|
-
// Wave-window forensics signals. Story #4545 deleted the `waveParallelism`
|
|
75
|
-
// consumer (perf-aggregator) with the execution-analysis surface, and
|
|
76
|
-
// Story #5003 deleted the span-tree that paired them; the kinds stay
|
|
77
|
-
// pinned so a re-introduced window reader needs no schema bump.
|
|
78
23
|
WAVE_START: 'wave-start',
|
|
79
24
|
WAVE_END: 'wave-end',
|
|
80
25
|
WAVE_COMPLETE: 'wave-complete',
|
|
81
|
-
// Story #3909 — the write-only wave-lifecycle kinds with no consumer
|
|
82
|
-
// (`wave-tick`, `epic-complete`) were retired. They duplicated the
|
|
83
|
-
// `epic-run-state` checkpoint and the `epic-run-progress` rollup and nothing
|
|
84
|
-
// read them back.
|
|
85
26
|
STATE_TRANSITION: 'state-transition',
|
|
86
27
|
HOTSPOT: 'hotspot',
|
|
87
28
|
REWORK: 'rework',
|
|
88
29
|
CHURN: 'churn',
|
|
89
30
|
IDLE: 'idle',
|
|
90
31
|
RETRY: 'retry',
|
|
91
|
-
// Story #3819 — per-criterion acceptance self-eval signal emitted by
|
|
92
|
-
// acceptance-eval.js. One record per Story per eval-loop terminus,
|
|
93
|
-
// carrying which acceptance items needed rework and the round count, so
|
|
94
|
-
// the retro and /mandrel-plan Phase 0 feedback fetch can see acceptance
|
|
95
|
-
// churn alongside friction/hotspot data.
|
|
96
32
|
ACCEPTANCE_EVAL: 'acceptance-eval',
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
// when a lifecycle event maps to a webhook notification — the resume
|
|
100
|
-
// suite reads it back to prove a dispatch survived a crash window without
|
|
101
|
-
// duplicating. Enumerated so the write-time validator (Story #4413) does
|
|
102
|
-
// not drop it; it is a deliberate write, not malformed data.
|
|
33
|
+
// Written by the notify dispatcher so resume can prove a dispatch survived a
|
|
34
|
+
// crash window; enumerated so the write-time validator does not drop it.
|
|
103
35
|
NOTIFICATION_EMITTED: 'notification.emitted',
|
|
104
36
|
});
|
|
105
37
|
|
|
106
38
|
/**
|
|
107
|
-
* The set of event-kind string values (for fast membership checks).
|
|
108
|
-
*
|
|
109
39
|
* @type {ReadonlySet<string>}
|
|
110
40
|
*/
|
|
111
41
|
export const EVENT_KIND_VALUES = Object.freeze(
|
|
112
42
|
new Set(Object.values(EVENT_KINDS)),
|
|
113
43
|
);
|
|
114
44
|
|
|
115
|
-
/**
|
|
116
|
-
* Field-name constants exported so reader/aggregator code does not
|
|
117
|
-
* spread string literals across the module graph.
|
|
118
|
-
*/
|
|
119
45
|
export const FIELDS = Object.freeze({
|
|
120
|
-
// Canonical envelope keys — there is exactly one key per concept. The
|
|
121
|
-
// legacy `timestamp` / `epic` / `story` / `task` aliases were deleted in
|
|
122
|
-
// the Epic #4406 signal-contract cutover; no reader tolerates them.
|
|
123
46
|
TS: 'ts',
|
|
124
47
|
EPIC_ID: 'epicId',
|
|
125
48
|
STORY_ID: 'storyId',
|
|
126
49
|
TASK_ID: 'taskId',
|
|
127
50
|
KIND: 'kind',
|
|
128
51
|
|
|
129
|
-
// Common payload fields
|
|
130
52
|
EMITTER: 'emitter',
|
|
131
53
|
SOURCE: 'source',
|
|
132
54
|
DETAILS: 'details',
|
|
@@ -135,9 +57,7 @@ export const FIELDS = Object.freeze({
|
|
|
135
57
|
});
|
|
136
58
|
|
|
137
59
|
/**
|
|
138
|
-
*
|
|
139
|
-
* We don't fully validate format here — the schema's contract is "looks
|
|
140
|
-
* like a timestamp string", not "round-trips through Date.parse exactly".
|
|
60
|
+
* "Looks like a timestamp string" — the format is not validated.
|
|
141
61
|
*
|
|
142
62
|
* @param {unknown} v
|
|
143
63
|
* @returns {boolean}
|
|
@@ -147,13 +67,6 @@ function isTimestamp(v) {
|
|
|
147
67
|
}
|
|
148
68
|
|
|
149
69
|
/**
|
|
150
|
-
* Common envelope guard: every signal MUST carry `ts`, `epicId`, and a
|
|
151
|
-
* recognised `kind`. Canonical keys only — the legacy `timestamp` / `epic`
|
|
152
|
-
* aliases were deleted in the Epic #4406 cutover.
|
|
153
|
-
*
|
|
154
|
-
* Returns true when the envelope is well-formed. Used by the stream readers
|
|
155
|
-
* to discard malformed lines before yielding them to the consumer.
|
|
156
|
-
*
|
|
157
70
|
* @param {unknown} evt
|
|
158
71
|
* @returns {boolean}
|
|
159
72
|
*/
|
|
@@ -163,23 +76,15 @@ export function hasCommonEnvelope(evt) {
|
|
|
163
76
|
return false;
|
|
164
77
|
}
|
|
165
78
|
if (!isTimestamp(evt.ts)) return false;
|
|
166
|
-
// The
|
|
167
|
-
// legacy `epic` alias is rejected (the cutover deleted that alias). Its
|
|
168
|
-
// value is nullable by contract: standalone-Story friction carries
|
|
169
|
-
// `epicId: null` (see signal-event.schema.json, where epicId is
|
|
170
|
-
// `["integer","null"]`). So accept an explicit null, reject a missing key
|
|
171
|
-
// or a present-but-non-positive-int value.
|
|
79
|
+
// The key must be present; its value may be null but never a non-positive int.
|
|
172
80
|
if (!Object.hasOwn(evt, 'epicId')) return false;
|
|
173
81
|
if (evt.epicId !== null && !isPositiveInt(evt.epicId)) return false;
|
|
174
82
|
return true;
|
|
175
83
|
}
|
|
176
84
|
|
|
177
85
|
/**
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
* canonical-shape check lives in the AJV validator compiled from
|
|
181
|
-
* `signal-event.schema.json` (see `lib/observability/signal-validator.js`);
|
|
182
|
-
* this predicate is the cheap envelope gate the streaming reader uses.
|
|
86
|
+
* Cheap envelope gate for the streaming reader; the full shape check is the
|
|
87
|
+
* AJV validator in `lib/observability/signal-validator.js`.
|
|
183
88
|
*
|
|
184
89
|
* @param {unknown} evt
|
|
185
90
|
* @param {string} [kind] — optional kind to match (one of `EVENT_KINDS`).
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `lib/signals/write.js` —
|
|
3
|
-
*
|
|
4
|
-
* The real implementation lives at `../observability/signals-writer.js`
|
|
5
|
-
* (Epic #1030 / Story #1041). This module exists so callers can converge
|
|
6
|
-
* on `lib/signals/` for the write surface. New code should
|
|
7
|
-
* `import { appendSignal } from './lib/signals/index.js'` (or
|
|
8
|
-
* `'./lib/signals/write.js'` for a narrower import); legacy direct imports
|
|
9
|
-
* from `lib/observability/` keep working unchanged.
|
|
10
|
-
*
|
|
11
|
-
* `appendTrace` was removed in Story #5003 together with the tool-trace
|
|
12
|
-
* hook — its only producer — and the viewer that was its only reader.
|
|
2
|
+
* `lib/signals/write.js` — re-export of `../observability/signals-writer.js`
|
|
3
|
+
* so callers converge on `lib/signals/` for the write surface.
|
|
13
4
|
*/
|
|
14
5
|
|
|
15
6
|
export {
|
|
@@ -1,62 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* confirm-merge.js — post-merge confirmation for a standalone Story.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* `agent::closing
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* PR-open. This module is that driver: it reads the live PR state, and
|
|
10
|
-
* only once the merge is confirmed (`state === 'MERGED'`) flips
|
|
11
|
-
* `agent::closing → agent::done` — which routes through the canonical
|
|
12
|
-
* `transitionTicketState` mutator that closes the issue
|
|
13
|
-
* (`state: 'closed'`, `state_reason: 'completed'`).
|
|
14
|
-
*
|
|
15
|
-
* Outcomes (returned as a structured envelope, never thrown for the
|
|
16
|
-
* not-yet-merged / recoverable cases so the CI-watch loop can re-poll):
|
|
17
|
-
*
|
|
18
|
-
* - `{ action: 'done', merged: true }`
|
|
19
|
-
* PR merged → flipped `agent::done`, issue closed.
|
|
20
|
-
* - `{ action: 'noop', reason: 'already-done' }`
|
|
21
|
-
* Story already carries `agent::done`. A closed issue *alone* does
|
|
22
|
-
* NOT short-circuit — GitHub's `Closes #<id>` footer closes the issue
|
|
23
|
-
* on auto-merge before this step runs, so a closed issue whose label
|
|
24
|
-
* is still `agent::closing` must still drive the `agent::done` flip
|
|
25
|
-
* (Story #3415).
|
|
26
|
-
* - `{ action: 'pending', reason: 'pr-open' | 'pr-not-merged' }`
|
|
27
|
-
* PR is still open (or closed-without-merge); the Story is left at
|
|
28
|
-
* `agent::closing` and the issue stays OPEN. Recoverable — re-run
|
|
29
|
-
* once the merge lands.
|
|
30
|
-
*
|
|
31
|
-
* This mirrors the epic path's `assertMergeReachable` gate in
|
|
32
|
-
* `post-merge-close.js`: the `agent::done` transition is the single
|
|
33
|
-
* writer gated behind a confirmed merge, so the label sequence is exactly
|
|
34
|
-
* `executing → closing → done` on a successful close and
|
|
35
|
-
* `executing → closing` (sticky) on a stalled / failed PR.
|
|
4
|
+
* Auto-merge completes asynchronously after close exits, so the
|
|
5
|
+
* `agent::closing → agent::done` flip (which closes the issue) is gated on a
|
|
6
|
+
* confirmed `MERGED` PR here, never fired at PR-open. Not-yet-merged cases
|
|
7
|
+
* return `pending` rather than throw so the CI-watch loop can re-poll; a
|
|
8
|
+
* stalled PR leaves the Story sticky at `agent::closing`.
|
|
36
9
|
*/
|
|
37
10
|
|
|
38
11
|
import { notify as defaultNotify } from '../../notify.js';
|
|
39
12
|
import { gh as defaultGh } from '../gh-exec.js';
|
|
40
13
|
import { Logger } from '../Logger.js';
|
|
14
|
+
import { isPrMerged } from '../orchestration/merge-poll.js';
|
|
41
15
|
import {
|
|
42
16
|
STATE_LABELS,
|
|
43
17
|
transitionTicketState,
|
|
44
18
|
} from '../orchestration/ticketing.js';
|
|
45
19
|
|
|
46
20
|
/**
|
|
47
|
-
* Read the live PR state for `prNumber` via `gh pr view --json`.
|
|
48
|
-
*
|
|
49
21
|
* @param {{ cwd: string, prNumber: number, gh?: object }} args
|
|
50
22
|
* @returns {Promise<{ state: string|null, mergedAt: string|null }>}
|
|
51
23
|
*/
|
|
52
24
|
export async function readPrMergeState({ cwd, prNumber, gh = defaultGh }) {
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
// `ensurePullRequestWith`); the CLI runs from the main-repo so the
|
|
56
|
-
// effective cwd is correct.
|
|
25
|
+
// gh-exec spawns against the process cwd (the main repo); `cwd` is
|
|
26
|
+
// accepted for call-site clarity only.
|
|
57
27
|
void cwd;
|
|
58
28
|
const view = await gh.pr.view(prNumber, ['state', 'mergedAt']);
|
|
59
|
-
// `gh.pr.view` resolves the parsed JSON when `--json` fields are passed.
|
|
60
29
|
return {
|
|
61
30
|
state: typeof view?.state === 'string' ? view.state : null,
|
|
62
31
|
mergedAt: typeof view?.mergedAt === 'string' ? view.mergedAt : null,
|
|
@@ -64,22 +33,22 @@ export async function readPrMergeState({ cwd, prNumber, gh = defaultGh }) {
|
|
|
64
33
|
}
|
|
65
34
|
|
|
66
35
|
/**
|
|
67
|
-
* Confirm a standalone Story's PR merged and flip `agent::closing →
|
|
68
|
-
* agent::done` (closing the issue) when it has.
|
|
69
|
-
*
|
|
70
36
|
* @param {object} args
|
|
71
37
|
* @param {object} args.provider Ticketing provider.
|
|
72
38
|
* @param {number} args.storyId
|
|
73
39
|
* @param {number} args.prNumber
|
|
74
40
|
* @param {string} [args.prUrl]
|
|
75
|
-
* @param {string} args.cwd
|
|
76
|
-
* @param {object} [args.config]
|
|
41
|
+
* @param {string} args.cwd
|
|
42
|
+
* @param {object} [args.config]
|
|
77
43
|
* @param {Function} [args.progress]
|
|
78
|
-
* @param {object} [args.injectedGh]
|
|
79
|
-
* @param {Function} [args.injectedNotify]
|
|
44
|
+
* @param {object} [args.injectedGh]
|
|
45
|
+
* @param {Function} [args.injectedNotify]
|
|
80
46
|
* @param {(args: object) => Promise<{state: string|null, mergedAt: string|null}>} [args.readPrMergeStateFn]
|
|
81
|
-
*
|
|
82
|
-
*
|
|
47
|
+
* @param {{ state: string|null, mergedAt: string|null }} [args.prState] The
|
|
48
|
+
* merge state the caller already read, so a land reads it once; omitted,
|
|
49
|
+
* it is read here.
|
|
50
|
+
* @returns {Promise<object>} `done` | `noop` (already-done) | `pending`
|
|
51
|
+
* (pr-open / pr-not-merged) | `flip-failed`.
|
|
83
52
|
*/
|
|
84
53
|
export async function confirmStoryMerged({
|
|
85
54
|
provider,
|
|
@@ -92,23 +61,16 @@ export async function confirmStoryMerged({
|
|
|
92
61
|
injectedGh,
|
|
93
62
|
injectedNotify,
|
|
94
63
|
readPrMergeStateFn = readPrMergeState,
|
|
64
|
+
prState,
|
|
95
65
|
}) {
|
|
96
66
|
progress?.('CONFIRM', `Confirming merge for standalone Story #${storyId}...`);
|
|
97
67
|
|
|
98
68
|
const story = await provider.getTicket(storyId);
|
|
99
69
|
|
|
100
|
-
//
|
|
101
|
-
// `
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
// routinely arrives here with `state === 'closed'`. Gating the noop on
|
|
105
|
-
// `state === 'closed'` mistook that for already-done and skipped the
|
|
106
|
-
// `agent::closing → agent::done` flip, stranding the label and the
|
|
107
|
-
// Projects board at "In Progress" (reproduced on Story #3413 / PR #3414).
|
|
108
|
-
// Requiring the `agent::done` label preserves idempotence for a genuinely
|
|
109
|
-
// finished Story while still driving the flip for the closed-by-footer
|
|
110
|
-
// case below (`transitionTicketState` is idempotent against an
|
|
111
|
-
// already-closed issue).
|
|
70
|
+
// Only the `agent::done` label short-circuits. A closed issue alone does
|
|
71
|
+
// not: the PR's `Closes #<id>` footer closes it before this step runs, and
|
|
72
|
+
// the flip must still happen (transitionTicketState is idempotent on a
|
|
73
|
+
// closed issue).
|
|
112
74
|
if (story.labels?.includes(STATE_LABELS.DONE)) {
|
|
113
75
|
progress?.(
|
|
114
76
|
'CONFIRM',
|
|
@@ -117,14 +79,15 @@ export async function confirmStoryMerged({
|
|
|
117
79
|
return { storyId, action: 'noop', reason: 'already-done', merged: true };
|
|
118
80
|
}
|
|
119
81
|
|
|
120
|
-
const { state, mergedAt } =
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
82
|
+
const { state, mergedAt } =
|
|
83
|
+
prState ??
|
|
84
|
+
(await readPrMergeStateFn({
|
|
85
|
+
cwd,
|
|
86
|
+
prNumber,
|
|
87
|
+
gh: injectedGh,
|
|
88
|
+
}));
|
|
125
89
|
|
|
126
|
-
|
|
127
|
-
if (!isMerged) {
|
|
90
|
+
if (!isPrMerged({ state, mergedAt })) {
|
|
128
91
|
const reason = state === 'CLOSED' ? 'pr-not-merged' : 'pr-open';
|
|
129
92
|
progress?.(
|
|
130
93
|
'CONFIRM',
|
|
@@ -133,11 +96,7 @@ export async function confirmStoryMerged({
|
|
|
133
96
|
return { storyId, action: 'pending', reason, merged: false };
|
|
134
97
|
}
|
|
135
98
|
|
|
136
|
-
//
|
|
137
|
-
// through the canonical mutator, which closes the issue
|
|
138
|
-
// (`state: 'closed'`, `state_reason: 'completed'`) on the `agent::done`
|
|
139
|
-
// transition. Best-effort: a flaky GitHub API must not crash the
|
|
140
|
-
// confirmation (the CI-watch loop re-runs idempotently).
|
|
99
|
+
// Best-effort: a flaky API must not crash confirmation; re-runs are idempotent.
|
|
141
100
|
const flipped = await flipDone(provider, storyId, story, progress);
|
|
142
101
|
if (flipped) {
|
|
143
102
|
await fireStoryMergedNotify({
|
|
@@ -1,26 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* story-merged-notify.js — flip a standalone Story to its close-entry rest
|
|
3
|
-
* state and fire the
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* auto-merge completes *asynchronously* after `single-story-close.js`
|
|
8
|
-
* exits, so closing the issue at PR-open left the Story marked "done"
|
|
9
|
-
* while its PR could still fail CI, go `BEHIND` base, or be closed
|
|
10
|
-
* without merging — stranding a CLOSED issue with no merged work.
|
|
11
|
-
*
|
|
12
|
-
* The fix brings the standalone path to parity with the epic path
|
|
13
|
-
* (#2155): the Story rests at `agent::closing` while the PR is open with
|
|
14
|
-
* auto-merge armed, and only flips `agent::done` (closing the issue) once
|
|
15
|
-
* the merge is confirmed by the post-merge confirmation step
|
|
16
|
-
* (`single-story-confirm-merge.js`, invoked by the CI-watch loop in
|
|
17
|
-
* `single-story-deliver.md` Step 5). This module owns the close-entry
|
|
18
|
-
* `agent::closing` flip + the `story-closing` notify; the `agent::done`
|
|
19
|
-
* flip + the `story-merged` notify live in `./confirm-merge.js`.
|
|
20
|
-
*
|
|
21
|
-
* Both the label flip and the notify dispatch are best-effort: failures
|
|
22
|
-
* are logged and swallowed so neither a flaky GitHub API nor a flaky
|
|
23
|
-
* webhook ever fails the close.
|
|
3
|
+
* state, `agent::closing`, and fire the `story-closing` notify. The issue
|
|
4
|
+
* stays open until confirm-merge.js sees the merge, because auto-merge lands
|
|
5
|
+
* asynchronously and the PR can still fail. Both steps are best-effort:
|
|
6
|
+
* failures are logged and swallowed, never failing the close.
|
|
24
7
|
*/
|
|
25
8
|
|
|
26
9
|
import { notify as defaultNotify } from '../../notify.js';
|
|
@@ -63,34 +46,10 @@ export async function flipLabelAndNotify({
|
|
|
63
46
|
|
|
64
47
|
async function flipLabel(provider, storyId, story, progress, config) {
|
|
65
48
|
try {
|
|
66
|
-
//
|
|
67
|
-
// canonical mutator
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
// issue OPEN, which is exactly the rest state the standalone path must
|
|
71
|
-
// hold while the PR is open with auto-merge armed.
|
|
72
|
-
//
|
|
73
|
-
// Route through the canonical state mutator so the Projects v2 Status
|
|
74
|
-
// column mirrors the `agent::closing` flip (Story #2548 wires
|
|
75
|
-
// column-sync inside `transitionTicketState`). Threading the
|
|
76
|
-
// prefetched `story` as `ticketSnapshot` preserves the round-trip
|
|
77
|
-
// elimination from Story #1795.
|
|
78
|
-
//
|
|
79
|
-
// Cascade is left at the default (true) so Stories that have a parent
|
|
80
|
-
// Feature (e.g. an Epic-parented Story closed via the standalone path)
|
|
81
|
-
// propagate the `agent::closing` state upward. For truly standalone
|
|
82
|
-
// Stories with no parent the cascade short-circuits immediately via
|
|
83
|
-
// the provider-capability guard in `cascadeParentState`, so there is
|
|
84
|
-
// no extra cost.
|
|
85
|
-
//
|
|
86
|
-
// We deliberately omit `notify` here: the `state-transition`
|
|
87
|
-
// notification that `transitionTicketState` would dispatch is
|
|
88
|
-
// redundant with the typed `story-closing` event that
|
|
89
|
-
// `fireStoryClosingNotify` emits immediately afterwards.
|
|
90
|
-
//
|
|
91
|
-
// `config` is threaded so the on-disk board-metadata cache (issue #4555)
|
|
92
|
-
// lands under the project's configured `tempRoot` rather than the
|
|
93
|
-
// framework default, matching every other transition call site.
|
|
49
|
+
// Only an `agent::done` transition closes the issue, so this leaves it
|
|
50
|
+
// open. The canonical mutator also syncs the board column and cascades
|
|
51
|
+
// to any parent. `notify` is omitted: the typed `story-closing` event
|
|
52
|
+
// below supersedes the generic state-transition one.
|
|
94
53
|
await transitionTicketState(provider, storyId, STATE_LABELS.CLOSING, {
|
|
95
54
|
ticketSnapshot: story,
|
|
96
55
|
config,
|
|
@@ -1,35 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* single-story-sweep/protection-ctx.js
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* callers — `single-story-init.js` and the
|
|
8
|
-
* `boot-sweep.js` CLI — build an identical ctx instead of each re-wiring
|
|
9
|
-
* the git/gh/ticket ports.
|
|
10
|
-
*
|
|
11
|
-
* Story #2990: the sweep protection-ctx `ghRunner` stays on raw
|
|
12
|
-
* `spawnSync('gh', …)` (not the `lib/gh-exec.js` async facade) because
|
|
13
|
-
* `executeCleanup` invokes the protection checks inside a synchronous
|
|
14
|
-
* candidate-filter loop. The runner contract is the legacy
|
|
15
|
-
* `(args, opts) => stdout string` shape.
|
|
4
|
+
* The one builder of the `evaluateProtection` ctx for every sweep caller.
|
|
5
|
+
* `ghRunner` stays on synchronous `spawnSync` (not the async gh-exec facade)
|
|
6
|
+
* because the checks run inside a synchronous candidate-filter loop.
|
|
16
7
|
*/
|
|
17
8
|
|
|
18
9
|
import { spawnSync as defaultSpawnSync } from 'node:child_process';
|
|
19
10
|
import { gitSpawn } from '../git-utils.js';
|
|
20
11
|
|
|
21
12
|
/**
|
|
22
|
-
* Build the synchronous `gh` runner the sweep uses for its
|
|
23
|
-
* candidate-protection checks.
|
|
24
|
-
*
|
|
25
|
-
* Story #4073: the `spawnImpl` seam injects the `spawnSync` boundary so
|
|
26
|
-
* the runner's success/error handling can be unit-tested without a live
|
|
27
|
-
* `gh` binary. It defaults to `child_process.spawnSync`, so the
|
|
28
|
-
* production CLI path is unchanged.
|
|
29
|
-
*
|
|
30
13
|
* @param {string} cwd Repo root used as the default spawn cwd.
|
|
31
|
-
* @param {typeof defaultSpawnSync} [spawnImpl]
|
|
32
|
-
* defaults to `child_process.spawnSync`.
|
|
14
|
+
* @param {typeof defaultSpawnSync} [spawnImpl]
|
|
33
15
|
* @returns {(args: string[], opts?: { cwd?: string }) => string}
|
|
34
16
|
*/
|
|
35
17
|
export function makeGhRunner(cwd, spawnImpl = defaultSpawnSync) {
|
|
@@ -49,10 +31,6 @@ export function makeGhRunner(cwd, spawnImpl = defaultSpawnSync) {
|
|
|
49
31
|
}
|
|
50
32
|
|
|
51
33
|
/**
|
|
52
|
-
* Build the `evaluateProtection` ctx bag: the repo root, the `gitSpawn`
|
|
53
|
-
* port, the synchronous `gh` runner, and a `getTicket` port bound to the
|
|
54
|
-
* supplied provider.
|
|
55
|
-
*
|
|
56
34
|
* @param {{
|
|
57
35
|
* cwd: string,
|
|
58
36
|
* provider: { getTicket: (id: number) => Promise<object> },
|