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,15 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* group them under one container Epic. The Epic is **not** a work item: it
|
|
6
|
-
* holds a `## Goal` paragraph and a child checklist, carries `type::epic` and
|
|
7
|
-
* nothing else, and is never branched, implemented or delivered.
|
|
8
|
-
*
|
|
9
|
-
* Ordering matters — the Epic is created **after** the Stories, because its
|
|
10
|
-
* body embeds their issue numbers and its sub-issue edges need their database
|
|
11
|
-
* ids. A container that exists before its contents would have to be written
|
|
12
|
-
* twice.
|
|
2
|
+
* The optional container Epic: a goal plus a child checklist, never
|
|
3
|
+
* delivered. Created after the Stories, since it embeds their numbers and
|
|
4
|
+
* database ids.
|
|
13
5
|
*
|
|
14
6
|
* @module lib/orchestration/plan-persist/epic-ops
|
|
15
7
|
*/
|
|
@@ -21,32 +13,22 @@ import { Logger } from '../../Logger.js';
|
|
|
21
13
|
import { LABEL_COLORS, TYPE_LABELS } from '../../label-constants.js';
|
|
22
14
|
import { composeEpicBody } from '../epic-container.js';
|
|
23
15
|
|
|
24
|
-
/**
|
|
25
|
-
* The Story count at or above which `/mandrel-plan` offers a container Epic.
|
|
26
|
-
*
|
|
27
|
-
* Three, i.e. "more than two" — at two Stories a pair of ids is as easy to
|
|
28
|
-
* carry as one, and the container earns nothing.
|
|
29
|
-
*/
|
|
16
|
+
/** Story count at which `/mandrel-plan` offers a container Epic. */
|
|
30
17
|
export const EPIC_SUGGESTION_THRESHOLD = 3;
|
|
31
18
|
|
|
32
|
-
/** Length of the truncated hex digest stamped into the Epic marker. */
|
|
33
19
|
const EPIC_FINGERPRINT_LENGTH = 8;
|
|
34
20
|
|
|
35
|
-
/** Marker prefix identifying a persist-authored Epic in an issue body. */
|
|
36
21
|
const EPIC_FINGERPRINT_MARKER_PREFIX = 'mandrel-epic-fingerprint';
|
|
37
22
|
|
|
38
23
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* Keyed on the children, not just the title: two runs that group *different*
|
|
42
|
-
* Stories are different containers even under the same title, and adopting
|
|
43
|
-
* one for the other would silently leave a cohort unlinked.
|
|
24
|
+
* Resume identity over title and the exact child set — a different cohort
|
|
25
|
+
* under the same title is a different container.
|
|
44
26
|
*
|
|
45
27
|
* Fields join on NUL, written as the `\u0000` escape and never as a raw byte
|
|
46
28
|
* — a literal NUL makes git classify the file binary and drop its diffs.
|
|
47
29
|
*
|
|
48
30
|
* @param {{ title: string, childIds: number[] }} opts
|
|
49
|
-
* @returns {string}
|
|
31
|
+
* @returns {string}
|
|
50
32
|
*/
|
|
51
33
|
function epicFingerprint({ title, childIds }) {
|
|
52
34
|
const ids = [...childIds].sort((a, b) => a - b).join(',');
|
|
@@ -57,8 +39,6 @@ function epicFingerprint({ title, childIds }) {
|
|
|
57
39
|
}
|
|
58
40
|
|
|
59
41
|
/**
|
|
60
|
-
* Render the invisible HTML-comment marker carrying the Epic's fingerprint.
|
|
61
|
-
*
|
|
62
42
|
* @param {string} fingerprint
|
|
63
43
|
* @returns {string}
|
|
64
44
|
*/
|
|
@@ -67,15 +47,9 @@ function epicFingerprintMarker(fingerprint) {
|
|
|
67
47
|
}
|
|
68
48
|
|
|
69
49
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* (`ensurePersistLabel` in `story-ops.js`), which degrade to "create without
|
|
74
|
-
* the label" because they are cosmetic. `type::epic` is not cosmetic: it is
|
|
75
|
-
* the sole marker `isEpicTicket` reads, so an Epic created without it is not
|
|
76
|
-
* an Epic — it is a stray issue that `/mandrel-deliver` will hard-error on and
|
|
77
|
-
* no expansion will ever find. Skipping creation leaves the Stories, which
|
|
78
|
-
* are the part that matters, perfectly deliverable by id.
|
|
50
|
+
* Fails closed, unlike the cosmetic cohort label: `type::epic` is the sole
|
|
51
|
+
* Epic marker, so an Epic without it is a stray issue. Skipping leaves the
|
|
52
|
+
* Stories deliverable by id.
|
|
79
53
|
*
|
|
80
54
|
* @param {{ provider: object }} opts
|
|
81
55
|
* @returns {Promise<boolean>} Whether creation may proceed.
|
|
@@ -113,11 +87,8 @@ async function ensureEpicLabel({ provider }) {
|
|
|
113
87
|
}
|
|
114
88
|
|
|
115
89
|
/**
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* Non-fatal: a search failure returns `null` and the caller creates. A
|
|
120
|
-
* duplicate Epic is cosmetic; a crash mid-persist is not.
|
|
90
|
+
* Non-fatal: a failed lookup returns `null` and the caller creates — a
|
|
91
|
+
* duplicate Epic is cosmetic, a mid-persist crash is not.
|
|
121
92
|
*
|
|
122
93
|
* @param {{ provider: object, fingerprint: string }} opts
|
|
123
94
|
* @returns {Promise<{ id: number, url?: string }|null>}
|
|
@@ -134,9 +105,7 @@ async function findExistingEpic({ provider, fingerprint }) {
|
|
|
134
105
|
String(issue?.body ?? '').includes(marker),
|
|
135
106
|
);
|
|
136
107
|
if (!hit) return null;
|
|
137
|
-
//
|
|
138
|
-
// `id` fallback this replaced would have adopted the resumed container by
|
|
139
|
-
// database id — a number that exists, resolves to nothing, fails no guard.
|
|
108
|
+
// `id` is the issue number here; never fall back to a database id.
|
|
140
109
|
const id = Number(hit.id);
|
|
141
110
|
if (!Number.isInteger(id) || id <= 0) return null;
|
|
142
111
|
return { id, url: hit.url ?? undefined };
|
|
@@ -149,11 +118,8 @@ async function findExistingEpic({ provider, fingerprint }) {
|
|
|
149
118
|
}
|
|
150
119
|
|
|
151
120
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* A resumed run's adopted Stories carry no `internalId` — they were found by
|
|
155
|
-
* listing, not created — so they are simply absent from the map and fall
|
|
156
|
-
* through to the lookup. Absence means "not known here", never "has none".
|
|
121
|
+
* Known database ids by issue number. Adopted Stories are absent (they carry
|
|
122
|
+
* no `internalId`) and fall through to a lookup.
|
|
157
123
|
*
|
|
158
124
|
* @param {Array<{ id?: number, internalId?: number }>|undefined} created
|
|
159
125
|
* @returns {Map<number, number>}
|
|
@@ -169,18 +135,9 @@ function internalIdsFrom(created) {
|
|
|
169
135
|
}
|
|
170
136
|
|
|
171
137
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
* `getSubTickets` reads it as a first-class child source. A lost edge costs
|
|
176
|
-
* the GitHub UI's nesting, not the grouping itself.
|
|
177
|
-
*
|
|
178
|
-
* Exported since Story #5155 so the adoption path (`epic-adoption.js`) links
|
|
179
|
-
* children exactly the way creation does — one mirroring rule, not two that
|
|
180
|
-
* drift.
|
|
181
|
-
*
|
|
182
|
-
* `created` is optional and carries the cohort's `createIssue` responses, so
|
|
183
|
-
* the linker can skip the id lookup for every child this run made itself.
|
|
138
|
+
* Native sub-issue edges, shared with the adoption path. Non-fatal: the body
|
|
139
|
+
* checklist is the durable child source. `created` lets the linker skip the
|
|
140
|
+
* id lookup for children this run made.
|
|
184
141
|
*
|
|
185
142
|
* @param {{ provider: object, epicNumber: number, childIds: number[], created?: Array<{ id: number, internalId?: number }> }} opts
|
|
186
143
|
* @returns {Promise<{ added: number, skipped: number, failed: number }|null>}
|
|
@@ -236,16 +193,8 @@ export async function mirrorSubIssueEdges({
|
|
|
236
193
|
}
|
|
237
194
|
|
|
238
195
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* Returns `null` whenever no Epic was created — not requested, too few
|
|
242
|
-
* Stories, or the label could not be ensured. Callers treat `null` as the
|
|
243
|
-
* ordinary no-Epic outcome, never as a failure.
|
|
244
|
-
*
|
|
245
|
-
* **The Epic never receives an `agent::*` label.** Its labels are exactly
|
|
246
|
-
* `[type::epic]`. That absence is load-bearing: it keeps the container out
|
|
247
|
-
* of the bare `/mandrel-deliver` ready list and outside `lint-issue-body.js`,
|
|
248
|
-
* which scopes itself to `type::story`.
|
|
196
|
+
* `null` is the ordinary no-Epic outcome, never a failure. Labels are exactly
|
|
197
|
+
* `[type::epic]` — no `agent::*`, which keeps it out of the deliver ready list.
|
|
249
198
|
*
|
|
250
199
|
* @param {{
|
|
251
200
|
* provider: object,
|
|
@@ -283,9 +232,7 @@ export async function createContainerEpic({
|
|
|
283
232
|
.map((s) => s.id)
|
|
284
233
|
.filter((id) => Number.isInteger(id) && id > 0);
|
|
285
234
|
|
|
286
|
-
// Dry-run
|
|
287
|
-
// negative placeholder ids there, so `childIds` is empty by construction —
|
|
288
|
-
// report the count from `created` itself rather than from the filtered list.
|
|
235
|
+
// Dry-run ids are negative placeholders, so report from `created` itself.
|
|
289
236
|
if (dryRun) {
|
|
290
237
|
return {
|
|
291
238
|
id: -1,
|
|
@@ -336,8 +283,6 @@ export async function createContainerEpic({
|
|
|
336
283
|
labels: [TYPE_LABELS.EPIC],
|
|
337
284
|
});
|
|
338
285
|
|
|
339
|
-
// `createIssue` declares both `id` and `number` and sets them to the same
|
|
340
|
-
// issue number; reading one of them is the whole contract.
|
|
341
286
|
const epicNumber = result.id;
|
|
342
287
|
const edges = await mirrorSubIssueEdges({
|
|
343
288
|
provider,
|
|
@@ -1,42 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* every ordering edge intra-plan by construction, and leaves the cross-plan
|
|
7
|
-
* case — a new Story that must wait for an open Story from an earlier run —
|
|
8
|
-
* expressible only by hand-editing the issue body after persist.
|
|
9
|
-
*
|
|
10
|
-
* An entry of the form `#1234` is that missing case: an **external** blocker,
|
|
11
|
-
* already live on the tracker. The two forms are distinguished lexically and
|
|
12
|
-
* totally, so nothing has to guess:
|
|
13
|
-
*
|
|
14
|
-
* - `some-slug` → a sibling, resolved against this run's slug map;
|
|
15
|
-
* - `#1234` → an existing issue, resolved against the tracker.
|
|
16
|
-
*
|
|
17
|
-
* External refs are excluded from sibling ordering and cycle detection. They
|
|
18
|
-
* cannot participate in either: a Story already open is not scheduled by this
|
|
19
|
-
* run, so it has no position in the topological sort, and it cannot close a
|
|
20
|
-
* cycle back into a Story that does not exist yet. Treating them as siblings
|
|
21
|
-
* is what would break — the unknown-slug guard would reject every one.
|
|
22
|
-
*
|
|
23
|
-
* They are validated strictly, and **before any create**: an unresolvable
|
|
24
|
-
* blocker that surfaced after the fact would leave a live Story gated on
|
|
25
|
-
* something that can never satisfy it, which the delivery engine reads as a
|
|
26
|
-
* permanent wedge rather than an error.
|
|
2
|
+
* `depends_on` entries naming an existing issue (`#<id>`) rather than a
|
|
3
|
+
* sibling slug. They take no part in sibling ordering or cycle detection, and
|
|
4
|
+
* are validated before any create — an unresolvable blocker on a live Story
|
|
5
|
+
* reads to delivery as a permanent wedge, not an error.
|
|
27
6
|
*
|
|
28
7
|
* @module lib/orchestration/plan-persist/external-deps
|
|
29
|
-
* @see Story #5155
|
|
30
8
|
*/
|
|
31
9
|
|
|
32
10
|
import { TYPE_LABELS } from '../../label-constants.js';
|
|
33
11
|
|
|
34
|
-
/** A `depends_on` entry naming an existing issue: `#` followed by digits. */
|
|
35
12
|
const EXTERNAL_REF_RE = /^#(\d+)$/;
|
|
36
13
|
|
|
37
14
|
/**
|
|
38
|
-
* Is this `depends_on` entry an external issue reference?
|
|
39
|
-
*
|
|
40
15
|
* @param {unknown} entry
|
|
41
16
|
* @returns {boolean}
|
|
42
17
|
*/
|
|
@@ -45,8 +20,6 @@ export function isExternalDependencyRef(entry) {
|
|
|
45
20
|
}
|
|
46
21
|
|
|
47
22
|
/**
|
|
48
|
-
* The issue number an external ref names, or `null` for a sibling slug.
|
|
49
|
-
*
|
|
50
23
|
* @param {unknown} entry
|
|
51
24
|
* @returns {number|null}
|
|
52
25
|
*/
|
|
@@ -59,9 +32,6 @@ export function externalDependencyId(entry) {
|
|
|
59
32
|
}
|
|
60
33
|
|
|
61
34
|
/**
|
|
62
|
-
* Every distinct external id declared across a plan's Stories, in first-seen
|
|
63
|
-
* order.
|
|
64
|
-
*
|
|
65
35
|
* @param {Array<{ depends_on?: string[] }>} stories
|
|
66
36
|
* @returns {number[]}
|
|
67
37
|
*/
|
|
@@ -80,8 +50,6 @@ export function collectExternalDependencyIds(stories) {
|
|
|
80
50
|
}
|
|
81
51
|
|
|
82
52
|
/**
|
|
83
|
-
* Normalize an issue's labels to plain strings.
|
|
84
|
-
*
|
|
85
53
|
* @param {unknown} raw
|
|
86
54
|
* @returns {string[]}
|
|
87
55
|
*/
|
|
@@ -93,8 +61,6 @@ function labelNames(raw) {
|
|
|
93
61
|
}
|
|
94
62
|
|
|
95
63
|
/**
|
|
96
|
-
* Explain why one external blocker is unusable, or `null` when it is fine.
|
|
97
|
-
*
|
|
98
64
|
* @param {number} id
|
|
99
65
|
* @param {object|null} issue
|
|
100
66
|
* @returns {string|null}
|
|
@@ -116,13 +82,10 @@ function rejectionReason(id, issue) {
|
|
|
116
82
|
}
|
|
117
83
|
|
|
118
84
|
/**
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* Hard-errors listing **every** bad ref rather than the first, so an operator
|
|
122
|
-
* fixing a plan sees the whole set in one pass.
|
|
85
|
+
* Every external ref must be an open Story; the error lists every bad ref.
|
|
123
86
|
*
|
|
124
87
|
* @param {{ provider: object, stories: Array<{ slug: string, depends_on?: string[] }> }} args
|
|
125
|
-
* @returns {Promise<number[]>}
|
|
88
|
+
* @returns {Promise<number[]>}
|
|
126
89
|
* @throws {Error} When any ref is missing, closed, an Epic, or not a Story.
|
|
127
90
|
*/
|
|
128
91
|
export async function assertExternalDependenciesResolvable({
|
|
@@ -1,23 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Exports:
|
|
5
|
-
* - `resolveBaseBranchRef(config)` — the one place the persist gates learn
|
|
6
|
-
* which branch name the operator configured.
|
|
7
|
-
*
|
|
8
|
-
* The ref the probes read is resolved per checkout (`resolveProbeRef`): the
|
|
9
|
-
* local branch when it exists, else its `origin/` tracking ref (a PR
|
|
10
|
-
* checkout on CI has no local `main`), else nothing — a shallow checkout
|
|
11
|
-
* with no base at all skips the probes instead of reading every path as
|
|
12
|
-
* absent.
|
|
13
|
-
* - `validateTickets(tickets, config, opts)` — normalises the authored
|
|
14
|
-
* `acceptance[]` handles and repairs the mechanical `changes[]`
|
|
15
|
-
* formalities against the base branch, then runs the cross-link,
|
|
16
|
-
* freshness, and task-body validators in one pass.
|
|
17
|
-
*
|
|
18
|
-
* Story #5312 deleted the fan-out probe that lived here: the delete
|
|
19
|
-
* blast-radius count never refused a real plan, and the `git grep` it paid
|
|
20
|
-
* for on every persist bought a warning nobody acted on.
|
|
2
|
+
* Base-branch resolution and the repair-then-validate pass for plan persist.
|
|
21
3
|
*
|
|
22
4
|
* @module lib/orchestration/plan-persist/persist-helpers
|
|
23
5
|
*/
|
|
@@ -29,20 +11,10 @@ import { normalizeAcceptanceHandles } from './acceptance-handle-repair.js';
|
|
|
29
11
|
import { repairChangeEntries } from './changes-repair.js';
|
|
30
12
|
|
|
31
13
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* The canonical resolved config carries the base branch at
|
|
35
|
-
* `project.baseBranch` (`lib/config-resolver.js` defaults it to `main`).
|
|
36
|
-
* This helper used to read `config.baseBranch` — a key the resolver never
|
|
37
|
-
* produces — so every freshness / file-assumption probe silently targeted
|
|
38
|
-
* the literal `main` regardless of configuration. Benign in a repo whose
|
|
39
|
-
* base branch *is* `main`; wrong for any consumer that configured something
|
|
40
|
-
* else (Story #4541).
|
|
41
|
-
*
|
|
42
|
-
* The flat `config.baseBranch` fallback is retained for the legacy
|
|
43
|
-
* `settings`-bag callers that pass `{ baseBranch, paths, planning }`.
|
|
14
|
+
* Reads `project.baseBranch` from resolved config; flat `baseBranch` serves
|
|
15
|
+
* legacy settings-bag callers.
|
|
44
16
|
*
|
|
45
|
-
* @param {object} [config]
|
|
17
|
+
* @param {object} [config]
|
|
46
18
|
* @returns {string}
|
|
47
19
|
*/
|
|
48
20
|
export function resolveBaseBranchRef(config) {
|
|
@@ -50,8 +22,6 @@ export function resolveBaseBranchRef(config) {
|
|
|
50
22
|
}
|
|
51
23
|
|
|
52
24
|
/**
|
|
53
|
-
* Does `ref` name a commit in the repo at `cwd`?
|
|
54
|
-
*
|
|
55
25
|
* @param {string} ref
|
|
56
26
|
* @param {string} cwd
|
|
57
27
|
* @returns {boolean}
|
|
@@ -64,17 +34,9 @@ function refResolves(ref, cwd) {
|
|
|
64
34
|
}
|
|
65
35
|
|
|
66
36
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* A developer checkout carries a local `main`; a CI pull-request checkout
|
|
71
|
-
* (`actions/checkout` at the merge ref, detached) carries only
|
|
72
|
-
* `origin/main`; a shallow smoke checkout carries neither. Probing the
|
|
73
|
-
* bare branch name in the last two answers "absent" for every path, which
|
|
74
|
-
* turns each bare-path repair into a `creates` and every declared path into
|
|
75
|
-
* a stale reference. So: the local branch when it resolves, else its
|
|
76
|
-
* `origin/` tracking ref when that does, else `null` — the caller then
|
|
77
|
-
* skips the probes and says so, rather than reporting the tree as missing.
|
|
37
|
+
* Local branch, else `origin/<branch>` (a CI PR checkout has no local base),
|
|
38
|
+
* else `null` so the probes are skipped rather than reading every path as
|
|
39
|
+
* absent (a shallow checkout has neither).
|
|
78
40
|
*
|
|
79
41
|
* @param {{ baseBranch: string, cwd?: string }} opts
|
|
80
42
|
* @returns {string|null}
|
|
@@ -86,10 +48,8 @@ function resolveProbeRef({ baseBranch, cwd }) {
|
|
|
86
48
|
}
|
|
87
49
|
|
|
88
50
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* the same probe the validator's own gates run, so the repair pass and the
|
|
92
|
-
* gates cannot disagree about what is at base.
|
|
51
|
+
* The validator gates' own probe, so repair and gates agree on what is at
|
|
52
|
+
* base.
|
|
93
53
|
*
|
|
94
54
|
* @param {{ baseBranchRef: string, path: string, cwd?: string }} opts
|
|
95
55
|
* @returns {boolean}
|
|
@@ -105,9 +65,7 @@ function defaultGitRunner({ baseBranchRef, path, cwd }) {
|
|
|
105
65
|
}
|
|
106
66
|
|
|
107
67
|
/**
|
|
108
|
-
*
|
|
109
|
-
* no base to read, a bare bullet is taken as the in-place edit it almost
|
|
110
|
-
* always is.
|
|
68
|
+
* With no base to read, a bare bullet is taken as an in-place edit.
|
|
111
69
|
*
|
|
112
70
|
* @param {{ baseBranchRef: string|null, cwd?: string, gitRunner?: Function }} opts
|
|
113
71
|
* @returns {(path: string) => boolean}
|
|
@@ -119,8 +77,6 @@ function makeExistsAtBase({ baseBranchRef, cwd, gitRunner }) {
|
|
|
119
77
|
}
|
|
120
78
|
|
|
121
79
|
/**
|
|
122
|
-
* The one warning a checkout with no readable base leaves on the dry-run.
|
|
123
|
-
*
|
|
124
80
|
* @param {string} baseBranch
|
|
125
81
|
* @param {string|null} baseBranchRef
|
|
126
82
|
* @returns {string[]}
|
|
@@ -135,8 +91,6 @@ function probeSkipWarnings(baseBranch, baseBranchRef) {
|
|
|
135
91
|
}
|
|
136
92
|
|
|
137
93
|
/**
|
|
138
|
-
* Attach non-enumerable bookkeeping to the validated array.
|
|
139
|
-
*
|
|
140
94
|
* @param {object[]} validated
|
|
141
95
|
* @param {Record<string, unknown>} extras
|
|
142
96
|
*/
|
|
@@ -152,17 +106,11 @@ function defineHidden(validated, extras) {
|
|
|
152
106
|
}
|
|
153
107
|
|
|
154
108
|
/**
|
|
155
|
-
* Repair the mechanical `changes[]` formalities
|
|
156
|
-
*
|
|
157
|
-
* Repair before judging (Story #5312, the shape Story #5005 set for the
|
|
158
|
-
* verify tier): a plain-string bullet or a trailing parenthetical is
|
|
159
|
-
* rewritten into `{ path, assumption }` by probing the base branch, and
|
|
160
|
-
* each rewrite is reported on the returned array's `repairs` so the dry-run
|
|
161
|
-
* can print it. An entry nothing path-shaped can be salvaged from survives
|
|
162
|
-
* untouched and still hard-errors in `validateTaskBodies`.
|
|
109
|
+
* Repair the mechanical `acceptance[]` / `changes[]` formalities (reported on
|
|
110
|
+
* `repairs`), then validate.
|
|
163
111
|
*
|
|
164
112
|
* @param {object[]} tickets Mutated in place.
|
|
165
|
-
* @param {object} config
|
|
113
|
+
* @param {object} config
|
|
166
114
|
* @param {{ cwd?: string, gitRunner?: Function }} [opts]
|
|
167
115
|
* @returns {object[] & { findings: object[], errors: string[], warnings: string[], normalizations: object[], repairs: object[], probeRef: string|null }}
|
|
168
116
|
*/
|
|
@@ -182,9 +130,7 @@ export function validateTickets(tickets, config, opts = {}) {
|
|
|
182
130
|
const validated = validateAndNormalizeTickets(tickets, {
|
|
183
131
|
baseBranchRef: baseBranchRef ?? undefined,
|
|
184
132
|
gitRunner: opts.gitRunner,
|
|
185
|
-
//
|
|
186
|
-
// probes (#4474 PR7) — without it they silently ran against
|
|
187
|
-
// process.cwd(), which is only the repo root by coincidence.
|
|
133
|
+
// Otherwise the probes run against process.cwd().
|
|
188
134
|
cwd: opts.cwd,
|
|
189
135
|
});
|
|
190
136
|
validated.warnings.push(...probeSkipWarnings(baseBranch, baseBranchRef));
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* actually fetched them (Story #4554).
|
|
5
|
-
*
|
|
6
|
-
* This lives beside the persist ops rather than inside `plan-persist.js` so
|
|
7
|
-
* the discovery + failure policy is directly testable: the CLI is a thin
|
|
8
|
-
* `parseArgs` shell, and the interesting behaviour here is exactly the part
|
|
9
|
-
* that decides whether a `--tickets` run can quietly lose its source set.
|
|
2
|
+
* Locate and read the `plan-context.js` envelope, from which persist derives
|
|
3
|
+
* the `--tickets` source ids.
|
|
10
4
|
*
|
|
11
5
|
* @module lib/orchestration/plan-persist/plan-context-source
|
|
12
6
|
*/
|
|
@@ -16,21 +10,13 @@ import path from 'node:path';
|
|
|
16
10
|
|
|
17
11
|
import { Logger } from '../../Logger.js';
|
|
18
12
|
|
|
19
|
-
/**
|
|
20
|
-
* Filename the `/mandrel-plan` interrogate step writes its envelope to inside
|
|
21
|
-
* `--plan-dir` (`plan-context.js --out <plan-dir>/plan-context.json`).
|
|
22
|
-
*/
|
|
23
13
|
export const PLAN_CONTEXT_FILENAME = 'plan-context.json';
|
|
24
14
|
|
|
25
15
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* An explicit `--plan-context` path wins; otherwise the conventional file
|
|
29
|
-
* inside `--plan-dir`. With neither, there is nothing to read — the caller
|
|
30
|
-
* gets `null` and must warn (see `loadPlanContextEnvelope`).
|
|
16
|
+
* An explicit `--plan-context` wins over the file inside `--plan-dir`.
|
|
31
17
|
*
|
|
32
|
-
* @param {string|null|undefined} explicitPath
|
|
33
|
-
* @param {string|null|undefined} planDir
|
|
18
|
+
* @param {string|null|undefined} explicitPath
|
|
19
|
+
* @param {string|null|undefined} planDir
|
|
34
20
|
* @returns {{ path: string, explicit: boolean }|null}
|
|
35
21
|
*/
|
|
36
22
|
export function resolvePlanContextPath(explicitPath, planDir) {
|
|
@@ -46,36 +32,18 @@ export function resolvePlanContextPath(explicitPath, planDir) {
|
|
|
46
32
|
return null;
|
|
47
33
|
}
|
|
48
34
|
|
|
49
|
-
/**
|
|
50
|
-
* The advice printed whenever persist has no envelope to derive ids from.
|
|
51
|
-
* Single-homed so the two no-envelope paths cannot drift apart.
|
|
52
|
-
*/
|
|
53
35
|
const CAPTURE_HINT =
|
|
54
36
|
'Re-run step 1 with `node .agents/scripts/plan-context.js … --out ' +
|
|
55
37
|
'<plan-dir>/plan-context.json` and pass --plan-dir, or pass ' +
|
|
56
38
|
'--source-tickets explicitly.';
|
|
57
39
|
|
|
58
40
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* lose its source set, so every no-envelope path is audible:
|
|
63
|
-
*
|
|
64
|
-
* - **No path at all** (neither `--plan-dir` nor `--plan-context`): warn.
|
|
65
|
-
* Persist cannot tell a legitimate `--seed` run from a `--tickets` run
|
|
66
|
-
* whose envelope was never captured, so it says so rather than returning a
|
|
67
|
-
* silent `null`.
|
|
68
|
-
* - **Explicit `--plan-context` missing**: throw. The operator named a file
|
|
69
|
-
* and meant it.
|
|
70
|
-
* - **Auto-discovered file simply absent**: warn and degrade to
|
|
71
|
-
* `--source-tickets`. A `--seed` run legitimately has no envelope, so
|
|
72
|
-
* absence alone is not fatal.
|
|
73
|
-
* - **Present but unparseable**: throw either way. A corrupt envelope is not
|
|
74
|
-
* the same as no envelope, and reading it as "no source tickets" is exactly
|
|
75
|
-
* the vacuous pass this module exists to prevent.
|
|
41
|
+
* A `--tickets` run must never quietly lose its source set: no path or an
|
|
42
|
+
* absent auto-discovered file warns (a `--seed` run legitimately has none);
|
|
43
|
+
* a missing explicit file or an unparseable envelope throws.
|
|
76
44
|
*
|
|
77
45
|
* @param {{ path: string, explicit: boolean }|null} planContext
|
|
78
|
-
* @returns {Promise<object|null>}
|
|
46
|
+
* @returns {Promise<object|null>}
|
|
79
47
|
*/
|
|
80
48
|
export async function loadPlanContextEnvelope(planContext) {
|
|
81
49
|
if (!planContext) {
|