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,36 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Extracted from `.agents/scripts/run-audit-suite.js` (Story #963, Epic #946).
|
|
5
|
-
*
|
|
6
|
-
* Three concerns live here:
|
|
7
|
-
* 1. `applySubstitutions` — pure string templating used on each workflow body.
|
|
8
|
-
* 2. `parseSubstitutionPairs` / `applyImplicitSubstitutions` — CLI-side glue
|
|
9
|
-
* that turns `--substitution key=value` pairs and `--ticket` / `--base-branch`
|
|
10
|
-
* flags into the substitutions map the runner consumes.
|
|
11
|
-
* 3. `computeAllowedKeys` — the per-run allow-list (built-ins ∪ rule-declared
|
|
12
|
-
* keys) used by the runner to reject unknown caller substitutions before
|
|
13
|
-
* any workflow is loaded.
|
|
14
|
-
*
|
|
15
|
-
* No filesystem, no provider, no validation throws beyond `parseSubstitutionPairs`
|
|
16
|
-
* (which is defensive against malformed CLI input).
|
|
2
|
+
* `{{key}}` substitution for audit workflow bodies, plus the CLI glue and the
|
|
3
|
+
* per-run allowed-key set.
|
|
17
4
|
*/
|
|
18
5
|
|
|
19
6
|
import { ValidationError } from '../errors/index.js';
|
|
20
7
|
|
|
21
|
-
/**
|
|
22
|
-
* Built-in substitution keys that are always available regardless of which
|
|
23
|
-
* audits are requested. `auditOutputDir` is sourced from the resolved paths;
|
|
24
|
-
* `ticketId` and `baseBranch` are populated from CLI flags or caller args.
|
|
25
|
-
*/
|
|
26
8
|
export const BUILT_IN_SUBSTITUTION_KEYS = Object.freeze([
|
|
27
9
|
'auditOutputDir',
|
|
28
10
|
'ticketId',
|
|
29
11
|
'baseBranch',
|
|
30
|
-
// Newline-joined change
|
|
31
|
-
//
|
|
32
|
-
// Absent in manual `/audit-*` invocations — lens templates handle the
|
|
33
|
-
// unsubstituted literal as "no scope filter".
|
|
12
|
+
// Newline-joined change set; when unsubstituted, lens templates read the
|
|
13
|
+
// literal as "no scope filter".
|
|
34
14
|
'changedFiles',
|
|
35
15
|
]);
|
|
36
16
|
|
|
@@ -39,10 +19,7 @@ function escapeRegExp(str) {
|
|
|
39
19
|
}
|
|
40
20
|
|
|
41
21
|
/**
|
|
42
|
-
*
|
|
43
|
-
* value from `substitutions`. Keys are escaped for regex safety. Unrecognised
|
|
44
|
-
* placeholders are left intact — validation of the substitution map happens
|
|
45
|
-
* upstream in {@link computeAllowedKeys}.
|
|
22
|
+
* Unrecognised placeholders are left intact; keys are validated upstream.
|
|
46
23
|
*
|
|
47
24
|
* @param {string} content
|
|
48
25
|
* @param {Record<string, string>} substitutions
|
|
@@ -60,8 +37,7 @@ export function applySubstitutions(content, substitutions) {
|
|
|
60
37
|
}
|
|
61
38
|
|
|
62
39
|
/**
|
|
63
|
-
*
|
|
64
|
-
* Throws {@link ValidationError} on malformed entries (missing `=` or empty key).
|
|
40
|
+
* Throws {@link ValidationError} on a missing `=` or empty key.
|
|
65
41
|
*
|
|
66
42
|
* @param {string[]} [pairs]
|
|
67
43
|
* @returns {Record<string, string>}
|
|
@@ -84,13 +60,11 @@ export function parseSubstitutionPairs(pairs = []) {
|
|
|
84
60
|
}
|
|
85
61
|
|
|
86
62
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* `--substitution`. Pulled out of `main` so the precedence rules can be
|
|
90
|
-
* unit-tested without the CLI layer.
|
|
63
|
+
* Fill `ticketId`/`baseBranch` from flags in place, unless an explicit
|
|
64
|
+
* `--substitution` already set them.
|
|
91
65
|
*
|
|
92
|
-
* @param {Record<string, unknown>} values
|
|
93
|
-
* @param {Record<string, string|undefined>} substitutions
|
|
66
|
+
* @param {Record<string, unknown>} values
|
|
67
|
+
* @param {Record<string, string|undefined>} substitutions
|
|
94
68
|
*/
|
|
95
69
|
export function applyImplicitSubstitutions(values, substitutions) {
|
|
96
70
|
if (values.ticket && substitutions.ticketId === undefined) {
|
|
@@ -102,10 +76,8 @@ export function applyImplicitSubstitutions(values, substitutions) {
|
|
|
102
76
|
}
|
|
103
77
|
|
|
104
78
|
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* are not registered in rules are ignored here — the runner rejects them with
|
|
108
|
-
* a findings entry before substitution matters.
|
|
79
|
+
* Built-ins plus each requested audit's declared keys; unregistered audits
|
|
80
|
+
* are rejected elsewhere.
|
|
109
81
|
*
|
|
110
82
|
* @param {{ audits?: Record<string, { substitutionKeys?: string[] }> }} rules
|
|
111
83
|
* @param {string[]} auditWorkflows
|
|
@@ -1,21 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Extracted from `.agents/scripts/run-audit-suite.js` (Story #963, Epic #946).
|
|
5
|
-
*
|
|
6
|
-
* The runner injects either {@link loadWorkflow} (production) or a stub (tests)
|
|
7
|
-
* via `injectedLoadWorkflow`. Same for {@link defaultWriteArtifact} and
|
|
8
|
-
* `injectedWriteArtifact`. Keeping the IO bound here lets the runner module
|
|
9
|
-
* stay free of `node:fs` imports and stay easy to unit-test.
|
|
2
|
+
* Filesystem IO for audit workflows, kept out of the runner so tests can
|
|
3
|
+
* inject stubs.
|
|
10
4
|
*/
|
|
11
5
|
|
|
12
6
|
import fs from 'node:fs/promises';
|
|
13
7
|
import path from 'node:path';
|
|
14
8
|
|
|
15
9
|
/**
|
|
16
|
-
*
|
|
17
|
-
* missing — the runner converts that into a `low`-severity finding rather
|
|
18
|
-
* than throwing, so a missing workflow doesn't fail the suite.
|
|
10
|
+
* `null` when missing; the runner records a finding rather than failing.
|
|
19
11
|
*
|
|
20
12
|
* @param {string} auditName
|
|
21
13
|
* @param {string} workflowsDir absolute path to the workflows root
|
|
@@ -32,10 +24,6 @@ export async function loadWorkflow(auditName, workflowsDir) {
|
|
|
32
24
|
}
|
|
33
25
|
|
|
34
26
|
/**
|
|
35
|
-
* Default artifact writer used when the caller passes a `--run-id` /
|
|
36
|
-
* `artifactPrefix`. Creates the artifacts dir on demand and returns the
|
|
37
|
-
* absolute path of the file written.
|
|
38
|
-
*
|
|
39
27
|
* @param {string} artifactsDir
|
|
40
28
|
* @param {string} fileName
|
|
41
29
|
* @param {string} content
|
|
@@ -1,29 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* There are two sides to a label axis and they used to be written down in
|
|
6
|
-
* different places, which is how they drifted:
|
|
7
|
-
*
|
|
8
|
-
* - the **creator** — `audit-labels-bootstrap.js`, which ran `gh label create`
|
|
9
|
-
* over the `audit::<lens>` list and nothing else;
|
|
10
|
-
* - the **generator** — `audit-to-stories/build-story-body.js`, which emitted
|
|
11
|
-
* `type::story`, `audit::<lens>` and — as a bare string literal —
|
|
12
|
-
* `risk::high`.
|
|
13
|
-
*
|
|
14
|
-
* `risk::high` was therefore generated by the filer and defined by **no**
|
|
15
|
-
* taxonomy: not `LABEL_TAXONOMY` (the repo-wide bootstrap), not the audit
|
|
16
|
-
* bootstrap. A generated label the repository has never created is the exact
|
|
17
|
-
* failure shape that made every `gh issue create` in the feedback loop fail in
|
|
18
|
-
* Story #4828. This module is the one list both sides read, so the creator
|
|
19
|
-
* cannot fall behind the generator again.
|
|
20
|
-
*
|
|
21
|
-
* It lives under `lib/` rather than inside the bootstrap CLI so the generator
|
|
22
|
-
* can import it without a lib → top-level-script edge (and without dragging the
|
|
23
|
-
* CLI's config/`gh` dependencies into a pure body builder).
|
|
24
|
-
*
|
|
25
|
-
* Label *names* come from `lib/label-constants.js` — the repo-wide SSOT for
|
|
26
|
-
* label spelling — so a rename still lands in one place.
|
|
2
|
+
* The closed set of labels an audit sweep may create or generate — the one
|
|
3
|
+
* list both the bootstrap (creator) and the Story-body builder (generator)
|
|
4
|
+
* read, so the creator cannot fall behind the generator.
|
|
27
5
|
*/
|
|
28
6
|
|
|
29
7
|
import { auditLabelFooter } from '../findings/route-finding.js';
|
|
@@ -35,12 +13,7 @@ import {
|
|
|
35
13
|
} from '../label-constants.js';
|
|
36
14
|
import { AUDIT_LENSES, auditLabelsForFindings } from './audit-lenses.js';
|
|
37
15
|
|
|
38
|
-
/**
|
|
39
|
-
* Per-lens label presentation, keyed by canonical lens name. A lens absent from
|
|
40
|
-
* this map falls back to {@link DEFAULT_LENS_META}, so adding an `audit-*`
|
|
41
|
-
* workflow to `AUDIT_LENSES` still yields a label without registering
|
|
42
|
-
* colour/description here first.
|
|
43
|
-
*/
|
|
16
|
+
/** A lens absent here falls back to {@link DEFAULT_LENS_META}. */
|
|
44
17
|
const LENS_META = Object.freeze({
|
|
45
18
|
accessibility: {
|
|
46
19
|
color: 'c5def5',
|
|
@@ -110,11 +83,7 @@ function hex(color) {
|
|
|
110
83
|
return String(color).replace('#', '');
|
|
111
84
|
}
|
|
112
85
|
|
|
113
|
-
/**
|
|
114
|
-
* The `audit::<lens>` half of the taxonomy, one per `/audit-<lens>` workflow.
|
|
115
|
-
* Derived from the same `AUDIT_LENSES` SSOT that `build-story-body.js` derives
|
|
116
|
-
* its labels from, so the creator and the deriver cannot drift (Story #4195).
|
|
117
|
-
*/
|
|
86
|
+
/** Derived from the same `AUDIT_LENSES` SSOT the generator uses. */
|
|
118
87
|
const AUDIT_LENS_LABELS = Object.freeze(
|
|
119
88
|
AUDIT_LENSES.map((name) => ({
|
|
120
89
|
name: `audit::${name}`,
|
|
@@ -123,13 +92,8 @@ const AUDIT_LENS_LABELS = Object.freeze(
|
|
|
123
92
|
);
|
|
124
93
|
|
|
125
94
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* The `type::` / `agent::` entries are also in `LABEL_TAXONOMY` (the repo-wide
|
|
130
|
-
* bootstrap). Creating a label twice is a no-op, so the overlap costs nothing
|
|
131
|
-
* and means an audit sweep does not silently depend on the repo-wide bootstrap
|
|
132
|
-
* having run first.
|
|
95
|
+
* Overlaps the repo-wide taxonomy on purpose (re-creating is a no-op), so an
|
|
96
|
+
* audit sweep does not depend on the repo-wide bootstrap having run.
|
|
133
97
|
*/
|
|
134
98
|
const AUDIT_STORY_AXIS_LABELS = Object.freeze([
|
|
135
99
|
{
|
|
@@ -137,14 +101,8 @@ const AUDIT_STORY_AXIS_LABELS = Object.freeze([
|
|
|
137
101
|
color: hex(LABEL_COLORS.TYPE),
|
|
138
102
|
description: 'Story work item',
|
|
139
103
|
},
|
|
140
|
-
// Created, never generated
|
|
141
|
-
//
|
|
142
|
-
// build-story-body.js): a freshly-filed audit Story is not delivery-ready,
|
|
143
|
-
// and `/mandrel-plan` stamps this label as its terminal flip after
|
|
144
|
-
// enrichment. The bootstrap still creates it so that flip has a label to
|
|
145
|
-
// apply on a repo where only the audit bootstrap has been run. The drift
|
|
146
|
-
// this module guards runs the other way — a generator inventing names the
|
|
147
|
-
// creator never made — so a creator-only entry is safe (Story #5229).
|
|
104
|
+
// Created, never generated: `/mandrel-plan` applies it after enrichment.
|
|
105
|
+
// A creator-only entry is safe; the guarded drift is generator-only names.
|
|
148
106
|
{
|
|
149
107
|
name: AGENT_LABELS.READY,
|
|
150
108
|
color: hex(LABEL_COLORS.AGENT),
|
|
@@ -159,10 +117,6 @@ const AUDIT_STORY_AXIS_LABELS = Object.freeze([
|
|
|
159
117
|
},
|
|
160
118
|
]);
|
|
161
119
|
|
|
162
|
-
/**
|
|
163
|
-
* Every label the audit sweep defines — the closed set the bootstrap creates
|
|
164
|
-
* and {@link definesAuditLabel} answers against.
|
|
165
|
-
*/
|
|
166
120
|
export const AUDIT_LABEL_TAXONOMY = Object.freeze([
|
|
167
121
|
...AUDIT_LENS_LABELS,
|
|
168
122
|
...AUDIT_STORY_AXIS_LABELS,
|
|
@@ -171,13 +125,6 @@ export const AUDIT_LABEL_TAXONOMY = Object.freeze([
|
|
|
171
125
|
const DEFINED_NAMES = new Set(AUDIT_LABEL_TAXONOMY.map((l) => l.name));
|
|
172
126
|
|
|
173
127
|
/**
|
|
174
|
-
* True when `name` is a label this taxonomy defines.
|
|
175
|
-
*
|
|
176
|
-
* The enforcement point is the label **generator** (`build-story-body.js`),
|
|
177
|
-
* which routes every label it derives through this predicate and refuses to
|
|
178
|
-
* emit one the taxonomy does not define — closing the drift in the direction it
|
|
179
|
-
* actually happened: a generator inventing names the bootstrap never created.
|
|
180
|
-
*
|
|
181
128
|
* @param {unknown} name
|
|
182
129
|
* @returns {boolean}
|
|
183
130
|
*/
|
|
@@ -186,18 +133,9 @@ export function definesAuditLabel(name) {
|
|
|
186
133
|
}
|
|
187
134
|
|
|
188
135
|
/**
|
|
189
|
-
* Render the `audit-labels` footer for a group of findings.
|
|
190
|
-
*
|
|
191
136
|
* The dedup corpus is listed by `audit::*` label, so a Story filed without one
|
|
192
|
-
* is
|
|
193
|
-
*
|
|
194
|
-
* a fingerprint footer alone cannot rescue it. Carrying the labels through the
|
|
195
|
-
* seed is what lets the chained planning path stamp them without the authoring
|
|
196
|
-
* agent being asked to notice them (Story #5307).
|
|
197
|
-
*
|
|
198
|
-
* Lives here rather than beside {@link auditLabelsForFindings} because it needs
|
|
199
|
-
* {@link definesAuditLabel}, and the taxonomy already depends on the lens list —
|
|
200
|
-
* the reverse edge would be a cycle.
|
|
137
|
+
* is invisible to an indexed run; the seed carries the labels so the planning
|
|
138
|
+
* path stamps them. Lives here (not in audit-lenses) to avoid an import cycle.
|
|
201
139
|
*
|
|
202
140
|
* @param {Array<object>} findings
|
|
203
141
|
* @returns {string} the footer, or '' when no finding resolves to a label.
|
|
@@ -1,26 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The `/audit-<lens>` workflows each emit a report named
|
|
6
|
-
* `audit-<lens>-results.md`. The `audit::<lens>` GitHub label set is keyed off
|
|
7
|
-
* exactly these lens names — never off a finding's fine-grained `dimension`
|
|
8
|
-
* text. `build-story-body.js` derives a group's `audit::<lens>` labels from
|
|
9
|
-
* each finding's `sourceReport` basename via {@link lensFromSourceReport}, and
|
|
10
|
-
* `audit-labels-bootstrap.js` creates one `audit::<lens>` label per entry in
|
|
11
|
-
* {@link AUDIT_LENSES}. Centralising the list here keeps the label producer
|
|
12
|
-
* (bootstrap) and the label deriver (story-body) from drifting apart.
|
|
13
|
-
*
|
|
14
|
-
* Pure: no I/O.
|
|
15
|
-
*
|
|
16
|
-
* @see Story #4195 — junk `audit::<dimension>` label derivation.
|
|
2
|
+
* SSOT for the audit lens names. `audit::<lens>` labels key off these (via
|
|
3
|
+
* each finding's report basename), never off a finding's `dimension` text.
|
|
4
|
+
* Pure.
|
|
17
5
|
*/
|
|
18
6
|
|
|
19
7
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* meta-workflows, which produce no `audit-<lens>-results.md` of their own).
|
|
23
|
-
* Adding a new `audit-*` workflow MUST add its lens name here.
|
|
8
|
+
* One per `/audit-<lens>` workflow that emits `audit-<lens>-results.md`; a
|
|
9
|
+
* new `audit-*` lens workflow MUST be added here.
|
|
24
10
|
*
|
|
25
11
|
* @type {ReadonlyArray<string>}
|
|
26
12
|
*/
|
|
@@ -44,7 +30,6 @@ export const AUDIT_LENSES = Object.freeze([
|
|
|
44
30
|
'ux-ui',
|
|
45
31
|
]);
|
|
46
32
|
|
|
47
|
-
/** O(1) membership set for {@link isCanonicalLens}. */
|
|
48
33
|
const LENS_SET = new Set(AUDIT_LENSES);
|
|
49
34
|
|
|
50
35
|
/**
|
|
@@ -56,16 +41,8 @@ export function isCanonicalLens(lens) {
|
|
|
56
41
|
}
|
|
57
42
|
|
|
58
43
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* `temp/audits/` — is irrelevant) and matches the exact
|
|
62
|
-
* `audit-<lens>-results.md` shape the audit workflows emit. Backslash and
|
|
63
|
-
* forward-slash separators are both handled so a Windows-authored path
|
|
64
|
-
* resolves identically.
|
|
65
|
-
*
|
|
66
|
-
* Returns `null` when the path does not match the expected shape or the
|
|
67
|
-
* extracted lens is not one of the canonical {@link AUDIT_LENSES} — callers
|
|
68
|
-
* drop a `null` so a stray report name can never mint a junk `audit::*` label.
|
|
44
|
+
* Basename-only, either separator. `null` for a non-matching or non-canonical
|
|
45
|
+
* name, so a stray report can never mint a junk label.
|
|
69
46
|
*
|
|
70
47
|
* @param {unknown} sourceReport — e.g. `temp/audits/audit-clean-code-results.md`.
|
|
71
48
|
* @returns {string|null} the canonical lens (`clean-code`) or `null`.
|
|
@@ -83,14 +60,8 @@ export function lensFromSourceReport(sourceReport) {
|
|
|
83
60
|
}
|
|
84
61
|
|
|
85
62
|
/**
|
|
86
|
-
* Derive the deduped, sorted set of canonical `audit::<lens>` labels for a
|
|
87
|
-
* collection of findings, keyed off each finding's `sourceReport` basename.
|
|
88
|
-
* Findings whose `sourceReport` does not resolve to a canonical lens
|
|
89
|
-
* contribute no label (never a junk one). Multi-lens groups (findings from
|
|
90
|
-
* more than one report) yield one label per distinct lens.
|
|
91
|
-
*
|
|
92
63
|
* @param {Array<{ sourceReport?: unknown }>} findings
|
|
93
|
-
* @returns {string[]} sorted `audit::<lens>` labels.
|
|
64
|
+
* @returns {string[]} sorted, deduped `audit::<lens>` labels.
|
|
94
65
|
*/
|
|
95
66
|
export function auditLabelsForFindings(findings) {
|
|
96
67
|
const lenses = new Set();
|
|
@@ -1,25 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Render the canonical Story body for the standalone grouping mode so a
|
|
5
|
-
* generated audit Story clears the same inline-contract bar the decomposer
|
|
6
|
-
* enforces (`assertEveryStoryHasInlineContract`): a clean goal, observable
|
|
7
|
-
* `acceptance[]`, a populated `changes[]` footprint, and a non-empty,
|
|
8
|
-
* tier-tagged `verify[]` (Story #4270).
|
|
9
|
-
*
|
|
10
|
-
* Pure: returns { title, body, labels }. Labels carry one canonical
|
|
11
|
-
* `audit::<lens>` per distinct source report represented in the merge
|
|
12
|
-
* (derived from each finding's `sourceReport` basename, NEVER from the
|
|
13
|
-
* fine-grained `dimension` text — see Story #4195), plus `type::story` and
|
|
14
|
-
* (when any finding is Critical) `risk::high`. Deliberately **no `agent::`
|
|
15
|
-
* state label** — see {@link STATIC_LABELS}.
|
|
16
|
-
*
|
|
17
|
-
* The body is serialized via the canonical story-body serializer
|
|
18
|
-
* (`.agents/scripts/lib/story-body/story-body.js`) so the output round-trips
|
|
19
|
-
* through `parse()` / `serialize()`. Audit-specific content (agent prompts,
|
|
20
|
-
* context links, fingerprint footer) is appended after the canonical sections
|
|
21
|
-
* as extended markdown — it is informational only and is not part of the
|
|
22
|
-
* structured contract.
|
|
2
|
+
* Render a standalone audit Story body that clears the inline-contract bar,
|
|
3
|
+
* with audit extras appended as informational markdown. Pure.
|
|
23
4
|
*/
|
|
24
5
|
|
|
25
6
|
import path from 'node:path';
|
|
@@ -32,32 +13,11 @@ import {
|
|
|
32
13
|
renderSemanticKeyFooter,
|
|
33
14
|
} from './finding-adapter.js';
|
|
34
15
|
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
// This used to be `[TYPE_LABELS.STORY, AGENT_LABELS.READY]`, which put every
|
|
39
|
-
// Story the sweep filed one step from execution. `agent::ready` is precisely
|
|
40
|
-
// what `/mandrel-deliver` reads as "available for pickup", and the bodies
|
|
41
|
-
// reaching this function are audit prose — a synthesized acceptance line per
|
|
42
|
-
// finding and an Agent Prompts section that is empty whenever the lens
|
|
43
|
-
// captured no `agentPrompt`. Filing them ready contradicted the sweep's own
|
|
44
|
-
// shipped runbook, whose enrich-before-you-deliver step says not to point
|
|
45
|
-
// `/mandrel-deliver` at a freshly-filed audit Story; the label said the
|
|
46
|
-
// opposite of the prose, and the label is the half a machine reads.
|
|
47
|
-
//
|
|
48
|
-
// The state axis therefore belongs to whoever enriches the finding:
|
|
49
|
-
// `/mandrel-plan` stamps `agent::ready` as its terminal flip once the Story
|
|
50
|
-
// has a `## Spec`, real acceptance criteria and runnable verify lines. An
|
|
51
|
-
// absent `agent::` label is a legal initial state — `isValidTransition`
|
|
52
|
-
// treats a null from-state as the initial-entry edge and permits any target —
|
|
53
|
-
// so nothing downstream has to special-case the gap (Story #5229).
|
|
16
|
+
// Deliberately no `agent::` state label: audit prose is not ready for pickup.
|
|
17
|
+
// `/mandrel-plan` stamps `agent::ready` once enriched; an absent state is a
|
|
18
|
+
// legal initial state for `isValidTransition`.
|
|
54
19
|
const STATIC_LABELS = Object.freeze([TYPE_LABELS.STORY]);
|
|
55
20
|
|
|
56
|
-
// The verify[] contract every generated audit Story carries. These commands
|
|
57
|
-
// exist in this repo's harness (package.json scripts) so the Story satisfies
|
|
58
|
-
// the inline-contract bar with runnable, tier-tagged gates rather than
|
|
59
|
-
// placeholder prose. Kept as a frozen constant so the same contract is
|
|
60
|
-
// asserted by the unit suite.
|
|
61
21
|
const DEFAULT_VERIFY = Object.freeze([
|
|
62
22
|
'npm run lint (validate)',
|
|
63
23
|
'npm test (unit)',
|
|
@@ -68,11 +28,7 @@ function uniq(items) {
|
|
|
68
28
|
}
|
|
69
29
|
|
|
70
30
|
/**
|
|
71
|
-
* The
|
|
72
|
-
* carries no leading ordinal (`1.`/`2.`) and no `[SEVERITY]` / `(dimension)`
|
|
73
|
-
* prefix (the polluted shape Story #4270 replaced); those signals live in the
|
|
74
|
-
* per-finding fingerprint footer and the extended Agent Prompts section, not
|
|
75
|
-
* in the goal.
|
|
31
|
+
* The group intent only — no ordinal or `[SEVERITY]`/`(dimension)` prefix.
|
|
76
32
|
*
|
|
77
33
|
* @param {object} group
|
|
78
34
|
* @returns {string}
|
|
@@ -82,14 +38,6 @@ function goalFromGroup(group) {
|
|
|
82
38
|
}
|
|
83
39
|
|
|
84
40
|
/**
|
|
85
|
-
* Map every distinct file mentioned across the merge onto a canonical
|
|
86
|
-
* `changes[]` PathEntry (`{ path, assumption }`). Audit findings remediate
|
|
87
|
-
* code that already exists, so the assumption is `refactors-existing`.
|
|
88
|
-
*
|
|
89
|
-
* `group.files` is an array post-`groupFindings`; fall back to scanning the
|
|
90
|
-
* findings' own `files[]` when an upstream caller hands a group whose `files`
|
|
91
|
-
* aggregate was not materialized.
|
|
92
|
-
*
|
|
93
41
|
* @param {object} group
|
|
94
42
|
* @returns {Array<{ path: string, assumption: string }>}
|
|
95
43
|
*/
|
|
@@ -107,15 +55,8 @@ function changesFromGroup(group) {
|
|
|
107
55
|
}
|
|
108
56
|
|
|
109
57
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* paragraph. The recommendation prose is preserved verbatim in the Agent
|
|
113
|
-
* Prompts / fingerprint footer for the implementer; the acceptance line is
|
|
114
|
-
* the binding, confirmable outcome.
|
|
115
|
-
*
|
|
116
|
-
* Shape: `<title> is remediated in <primary file>: the recommended end-state
|
|
117
|
-
* holds and the finding is no longer reproducible.` — anchored on the finding
|
|
118
|
-
* title and primary file so the reviewer knows exactly what to check.
|
|
58
|
+
* A checkable end-state anchored on title and primary file, not the verbatim
|
|
59
|
+
* recommendation (which stays in the prompts/footer).
|
|
119
60
|
*
|
|
120
61
|
* @param {object} finding
|
|
121
62
|
* @returns {string}
|
|
@@ -135,9 +76,6 @@ function acceptanceCriteriaFromGroup(group) {
|
|
|
135
76
|
}
|
|
136
77
|
|
|
137
78
|
/**
|
|
138
|
-
* Resolve the `edges[]` sequencing anchored on this group. Each edge whose
|
|
139
|
-
* `fromGroupKey` matches this group's key contributes its `toGroupKey`.
|
|
140
|
-
*
|
|
141
79
|
* @param {object} group
|
|
142
80
|
* @param {Array<{ fromGroupKey: string, toGroupKey: string }>} edges
|
|
143
81
|
* @returns {string[]}
|
|
@@ -152,27 +90,10 @@ function sequencingDepsForGroup(group, edges) {
|
|
|
152
90
|
}
|
|
153
91
|
|
|
154
92
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* are not numbered — which is why this used to render as a prose
|
|
160
|
-
* `## Sequencing` block that nothing could act on. Standalone audit Stories
|
|
161
|
-
* therefore hardcoded `depends_on: []`, and their only actual serializer was
|
|
162
|
-
* an accident: their shared provenance footers collided under the delivery
|
|
163
|
-
* footprint guard. Narrowing that scrape removes the accident, so the ordering
|
|
164
|
-
* has to become real in the same change.
|
|
165
|
-
*
|
|
166
|
-
* The resolution is the two-pass shape `plan-persist` already uses: create every
|
|
167
|
-
* issue first, then re-render each body with the now-known numbers and mirror
|
|
168
|
-
* the same edges as native `blocked_by` relations. An edge whose target was not
|
|
169
|
-
* created (deduped against an existing Issue, suppressed by the ledger) simply
|
|
170
|
-
* drops — a `blocked by #undefined` would be worse than an absent edge.
|
|
171
|
-
*
|
|
172
|
-
* A **plain object**, deliberately, not a `Map`: the same map is handed to
|
|
173
|
-
* `applyBlockedByDependencies`, which indexes it with property access, so a
|
|
174
|
-
* `Map` there would silently resolve every lookup to `undefined`, skip every
|
|
175
|
-
* edge, and report success having written nothing. One shape, both halves.
|
|
93
|
+
* Group keys → `#N` refs, or `[]` before issues are numbered (first pass).
|
|
94
|
+
* Edges whose target was not created drop. `issueByGroupKey` must be a plain
|
|
95
|
+
* object: `applyBlockedByDependencies` indexes the same map by property, so a
|
|
96
|
+
* `Map` would silently skip every edge.
|
|
176
97
|
*
|
|
177
98
|
* @param {string[]} deps Group keys this group depends on.
|
|
178
99
|
* @param {Record<string, number>|null} issueByGroupKey
|
|
@@ -196,16 +117,8 @@ function agentPromptsSection(group) {
|
|
|
196
117
|
}
|
|
197
118
|
|
|
198
119
|
/**
|
|
199
|
-
* Link each source
|
|
200
|
-
*
|
|
201
|
-
* This used to render `- [\`path\`](path)` — the same
|
|
202
|
-
* `temp/audits/audit-<lens>-results.md` in the link text and again in the URL,
|
|
203
|
-
* byte-identical across every Story of a same-lens sweep. That doubled a token
|
|
204
|
-
* the delivery footprint guard scraped as edit intent, so a lens's whole cohort
|
|
205
|
-
* serialized on a report none of them would ever write to (Story #5044). The
|
|
206
|
-
* guard now ignores markdown-link URLs and temp-root paths, but rendering the
|
|
207
|
-
* path twice was never useful to a reader either: the file name is the label,
|
|
208
|
-
* the path is the target.
|
|
120
|
+
* Link each source report once (basename label, path target); repeating the
|
|
121
|
+
* path is a token the footprint guard can scrape as edit intent.
|
|
209
122
|
*
|
|
210
123
|
* @param {object} group
|
|
211
124
|
* @returns {string}
|
|
@@ -217,21 +130,14 @@ function contextLinksFromGroup(group) {
|
|
|
217
130
|
.filter((s) => typeof s === 'string'),
|
|
218
131
|
);
|
|
219
132
|
if (reports.length === 0) return '_(no source audit reports captured)_';
|
|
220
|
-
// `path.basename`
|
|
221
|
-
//
|
|
222
|
-
// the whole path — which would render the path twice in one link and
|
|
223
|
-
// re-create the very duplication this function exists to remove.
|
|
133
|
+
// `path.basename` splits on both separators on win32; `split('/')` would
|
|
134
|
+
// leave a Windows path whole and render it twice.
|
|
224
135
|
return reports.map((r) => `- [${path.basename(r)}](${r})`).join('\n');
|
|
225
136
|
}
|
|
226
137
|
|
|
227
138
|
function labelsForGroup(group) {
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
// fine-grained `dimension` text. The dimension is free-form prose
|
|
231
|
-
// ("stale-description", "dry", "efficiency (cpu)") and minting
|
|
232
|
-
// `audit::<dimension>` from it produced non-existent labels; only the 14
|
|
233
|
-
// canonical lens labels are valid. Multi-lens groups carry one label per
|
|
234
|
-
// distinct source report. See Story #4195.
|
|
139
|
+
// `audit::<lens>` comes from each `sourceReport` basename, never from the
|
|
140
|
+
// free-form `dimension` text, which mints non-existent labels.
|
|
235
141
|
const auditLabels = auditLabelsForFindings(group.findings ?? []);
|
|
236
142
|
const labels = [...STATIC_LABELS, ...auditLabels];
|
|
237
143
|
const hasCritical = (group.findings ?? []).some(
|
|
@@ -242,17 +148,8 @@ function labelsForGroup(group) {
|
|
|
242
148
|
}
|
|
243
149
|
|
|
244
150
|
/**
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
*
|
|
248
|
-
* Story #4195 fixed half of this: `audit::<dimension>` labels minted from
|
|
249
|
-
* free-form dimension prose ("stale-description", "dry") named labels that did
|
|
250
|
-
* not exist, so derivation moved to the closed lens list. The other half stayed
|
|
251
|
-
* open — `risk::high` was a bare string literal here, defined by no taxonomy —
|
|
252
|
-
* and nothing checked the generated set against anything at all. Throwing is
|
|
253
|
-
* deliberate: a label the repo has never created is dropped or fails the create
|
|
254
|
-
* outright, and a filer that silently loses `risk::high` on a Critical merge is
|
|
255
|
-
* worse than a loud failure at the point of generation.
|
|
151
|
+
* Throws rather than emit a label the repo lacks: a create would drop or fail
|
|
152
|
+
* on it, and silently losing `risk::high` on a Critical is worse.
|
|
256
153
|
*
|
|
257
154
|
* @param {string[]} labels
|
|
258
155
|
* @returns {string[]} the same labels, when every one is defined.
|
|
@@ -272,20 +169,13 @@ function assertLabelsInTaxonomy(labels) {
|
|
|
272
169
|
}
|
|
273
170
|
|
|
274
171
|
/**
|
|
172
|
+
* Second pass passes `issueByGroupKey` so edges render as `blocked by #N`.
|
|
173
|
+
*
|
|
275
174
|
* @param {object} params
|
|
276
175
|
* @param {object} params.group — output of `groupFindings` (one entry).
|
|
277
176
|
* @param {Array<{ fromGroupKey: string, toGroupKey: string }>} [params.edges]
|
|
278
|
-
*
|
|
279
|
-
* this group are carried through to `depends_on[]`; omit when no sequencing
|
|
280
|
-
* is known.
|
|
281
|
-
* @param {Record<string, number>|null} [params.issueByGroupKey]
|
|
282
|
-
* — group key → opened issue number. Supplied on the **second** pass, once
|
|
283
|
-
* the issues exist, so this group's edges render as canonical
|
|
284
|
-
* `blocked by #N` footers (Story #5044). Omit on the first pass.
|
|
177
|
+
* @param {Record<string, number>|null} [params.issueByGroupKey] Second pass only.
|
|
285
178
|
* @returns {{ title: string, body: string, labels: string[], groupKey: string, dependsOn: string[] }}
|
|
286
|
-
* `groupKey` and `dependsOn` are the caller's handle on the second pass:
|
|
287
|
-
* they name this Story and the groups it must follow, so the caller can map
|
|
288
|
-
* both onto issue numbers without re-deriving the grouping.
|
|
289
179
|
*/
|
|
290
180
|
export function buildStoryBody({ group, edges = [], issueByGroupKey = null }) {
|
|
291
181
|
if (!group || !Array.isArray(group.findings)) {
|
|
@@ -294,11 +184,6 @@ export function buildStoryBody({ group, edges = [], issueByGroupKey = null }) {
|
|
|
294
184
|
const title = group.title;
|
|
295
185
|
const dependsOn = sequencingDepsForGroup(group, edges);
|
|
296
186
|
|
|
297
|
-
// Build the canonical StoryBody object from the audit group data. The
|
|
298
|
-
// acceptance + verify arrays are populated so the body clears the
|
|
299
|
-
// inline-contract bar; changes[] carries the file footprint. `depends_on`
|
|
300
|
-
// is empty on the first pass (the blockers have no issue numbers yet) and
|
|
301
|
-
// carries real `#N` refs on the second — see dependencyRefs.
|
|
302
187
|
const storyBody = {
|
|
303
188
|
goal: goalFromGroup(group),
|
|
304
189
|
changes: changesFromGroup(group),
|
|
@@ -310,15 +195,12 @@ export function buildStoryBody({ group, edges = [], issueByGroupKey = null }) {
|
|
|
310
195
|
depends_on: dependencyRefs(dependsOn, issueByGroupKey),
|
|
311
196
|
};
|
|
312
197
|
|
|
313
|
-
// The
|
|
314
|
-
//
|
|
315
|
-
// ordering from the same place it reads every other Story's.
|
|
198
|
+
// The serializer's own footer, so `/mandrel-deliver` reads the ordering
|
|
199
|
+
// where it reads every other Story's.
|
|
316
200
|
const canonicalSections = serialize(storyBody, {
|
|
317
201
|
includeFooter: storyBody.depends_on.length > 0,
|
|
318
202
|
});
|
|
319
203
|
|
|
320
|
-
// Append audit-specific extended sections (agent prompts, context links,
|
|
321
|
-
// provenance footers) that are not part of the canonical shape.
|
|
322
204
|
const body = [
|
|
323
205
|
canonicalSections,
|
|
324
206
|
'',
|