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,218 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI: provenance-citation **report** for workflow prose.
|
|
3
|
-
*
|
|
4
|
-
* Workflow documents ride resident in an executing agent's context. A
|
|
5
|
-
* `(Story #1234)` aside costs the same tokens as instruction and teaches
|
|
6
|
-
* the model Mandrel's own history instead of the task in front of it. The
|
|
7
|
-
* citations that survive are the ones a reader must follow to act; the
|
|
8
|
-
* rest belong in the commit trail and `docs/decisions.md`.
|
|
9
|
-
*
|
|
10
|
-
* This command counts every issue-shaped reference across
|
|
11
|
-
* `.agents/workflows/**\/*.md` and prints the per-file tally. It **always
|
|
12
|
-
* exits 0**: Story #5340 demoted it from a ratchet to a report and deleted
|
|
13
|
-
* `baselines/workflow-citations.json` with it. The ratchet failed a rise
|
|
14
|
-
* above a committed total, so a prose fix that added one pointer had to be
|
|
15
|
-
* paid for with an unrelated trim in the same commit — and that is how three
|
|
16
|
-
* reference sections came to describe mechanisms the code had already
|
|
17
|
-
* retired. The count is still worth seeing on every change, so it stays a
|
|
18
|
-
* report. See `docs/decisions.md`, ADR 20260917-5340.
|
|
19
|
-
*
|
|
20
|
-
* The counted token is the bare `#NNNN` form rather than the
|
|
21
|
-
* `(Story|Epic|issue|refs) #NNNN` phrasing, because the same citation is
|
|
22
|
-
* written both ways — `(Story #4593)` and a bare `(#4593)` — and a report
|
|
23
|
-
* that only saw the prefixed form would undercount the other one.
|
|
24
|
-
*
|
|
25
|
-
* Flags:
|
|
26
|
-
* --root <path> scan a different workflow root (default
|
|
27
|
-
* `.agents/workflows`)
|
|
28
|
-
* --json write the structured envelope to stdout
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import fs from 'node:fs';
|
|
32
|
-
import path from 'node:path';
|
|
33
|
-
import process from 'node:process';
|
|
34
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
35
|
-
|
|
36
|
-
/** Default workflow root, relative to the repository root. */
|
|
37
|
-
const DEFAULT_ROOT = path.join('.agents', 'workflows');
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Issue-shaped reference: a `#` followed by 3–5 digits. Narrow enough to
|
|
41
|
-
* skip markdown headings and anchor links, wide enough to catch both the
|
|
42
|
-
* `(Story #1234)` and bare `(#1234)` spellings of one citation.
|
|
43
|
-
*/
|
|
44
|
-
const CITATION_RE = /#\d{3,5}\b/g;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Parse argv. Exported so unit tests can pin the parser.
|
|
48
|
-
*
|
|
49
|
-
* @param {string[]} argv
|
|
50
|
-
* @returns {{ rootPath: string | null, json: boolean }}
|
|
51
|
-
*/
|
|
52
|
-
export function parseArgv(argv = []) {
|
|
53
|
-
const out = { rootPath: null, json: false };
|
|
54
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
55
|
-
const flag = argv[i];
|
|
56
|
-
const next = argv[i + 1];
|
|
57
|
-
if (flag === '--root' && next && !next.startsWith('--')) {
|
|
58
|
-
out.rootPath = next;
|
|
59
|
-
i += 1;
|
|
60
|
-
} else if (flag === '--json') {
|
|
61
|
-
out.json = true;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return out;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Recursively collect `.md` files under `rootDir`. Returns absolute paths,
|
|
69
|
-
* sorted for determinism.
|
|
70
|
-
*
|
|
71
|
-
* @param {string} rootDir
|
|
72
|
-
* @returns {string[]}
|
|
73
|
-
*/
|
|
74
|
-
export function collectMarkdownFiles(rootDir) {
|
|
75
|
-
const out = [];
|
|
76
|
-
const walk = (dir) => {
|
|
77
|
-
let entries;
|
|
78
|
-
try {
|
|
79
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
80
|
-
} catch {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
for (const entry of entries) {
|
|
84
|
-
const full = path.join(dir, entry.name);
|
|
85
|
-
if (entry.isDirectory()) walk(full);
|
|
86
|
-
else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full);
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
walk(rootDir);
|
|
90
|
-
return out.sort();
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Pure helper: count citations in source text.
|
|
95
|
-
*
|
|
96
|
-
* @param {string} source
|
|
97
|
-
* @returns {number}
|
|
98
|
-
*/
|
|
99
|
-
export function countCitations(source) {
|
|
100
|
-
return (String(source ?? '').match(CITATION_RE) ?? []).length;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Count citations across a file set, relativizing paths against `cwd` so
|
|
105
|
-
* the report serializes identically on every platform. Files with zero
|
|
106
|
-
* citations are omitted — the report names where the tax lives.
|
|
107
|
-
*
|
|
108
|
-
* @param {string[]} files absolute paths
|
|
109
|
-
* @param {string} cwd
|
|
110
|
-
* @param {{ readFile?: (p: string) => string }} [opts]
|
|
111
|
-
* @returns {{ total: number, files: Array<{ path: string, count: number }> }}
|
|
112
|
-
*/
|
|
113
|
-
export function tallyCitations(files, cwd, { readFile } = {}) {
|
|
114
|
-
const read = readFile ?? ((p) => fs.readFileSync(p, 'utf-8'));
|
|
115
|
-
const rows = [];
|
|
116
|
-
let total = 0;
|
|
117
|
-
for (const file of files) {
|
|
118
|
-
let count;
|
|
119
|
-
try {
|
|
120
|
-
count = countCitations(read(file));
|
|
121
|
-
} catch {
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
if (count === 0) continue;
|
|
125
|
-
total += count;
|
|
126
|
-
rows.push({
|
|
127
|
-
path: path.relative(cwd, file).split(path.sep).join('/'),
|
|
128
|
-
count,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
return { total, files: rows.sort((a, b) => a.path.localeCompare(b.path)) };
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Pure helper: render the human-readable report — one line per file that
|
|
136
|
-
* carries a citation, then the total. No `+` / `-` ratchet vocabulary: there
|
|
137
|
-
* is nothing to regress against.
|
|
138
|
-
*
|
|
139
|
-
* @param {{ total: number, files: Array<{ path: string, count: number }> }} tally
|
|
140
|
-
* @returns {string}
|
|
141
|
-
*/
|
|
142
|
-
export function renderReport(tally) {
|
|
143
|
-
const lines = tally.files.map((row) => ` ${row.path}: ${row.count}`);
|
|
144
|
-
lines.push(
|
|
145
|
-
`[workflow-citations] total=${tally.total} across ${tally.files.length} file(s) — report only, never gated`,
|
|
146
|
-
);
|
|
147
|
-
return lines.join('\n');
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Top-level CLI entry. Exported so tests can drive the pipeline against a
|
|
152
|
-
* tmpdir fixture corpus.
|
|
153
|
-
*
|
|
154
|
-
* @param {{
|
|
155
|
-
* argv?: string[],
|
|
156
|
-
* cwd?: string,
|
|
157
|
-
* stdout?: { write: (s: string) => void },
|
|
158
|
-
* stderr?: { write: (s: string) => void },
|
|
159
|
-
* }} [opts]
|
|
160
|
-
* @returns {Promise<number>} always 0 — this is a report, not a gate
|
|
161
|
-
*/
|
|
162
|
-
export async function runCli({
|
|
163
|
-
argv = process.argv.slice(2),
|
|
164
|
-
cwd = process.cwd(),
|
|
165
|
-
stdout = process.stdout,
|
|
166
|
-
} = {}) {
|
|
167
|
-
const { rootPath, json } = parseArgv(argv);
|
|
168
|
-
const root = path.resolve(cwd, rootPath ?? DEFAULT_ROOT);
|
|
169
|
-
if (!fs.existsSync(root)) {
|
|
170
|
-
throw new Error(`[workflow-citations] workflow root not found: ${root}`);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const tally = tallyCitations(collectMarkdownFiles(root), cwd);
|
|
174
|
-
|
|
175
|
-
if (json) {
|
|
176
|
-
stdout.write(
|
|
177
|
-
`${JSON.stringify(
|
|
178
|
-
{
|
|
179
|
-
kind: 'workflow-citations-report',
|
|
180
|
-
root,
|
|
181
|
-
total: tally.total,
|
|
182
|
-
files: tally.files,
|
|
183
|
-
exitCode: 0,
|
|
184
|
-
},
|
|
185
|
-
null,
|
|
186
|
-
2,
|
|
187
|
-
)}\n`,
|
|
188
|
-
);
|
|
189
|
-
return 0;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
stdout.write(`\n--- workflow-citations report ---\n`);
|
|
193
|
-
stdout.write(`${renderReport(tally)}\n`);
|
|
194
|
-
return 0;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
async function main() {
|
|
198
|
-
return runCli();
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
runAsCli(import.meta.url, main, {
|
|
202
|
-
source: 'workflow-citations',
|
|
203
|
-
propagateExitCode: true,
|
|
204
|
-
errorPrefix: '[workflow-citations] ❌ Fatal error',
|
|
205
|
-
usage: {
|
|
206
|
-
invocation:
|
|
207
|
-
'node .agents/scripts/check-workflow-citations.js [--root <dir>] [--json]',
|
|
208
|
-
summary:
|
|
209
|
-
'Report provenance citations in workflow prose: count issue-shaped references across .agents/workflows/** and print the per-file tally. Never fails.',
|
|
210
|
-
flags: [
|
|
211
|
-
['--root <dir>', 'Workflow root to scan (default: .agents/workflows).'],
|
|
212
|
-
['--json', 'Emit the report envelope as JSON.'],
|
|
213
|
-
],
|
|
214
|
-
notes: [
|
|
215
|
-
'Exit codes:\n 0 always — this is a report, not a gate (Story #5340)',
|
|
216
|
-
],
|
|
217
|
-
},
|
|
218
|
-
});
|
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* check-workflow-cli-lint.js — enforce the "no workflow instructs a
|
|
6
|
-
* no-CLI library call" rule (Epic #4474 PR5; sibling of
|
|
7
|
-
* check-lifecycle-lint.js).
|
|
8
|
-
*
|
|
9
|
-
* The measured failure mode this rule kills: workflow prose that tells the
|
|
10
|
-
* host LLM to "Call `someExportedFunction({...})` exported from
|
|
11
|
-
* `lib/whatever.js`". There is no runnable form of that instruction, so the
|
|
12
|
-
* model greps the framework source and writes throwaway `.mjs` shims to
|
|
13
|
-
* invoke the export — the mandrel-bench N=2 cohort measured ~12–15 turns of
|
|
14
|
-
* shim-writing per plan for exactly this pattern. Workflows must instruct
|
|
15
|
-
* `node .agents/scripts/<cli>.js …` commands instead.
|
|
16
|
-
*
|
|
17
|
-
* Scope: every `*.md` under `.agents/workflows/`.
|
|
18
|
-
*
|
|
19
|
-
* Heuristic (tuned to zero false positives on the surviving corpus —
|
|
20
|
-
* descriptive mentions like "the automatic paths call `foo()`" are prose
|
|
21
|
-
* about script internals, not instructions, and are NOT flagged):
|
|
22
|
-
*
|
|
23
|
-
* Rule 1 — imperative library call. A paragraph (fenced code blocks
|
|
24
|
-
* stripped; lines joined) matching /\b(Call|Invoke)\s+`ident\s*\(/ —
|
|
25
|
-
* a capitalized imperative directly instructing a function call.
|
|
26
|
-
*
|
|
27
|
-
* Rule 2 — "exported from" instruction. A paragraph containing both a
|
|
28
|
-
* backticked call token (`ident(`) and the phrase "exported from" —
|
|
29
|
-
* the canonical shape of the retired Phase 2/3/4 prose.
|
|
30
|
-
*
|
|
31
|
-
* Rule 3 — prose-level lib import. `import(` / `require(` naming a
|
|
32
|
-
* `scripts/lib/` path OUTSIDE a fenced code block. (A complete,
|
|
33
|
-
* runnable `node -e` one-liner inside a fenced block is exempt: it
|
|
34
|
-
* costs zero shim-writing turns because it is executable as written.)
|
|
35
|
-
*
|
|
36
|
-
* Exit codes:
|
|
37
|
-
* 0 — clean.
|
|
38
|
-
* 1 — at least one violation; offending file + paragraph line printed
|
|
39
|
-
* to stderr.
|
|
40
|
-
*
|
|
41
|
-
* Ships as part of `npm run lint` (run-lint.js task list), alongside the
|
|
42
|
-
* lifecycle lint and the label-vocabulary lint.
|
|
43
|
-
*/
|
|
44
|
-
|
|
45
|
-
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
46
|
-
import path from 'node:path';
|
|
47
|
-
import { fileURLToPath } from 'node:url';
|
|
48
|
-
|
|
49
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
50
|
-
|
|
51
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
52
|
-
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
53
|
-
export const DEFAULT_WORKFLOWS_DIR = path.join(
|
|
54
|
-
REPO_ROOT,
|
|
55
|
-
'.agents',
|
|
56
|
-
'workflows',
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
const IMPERATIVE_CALL_RE = /\b(?:Call|Invoke)\s+`[A-Za-z_$][\w$]*\s*\(/;
|
|
60
|
-
const BACKTICK_CALL_RE = /`[A-Za-z_$][\w$]*\s*\(/;
|
|
61
|
-
const EXPORTED_FROM_RE = /\bexported from\b/;
|
|
62
|
-
const LIB_IMPORT_RE = /\b(?:import|require)\(\s*['"`][^'"`]*scripts\/lib\//;
|
|
63
|
-
|
|
64
|
-
/** A markdown table row (leading pipe, optionally indented). */
|
|
65
|
-
const TABLE_ROW_RE = /^\s*\|/;
|
|
66
|
-
/** A markdown heading of any level — the lookback boundary for Rule 4. */
|
|
67
|
-
const HEADING_RE = /^\s*#{1,6}\s/;
|
|
68
|
-
/** A backticked `--flag` occupying a table row's first cell. */
|
|
69
|
-
const FLAG_CELL_RE = /^\s*\|\s*`?--[\w-]+/;
|
|
70
|
-
/** A `.js` script filename — bare or path-qualified. */
|
|
71
|
-
const SCRIPT_NAME_RE = /([\w./-]*[\w-]+\.js)\b/;
|
|
72
|
-
/** A markdown table's delimiter row (`| --- | --- |`). */
|
|
73
|
-
const TABLE_DELIMITER_RE = /^\s*\|[\s|:-]+\|?\s*$/;
|
|
74
|
-
/** Minimum `--flag` rows before a table counts as a flag *table*. */
|
|
75
|
-
export const MIN_FLAG_ROWS = 2;
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Strip fenced code blocks (``` / ~~~), replacing their lines with empty
|
|
79
|
-
* strings so line numbers stay stable. Complete runnable commands live in
|
|
80
|
-
* fences and are exempt by design (see header).
|
|
81
|
-
*
|
|
82
|
-
* @param {string} source
|
|
83
|
-
* @returns {string[]} lines with fenced content blanked.
|
|
84
|
-
*/
|
|
85
|
-
export function stripFences(source) {
|
|
86
|
-
const lines = source.split('\n');
|
|
87
|
-
let inFence = false;
|
|
88
|
-
return lines.map((line) => {
|
|
89
|
-
const fence = /^\s*(```|~~~)/.test(line);
|
|
90
|
-
if (fence) {
|
|
91
|
-
inFence = !inFence;
|
|
92
|
-
return '';
|
|
93
|
-
}
|
|
94
|
-
return inFence ? '' : line;
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Split blanked lines into paragraphs — runs of consecutive non-empty
|
|
100
|
-
* lines — keeping the 1-based line number of each paragraph's first line.
|
|
101
|
-
*
|
|
102
|
-
* @param {string[]} lines
|
|
103
|
-
* @returns {Array<{ text: string, line: number }>}
|
|
104
|
-
*/
|
|
105
|
-
export function toParagraphs(lines) {
|
|
106
|
-
const paragraphs = [];
|
|
107
|
-
let buf = [];
|
|
108
|
-
let start = 0;
|
|
109
|
-
for (let i = 0; i < lines.length; i++) {
|
|
110
|
-
if (lines[i].trim().length > 0) {
|
|
111
|
-
if (buf.length === 0) start = i + 1;
|
|
112
|
-
buf.push(lines[i]);
|
|
113
|
-
} else if (buf.length > 0) {
|
|
114
|
-
paragraphs.push({ text: buf.join(' '), line: start });
|
|
115
|
-
buf = [];
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (buf.length > 0) paragraphs.push({ text: buf.join(' '), line: start });
|
|
119
|
-
return paragraphs;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Rule 4 — CLI flag table. Find markdown tables that enumerate the `--flags`
|
|
124
|
-
* of a script the repo already owns, and flag them as duplicated surface.
|
|
125
|
-
*
|
|
126
|
-
* The script's own argument parser is the source of truth for its flags, and
|
|
127
|
-
* it prints them itself; a copy in prose is drift waiting to happen (the very
|
|
128
|
-
* drift Story #4546 removed). Prose must point at the command instead.
|
|
129
|
-
*
|
|
130
|
-
* The signal is deliberately narrow, to stay at zero false positives:
|
|
131
|
-
*
|
|
132
|
-
* 1. The table has at least `MIN_FLAG_ROWS` data rows whose **first cell**
|
|
133
|
-
* is a `--flag`. One flag row among prose rows is a contract/behaviour
|
|
134
|
-
* table (e.g. "Default | …", "`--dry-run` | …"), not a flag enumeration.
|
|
135
|
-
* 2. A `.js` script is named between the table and the nearest preceding
|
|
136
|
-
* heading (inclusive) — i.e. the section is *about* that script, so the
|
|
137
|
-
* table is restating its surface.
|
|
138
|
-
*
|
|
139
|
-
* A slash command's own argument table (`/mandrel-plan`, `/mandrel-deliver`) has no script
|
|
140
|
-
* behind it — nothing owns those flags but the workflow prose itself — so
|
|
141
|
-
* condition 2 leaves it alone by design.
|
|
142
|
-
*
|
|
143
|
-
* @param {string[]} rawLines unstripped source lines (fenced commands are the
|
|
144
|
-
* usual place a script is named, so this rule reads the original text).
|
|
145
|
-
* @returns {Array<{ rule: string, line: number, hint: string }>}
|
|
146
|
-
*/
|
|
147
|
-
export function lintFlagTables(rawLines) {
|
|
148
|
-
const violations = [];
|
|
149
|
-
let inFence = false;
|
|
150
|
-
|
|
151
|
-
for (let i = 0; i < rawLines.length; i++) {
|
|
152
|
-
if (/^\s*(```|~~~)/.test(rawLines[i])) {
|
|
153
|
-
inFence = !inFence;
|
|
154
|
-
continue;
|
|
155
|
-
}
|
|
156
|
-
if (inFence || !TABLE_ROW_RE.test(rawLines[i])) continue;
|
|
157
|
-
|
|
158
|
-
// Collect the contiguous table block starting here.
|
|
159
|
-
const start = i;
|
|
160
|
-
let end = i;
|
|
161
|
-
while (end + 1 < rawLines.length && TABLE_ROW_RE.test(rawLines[end + 1])) {
|
|
162
|
-
end += 1;
|
|
163
|
-
}
|
|
164
|
-
i = end; // continue scanning after this table
|
|
165
|
-
|
|
166
|
-
const flagRows = rawLines
|
|
167
|
-
.slice(start, end + 1)
|
|
168
|
-
.filter((l) => !TABLE_DELIMITER_RE.test(l) && FLAG_CELL_RE.test(l));
|
|
169
|
-
if (flagRows.length < MIN_FLAG_ROWS) continue;
|
|
170
|
-
|
|
171
|
-
// Look back to the nearest heading (inclusive) for a named script.
|
|
172
|
-
let script = null;
|
|
173
|
-
for (let j = start - 1; j >= 0; j--) {
|
|
174
|
-
const m = SCRIPT_NAME_RE.exec(rawLines[j]);
|
|
175
|
-
if (m) {
|
|
176
|
-
script = m[1];
|
|
177
|
-
break;
|
|
178
|
-
}
|
|
179
|
-
if (HEADING_RE.test(rawLines[j])) break;
|
|
180
|
-
}
|
|
181
|
-
if (!script) continue;
|
|
182
|
-
|
|
183
|
-
const base = script.split('/').pop();
|
|
184
|
-
violations.push({
|
|
185
|
-
rule: 'no-cli-flag-table',
|
|
186
|
-
line: start + 1,
|
|
187
|
-
hint:
|
|
188
|
-
`Workflow prose restates the flag surface of \`${base}\` as a table (${flagRows.length} flag rows). ` +
|
|
189
|
-
"The script's argument parser owns those flags, so a prose copy is drift waiting to happen. " +
|
|
190
|
-
`Delete the table and point at the command (\`node .agents/scripts/${base} …\`), keeping only the ` +
|
|
191
|
-
'judgement a reader cannot get from the command itself. If the script has no help output to point ' +
|
|
192
|
-
'at, add one — do not re-inline the table.',
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
return violations;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Lint one markdown source. Returns violations
|
|
200
|
-
* `{ rule, line, hint }[]` (empty when clean).
|
|
201
|
-
*
|
|
202
|
-
* @param {string} source markdown content.
|
|
203
|
-
* @returns {Array<{ rule: string, line: number, hint: string }>}
|
|
204
|
-
*/
|
|
205
|
-
export function lintWorkflowSource(source) {
|
|
206
|
-
const violations = [];
|
|
207
|
-
const rawLines = source.split('\n');
|
|
208
|
-
const lines = stripFences(source);
|
|
209
|
-
violations.push(...lintFlagTables(rawLines));
|
|
210
|
-
for (const para of toParagraphs(lines)) {
|
|
211
|
-
if (IMPERATIVE_CALL_RE.test(para.text)) {
|
|
212
|
-
violations.push({
|
|
213
|
-
rule: 'no-cli-library-call',
|
|
214
|
-
line: para.line,
|
|
215
|
-
hint:
|
|
216
|
-
'Workflow prose instructs calling a function directly ("Call/Invoke `fn(...)`"). ' +
|
|
217
|
-
'There is no runnable form of that instruction — the model must write a throwaway shim. ' +
|
|
218
|
-
'Instruct a `node .agents/scripts/<cli>.js …` command instead (add a CLI if none exists).',
|
|
219
|
-
});
|
|
220
|
-
continue;
|
|
221
|
-
}
|
|
222
|
-
if (EXPORTED_FROM_RE.test(para.text) && BACKTICK_CALL_RE.test(para.text)) {
|
|
223
|
-
violations.push({
|
|
224
|
-
rule: 'no-cli-library-call',
|
|
225
|
-
line: para.line,
|
|
226
|
-
hint:
|
|
227
|
-
'Workflow prose points at an exported library function ("`fn(...)` exported from …") ' +
|
|
228
|
-
'with no CLI entrypoint. Instruct a `node .agents/scripts/<cli>.js …` command instead.',
|
|
229
|
-
});
|
|
230
|
-
continue;
|
|
231
|
-
}
|
|
232
|
-
if (LIB_IMPORT_RE.test(para.text)) {
|
|
233
|
-
violations.push({
|
|
234
|
-
rule: 'no-prose-lib-import',
|
|
235
|
-
line: para.line,
|
|
236
|
-
hint:
|
|
237
|
-
'Workflow prose (outside a fenced code block) instructs importing a scripts/lib module. ' +
|
|
238
|
-
'Give a complete runnable command in a fenced block, or add a CLI entrypoint.',
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
return violations;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Recursively collect `*.md` files under a directory.
|
|
247
|
-
*
|
|
248
|
-
* @param {string} dir
|
|
249
|
-
* @returns {string[]} absolute paths.
|
|
250
|
-
*/
|
|
251
|
-
export function collectMarkdown(dir) {
|
|
252
|
-
const out = [];
|
|
253
|
-
for (const entry of readdirSync(dir)) {
|
|
254
|
-
const abs = path.join(dir, entry);
|
|
255
|
-
const st = statSync(abs);
|
|
256
|
-
if (st.isDirectory()) out.push(...collectMarkdown(abs));
|
|
257
|
-
else if (entry.endsWith('.md')) out.push(abs);
|
|
258
|
-
}
|
|
259
|
-
return out;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Run the check over a workflows directory. Exported for tests (pass a
|
|
264
|
-
* fixture directory).
|
|
265
|
-
*
|
|
266
|
-
* @param {string} [workflowsDir]
|
|
267
|
-
* @returns {Array<{ file: string, rule: string, line: number, hint: string }>}
|
|
268
|
-
*/
|
|
269
|
-
export function runCheck(workflowsDir = DEFAULT_WORKFLOWS_DIR) {
|
|
270
|
-
const violations = [];
|
|
271
|
-
for (const file of collectMarkdown(workflowsDir)) {
|
|
272
|
-
const source = readFileSync(file, 'utf8');
|
|
273
|
-
for (const v of lintWorkflowSource(source)) {
|
|
274
|
-
violations.push({ file: path.relative(REPO_ROOT, file), ...v });
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
return violations;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
async function main() {
|
|
281
|
-
const violations = runCheck();
|
|
282
|
-
if (violations.length === 0) {
|
|
283
|
-
process.stdout.write(
|
|
284
|
-
'[workflow-cli-lint] clean: no workflow instructs a no-CLI library call.\n',
|
|
285
|
-
);
|
|
286
|
-
return 0;
|
|
287
|
-
}
|
|
288
|
-
for (const v of violations) {
|
|
289
|
-
process.stderr.write(
|
|
290
|
-
`[workflow-cli-lint][${v.rule}] ${v.file}:${v.line}\n ${v.hint}\n`,
|
|
291
|
-
);
|
|
292
|
-
}
|
|
293
|
-
return 1;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
await runAsCli(import.meta.url, main, {
|
|
297
|
-
source: 'check-workflow-cli-lint',
|
|
298
|
-
propagateExitCode: true,
|
|
299
|
-
});
|