mandrel 2.60.0 → 2.62.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/merge-queue.js +158 -0
- 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 +190 -280
- 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 +183 -485
- 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 +32 -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,34 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* feedback report is indistinguishable from a healthy one. This standing
|
|
7
|
-
* self-check closes that gap: at retro time it samples the on-disk signal
|
|
8
|
-
* substrate the sibling Stories established and surfaces the two ways the
|
|
9
|
-
* repaired loop can regress without anyone noticing:
|
|
10
|
-
*
|
|
11
|
-
* 1. **Schema-invalid signal lines.** It tails the most recent
|
|
12
|
-
* {@link MAX_SAMPLE_LINES} lines of every `signals.ndjson` stream under
|
|
13
|
-
* the run temp tree and validates each against the canonical
|
|
14
|
-
* `signal-event.schema.json` (via `validateSignal`, the same validator
|
|
15
|
-
* the writer uses — no hand-rolled drift).
|
|
16
|
-
* 2. **Un-actioned retro proposals.** It reads the retro mirror
|
|
17
|
-
* (`temp/run-<id>/retro.md`, Story #4418) and flags any actionable
|
|
18
|
-
* "Proposed issues" item that carries neither a filed-issue reference
|
|
19
|
-
* (`Filed: [#N](url)`) nor lives under the explicit "One-off /
|
|
20
|
-
* discarded" record.
|
|
21
|
-
*
|
|
22
|
-
* Contract:
|
|
23
|
-
* - Scope `retro`, `autoCorrect: 'refuse-and-print'` — read-only by
|
|
24
|
-
* construction; the runner refuses `autoFix` under the retro scope.
|
|
25
|
-
* - A clean substrate (valid lines, every proposal filed or
|
|
26
|
-
* discarded) yields **zero findings**, preserving the compact retro
|
|
27
|
-
* shape. Only when a concern is non-zero does `detect` return a single
|
|
28
|
-
* combined finding naming every non-clean dimension.
|
|
29
|
-
* - No new provider plumbing: `detect(state)` reads `state.cwd` from the
|
|
30
|
-
* existing cwd-scoped checks-registry state, anchors it to the main
|
|
31
|
-
* checkout root, and reads the temp tree directly.
|
|
2
|
+
* Read-only retro check for the feedback-loop substrate — an empty feedback
|
|
3
|
+
* report looks healthy, so this surfaces schema-invalid signal samples
|
|
4
|
+
* (validated with the writer's own validator) and actionable retro
|
|
5
|
+
* proposals neither filed nor discarded. A clean substrate yields no finding.
|
|
32
6
|
*/
|
|
33
7
|
|
|
34
8
|
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
@@ -37,18 +11,11 @@ import path from 'node:path';
|
|
|
37
11
|
import { mainCheckoutRoot, tempRootFrom } from '../config/temp-paths.js';
|
|
38
12
|
import { validateSignal } from '../observability/signal-validator.js';
|
|
39
13
|
|
|
40
|
-
/**
|
|
41
|
-
* Lines sampled from the tail of each `signals.ndjson` stream. The check is
|
|
42
|
-
* a health probe, not an exhaustive audit — the most recent window is a
|
|
43
|
-
* representative sample that keeps the read bounded on long streams.
|
|
44
|
-
*/
|
|
14
|
+
/** Tail window per stream: a bounded health probe, not an audit. */
|
|
45
15
|
const MAX_SAMPLE_LINES = 200;
|
|
46
16
|
|
|
47
17
|
/**
|
|
48
|
-
*
|
|
49
|
-
* `<baseDir>/<tempRoot>` (the layout `lib/config/temp-paths.js` creates).
|
|
50
|
-
* Returns `{ epicId, epicDir }` or `null` when no run temp tree exists (a
|
|
51
|
-
* fresh checkout, or a context with no run in flight).
|
|
18
|
+
* Most-recently-touched `run-<id>` temp tree, or `null`.
|
|
52
19
|
*
|
|
53
20
|
* @param {string} baseDir The main checkout root.
|
|
54
21
|
* @param {{ tempRoot?: string, fsImpl?: { readdirSync: typeof readdirSync, statSync: typeof statSync } }} [opts]
|
|
@@ -87,8 +54,7 @@ export function resolveEpicTempTree(
|
|
|
87
54
|
}
|
|
88
55
|
|
|
89
56
|
/**
|
|
90
|
-
*
|
|
91
|
-
* Epic-level wave-lifecycle stream plus each per-Story stream.
|
|
57
|
+
* The run-level stream plus each per-Story stream.
|
|
92
58
|
*
|
|
93
59
|
* @param {string} epicDir
|
|
94
60
|
* @param {{ fsImpl?: { readdirSync: typeof readdirSync, statSync: typeof statSync } }} [opts]
|
|
@@ -123,9 +89,7 @@ export function findSignalStreams(epicDir, { fsImpl } = {}) {
|
|
|
123
89
|
}
|
|
124
90
|
|
|
125
91
|
/**
|
|
126
|
-
*
|
|
127
|
-
* the canonical schema (a JSON parse failure counts as invalid). A missing
|
|
128
|
-
* or unreadable stream contributes zero — absence is not invalidity.
|
|
92
|
+
* Unparseable lines count as invalid; an unreadable stream counts zero.
|
|
129
93
|
*
|
|
130
94
|
* @param {string} streamPath
|
|
131
95
|
* @param {{ validate?: typeof validateSignal, maxLines?: number, readImpl?: typeof readFileSync }} [opts]
|
|
@@ -165,12 +129,8 @@ export function sampleStreamInvalidCount(
|
|
|
165
129
|
}
|
|
166
130
|
|
|
167
131
|
/**
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* `### Proposed issues` heading whose body carries a paste-ready
|
|
171
|
-
* `gh issue create` stanza (the un-filed fallback) instead of a
|
|
172
|
-
* `Filed: [#N](url)` reference. Discarded proposals live under the separate
|
|
173
|
-
* "### One-off / discarded" heading and are never scanned here.
|
|
132
|
+
* Unfiled = a `### Proposed issues` item carrying a `gh issue create` stanza
|
|
133
|
+
* and no `Filed:` line. Discarded proposals sit under another heading.
|
|
174
134
|
*
|
|
175
135
|
* @param {string} retroText
|
|
176
136
|
* @returns {string[]} Titles of unfiled actionable proposals.
|
|
@@ -211,9 +171,7 @@ export function scanRetroMirror(retroText) {
|
|
|
211
171
|
}
|
|
212
172
|
|
|
213
173
|
/**
|
|
214
|
-
*
|
|
215
|
-
* signal streams, and scan its retro mirror. Returns a single combined
|
|
216
|
-
* finding when either dimension is non-clean, else `null`.
|
|
174
|
+
* One combined finding when either dimension is non-clean, else `null`.
|
|
217
175
|
*
|
|
218
176
|
* @param {string} baseDir
|
|
219
177
|
* @param {{
|
|
@@ -1,34 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Scope-aware, memoized state assembler for the checks registry: each scope
|
|
3
|
+
* probes only the keys its checks need.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `index.js` filters the registry by `scope` first, then asks this module
|
|
7
|
-
* for state; the per-scope projection keeps probe cost proportional to the
|
|
8
|
-
* call site (e.g. `story-close` does not pay for `diagnose` probes, and
|
|
9
|
-
* the `retro` consumer only probes inputs the retro-scoped checks need).
|
|
10
|
-
*
|
|
11
|
-
* Privacy contract:
|
|
12
|
-
* - The `env` projection records **presence only** (`'set' | 'missing'`).
|
|
13
|
-
* It must never return, log, or otherwise expose the value of any
|
|
14
|
-
* environment variable. Specifically `GITHUB_TOKEN` and similarly
|
|
15
|
-
* scoped secrets are reduced to a single `'set'` / `'missing'` string
|
|
16
|
-
* before reaching the caller.
|
|
17
|
-
* - The `fs` projection records the **existence** of bootstrap files
|
|
18
|
-
* (`.env`, `.mcp.json`, `.worktrees/`); it does not read their contents.
|
|
19
|
-
*
|
|
20
|
-
* Memoization:
|
|
21
|
-
* - Results are cached per-scope by a module-local `Map`. Repeated calls
|
|
22
|
-
* with the same scope reuse the prior result without re-running any
|
|
23
|
-
* probe (verifiable via a probe spy in unit tests).
|
|
24
|
-
* - Different scopes get independent entries — they probe different keys
|
|
25
|
-
* and must not share a cached object.
|
|
26
|
-
* - `clearStateCache()` is exported for tests so a fresh probe matrix can
|
|
27
|
-
* be observed without restarting the process.
|
|
28
|
-
*
|
|
29
|
-
* Probes are injectable for testing. Production callers omit the `probes`
|
|
30
|
-
* option and get the real `git` / `fs` / `process.env` probes; tests pass
|
|
31
|
-
* spy probes to assert call counts and shapes.
|
|
5
|
+
* Privacy contract: `env` records presence only (`'set' | 'missing'`), never a
|
|
6
|
+
* value; `fs` records existence only, never contents.
|
|
32
7
|
*/
|
|
33
8
|
|
|
34
9
|
import { spawnSync } from 'node:child_process';
|
|
@@ -36,17 +11,11 @@ import { existsSync } from 'node:fs';
|
|
|
36
11
|
import path from 'node:path';
|
|
37
12
|
|
|
38
13
|
/**
|
|
39
|
-
* Scope →
|
|
40
|
-
*
|
|
41
|
-
* edit here — checks should not silently grow the probe surface.
|
|
42
|
-
*
|
|
43
|
-
* Keys are namespaced by category (`git.*`, `fs.*`, `env.*`) so the probe
|
|
44
|
-
* dispatcher can route them without re-parsing.
|
|
14
|
+
* Scope → probe keys (`git.*`, `fs.*`, `env.*`). Growing the probe surface is
|
|
15
|
+
* a deliberate edit here.
|
|
45
16
|
*
|
|
46
17
|
* @type {Record<string, readonly string[]>}
|
|
47
18
|
*/
|
|
48
|
-
// Story-close probe surface: branch list + worktree set. Story #1289
|
|
49
|
-
// introduced the `npm-test` alias.
|
|
50
19
|
const STORY_CLOSE_KEYS = Object.freeze([
|
|
51
20
|
'git.headRef',
|
|
52
21
|
'git.localBranches',
|
|
@@ -73,33 +42,25 @@ const SCOPE_KEYS = Object.freeze({
|
|
|
73
42
|
'fs.dotEnv',
|
|
74
43
|
'fs.dotMcp',
|
|
75
44
|
]),
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
// retro leg is a silent no-op (#4580).
|
|
45
|
+
// core-bare-clean runs in retro; without git.coreBare its detect() is a
|
|
46
|
+
// silent no-op.
|
|
79
47
|
retro: Object.freeze(['git.headRef', 'git.coreBare', 'fs.worktrees']),
|
|
80
48
|
diagnose: DIAGNOSE_KEYS,
|
|
81
49
|
});
|
|
82
50
|
|
|
83
51
|
/**
|
|
84
|
-
*
|
|
85
|
-
* does not collide with a prior probe matrix.
|
|
52
|
+
* Keyed by `${scope}::${cwd}`.
|
|
86
53
|
*
|
|
87
54
|
* @type {Map<string, StateObject>}
|
|
88
55
|
*/
|
|
89
56
|
const cache = new Map();
|
|
90
57
|
|
|
91
|
-
/**
|
|
92
|
-
* Clear the memoization cache. Tests call this between cases to observe a
|
|
93
|
-
* fresh probe matrix without restarting the process.
|
|
94
|
-
*/
|
|
95
58
|
export function clearStateCache() {
|
|
96
59
|
cache.clear();
|
|
97
60
|
}
|
|
98
61
|
|
|
99
62
|
/**
|
|
100
|
-
*
|
|
101
|
-
* exit is reported as `{ ok: false, stdout: '' }` so callers can treat the
|
|
102
|
-
* absence of a ref as "missing" rather than crashing the probe assembly.
|
|
63
|
+
* Never throws; a failure reads as `{ ok: false }`.
|
|
103
64
|
*
|
|
104
65
|
* @param {string} cwd
|
|
105
66
|
* @param {...string} args
|
|
@@ -114,8 +75,6 @@ function defaultGitProbe(cwd, ...args) {
|
|
|
114
75
|
}
|
|
115
76
|
|
|
116
77
|
/**
|
|
117
|
-
* Default fs probe — `existsSync` wrapper. Never reads file contents.
|
|
118
|
-
*
|
|
119
78
|
* @param {string} absPath
|
|
120
79
|
* @returns {boolean}
|
|
121
80
|
*/
|
|
@@ -124,9 +83,6 @@ function defaultFsProbe(absPath) {
|
|
|
124
83
|
}
|
|
125
84
|
|
|
126
85
|
/**
|
|
127
|
-
* Default env probe — returns `'set' | 'missing'` for the named variable.
|
|
128
|
-
* Never returns the value.
|
|
129
|
-
*
|
|
130
86
|
* @param {string} name
|
|
131
87
|
* @returns {'set' | 'missing'}
|
|
132
88
|
*/
|
|
@@ -135,9 +91,6 @@ function defaultEnvProbe(name) {
|
|
|
135
91
|
}
|
|
136
92
|
|
|
137
93
|
/**
|
|
138
|
-
* Probe the current HEAD ref (short / abbreviated form). Returns the branch
|
|
139
|
-
* name, or `null` when git cannot resolve HEAD (detached / non-repo).
|
|
140
|
-
*
|
|
141
94
|
* @param {object} args
|
|
142
95
|
* @param {string} args.cwd
|
|
143
96
|
* @param {(cwd: string, ...args: string[]) => { ok: boolean, stdout: string }} args.git
|
|
@@ -149,9 +102,6 @@ function probeHeadRef({ cwd, git }) {
|
|
|
149
102
|
}
|
|
150
103
|
|
|
151
104
|
/**
|
|
152
|
-
* Split a newline-delimited `for-each-ref --format='%(refname:short)'`
|
|
153
|
-
* payload into a trimmed, non-empty short-name list.
|
|
154
|
-
*
|
|
155
105
|
* @param {{ ok: boolean, stdout: string }} result
|
|
156
106
|
* @returns {string[]}
|
|
157
107
|
*/
|
|
@@ -165,9 +115,6 @@ function parseBranchList(result) {
|
|
|
165
115
|
}
|
|
166
116
|
|
|
167
117
|
/**
|
|
168
|
-
* Probe all local branches (`refs/heads/`), short-name form. Used by checks
|
|
169
|
-
* that grep over the branch list for legacy naming patterns.
|
|
170
|
-
*
|
|
171
118
|
* @param {object} args
|
|
172
119
|
* @param {string} args.cwd
|
|
173
120
|
* @param {(cwd: string, ...args: string[]) => { ok: boolean, stdout: string }} args.git
|
|
@@ -180,8 +127,6 @@ function probeLocalBranches({ cwd, git }) {
|
|
|
180
127
|
}
|
|
181
128
|
|
|
182
129
|
/**
|
|
183
|
-
* Probe `core.bare`. Returns the config value, or `null` when unset.
|
|
184
|
-
*
|
|
185
130
|
* @param {object} args
|
|
186
131
|
* @param {string} args.cwd
|
|
187
132
|
* @param {(cwd: string, ...args: string[]) => { ok: boolean, stdout: string }} args.git
|
|
@@ -193,11 +138,7 @@ function probeCoreBare({ cwd, git }) {
|
|
|
193
138
|
}
|
|
194
139
|
|
|
195
140
|
/**
|
|
196
|
-
*
|
|
197
|
-
* handler receives `{ cwd, git }` and returns the field's value.
|
|
198
|
-
*
|
|
199
|
-
* Story #3351: replaces the prior if/else ladder so each probe is
|
|
200
|
-
* independently testable.
|
|
141
|
+
* Keyed by the field after `git.`.
|
|
201
142
|
*
|
|
202
143
|
* @type {Record<string, (ctx: { cwd: string, git: (cwd: string, ...args: string[]) => { ok: boolean, stdout: string } }) => unknown>}
|
|
203
144
|
*/
|
|
@@ -208,9 +149,6 @@ const GIT_PROBES = Object.freeze({
|
|
|
208
149
|
});
|
|
209
150
|
|
|
210
151
|
/**
|
|
211
|
-
* Build the git projection for a key list by iterating the `GIT_PROBES`
|
|
212
|
-
* handler map.
|
|
213
|
-
*
|
|
214
152
|
* @param {readonly string[]} keys
|
|
215
153
|
* @param {string} cwd
|
|
216
154
|
* @param {(cwd: string, ...args: string[]) => { ok: boolean, stdout: string }} git
|
|
@@ -229,8 +167,6 @@ function probeGit(keys, cwd, git) {
|
|
|
229
167
|
}
|
|
230
168
|
|
|
231
169
|
/**
|
|
232
|
-
* Build the fs projection for a key list.
|
|
233
|
-
*
|
|
234
170
|
* @param {readonly string[]} keys
|
|
235
171
|
* @param {string} cwd
|
|
236
172
|
* @param {(absPath: string) => boolean} fs
|
|
@@ -253,8 +189,6 @@ function probeFs(keys, cwd, fs) {
|
|
|
253
189
|
}
|
|
254
190
|
|
|
255
191
|
/**
|
|
256
|
-
* Build the env projection for a key list. Presence only.
|
|
257
|
-
*
|
|
258
192
|
* @param {readonly string[]} keys
|
|
259
193
|
* @param {(name: string) => 'set' | 'missing'} env
|
|
260
194
|
* @returns {Record<string, 'set' | 'missing'>}
|
|
@@ -270,17 +204,13 @@ function probeEnv(keys, env) {
|
|
|
270
204
|
}
|
|
271
205
|
|
|
272
206
|
/**
|
|
273
|
-
*
|
|
274
|
-
* `
|
|
275
|
-
* scope declares. Memoized per `(scope, cwd)`.
|
|
207
|
+
* Frozen state with projections for the scope's keys only; memoized per
|
|
208
|
+
* `(scope, cwd)` unless `probes` are injected.
|
|
276
209
|
*
|
|
277
210
|
* @param {object} [opts]
|
|
278
|
-
* @param {string} [opts.scope]
|
|
279
|
-
* scope-specific. An undefined scope returns an empty projection (used
|
|
280
|
-
* only by tests that want to verify the no-op path).
|
|
211
|
+
* @param {string} [opts.scope] Undefined yields an empty projection.
|
|
281
212
|
* @param {string} [opts.cwd=process.cwd()]
|
|
282
|
-
* @param {object} [opts.probes]
|
|
283
|
-
* Production callers omit this and get the default probes.
|
|
213
|
+
* @param {object} [opts.probes] `{ git, fs, env }` test spies.
|
|
284
214
|
* @returns {StateObject}
|
|
285
215
|
*
|
|
286
216
|
* @typedef {object} StateObject
|
|
@@ -300,8 +230,7 @@ export function assembleState({ scope, cwd = process.cwd(), probes } = {}) {
|
|
|
300
230
|
const envProbe = probes?.env ?? defaultEnvProbe;
|
|
301
231
|
const gitProjection = probeGit(keys, cwd, gitProbe);
|
|
302
232
|
const fsProjection = probeFs(keys, cwd, fsProbe);
|
|
303
|
-
//
|
|
304
|
-
// worktree they were assembled for.
|
|
233
|
+
// `cwd` lets fs-scanning checks target the worktree they were assembled for.
|
|
305
234
|
const state = Object.freeze({
|
|
306
235
|
scope,
|
|
307
236
|
cwd,
|
|
@@ -310,16 +239,12 @@ export function assembleState({ scope, cwd = process.cwd(), probes } = {}) {
|
|
|
310
239
|
env: Object.freeze(probeEnv(keys, envProbe)),
|
|
311
240
|
});
|
|
312
241
|
if (!probes) {
|
|
313
|
-
// Only memoize the default-probe path. Tests with injected spies want
|
|
314
|
-
// to observe call counts on every invocation.
|
|
315
242
|
cache.set(cacheKey, state);
|
|
316
243
|
}
|
|
317
244
|
return state;
|
|
318
245
|
}
|
|
319
246
|
|
|
320
247
|
/**
|
|
321
|
-
* Expose the scope → key map for tests and `/diagnose --show-scope`.
|
|
322
|
-
*
|
|
323
248
|
* @returns {Record<string, readonly string[]>}
|
|
324
249
|
*/
|
|
325
250
|
export function getScopeKeys() {
|
|
@@ -1,29 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* story-init
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* waiting on completion) instead of a synchronous Bash call with a
|
|
7
|
-
* 10-minute timeout. This guards the failure mode where `Monitor`'s wait
|
|
8
|
-
* is not equivalent to script exit — a sub-agent that exits during a
|
|
9
|
-
* Monitor wait kills `single-story-init.js` mid-run, leaving a
|
|
10
|
-
* half-initialized worktree.
|
|
11
|
-
*
|
|
12
|
-
* Scope: 'story-close', 'retro'. The check runs at every
|
|
13
|
-
* preflight surface that has the opportunity to invoke Story init —
|
|
14
|
-
* primarily `/mandrel-deliver`'s init step — and surfaces as a retro audit
|
|
15
|
-
* signal if the failure mode resurfaces during a sprint.
|
|
16
|
-
*
|
|
17
|
-
* The check is `refuse-and-print`. Auto-rewriting an orchestration call
|
|
18
|
-
* site would change runtime behavior on a script the operator may be
|
|
19
|
-
* actively iterating on; the fixCommand prints the canonical
|
|
20
|
-
* synchronous-call replacement pattern so they can apply it deliberately.
|
|
21
|
-
*
|
|
22
|
-
* Implementation note: we scan `.agents/` (markdown + js) for the
|
|
23
|
-
* juxtaposition of a `story-init.js` reference (which also matches
|
|
24
|
-
* `single-story-init.js` as a suffix) and a backgrounding token
|
|
25
|
-
* (`run_in_background: true`, the literal `Monitor` tool name as a
|
|
26
|
-
* fan-out target, or `&` shell backgrounding) within a small line window.
|
|
2
|
+
* Flags call sites that background `single-story-init.js` instead of calling
|
|
3
|
+
* it synchronously: a sub-agent exiting during a `Monitor` wait kills init
|
|
4
|
+
* mid-run and leaves a half-initialized worktree. Refuse-and-print, since
|
|
5
|
+
* rewriting a call site would change behaviour the operator may be editing.
|
|
27
6
|
*/
|
|
28
7
|
|
|
29
8
|
import nodeFs from 'node:fs';
|
|
@@ -33,15 +12,8 @@ const SCAN_ROOT_DEFAULT = '.agents';
|
|
|
33
12
|
const WINDOW_LINES = 20;
|
|
34
13
|
|
|
35
14
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* (which legitimately appears in docs warning against the antipattern).
|
|
39
|
-
*
|
|
40
|
-
* - `run_in_background: true` — Bash tool's backgrounding flag.
|
|
41
|
-
* - `detached: true` — child_process.spawn options that detach the
|
|
42
|
-
* subprocess from the parent's lifecycle, equivalent to backgrounding.
|
|
43
|
-
* - `single-story-init.js &` — POSIX shell ampersand backgrounding
|
|
44
|
-
* (the pattern matches the `story-init.js` suffix of both names).
|
|
15
|
+
* Invocation syntax only, never prose like "do not use Monitor" that docs
|
|
16
|
+
* legitimately carry.
|
|
45
17
|
*/
|
|
46
18
|
const BACKGROUND_TOKENS = [
|
|
47
19
|
/run_in_background\s*:\s*true/,
|
|
@@ -50,15 +22,6 @@ const BACKGROUND_TOKENS = [
|
|
|
50
22
|
];
|
|
51
23
|
|
|
52
24
|
/**
|
|
53
|
-
* Walk a directory recursively, yielding absolute file paths for `.js`
|
|
54
|
-
* and `.md` sources. Skips `node_modules`, `.worktrees`, and directories
|
|
55
|
-
* starting with `.git`.
|
|
56
|
-
*
|
|
57
|
-
* The optional final `fsImpl` parameter defaults to the real `node:fs`
|
|
58
|
-
* (`.agents/rules/test-seams.md` rule 1) and is forwarded to the recursive
|
|
59
|
-
* call rather than re-acquired there (rule 4), so a test drives the whole walk
|
|
60
|
-
* through a plain stub object instead of module mocking (rule 5).
|
|
61
|
-
*
|
|
62
25
|
* @param {string} dir
|
|
63
26
|
* @param {typeof nodeFs} [fsImpl]
|
|
64
27
|
* @returns {string[]}
|
|
@@ -92,16 +55,7 @@ export function walkSources(dir, fsImpl = nodeFs) {
|
|
|
92
55
|
}
|
|
93
56
|
|
|
94
57
|
/**
|
|
95
|
-
*
|
|
96
|
-
* referencing `story-init.js` (including `single-story-init.js`) that has
|
|
97
|
-
* a backgrounding token in the same ±WINDOW_LINES window.
|
|
98
|
-
*
|
|
99
|
-
* The check explicitly excludes the `single-story-init.js` file itself and
|
|
100
|
-
* any dedicated check module (this file): the source-of-truth
|
|
101
|
-
* implementation legitimately mentions itself.
|
|
102
|
-
*
|
|
103
|
-
* Pure: it is handed the already-read source, so it needs no filesystem seam
|
|
104
|
-
* of its own.
|
|
58
|
+
* Every `story-init.js` line with a backgrounding token within ±WINDOW_LINES.
|
|
105
59
|
*
|
|
106
60
|
* @param {string} file
|
|
107
61
|
* @param {string} src
|
|
@@ -109,11 +63,8 @@ export function walkSources(dir, fsImpl = nodeFs) {
|
|
|
109
63
|
*/
|
|
110
64
|
export function scanFile(file, src) {
|
|
111
65
|
const offences = [];
|
|
112
|
-
//
|
|
113
|
-
//
|
|
114
|
-
// (run_in_background) and the story-init backgrounding anti-pattern in
|
|
115
|
-
// adjacent bullets, which collides with the scanner's ±20-line window
|
|
116
|
-
// even though there is no real invocation in the prose.
|
|
66
|
+
// Skip the script, this check, and parallel-tooling.md, whose adjacent
|
|
67
|
+
// prose bullets fall inside one window with no real invocation.
|
|
117
68
|
const basename = path.basename(file);
|
|
118
69
|
if (
|
|
119
70
|
basename === 'single-story-init.js' ||
|
|
@@ -160,9 +111,7 @@ export default {
|
|
|
160
111
|
|
|
161
112
|
/**
|
|
162
113
|
* @param {{ cwd?: string, scanRoot?: string, scope?: string }} [state]
|
|
163
|
-
* @param {typeof nodeFs} [fsImpl]
|
|
164
|
-
* to the real `node:fs` (`.agents/rules/test-seams.md` rule 1) and is
|
|
165
|
-
* forwarded to {@link walkSources} rather than re-acquired (rule 4).
|
|
114
|
+
* @param {typeof nodeFs} [fsImpl]
|
|
166
115
|
*/
|
|
167
116
|
detect(state, fsImpl = nodeFs) {
|
|
168
117
|
const cwd = state?.cwd ?? process.cwd();
|
|
@@ -1,43 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Nested
|
|
5
|
-
*
|
|
6
|
-
* 2.1.202, re-spiked 2026-07-08; see Epic #4385 / watch #2870). A level-1
|
|
7
|
-
* sub-agent carries `Agent` in its primary toolset and can spawn a working
|
|
8
|
-
* level-2 sub-agent. Declaring `Agent` in a sub-agent workflow is therefore
|
|
9
|
-
* a legitimate design choice, **not** an automatic runtime failure.
|
|
10
|
-
*
|
|
11
|
-
* What this check guards is the one case that still fails: a fan-out whose
|
|
12
|
-
* declared nesting depth exceeds the announced/supported ceiling. A dispatch
|
|
13
|
-
* chain deeper than the harness supports will silently fail at runtime, so a
|
|
14
|
-
* workflow that declares `Agent` together with a `nesting-depth` beyond the
|
|
15
|
-
* ceiling is flagged as a blocker. A sub-agent that declares `Agent` at a
|
|
16
|
-
* supported depth (the common case — an undeclared depth is treated as the
|
|
17
|
-
* shallow level-1 fan-out) produces no finding.
|
|
18
|
-
*
|
|
19
|
-
* This inverts the historical guard (Story #4387): the check used to refuse
|
|
20
|
-
* `Agent` in *any* sub-agent workflow on the now-false rationale that
|
|
21
|
-
* sub-agents cannot dispatch. It no longer strips a real capability; it only
|
|
22
|
-
* catches an over-deep fan-out. The self-healing surface is preserved — it is
|
|
23
|
-
* re-scoped, not removed.
|
|
24
|
-
*
|
|
25
|
-
* Scope: 'retro'. Surfaces as audit signal at retro.
|
|
26
|
-
*
|
|
27
|
-
* The check is `refuse-and-print` — auto-rewriting a workflow's declared
|
|
28
|
-
* depth or tool list would silently change runtime behavior in ways the
|
|
29
|
-
* operator may not have intended. The fixCommand explains how to bring the
|
|
30
|
-
* fan-out back under the ceiling (reduce the declared depth or split the
|
|
31
|
-
* deepest level out), and is explicit that stripping `Agent` is NOT the fix.
|
|
32
|
-
*
|
|
33
|
-
* Implementation note: we scan `.agents/workflows/*.md` for workflow files
|
|
34
|
-
* whose frontmatter or body identifies them as a sub-agent role AND whose
|
|
35
|
-
* `tools:` declaration includes `Agent`, then read the workflow's declared
|
|
36
|
-
* `nesting-depth`. The marker for "sub-agent" is the phrase `sub-agent`
|
|
37
|
-
* appearing in the description / overview region. The depth is read from a
|
|
38
|
-
* `nesting-depth:` (or `agent-depth:`) frontmatter field, or a
|
|
39
|
-
* `<!-- nesting-depth: N -->` body marker; an absent declaration is treated
|
|
40
|
-
* as depth 1 (a single, shallow fan-out level).
|
|
2
|
+
* Flags a sub-agent workflow that declares `Agent` with a fan-out deeper than
|
|
3
|
+
* the supported nesting ceiling — such a chain fails silently at runtime.
|
|
4
|
+
* Nested dispatch at a supported depth is legitimate. Refuse-and-print:
|
|
5
|
+
* rewriting depth or tools would change runtime behaviour unasked.
|
|
41
6
|
*/
|
|
42
7
|
|
|
43
8
|
import { readdirSync, readFileSync } from 'node:fs';
|
|
@@ -46,21 +11,14 @@ import path from 'node:path';
|
|
|
46
11
|
const WORKFLOWS_DIR_DEFAULT = path.join('.agents', 'workflows');
|
|
47
12
|
|
|
48
13
|
/**
|
|
49
|
-
*
|
|
50
|
-
* sub-agent fan-out. Depth 2 is independently verified; depths 3–5 are
|
|
51
|
-
* announced but not yet re-spiked (Epic #4385 / watch #2870). A workflow
|
|
52
|
-
* declaring a fan-out deeper than this ceiling is flagged. Operators can pin
|
|
53
|
-
* a stricter (or, once verified, looser) ceiling via `state.supportedDepth`.
|
|
14
|
+
* Harness-announced ceiling (only depth 2 is verified); `state.supportedDepth` overrides.
|
|
54
15
|
*
|
|
55
16
|
* @type {number}
|
|
56
17
|
*/
|
|
57
18
|
export const ANNOUNCED_MAX_DEPTH = 5;
|
|
58
19
|
|
|
59
20
|
/**
|
|
60
|
-
*
|
|
61
|
-
* (non-recursive — the workflows surface is one level deep; helpers/
|
|
62
|
-
* sub-directory holds procedural modules that are not invoked as
|
|
63
|
-
* sub-agents in their own right).
|
|
21
|
+
* Non-recursive: `helpers/` modules are never sub-agents themselves.
|
|
64
22
|
*
|
|
65
23
|
* @param {string} dir
|
|
66
24
|
* @returns {string[]}
|
|
@@ -78,9 +36,6 @@ function listWorkflowFiles(dir) {
|
|
|
78
36
|
}
|
|
79
37
|
|
|
80
38
|
/**
|
|
81
|
-
* Extract the frontmatter block (between leading `---` lines) and the
|
|
82
|
-
* body. Returns `{ frontmatter, body }` strings (either may be empty).
|
|
83
|
-
*
|
|
84
39
|
* @param {string} src
|
|
85
40
|
* @returns {{ frontmatter: string, body: string }}
|
|
86
41
|
*/
|
|
@@ -89,19 +44,14 @@ function splitFrontmatter(src) {
|
|
|
89
44
|
const end = src.indexOf('\n---', 3);
|
|
90
45
|
if (end === -1) return { frontmatter: '', body: src };
|
|
91
46
|
const frontmatter = src.slice(3, end);
|
|
92
|
-
// Skip past the closing `---` and the trailing newline.
|
|
93
47
|
const bodyStart = src.indexOf('\n', end + 4);
|
|
94
48
|
const body = bodyStart === -1 ? '' : src.slice(bodyStart + 1);
|
|
95
49
|
return { frontmatter, body };
|
|
96
50
|
}
|
|
97
51
|
|
|
98
52
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* description/overview region or the explicit phrase `runs as a
|
|
102
|
-
* sub-agent`. The marker has to appear early in the document — past
|
|
103
|
-
* the first ~100 lines we treat the mention as historical context
|
|
104
|
-
* rather than a role declaration.
|
|
53
|
+
* `sub-agent` within the first 100 lines is a role declaration; later
|
|
54
|
+
* mentions are context.
|
|
105
55
|
*
|
|
106
56
|
* @param {string} src
|
|
107
57
|
* @returns {boolean}
|
|
@@ -112,34 +62,25 @@ function isSubAgentWorkflow(src) {
|
|
|
112
62
|
}
|
|
113
63
|
|
|
114
64
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* (for the finding's detail field), or `null` if no `Agent` tool is
|
|
118
|
-
* declared.
|
|
65
|
+
* Find an `Agent` entry in a flow- or block-style `tools:` list, in
|
|
66
|
+
* frontmatter or body; returns the fragment for the finding detail.
|
|
119
67
|
*
|
|
120
68
|
* @param {{ frontmatter: string, body: string }} parts
|
|
121
69
|
* @returns {string | null}
|
|
122
70
|
*/
|
|
123
71
|
function findAgentToolDeclaration(parts) {
|
|
124
72
|
const { frontmatter, body } = parts;
|
|
125
|
-
// Frontmatter YAML — match either `tools: [..., Agent, ...]` (flow
|
|
126
|
-
// style) or block style with `- Agent`.
|
|
127
73
|
const flowMatch = frontmatter.match(/tools\s*:\s*\[(.*?)\]/s);
|
|
128
74
|
if (flowMatch && /\bAgent\b/.test(flowMatch[1])) {
|
|
129
75
|
return `frontmatter tools: ${flowMatch[0].slice(0, 120)}`;
|
|
130
76
|
}
|
|
131
|
-
//
|
|
132
|
-
// tolerate the trailing item line having no newline before the
|
|
133
|
-
// frontmatter terminator.
|
|
77
|
+
// The last item may lack a newline before the frontmatter terminator.
|
|
134
78
|
const blockMatch = frontmatter.match(
|
|
135
79
|
/tools\s*:\s*\n((?:[ \t]*-[ \t]*[^\n]+\n?)+)/,
|
|
136
80
|
);
|
|
137
81
|
if (blockMatch && /^[ \t]*-[ \t]*Agent\b/m.test(blockMatch[1])) {
|
|
138
82
|
return `frontmatter tools (block): ${blockMatch[0].split('\n')[0]}`;
|
|
139
83
|
}
|
|
140
|
-
// Body: same shape, e.g. operators sometimes document the tool list
|
|
141
|
-
// in a "## Tools" section. We accept either of the YAML shapes
|
|
142
|
-
// appearing in fenced code or inline.
|
|
143
84
|
const bodyFlow = body.match(/tools\s*:\s*\[(.*?)\]/s);
|
|
144
85
|
if (bodyFlow && /\bAgent\b/.test(bodyFlow[1])) {
|
|
145
86
|
return `body tools: ${bodyFlow[0].slice(0, 120)}`;
|
|
@@ -152,12 +93,8 @@ function findAgentToolDeclaration(parts) {
|
|
|
152
93
|
}
|
|
153
94
|
|
|
154
95
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
* `nesting-depth:` (or `agent-depth:`) frontmatter field, or a
|
|
158
|
-
* `<!-- nesting-depth: N -->` marker in the body. Returns the integer
|
|
159
|
-
* depth, or `null` when no depth is declared (the caller treats an absent
|
|
160
|
-
* declaration as the shallow level-1 fan-out).
|
|
96
|
+
* From a `nesting-depth:`/`agent-depth:` frontmatter field or a
|
|
97
|
+
* `<!-- nesting-depth: N -->` body marker; `null` when undeclared.
|
|
161
98
|
*
|
|
162
99
|
* @param {{ frontmatter: string, body: string }} parts
|
|
163
100
|
* @returns {number | null}
|
|
@@ -176,10 +113,6 @@ function parseDeclaredDepth(parts) {
|
|
|
176
113
|
}
|
|
177
114
|
|
|
178
115
|
/**
|
|
179
|
-
* Resolve the supported depth ceiling for a detect run. Operators may pin a
|
|
180
|
-
* stricter (or, once verified, looser) ceiling via `state.supportedDepth`;
|
|
181
|
-
* an unset or non-positive-integer override falls back to the announced max.
|
|
182
|
-
*
|
|
183
116
|
* @param {{ supportedDepth?: unknown } | null | undefined} state
|
|
184
117
|
* @returns {number}
|
|
185
118
|
*/
|
|
@@ -227,9 +160,7 @@ export default {
|
|
|
227
160
|
const parts = splitFrontmatter(src);
|
|
228
161
|
const where = findAgentToolDeclaration(parts);
|
|
229
162
|
if (!where) continue;
|
|
230
|
-
//
|
|
231
|
-
// supported ceiling is a runtime hazard; an undeclared depth is the
|
|
232
|
-
// shallow level-1 fan-out and always within the ceiling.
|
|
163
|
+
// An undeclared depth is the shallow level-1 fan-out.
|
|
233
164
|
const depth = parseDeclaredDepth(parts) ?? 1;
|
|
234
165
|
if (depth <= ceiling) continue;
|
|
235
166
|
offences.push({
|