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,18 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The chained `/mandrel-plan` path files Stories from an audit seed, and until
|
|
6
|
-
* Story #5307 those Stories were invisible to the sweep that proposed them:
|
|
7
|
-
* they carried no `audit::*` label, so they were absent from the label-listed
|
|
8
|
-
* corpus dedup indexes, and nothing recorded them in the cross-run ledger. The
|
|
9
|
-
* provenance footers `carryProvenanceFooters` stamps could not cover for
|
|
10
|
-
* either — with an index in play the exact lookup is answered from that pool
|
|
11
|
-
* and never reaches the provider.
|
|
12
|
-
*
|
|
13
|
-
* Both halves ride the create loop in `story-ops.js` because that is the only
|
|
14
|
-
* seam on this path that cannot be forgotten: there is no second required pass
|
|
15
|
-
* here the way `--wire-edges` is one for the standalone filer.
|
|
2
|
+
* What an audit-seeded plan leaves for the next sweep: `audit::*` labels (the
|
|
3
|
+
* dedup corpus is label-listed, so footers alone are invisible to an indexed
|
|
4
|
+
* sweep) and cross-run ledger entries.
|
|
16
5
|
*/
|
|
17
6
|
|
|
18
7
|
import {
|
|
@@ -29,11 +18,6 @@ import {
|
|
|
29
18
|
import { Logger } from '../../Logger.js';
|
|
30
19
|
|
|
31
20
|
/**
|
|
32
|
-
* A fresh accumulator for one persist run's audit filings.
|
|
33
|
-
*
|
|
34
|
-
* The run collects into this and flushes once, so a plan that files N Stories
|
|
35
|
-
* leaves one reviewable ledger diff rather than N.
|
|
36
|
-
*
|
|
37
21
|
* @param {string} [ledgerPath]
|
|
38
22
|
* @returns {{ path: string, ledger: object|null, recorded: number, ambiguous: number }}
|
|
39
23
|
*/
|
|
@@ -47,20 +31,12 @@ function newAuditLedgerRecord(ledgerPath) {
|
|
|
47
31
|
}
|
|
48
32
|
|
|
49
33
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* label only scopes which issues the next sweep's corpus fetch returns, and
|
|
54
|
-
* matching inside that corpus is by fingerprint and semantic key. A superset
|
|
55
|
-
* corpus can therefore only ever find more, never less — so erring wide is the
|
|
56
|
-
* safe direction, and it keeps lens-to-label knowledge in the audit filer that
|
|
57
|
-
* owns it rather than re-deriving a dimension here (the junk-derivation trap
|
|
58
|
-
* Story #4195 closed).
|
|
59
|
-
*
|
|
60
|
-
* A non-audit seed carries no such footer, so this is a no-op there.
|
|
34
|
+
* Labels come from the seed union, not per-Story attribution: a label only
|
|
35
|
+
* widens the next sweep's corpus (matching is by fingerprint), so erring
|
|
36
|
+
* wide is safe.
|
|
61
37
|
*
|
|
62
|
-
* @param {Array<object>} stories
|
|
63
|
-
* @param {string} [provenanceSource]
|
|
38
|
+
* @param {Array<object>} stories
|
|
39
|
+
* @param {string} [provenanceSource]
|
|
64
40
|
* @returns {Array<object>}
|
|
65
41
|
*/
|
|
66
42
|
export function withAuditLabels(stories, provenanceSource) {
|
|
@@ -73,19 +49,9 @@ export function withAuditLabels(stories, provenanceSource) {
|
|
|
73
49
|
}
|
|
74
50
|
|
|
75
51
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* recorded is exactly what was stamped — attribution already applied. A Story
|
|
80
|
-
* from a non-audit plan carries no footers and records nothing, which is why
|
|
81
|
-
* a `--seed` or `--tickets` run never touches the ledger file at all.
|
|
82
|
-
*
|
|
83
|
-
* **The union fallback is deliberately NOT recorded.** When the seed carried
|
|
84
|
-
* footers but the plan attributed none per-Story, every sibling carries every
|
|
85
|
-
* fingerprint; binding a finding to one of them would be a coin flip, and a
|
|
86
|
-
* wrong binding is worse than none — the finding would be suppressed against an
|
|
87
|
-
* Issue that never tracked it, or resurrected when an unrelated Story closed.
|
|
88
|
-
* The audit path stamps `provenance` mechanically, so this is the exception.
|
|
52
|
+
* Identities are read off the stamped body. Union-carried (unattributed)
|
|
53
|
+
* footers are never recorded: every sibling carries them, and a wrong
|
|
54
|
+
* binding is worse than none.
|
|
89
55
|
*
|
|
90
56
|
* @param {{ story: object, id: number, ledgerRecord: object, attributed: boolean }} args
|
|
91
57
|
*/
|
|
@@ -112,12 +78,6 @@ function recordAuditFiling({ story, id, ledgerRecord, attributed }) {
|
|
|
112
78
|
}
|
|
113
79
|
|
|
114
80
|
/**
|
|
115
|
-
* Persist the run's audit filings, once, after every Story exists.
|
|
116
|
-
*
|
|
117
|
-
* Writing per-Story would rewrite a committed baseline N times for one plan;
|
|
118
|
-
* writing once keeps the diff to a single reviewable change. A run that
|
|
119
|
-
* recorded nothing writes nothing.
|
|
120
|
-
*
|
|
121
81
|
* @param {object} ledgerRecord
|
|
122
82
|
* @param {{ warn: Function }} logger
|
|
123
83
|
*/
|
|
@@ -138,27 +98,16 @@ function flushAuditLedger(ledgerRecord, logger) {
|
|
|
138
98
|
}
|
|
139
99
|
|
|
140
100
|
/**
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* Driven from the persist orchestrator rather than from inside the create loop:
|
|
144
|
-
* the loop's job is to create issues, and this is the only other place that
|
|
145
|
-
* always runs after it. Either seam is unforgettable — there is no second
|
|
146
|
-
* required pass on this path the way `--wire-edges` is one for the standalone
|
|
147
|
-
* filer — and keeping the side effect at the orchestration layer leaves the
|
|
148
|
-
* create loop doing one thing.
|
|
149
|
-
*
|
|
150
|
-
* One write per plan, not per Story: the ledger is committed state, and N
|
|
151
|
-
* rewrites of it for one plan is a diff nobody can review. A run that recorded
|
|
152
|
-
* nothing — a non-audit plan, or one whose identities were all union-carried —
|
|
153
|
-
* writes nothing at all.
|
|
101
|
+
* One ledger write per plan, not per Story — the ledger is committed state.
|
|
102
|
+
* A run that recorded nothing writes nothing.
|
|
154
103
|
*
|
|
155
104
|
* @param {object} params
|
|
156
|
-
* @param {Array<object>} params.stories
|
|
157
|
-
* @param {Array<{ slug: string, id: number }>} params.created
|
|
158
|
-
* @param {Array<object>} params.tickets
|
|
105
|
+
* @param {Array<object>} params.stories
|
|
106
|
+
* @param {Array<{ slug: string, id: number }>} params.created
|
|
107
|
+
* @param {Array<object>} params.tickets
|
|
159
108
|
* @param {string} [params.ledgerPath]
|
|
160
109
|
* @param {{ warn: Function }} [params.logger]
|
|
161
|
-
* @param {boolean} [params.dryRun]
|
|
110
|
+
* @param {boolean} [params.dryRun]
|
|
162
111
|
* @returns {{ recorded: number, ambiguous: number }}
|
|
163
112
|
*/
|
|
164
113
|
export function recordAuditFilings({
|
|
@@ -169,14 +118,10 @@ export function recordAuditFilings({
|
|
|
169
118
|
logger,
|
|
170
119
|
dryRun = false,
|
|
171
120
|
}) {
|
|
172
|
-
// A dry run created no issue to record against, and must not touch committed
|
|
173
|
-
// state. Owned here rather than at the call site so the contract is testable.
|
|
174
121
|
if (dryRun) return { recorded: 0, ambiguous: 0 };
|
|
175
122
|
const record = newAuditLedgerRecord(ledgerPath);
|
|
176
123
|
const idBySlug = new Map((created ?? []).map((c) => [c.slug, c.id]));
|
|
177
|
-
// Attribution is
|
|
178
|
-
// raw tickets rather than threaded through assembly: a Story that declared no
|
|
179
|
-
// `provenance` inherited the seed union, where ownership is a coin flip.
|
|
124
|
+
// Attribution is what the plan authored, so read it off the raw tickets.
|
|
180
125
|
const attributedSlugs = new Set(
|
|
181
126
|
(tickets ?? [])
|
|
182
127
|
.filter((t) => t?.provenance !== undefined && t?.provenance !== null)
|
|
@@ -1,37 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* anyway and charged the author a full re-drafting round to paste that exact
|
|
9
|
-
* object back. Story #5005 made the same call for the verify-tier suffix and
|
|
10
|
-
* repaired it instead; the suffix is gone now, and the repair moves to the
|
|
11
|
-
* one formality left: this module applies the inference the validator
|
|
12
|
-
* trusts, so the dry-run rewrites and **reports** each repair rather than
|
|
13
|
-
* refusing on it.
|
|
14
|
-
*
|
|
15
|
-
* Two shapes are repaired, on both authoring surfaces (a structured object
|
|
16
|
-
* body's `changes[]` array and a serialized string body's `## Changes`
|
|
17
|
-
* section):
|
|
18
|
-
*
|
|
19
|
-
* - a **plain-string bullet** (`src/app.js`, `` `src/app.js` ``,
|
|
20
|
-
* `src/app.js — adds the route`) becomes `{ path, assumption }`, the
|
|
21
|
-
* assumption resolved by probing the base branch — a path present at
|
|
22
|
-
* base is a `refactors-existing`, an absent one a `creates`;
|
|
23
|
-
* - a **trailing parenthetical** on a path (`src/app.js (new)`,
|
|
24
|
-
* `` `src/app.js (creates)` — refactors-existing ``) is stripped; an
|
|
25
|
-
* authored assumption is kept, an absent one probed as above.
|
|
26
|
-
*
|
|
27
|
-
* A string nothing path-shaped can be salvaged from is left untouched and
|
|
28
|
-
* still fails the body-shape validator — that is the one `changes[]` failure
|
|
29
|
-
* only the author can resolve.
|
|
30
|
-
*
|
|
31
|
-
* It lives beside the validator rather than inside it because the validator's
|
|
32
|
-
* job is to *judge*: mixing a mutating repair pass into a module of pure
|
|
33
|
-
* collectors muddies both. `persist-helpers.js#validateTickets` calls this
|
|
34
|
-
* first, then the validators.
|
|
2
|
+
* Repair-before-judging for `changes[]`, on both the structured array and a
|
|
3
|
+
* serialized `## Changes` section: a plain-string bullet becomes
|
|
4
|
+
* `{ path, assumption }` (probed at base: present → `refactors-existing`,
|
|
5
|
+
* absent → `creates`), and a trailing parenthetical on a path is stripped.
|
|
6
|
+
* Repairs are reported, not refused; an unsalvageable string is left for the
|
|
7
|
+
* validator. Kept apart from the validator, whose collectors are pure.
|
|
35
8
|
*
|
|
36
9
|
* @module lib/orchestration/plan-persist/changes-repair
|
|
37
10
|
*/
|
|
@@ -39,22 +12,16 @@
|
|
|
39
12
|
import { matchBarePathToken } from '../../story-body/body-format-lints.js';
|
|
40
13
|
import { FILE_ASSUMPTION_VALUES } from '../file-assumption-enum.js';
|
|
41
14
|
|
|
42
|
-
/** The `## Changes` heading (either level the parser accepts). */
|
|
43
15
|
const CHANGES_HEADING_RE = /^#{2,3}\s+Changes\s*$/i;
|
|
44
16
|
|
|
45
|
-
/** Any heading — the end of the `## Changes` section. */
|
|
46
17
|
const ANY_HEADING_RE = /^#{1,6}\s+\S/;
|
|
47
18
|
|
|
48
|
-
/** A trailing `(…)` on a path token. */
|
|
49
19
|
const TRAILING_PARENTHETICAL_RE = /\s*\([^)]*\)\s*$/;
|
|
50
20
|
|
|
51
|
-
/** The
|
|
21
|
+
/** The canonical bullet: `` `path` — assumption ``. */
|
|
52
22
|
const HUMANIZED_RE = /^`([^`]+)`\s+—\s+(\S+)$/;
|
|
53
23
|
|
|
54
24
|
/**
|
|
55
|
-
* Strip a trailing parenthetical from a path token, reporting whether one
|
|
56
|
-
* was present.
|
|
57
|
-
*
|
|
58
25
|
* @param {string} raw
|
|
59
26
|
* @returns {{ path: string, stripped: boolean }}
|
|
60
27
|
*/
|
|
@@ -64,16 +31,8 @@ function stripParenthetical(raw) {
|
|
|
64
31
|
}
|
|
65
32
|
|
|
66
33
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* backticks, strip a trailing parenthetical. Returns `null` when nothing
|
|
70
|
-
* path-shaped survives.
|
|
71
|
-
*
|
|
72
|
-
* What counts as path-shaped is `matchBarePathToken` — the same grammar the
|
|
73
|
-
* story-body parser admits a bare bullet under, imported rather than
|
|
74
|
-
* restated (Story #5361). The repair pass scoring a narrower class than the
|
|
75
|
-
* parser is what let a route-segment path be repaired on one surface and
|
|
76
|
-
* refused on the other.
|
|
34
|
+
* Path-shaped means `matchBarePathToken` — the parser's own grammar, so the
|
|
35
|
+
* repair and the parser accept the same class.
|
|
77
36
|
*
|
|
78
37
|
* @param {string} raw
|
|
79
38
|
* @returns {string|null}
|
|
@@ -93,9 +52,6 @@ function salvagePath(raw) {
|
|
|
93
52
|
}
|
|
94
53
|
|
|
95
54
|
/**
|
|
96
|
-
* Resolve the assumption for a path with none authored: present at base →
|
|
97
|
-
* `refactors-existing`, absent → `creates`.
|
|
98
|
-
*
|
|
99
55
|
* @param {string} path
|
|
100
56
|
* @param {(path: string) => boolean} existsAtBase
|
|
101
57
|
* @returns {'refactors-existing'|'creates'}
|
|
@@ -105,9 +61,7 @@ function probeAssumption(path, existsAtBase) {
|
|
|
105
61
|
}
|
|
106
62
|
|
|
107
63
|
/**
|
|
108
|
-
*
|
|
109
|
-
* repair record, or `null` when the item needs no repair (or cannot be
|
|
110
|
-
* repaired).
|
|
64
|
+
* `null` when the item needs no repair or cannot be repaired.
|
|
111
65
|
*
|
|
112
66
|
* @param {unknown} item
|
|
113
67
|
* @param {(path: string) => boolean} existsAtBase
|
|
@@ -144,10 +98,6 @@ function repairStructuredItem(item, existsAtBase) {
|
|
|
144
98
|
}
|
|
145
99
|
|
|
146
100
|
/**
|
|
147
|
-
* Repair one line of a serialized `## Changes` section. Returns the rewritten
|
|
148
|
-
* line and a repair record, or `null` when the line is already canonical or
|
|
149
|
-
* cannot be repaired.
|
|
150
|
-
*
|
|
151
101
|
* @param {string} line
|
|
152
102
|
* @param {(path: string) => boolean} existsAtBase
|
|
153
103
|
* @returns {{ line: string, repair: object }|null}
|
|
@@ -200,9 +150,7 @@ function repairSectionLine(line, existsAtBase) {
|
|
|
200
150
|
}
|
|
201
151
|
|
|
202
152
|
/**
|
|
203
|
-
*
|
|
204
|
-
* between the heading and the next heading are touched; the rest of the
|
|
205
|
-
* body is byte-identical.
|
|
153
|
+
* Touches only the `## Changes` section; the rest stays byte-identical.
|
|
206
154
|
*
|
|
207
155
|
* @param {string} body
|
|
208
156
|
* @param {(path: string) => boolean} existsAtBase
|
|
@@ -232,11 +180,9 @@ function repairSerializedBody(body, existsAtBase) {
|
|
|
232
180
|
}
|
|
233
181
|
|
|
234
182
|
/**
|
|
235
|
-
* Repair the `changes[]` of one ticket, on whichever surface carries it.
|
|
236
|
-
*
|
|
237
183
|
* @param {object} ticket Mutated in place.
|
|
238
184
|
* @param {(path: string) => boolean} existsAtBase
|
|
239
|
-
* @returns {object[]}
|
|
185
|
+
* @returns {object[]}
|
|
240
186
|
*/
|
|
241
187
|
function repairTicket(ticket, existsAtBase) {
|
|
242
188
|
const body = ticket.body;
|
|
@@ -263,13 +209,6 @@ function repairTicket(ticket, existsAtBase) {
|
|
|
263
209
|
}
|
|
264
210
|
|
|
265
211
|
/**
|
|
266
|
-
* Render one `changes[]` repair as the dry-run line the operator reads.
|
|
267
|
-
*
|
|
268
|
-
* The dry-run's repair list is mixed — an `acceptance[]` handle strip is
|
|
269
|
-
* reported on it too — but the dispatch across kinds lives in
|
|
270
|
-
* [`acceptance-handle-repair.js`](acceptance-handle-repair.js)`#renderRepair`,
|
|
271
|
-
* which delegates here for this kind. Each producer owns its own line.
|
|
272
|
-
*
|
|
273
212
|
* @param {{ slug: string, from: string, path: string, assumption: string, reason: string }} repair
|
|
274
213
|
* @returns {string}
|
|
275
214
|
*/
|
|
@@ -284,11 +223,8 @@ export function renderChangeRepair({ slug, from, path, assumption, reason }) {
|
|
|
284
223
|
}
|
|
285
224
|
|
|
286
225
|
/**
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
* in place (the persist pipeline threads this same array on to assembly)
|
|
290
|
-
* and returns the repairs, each tagged with the Story's slug. Total — a
|
|
291
|
-
* non-array argument and non-Story tickets are no-ops.
|
|
226
|
+
* Mutates `tickets` in place — persist threads this same array on to
|
|
227
|
+
* assembly.
|
|
292
228
|
*
|
|
293
229
|
* @param {object[]} tickets
|
|
294
230
|
* @param {{ existsAtBase: (path: string) => boolean }} args
|
|
@@ -1,25 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Story #5155. A plan can now point at two things it did not author: the
|
|
6
|
-
* container Epic it wants to join (`--epic <id>`) and the open Stories it must
|
|
7
|
-
* wait for (`depends_on: ["#<id>"]`). They are different features with
|
|
8
|
-
* different owners, but they share the one property that decides *when* they
|
|
9
|
-
* are checked, and that is what this module exists to express: both name live
|
|
10
|
-
* tracker state, so both are verified **before the first `createIssue`**, dry
|
|
11
|
-
* run included.
|
|
12
|
-
*
|
|
13
|
-
* The timing is the whole point. Either reference is free to fix while nothing
|
|
14
|
-
* has been written and expensive afterwards — an unresolvable blocker left on
|
|
15
|
-
* a live Story reads to the delivery engine as a permanent wedge rather than
|
|
16
|
-
* an error worth reporting, and a mistyped Epic id would leave the operator
|
|
17
|
-
* believing their Stories were filed somewhere they were not. Resolving them
|
|
18
|
-
* together, at one call site, is what keeps a later edit from quietly moving
|
|
19
|
-
* one of them after the creates.
|
|
2
|
+
* A plan's references to live tracker state (`--epic <id>`, `#<id>`
|
|
3
|
+
* blockers), verified together before the first create, dry run included —
|
|
4
|
+
* cheap to fix then, costly after.
|
|
20
5
|
*
|
|
21
6
|
* @module lib/orchestration/plan-persist/cross-plan-links
|
|
22
|
-
* @see Story #5155
|
|
23
7
|
*/
|
|
24
8
|
|
|
25
9
|
import { adoptContainerEpic, resolveAdoptionTarget } from './epic-adoption.js';
|
|
@@ -27,15 +11,12 @@ import { createContainerEpic } from './epic-ops.js';
|
|
|
27
11
|
import { assertExternalDependenciesResolvable } from './external-deps.js';
|
|
28
12
|
|
|
29
13
|
/**
|
|
30
|
-
* Verify a plan's outward references and return the Epic it adopts.
|
|
31
|
-
*
|
|
32
14
|
* @param {{
|
|
33
15
|
* provider: object,
|
|
34
16
|
* stories: Array<{ slug: string, depends_on?: string[] }>,
|
|
35
17
|
* epicId: number|null,
|
|
36
18
|
* }} args
|
|
37
19
|
* @returns {Promise<{ id: number, title: string, body: string }|null>}
|
|
38
|
-
* The resolved adoption target, or `null` when none was requested.
|
|
39
20
|
* @throws {Error} When a `#<id>` blocker or the named Epic cannot be used.
|
|
40
21
|
*/
|
|
41
22
|
export async function resolveCrossPlanLinks({ provider, stories, epicId }) {
|
|
@@ -44,13 +25,8 @@ export async function resolveCrossPlanLinks({ provider, stories, epicId }) {
|
|
|
44
25
|
}
|
|
45
26
|
|
|
46
27
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* The one entry point `run-plan-persist` calls, so the engine holds a single
|
|
50
|
-
* statement rather than a branch it has to keep straight: which of the two
|
|
51
|
-
* paths applies is decided by whether an adoption target was resolved before
|
|
52
|
-
* the creates, and the two have opposite failure postures that are easy to
|
|
53
|
-
* apply to the wrong one when the choice is inlined at the call site.
|
|
28
|
+
* Adopt the resolved target, else create. The two paths have opposite
|
|
29
|
+
* failure postures, so the choice lives here, not at the call site.
|
|
54
30
|
*
|
|
55
31
|
* @param {{
|
|
56
32
|
* provider: object,
|
|
@@ -59,7 +35,7 @@ export async function resolveCrossPlanLinks({ provider, stories, epicId }) {
|
|
|
59
35
|
* created: Array<{ id: number }>,
|
|
60
36
|
* opts?: { dryRun?: boolean },
|
|
61
37
|
* }} args
|
|
62
|
-
* @returns {Promise<object|null>}
|
|
38
|
+
* @returns {Promise<object|null>}
|
|
63
39
|
*/
|
|
64
40
|
export async function resolveContainerEpic({
|
|
65
41
|
provider,
|
|
@@ -1,25 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* re-adopts the one carrying its exact fingerprint. This module covers the
|
|
7
|
-
* case neither does: an operator pointing a fresh plan at an Epic an earlier
|
|
8
|
-
* plan opened, with a different cohort and no fingerprint in common.
|
|
9
|
-
*
|
|
10
|
-
* **The posture is deliberately stricter than creation's.** Creation degrades
|
|
11
|
-
* — an unensurable label just skips the container, because the Stories are the
|
|
12
|
-
* part that matters and a missing Epic costs only tidiness. Adoption cannot
|
|
13
|
-
* degrade the same way: the operator named a specific id, so silently not
|
|
14
|
-
* adopting it would leave them believing their Stories were filed somewhere
|
|
15
|
-
* they were not. A bad target is therefore a **hard error, raised before the
|
|
16
|
-
* first Story is created** (dry run included), when nothing has been written
|
|
17
|
-
* and the fix is free. Once the Stories exist, the posture flips to creation's
|
|
18
|
-
* — a failed checklist write or sub-issue edge warns, because by then refusing
|
|
19
|
-
* would strand live Stories over a cosmetic link.
|
|
2
|
+
* Join this run's Stories to an existing Epic the operator named (`--epic`).
|
|
3
|
+
* A bad target is a hard error raised before the first create — silently not
|
|
4
|
+
* adopting would misfile the plan. Once Stories exist, link failures only
|
|
5
|
+
* warn.
|
|
20
6
|
*
|
|
21
7
|
* @module lib/orchestration/plan-persist/epic-adoption
|
|
22
|
-
* @see Story #5155
|
|
23
8
|
*/
|
|
24
9
|
|
|
25
10
|
import { Logger } from '../../Logger.js';
|
|
@@ -29,14 +14,7 @@ import { isEpicTicket } from '../epic-container.js';
|
|
|
29
14
|
import { mirrorSubIssueEdges } from './epic-ops.js';
|
|
30
15
|
|
|
31
16
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* Called **before any create**, so every refusal below costs the operator a
|
|
35
|
-
* re-run of a command that wrote nothing.
|
|
36
|
-
*
|
|
37
|
-
* A null/absent `epicId` is the ordinary "no adoption requested" case and
|
|
38
|
-
* resolves to `null` — only a *supplied* id can be wrong, and every wrong one
|
|
39
|
-
* throws.
|
|
17
|
+
* Called before any create. An absent `epicId` resolves to `null`.
|
|
40
18
|
*
|
|
41
19
|
* @param {{ provider: object, epicId: number|null }} opts
|
|
42
20
|
* @returns {Promise<{ id: number, title: string, body: string }|null>}
|
|
@@ -91,11 +69,7 @@ export async function resolveAdoptionTarget({ provider, epicId }) {
|
|
|
91
69
|
}
|
|
92
70
|
|
|
93
71
|
/**
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* Runs **after** the Stories exist, because both halves of the linkage need
|
|
97
|
-
* their real ids: the checklist embeds issue numbers and the sub-issue edges
|
|
98
|
-
* need database ids.
|
|
72
|
+
* Runs after the Stories exist — the linkage needs their real ids.
|
|
99
73
|
*
|
|
100
74
|
* @param {{
|
|
101
75
|
* provider: object,
|
|
@@ -122,9 +96,7 @@ export async function adoptContainerEpic({
|
|
|
122
96
|
|
|
123
97
|
const all = Array.isArray(created) ? created : [];
|
|
124
98
|
|
|
125
|
-
// Dry
|
|
126
|
-
// placeholder ids there, so report them as-is rather than filtering to the
|
|
127
|
-
// positives and claiming an empty adoption.
|
|
99
|
+
// Dry-run ids are negative placeholders; report them as-is.
|
|
128
100
|
if (dryRun) {
|
|
129
101
|
return {
|
|
130
102
|
id: target.id,
|
|
@@ -163,29 +135,11 @@ export async function adoptContainerEpic({
|
|
|
163
135
|
}
|
|
164
136
|
|
|
165
137
|
/**
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
* append computed against that snapshot and PATCHed wholesale silently drops
|
|
172
|
-
* every checklist row another writer added in between — a concurrent persist
|
|
173
|
-
* run adopting the same Epic, or an operator ticking a child off by hand. The
|
|
174
|
-
* body is a full-document write, so a stale base is not a merge conflict; it
|
|
175
|
-
* is a silent revert.
|
|
176
|
-
*
|
|
177
|
-
* This **narrows** the read-then-PATCH window; it does not close it. Nothing
|
|
178
|
-
* here is atomic, and GitHub's issue API offers no compare-and-swap, so a
|
|
179
|
-
* write landing between this read and this PATCH is still lost. Narrowing it
|
|
180
|
-
* from "the whole create phase" to "one round-trip" is the available fix; a
|
|
181
|
-
* real one needs an API that does not exist.
|
|
182
|
-
*
|
|
183
|
-
* The PATCH is skipped when the append changes nothing, so re-running an
|
|
184
|
-
* adoption that already landed writes nothing at all.
|
|
185
|
-
*
|
|
186
|
-
* Non-fatal: the Stories are already live, and the native sub-issue edges
|
|
187
|
-
* written next are the other half of the linkage. Losing the checklist costs
|
|
188
|
-
* the body-only fallback path, not the grouping.
|
|
138
|
+
* The body is re-read fresh right before the append: the body PATCH is a
|
|
139
|
+
* whole-document write, so appending to the pre-create snapshot would
|
|
140
|
+
* silently revert rows another writer added since. This narrows the window
|
|
141
|
+
* to one round-trip; GitHub offers no compare-and-swap to close it. Skips the
|
|
142
|
+
* PATCH when nothing changes. Non-fatal.
|
|
189
143
|
*
|
|
190
144
|
* @param {{ provider: object, target: { id: number, body: string }, childIds: number[] }} opts
|
|
191
145
|
* @returns {Promise<void>}
|
|
@@ -212,13 +166,8 @@ async function appendChecklist({ provider, target, childIds }) {
|
|
|
212
166
|
}
|
|
213
167
|
|
|
214
168
|
/**
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
* `{ fresh: true }` is the whole point: the adoption path already read this
|
|
218
|
-
* issue once, so a cached read would hand back the very snapshot this function
|
|
219
|
-
* exists to replace. Falls back to the snapshot when the re-read fails or the
|
|
220
|
-
* provider has no `getTicket` — a stale base still appends the run's own
|
|
221
|
-
* children, which beats not linking them.
|
|
169
|
+
* `{ fresh: true }` bypasses the cache that holds the stale snapshot. Falls
|
|
170
|
+
* back to the snapshot, which still links this run's children.
|
|
222
171
|
*
|
|
223
172
|
* @param {{ provider: object, target: { id: number, body: string } }} opts
|
|
224
173
|
* @returns {Promise<string>}
|