mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,43 +1,16 @@
|
|
|
1
1
|
// .agents/scripts/lib/source-text/strip-js-comments.js
|
|
2
2
|
/**
|
|
3
|
-
* The one string-literal-aware
|
|
3
|
+
* The one string-literal-aware JS comment stripper, for guards that grep for
|
|
4
|
+
* a pattern in real code (so a guard's own rationale cannot satisfy it).
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* numbers), one blanked it to whitespace, and one used a regex that did not
|
|
11
|
-
* honour string literals at all. A fix to any of them silently missed the
|
|
12
|
-
* others, and a guard whose own rationale mentions the pattern it greps for
|
|
13
|
-
* can satisfy itself if the stripping is wrong.
|
|
14
|
-
*
|
|
15
|
-
* **Semantics: comment bodies become equivalent whitespace.** Every character
|
|
16
|
-
* of a comment is replaced by a space except newlines, which survive. That is
|
|
17
|
-
* the most information-preserving of the four behaviours and the only one that
|
|
18
|
-
* is safe for all of them:
|
|
19
|
-
*
|
|
20
|
-
* - line and column positions are unchanged, so a guard can report a
|
|
21
|
-
* `file:line` that matches the original source;
|
|
22
|
-
* - a regex looking for code cannot match comment text, because none
|
|
23
|
-
* survives;
|
|
24
|
-
* - the output is the same length as the input, so byte offsets hold.
|
|
25
|
-
*
|
|
26
|
-
* String and template literals are copied through verbatim, so a `//` inside a
|
|
27
|
-
* URL or a `/*` inside a message is not mistaken for a comment opener. Escape
|
|
28
|
-
* sequences are honoured, so an escaped quote does not end the literal early.
|
|
29
|
-
*
|
|
30
|
-
* An unterminated comment or literal runs to end of input rather than
|
|
31
|
-
* throwing: this is a lint helper reading files that may be mid-edit, and a
|
|
32
|
-
* crash there would be a worse failure than a slightly over-stripped tail.
|
|
33
|
-
*
|
|
34
|
-
* Builtins only — no dependency, so the guards that run before a consumer's
|
|
35
|
-
* install can use it.
|
|
6
|
+
* Every comment character except newlines becomes a space, so line, column
|
|
7
|
+
* and byte offsets all survive. Literals pass through verbatim, honouring
|
|
8
|
+
* escapes. An unterminated comment or literal runs to end of input rather
|
|
9
|
+
* than throwing — files may be mid-edit. Builtins only, so it runs before a
|
|
10
|
+
* consumer's install.
|
|
36
11
|
*/
|
|
37
12
|
|
|
38
13
|
/**
|
|
39
|
-
* Replace every non-newline character of `text` with a space.
|
|
40
|
-
*
|
|
41
14
|
* @param {string} text
|
|
42
15
|
* @returns {string}
|
|
43
16
|
*/
|
|
@@ -46,12 +19,9 @@ function blank(text) {
|
|
|
46
19
|
}
|
|
47
20
|
|
|
48
21
|
/**
|
|
49
|
-
* Index just past the string or template literal opening at `start`.
|
|
50
|
-
* Runs to end of input when the literal is never closed.
|
|
51
|
-
*
|
|
52
22
|
* @param {string} text
|
|
53
23
|
* @param {number} start - index of the opening quote
|
|
54
|
-
* @returns {number}
|
|
24
|
+
* @returns {number} index just past the literal, or end of input.
|
|
55
25
|
*/
|
|
56
26
|
function endOfLiteral(text, start) {
|
|
57
27
|
const quote = text[start];
|
|
@@ -69,9 +39,6 @@ function endOfLiteral(text, start) {
|
|
|
69
39
|
}
|
|
70
40
|
|
|
71
41
|
/**
|
|
72
|
-
* Strip JavaScript comments, replacing their bodies with equivalent
|
|
73
|
-
* whitespace so line numbers, columns and byte offsets all survive.
|
|
74
|
-
*
|
|
75
42
|
* @param {string} source - JavaScript source text. Nullish is treated as empty.
|
|
76
43
|
* @returns {string} the source with every comment body blanked to whitespace
|
|
77
44
|
*/
|
|
@@ -1,39 +1,16 @@
|
|
|
1
|
-
// .agents/scripts/lib/stdio-flush.js
|
|
2
1
|
/**
|
|
3
|
-
* Stdio drain helper
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `child_process` capture, every `$(...)` substitution — Node writes
|
|
8
|
-
* asynchronously once the 64 KiB kernel pipe buffer fills: `write()` returns
|
|
9
|
-
* `false` and the remaining bytes sit in the stream's internal queue until the
|
|
10
|
-
* reader drains it.
|
|
11
|
-
*
|
|
12
|
-
* `process.exit()` does not wait for that queue. Anything still buffered when
|
|
13
|
-
* the process terminates is discarded, so a CLI that emits more than a pipe
|
|
14
|
-
* buffer's worth of output and then exits eagerly silently truncates — the
|
|
15
|
-
* exit code still reads green, and the consumer parses a half-written
|
|
16
|
-
* envelope. `runAsCli` is the shared boundary where that used to happen for
|
|
17
|
-
* every `.agents/scripts` entry point.
|
|
18
|
-
*
|
|
19
|
-
* The fix is to stop exiting eagerly (set `process.exitCode` and let the loop
|
|
20
|
-
* drain naturally). This helper is the belt-and-braces half: an explicit await
|
|
21
|
-
* on the queued bytes, so the flush is complete before the CLI's last frame
|
|
22
|
-
* unwinds even when something further out terminates the process.
|
|
2
|
+
* Stdio drain helper. On a pipe, stdout/stderr write asynchronously once the
|
|
3
|
+
* kernel buffer fills, and `process.exit()` discards the queue — a green exit
|
|
4
|
+
* with a truncated envelope. CLIs set `exitCode` instead of exiting; this
|
|
5
|
+
* explicitly awaits the queued bytes as the second guard.
|
|
23
6
|
*
|
|
24
7
|
* @module stdio-flush
|
|
25
8
|
*/
|
|
26
9
|
|
|
27
10
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* process hangs.
|
|
32
|
-
*
|
|
33
|
-
* Both settle paths are covered: the zero-length `write()` callback (which
|
|
34
|
-
* fires after every previously queued chunk, since writes are ordered) and the
|
|
35
|
-
* `'drain'` event (which fires when a backed-up stream empties). Whichever
|
|
36
|
-
* lands first resolves; the other is detached.
|
|
11
|
+
* Resolve once queued bytes reach the OS, via whichever of the ordered empty
|
|
12
|
+
* `write()` callback or `'drain'` lands first. Resolves immediately for
|
|
13
|
+
* anything not flushable — a flush must never hang a process.
|
|
37
14
|
*
|
|
38
15
|
* @param {NodeJS.WritableStream & { writableLength?: number, writableEnded?: boolean, destroyed?: boolean }} [stream]
|
|
39
16
|
* @returns {Promise<void>}
|
|
@@ -52,18 +29,14 @@ function drainStream(stream) {
|
|
|
52
29
|
resolve();
|
|
53
30
|
};
|
|
54
31
|
stream.once?.('drain', done);
|
|
55
|
-
// The write callback fires once this (empty) chunk — and therefore every
|
|
56
|
-
// chunk queued ahead of it — has been flushed to the underlying handle.
|
|
57
32
|
stream.write('', done);
|
|
58
33
|
});
|
|
59
34
|
}
|
|
60
35
|
|
|
61
36
|
/**
|
|
62
|
-
*
|
|
63
|
-
* errored, closed, or was never writable resolves as already-flushed.
|
|
37
|
+
* Never rejects.
|
|
64
38
|
*
|
|
65
|
-
* @param {Array<NodeJS.WritableStream|undefined>} [streams]
|
|
66
|
-
* `[process.stdout, process.stderr]`.
|
|
39
|
+
* @param {Array<NodeJS.WritableStream|undefined>} [streams]
|
|
67
40
|
* @returns {Promise<void>}
|
|
68
41
|
*/
|
|
69
42
|
export async function flushStdio(streams = [process.stdout, process.stderr]) {
|
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
* but each historically re-implemented the step that turns a list of Story
|
|
7
|
-
* records into the `Map<storyId, number[]>` adjacency the kernel consumes.
|
|
8
|
-
* This module is now the one home for that step; the live consumer is:
|
|
9
|
-
*
|
|
10
|
-
* - `lib/wave-runner/ready-set.js` (`planReadySet`, the path-agnostic
|
|
11
|
-
* continuous scheduler the `stories-wave-tick.js` adapter dispatches through)
|
|
12
|
-
* - `stories-wave-tick.js` (for cycle detection, before delegating
|
|
13
|
-
* selection to `planReadySet`)
|
|
14
|
-
*
|
|
15
|
-
* (Pre-v2: `epic-runner/phases/build-wave-dag.js` and `dispatch-pipeline.js`
|
|
16
|
-
* also called here; both entry seams were deleted.)
|
|
17
|
-
*
|
|
18
|
-
* Dependency source order (must stay aligned with `manifest-builder.js` and
|
|
19
|
-
* `helpers/deliver-story.md` so planning and runtime scheduling never disagree):
|
|
20
|
-
* 1. Canonical: `blocked by #NNN` / `depends on #NNN` parsed from the
|
|
21
|
-
* Story body via `parseBlockedBy` (the same parser planning uses).
|
|
22
|
-
* 2. Fallback: an explicit `dependencies` (ticket shape) or
|
|
23
|
-
* `dependsOn` (operator-DAG shape) array on the Story record.
|
|
2
|
+
* The single Story-records → `Map<storyId, number[]>` adjacency builder for
|
|
3
|
+
* the `lib/Graph.js` kernel. Dependency sources must match planning
|
|
4
|
+
* (`manifest-builder.js`) so scheduling never disagrees: body `blocked by` /
|
|
5
|
+
* `depends on` refs, unioned with a `dependencies` / `dependsOn` array.
|
|
24
6
|
*
|
|
25
7
|
* @module lib/story-adjacency
|
|
26
8
|
*/
|
|
@@ -28,28 +10,14 @@
|
|
|
28
10
|
import { parseBlockedBy } from './dependency-parser.js';
|
|
29
11
|
|
|
30
12
|
/**
|
|
31
|
-
*
|
|
32
|
-
* from an ordered list of Story records.
|
|
33
|
-
*
|
|
34
|
-
* Each record contributes one adjacency entry keyed by
|
|
35
|
-
* `Number(record.id ?? record.number)`. Dependencies are the deduped
|
|
36
|
-
* union of body-parsed `blocked by` references and the record's
|
|
37
|
-
* explicit `dependencies` / `dependsOn` array, with self-edges and
|
|
38
|
-
* non-integer ids always dropped.
|
|
13
|
+
* Self-edges and non-integer ids are always dropped.
|
|
39
14
|
*
|
|
40
15
|
* @param {Array<{id?: number|string, number?: number, body?: string,
|
|
41
16
|
* dependencies?: Array<number|string>, dependsOn?: Array<number|string>}>} stories
|
|
42
|
-
* Story records (live ticket payloads, fixture tickets, or operator
|
|
43
|
-
* DAG nodes).
|
|
44
17
|
* @param {object} [opts]
|
|
45
|
-
* @param {boolean} [opts.dropForeign=false]
|
|
46
|
-
*
|
|
47
|
-
* `
|
|
48
|
-
* dependency on an id absent from the input is treated as not-yet-done
|
|
49
|
-
* and withholds the dependent until it completes. When `true` (the
|
|
50
|
-
* pre-v2 Epic-scoped-wrapper semantics), edges pointing at ids outside
|
|
51
|
-
* the supplied story set are dropped so the DAG stays closed over the
|
|
52
|
-
* scheduled set.
|
|
18
|
+
* @param {boolean} [opts.dropForeign=false] Default keeps edges to ids absent
|
|
19
|
+
* from the input (treated as not-yet-done, withholding the dependent);
|
|
20
|
+
* `true` drops them so the DAG is closed over the supplied set.
|
|
53
21
|
* @returns {Map<number, number[]>}
|
|
54
22
|
*/
|
|
55
23
|
export function buildStoryAdjacency(stories, { dropForeign = false } = {}) {
|
|
@@ -1,72 +1,66 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* body-format-lints.js — SSOT for the deterministic
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* body-format-lints.js — SSOT for the deterministic lints that can reject an
|
|
3
|
+
* authored Story body at persist time (rendered into the story-author prompt
|
|
4
|
+
* so a first draft is lint-clean), plus the mechanical `## Changes` fix-it.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* resident-context prices. This module is the single home for two remedies:
|
|
10
|
-
*
|
|
11
|
-
* 1. `BODY_FORMAT_LINTS` — the enumerated rejecting lints, each carrying a
|
|
12
|
-
* concrete good/bad example. `templates/decomposer-prompts.js` renders
|
|
13
|
-
* them into the story-author system prompt so the first draft is
|
|
14
|
-
* lint-clean by construction; a test enumerates the registry against the
|
|
15
|
-
* rendered prompt (Story #4684 AC-1).
|
|
16
|
-
* 2. `suggestPathEntryFix` — the mechanical rewrite. `story-body.js`
|
|
17
|
-
* (`parsePathEntry`) and `task-body-validator.js`
|
|
18
|
-
* (`collectChangesErrors`) call it so a failing lint emits the corrected
|
|
19
|
-
* form ready to paste rather than a bare reject (AC-2), and the persist
|
|
20
|
-
* dry-run applies the same salvage for real (Story #5312,
|
|
21
|
-
* `plan-persist/changes-repair.js`).
|
|
22
|
-
*
|
|
23
|
-
* Story #5312 deleted the `verify-tier-suffix` / `verify-manual-reason` lints
|
|
24
|
-
* with the tier suffix itself: a `verify[]` entry is any command, and the
|
|
25
|
-
* `manual:<reason>` escape is gone with the rule it escaped.
|
|
26
|
-
*
|
|
27
|
-
* Import hygiene: this module imports only the cycle-free
|
|
28
|
-
* `file-assumption-enum.js` leaf. It must NOT import `story-body.js` or
|
|
29
|
-
* `task-body-validator.js` — both import this module, and either back-edge
|
|
30
|
-
* would introduce a cycle (see the note in `file-assumption-enum.js`).
|
|
6
|
+
* Imports only the cycle-free `file-assumption-enum.js` leaf: story-body.js
|
|
7
|
+
* and task-body-validator.js both import this module, so importing either
|
|
8
|
+
* back would create a cycle.
|
|
31
9
|
*/
|
|
32
10
|
|
|
33
11
|
import { FILE_ASSUMPTION_VALUES } from '../orchestration/file-assumption-enum.js';
|
|
34
12
|
|
|
13
|
+
// Most bare-path bullets are in-place edits; the fix-it text tells the author
|
|
14
|
+
// to switch to creates/deletes when needed.
|
|
15
|
+
const DEFAULT_SUGGESTED_ASSUMPTION = 'refactors-existing';
|
|
16
|
+
|
|
35
17
|
/**
|
|
36
|
-
* The
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* `
|
|
18
|
+
* The one definition of a path bullet, shared by the story-body parser and
|
|
19
|
+
* the persist repair pass (which cannot import each other). Any single
|
|
20
|
+
* non-whitespace token, optionally backtick-wrapped — this admits route
|
|
21
|
+
* segments (`app/[slug]/page.tsx`) and extensionless files (`Makefile`) while
|
|
22
|
+
* whitespace still marks prose.
|
|
40
23
|
*/
|
|
41
|
-
const
|
|
24
|
+
const BARE_PATH_TOKEN_RE = /^(?:`([^\s`]+)`|([^\s`]+))$/;
|
|
42
25
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
26
|
+
/**
|
|
27
|
+
* @param {unknown} raw
|
|
28
|
+
* @returns {string|null} The path, with any wrapping backticks peeled.
|
|
29
|
+
*/
|
|
30
|
+
export function matchBarePathToken(raw) {
|
|
31
|
+
if (typeof raw !== 'string') return null;
|
|
32
|
+
const match = raw.trim().match(BARE_PATH_TOKEN_RE);
|
|
33
|
+
return match ? (match[1] ?? match[2]) : null;
|
|
34
|
+
}
|
|
47
35
|
|
|
48
36
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* bullet with a bad assumption). Returns `null` when no path-shaped token can
|
|
52
|
-
* be salvaged.
|
|
37
|
+
* Prose (carries whitespace) versus a single non-path token — distinct
|
|
38
|
+
* failures with distinct fixes.
|
|
53
39
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
40
|
+
* @param {unknown} raw
|
|
41
|
+
* @returns {boolean}
|
|
42
|
+
*/
|
|
43
|
+
export function isProseBullet(raw) {
|
|
44
|
+
return typeof raw === 'string' && /\s/.test(raw.trim());
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Deliberately loose: a false positive only yields an unhelpful fix-it.
|
|
48
|
+
const PATH_LIKE_RE = /[\w@*-]*[/.][\w@./*-]+/;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Paste-ready inline-JSON `{ path, assumption }` for a rejected bullet, or
|
|
52
|
+
* `null` when no path-shaped token can be salvaged.
|
|
56
53
|
*
|
|
57
54
|
* @param {unknown} raw
|
|
58
55
|
* @returns {string|null} e.g. `{"path":"src/app.js","assumption":"refactors-existing"}`.
|
|
59
56
|
*/
|
|
60
57
|
export function suggestPathEntryFix(raw) {
|
|
61
58
|
if (typeof raw !== 'string') return null;
|
|
62
|
-
// Strip a leading markdown bullet marker.
|
|
63
59
|
let s = raw
|
|
64
60
|
.trim()
|
|
65
61
|
.replace(/^[-*]\s+/, '')
|
|
66
62
|
.trim();
|
|
67
|
-
// Take the segment before any humanized "— assumption" tail.
|
|
68
63
|
s = s.split('—')[0].trim();
|
|
69
|
-
// Peel surrounding backticks / quotes.
|
|
70
64
|
s = s
|
|
71
65
|
.replace(/^[`'"]+/, '')
|
|
72
66
|
.replace(/[`'"]+$/, '')
|
|
@@ -76,21 +70,16 @@ export function suggestPathEntryFix(raw) {
|
|
|
76
70
|
}
|
|
77
71
|
|
|
78
72
|
/**
|
|
79
|
-
* A single deterministic body-format lint the persist path enforces.
|
|
80
|
-
*
|
|
81
73
|
* @typedef {object} BodyFormatLint
|
|
82
74
|
* @property {string} id Stable identifier (also the prompt anchor).
|
|
83
|
-
* @property {string} summary
|
|
84
|
-
* @property {string} badExample
|
|
85
|
-
* @property {string} goodExample
|
|
75
|
+
* @property {string} summary
|
|
76
|
+
* @property {string} badExample
|
|
77
|
+
* @property {string} goodExample
|
|
86
78
|
* @property {boolean} autoFixable Whether a failing dry-run emits a fix-it.
|
|
87
79
|
*/
|
|
88
80
|
|
|
89
81
|
/**
|
|
90
|
-
*
|
|
91
|
-
* persist time. Each carries a concrete example so the story-author prompt can
|
|
92
|
-
* state the requirement example-first (Story #4684 AC-1). The one `autoFixable`
|
|
93
|
-
* lint is the mechanical rewrite the dry-run applies (Story #5312).
|
|
82
|
+
* Only rules that still refuse; warnings live elsewhere.
|
|
94
83
|
*
|
|
95
84
|
* @type {ReadonlyArray<BodyFormatLint>}
|
|
96
85
|
*/
|
|
@@ -114,10 +103,13 @@ export const BODY_FORMAT_LINTS = Object.freeze([
|
|
|
114
103
|
{
|
|
115
104
|
id: 'changes-path-entry-shape',
|
|
116
105
|
summary:
|
|
117
|
-
'Every `## Changes` / `## References` bullet MUST
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
106
|
+
'Every `## Changes` / `## References` bullet MUST name a path — a bare ' +
|
|
107
|
+
'path string is the default form and persist derives its assumption by ' +
|
|
108
|
+
'probing the base branch. Use the `{ path, assumption }` object ' +
|
|
109
|
+
`(assumption ∈ ${FILE_ASSUMPTION_VALUES.join(' | ')}) only to pin one ` +
|
|
110
|
+
'yourself; `deletes` always needs it. Prose bullets are rejected.',
|
|
111
|
+
badExample: '- the routing module and its tests',
|
|
112
|
+
goodExample: '- src/app.js',
|
|
121
113
|
autoFixable: true,
|
|
122
114
|
},
|
|
123
115
|
{
|
|
@@ -127,13 +119,6 @@ export const BODY_FORMAT_LINTS = Object.freeze([
|
|
|
127
119
|
goodExample: '- {"path": "src/app.js", "assumption": "creates"}',
|
|
128
120
|
autoFixable: false,
|
|
129
121
|
},
|
|
130
|
-
{
|
|
131
|
-
id: 'verify-non-empty',
|
|
132
|
-
summary: 'A Story MUST list at least one `verify[]` entry.',
|
|
133
|
-
badExample: '"verify": []',
|
|
134
|
-
goodExample: '"verify": ["npm run validate"]',
|
|
135
|
-
autoFixable: false,
|
|
136
|
-
},
|
|
137
122
|
{
|
|
138
123
|
id: 'acceptance-non-empty',
|
|
139
124
|
summary:
|
|
@@ -1,42 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* footer-block.js — the Story body's `---` footer grammar
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* distinction is the whole safety property. An unanchored whole-body scan
|
|
7
|
-
* (what `parseBlockedBy` used to be) turned any sentence that merely mentioned
|
|
8
|
-
* a blocker into a real dispatch gate — an example, a changelog note, an
|
|
9
|
-
* acceptance criterion quoting the phrase — and withheld the Story until an
|
|
10
|
-
* unrelated issue closed.
|
|
11
|
-
*
|
|
12
|
-
* This module is the single home for that grammar. Both readers go through it:
|
|
13
|
-
* `lib/story-body/story-body.js` (what a body round-trips as `depends_on`) and
|
|
14
|
-
* `lib/dependency-parser.js` (what gates dispatch). Sharing one implementation
|
|
15
|
-
* is what keeps them from drifting apart into two different answers about the
|
|
16
|
-
* same body.
|
|
2
|
+
* footer-block.js — the Story body's `---` footer grammar, shared by the body
|
|
3
|
+
* parser and the dispatch-edge parser so they cannot disagree. Dependency
|
|
4
|
+
* edges are declared only by an exact line in the footer; an unanchored body
|
|
5
|
+
* scan turned any sentence mentioning a blocker into a real dispatch gate.
|
|
17
6
|
*
|
|
18
7
|
* @module lib/story-body/footer-block
|
|
19
8
|
*/
|
|
20
9
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
* its own line inside the footer block. Anchored at both ends deliberately —
|
|
24
|
-
* `depends on #N`, `Blocked by: #N`, and `blocked by #N once X lands` all
|
|
25
|
-
* declare nothing.
|
|
26
|
-
*/
|
|
10
|
+
// Anchored at both ends: `Blocked by: #N` or `blocked by #N once X` declare
|
|
11
|
+
// nothing.
|
|
27
12
|
const FOOTER_BLOCKED_BY_LINE_RE = /^blocked by\s+(#\d+)$/i;
|
|
28
13
|
|
|
29
|
-
/** A `---` rule on its own line. */
|
|
30
14
|
const FOOTER_RULE_RE = /^---\s*$/;
|
|
31
15
|
|
|
32
|
-
/** Footer keys that qualify a bare `---` rule as the footer separator. */
|
|
33
16
|
const FOOTER_KEY_RE = /^(parent:|Epic:|blocked by)/im;
|
|
34
17
|
|
|
35
18
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* `blocked by`). A `---` opening a thematic break or a table mid-body is
|
|
39
|
-
* therefore not mistaken for the footer.
|
|
19
|
+
* A `---` counts only when later lines start with a footer key, so a mid-body
|
|
20
|
+
* thematic break is not mistaken for the footer.
|
|
40
21
|
*
|
|
41
22
|
* @param {string} line
|
|
42
23
|
* @param {string[]} lines
|
|
@@ -49,16 +30,8 @@ export function isFooterSeparator(line, lines, index) {
|
|
|
49
30
|
}
|
|
50
31
|
|
|
51
32
|
/**
|
|
52
|
-
* Return the footer block of a body — everything after the footer separator —
|
|
53
|
-
* or `''` when the body carries no footer.
|
|
54
|
-
*
|
|
55
|
-
* Module-private: `parseFooterBlockedByIds` is its only caller. The body
|
|
56
|
-
* parser splits its own sections and reaches for `parseFooterBlockedByRefs`
|
|
57
|
-
* with the footer it already has, so exporting this would ship a symbol with
|
|
58
|
-
* no consumer.
|
|
59
|
-
*
|
|
60
33
|
* @param {string} body
|
|
61
|
-
* @returns {string}
|
|
34
|
+
* @returns {string} everything after the footer separator, or ''.
|
|
62
35
|
*/
|
|
63
36
|
function extractFooterBlock(body) {
|
|
64
37
|
if (!body) return '';
|
|
@@ -68,11 +41,8 @@ function extractFooterBlock(body) {
|
|
|
68
41
|
}
|
|
69
42
|
|
|
70
43
|
/**
|
|
71
|
-
* Extract the `blocked by #N` refs from an already-split footer block, as the
|
|
72
|
-
* `"#N"` strings a Story body's `depends_on` field round-trips.
|
|
73
|
-
*
|
|
74
44
|
* @param {string} footerBlock
|
|
75
|
-
* @returns {string[]}
|
|
45
|
+
* @returns {string[]} `"#N"` refs, as `depends_on` round-trips them.
|
|
76
46
|
*/
|
|
77
47
|
export function parseFooterBlockedByRefs(footerBlock) {
|
|
78
48
|
if (!footerBlock) return [];
|
|
@@ -83,11 +53,8 @@ export function parseFooterBlockedByRefs(footerBlock) {
|
|
|
83
53
|
}
|
|
84
54
|
|
|
85
55
|
/**
|
|
86
|
-
* Parse a body's declared blocker issue **numbers**, deduped — the
|
|
87
|
-
* dispatch-edge view of the same footer the body parser reads.
|
|
88
|
-
*
|
|
89
56
|
* @param {string} body
|
|
90
|
-
* @returns {number[]}
|
|
57
|
+
* @returns {number[]} deduped blocker issue numbers.
|
|
91
58
|
*/
|
|
92
59
|
export function parseFooterBlockedByIds(body) {
|
|
93
60
|
const ids = parseFooterBlockedByRefs(extractFooterBlock(body)).map((ref) =>
|