mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +57 -49
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +39 -121
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -124
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +123 -191
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +22 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +60 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +326 -523
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +17 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/schemas/model-attribution.schema.json +0 -53
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,27 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `.agents/workflows/helpers/mandrel-sync-config.md`. Invoked by
|
|
8
|
-
* `/mandrel-update` Step 3 after the package upgrade re-materializes `.agents/`.
|
|
9
|
-
*
|
|
10
|
-
* Contract:
|
|
11
|
-
* - Validates the project config against the framework schema. On
|
|
12
|
-
* failure, prints diagnostics and exits 1.
|
|
13
|
-
* - Never auto-fills optional keys from `.agents/docs/agentrc-reference.json`.
|
|
14
|
-
* The runtime layers framework defaults at read time, so an absent
|
|
15
|
-
* key resolves to the framework default without being written.
|
|
16
|
-
* - For every project leaf whose value equals the framework default,
|
|
17
|
-
* prints an informational `[REDUNDANT]` advisory. The project file
|
|
18
|
-
* is never modified.
|
|
19
|
-
*
|
|
20
|
-
* Exit codes:
|
|
21
|
-
* 0 — Config is valid (advisories may still appear).
|
|
22
|
-
* 1 — Config is missing, malformed, or fails schema validation.
|
|
23
|
-
*
|
|
24
|
-
* The flag contract lives in `USAGE` below — `--help` is the one home for it.
|
|
4
|
+
* Validate `.agentrc.json` and flag leaves that restate a framework default.
|
|
5
|
+
* Never writes the file: defaults are layered at read time, so absent keys
|
|
6
|
+
* need no filling. Flags and exit codes live in `USAGE`.
|
|
25
7
|
*/
|
|
26
8
|
|
|
27
9
|
import { fileURLToPath } from 'node:url';
|
|
@@ -1,34 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* `.claude/agents/` tree
|
|
6
|
-
*
|
|
7
|
-
* `
|
|
8
|
-
* orphan-reap, same prune-exempt handling for the consumer-authored
|
|
9
|
-
* `.agents/local/agents/` source. Two source directories are enumerated in
|
|
10
|
-
* order:
|
|
11
|
-
*
|
|
12
|
-
* 1. PAYLOAD_SRC — `.agents/agents/` (the installed Mandrel payload)
|
|
13
|
-
* 2. LOCAL_SRC — `.agents/local/agents/` (consumer-authored, prune-exempt)
|
|
14
|
-
*
|
|
15
|
-
* The payload directory wins on basename collision: if both sources supply
|
|
16
|
-
* `foo.md`, the payload copy is projected and the local copy is ignored with a
|
|
17
|
-
* `shadowed` warning. Because both sources are unioned into `sourceSet`, local
|
|
18
|
-
* agent defs are also protected from the orphan-reap — they survive
|
|
19
|
-
* `npm install`, `mandrel sync`, and `mandrel update` with no manual re-sync.
|
|
20
|
-
*
|
|
21
|
-
* Only top-level `.md` files project (`.claude/agents/<name>.md`). Unlike the
|
|
22
|
-
* commands sync there is no `loops/` namespace and no plugin tree to reap — the
|
|
23
|
-
* agent surface is flat.
|
|
24
|
-
*
|
|
25
|
-
* A `.claude/agents/<name>.md` runs on its **own** system prompt — it does NOT
|
|
26
|
-
* inherit the `CLAUDE.md` @-import closure — so a spawn routed to a role agent
|
|
27
|
-
* stops re-paying the always-loaded context (issue #4478). The role defs
|
|
28
|
-
* @-import `security-baseline.md` so the inviolable security MUSTs stay
|
|
29
|
-
* single-sourced.
|
|
30
|
-
*
|
|
31
|
-
* Usage: node .agents/scripts/sync-claude-agents.js
|
|
4
|
+
* Project `.agents/agents/` and `.agents/local/agents/` into a flat
|
|
5
|
+
* `.claude/agents/` tree — the sibling of `sync-claude-commands.js`, with the
|
|
6
|
+
* same payload-wins shadowing and orphan-reap. A role agent runs on its own
|
|
7
|
+
* system prompt (no `CLAUDE.md` closure), which is the point of routing to it.
|
|
32
8
|
*/
|
|
33
9
|
|
|
34
10
|
// cli-opt-out: top-level-await script with no main() function — runAsCli wraps an async main, which doesn't apply here.
|
|
@@ -38,21 +14,10 @@ import path from 'node:path';
|
|
|
38
14
|
import { applyHeader } from './lib/command-header.js';
|
|
39
15
|
import { Logger } from './lib/Logger.js';
|
|
40
16
|
|
|
41
|
-
//
|
|
42
|
-
// `.agents/` is materialized and where Claude Code loads `.claude/agents/`.
|
|
43
|
-
// It MUST NOT use `__dirname/../..`: in an npm-installed consumer this script
|
|
44
|
-
// runs from `node_modules/mandrel/.agents/scripts/`, so that climb lands on the
|
|
45
|
-
// package dir and the defs would be written *inside node_modules* rather than
|
|
46
|
-
// the consumer. Every real invocation runs with cwd at the project root
|
|
47
|
-
// (`npm run sync:agents`, the prepare hook). Tests drive fixture trees via the
|
|
48
|
-
// SYNC_CLAUDE_AGENTS_SRC/DEST overrides below.
|
|
17
|
+
// cwd, never `__dirname/../..`, which lands inside node_modules when installed.
|
|
49
18
|
const PROJECT_ROOT = process.cwd();
|
|
50
19
|
|
|
51
|
-
//
|
|
52
|
-
// agents tree in isolation. When unset, behaviour is unchanged — the script
|
|
53
|
-
// defaults to the real agents / .claude/agents directories. SYNC_CLAUDE_AGENTS_SRC
|
|
54
|
-
// overrides the PAYLOAD source only; LOCAL_SRC is always derived from the project
|
|
55
|
-
// root so fixture tests can isolate the payload source.
|
|
20
|
+
// Test overrides; SYNC_CLAUDE_AGENTS_SRC replaces the payload source only.
|
|
56
21
|
const PAYLOAD_SRC =
|
|
57
22
|
process.env.SYNC_CLAUDE_AGENTS_SRC ??
|
|
58
23
|
path.join(PROJECT_ROOT, '.agents', 'agents');
|
|
@@ -69,8 +34,6 @@ export const LOCAL_HEADER =
|
|
|
69
34
|
'<!-- AUTO-GENERATED from .agents/local/ — do not edit. Source of truth: .agents/local/agents/ -->\n<!-- Re-run: npm run sync:agents -->\n\n';
|
|
70
35
|
|
|
71
36
|
/**
|
|
72
|
-
* Return true when the given directory path exists and is accessible.
|
|
73
|
-
*
|
|
74
37
|
* @param {string} dir
|
|
75
38
|
* @returns {boolean}
|
|
76
39
|
*/
|
|
@@ -84,11 +47,9 @@ function dirExists(dir) {
|
|
|
84
47
|
|
|
85
48
|
fs.mkdirSync(DEST_DIR, { recursive: true });
|
|
86
49
|
|
|
87
|
-
// Top-level .md files project flat. Subdirectories are skipped.
|
|
88
50
|
const isTopLevelAgent = (entry) => entry.isFile() && entry.name.endsWith('.md');
|
|
89
51
|
|
|
90
|
-
//
|
|
91
|
-
// basename collision — a consumer must not silently shadow a core role def.
|
|
52
|
+
// Payload first, so it wins a collision.
|
|
92
53
|
const SRC_DIRS = [PAYLOAD_SRC, LOCAL_SRC].filter(dirExists);
|
|
93
54
|
|
|
94
55
|
/** @type {Array<{dir: string, name: string}>} */
|
|
@@ -99,7 +60,6 @@ const entries = SRC_DIRS.flatMap((dir) =>
|
|
|
99
60
|
.map((e) => ({ dir, name: e.name })),
|
|
100
61
|
);
|
|
101
62
|
|
|
102
|
-
// Collision policy: payload wins, warn on a shadowed local file.
|
|
103
63
|
const byName = new Map();
|
|
104
64
|
for (const e of entries) {
|
|
105
65
|
if (byName.has(e.name)) {
|
|
@@ -109,13 +69,10 @@ for (const e of entries) {
|
|
|
109
69
|
byName.set(e.name, e);
|
|
110
70
|
}
|
|
111
71
|
|
|
112
|
-
//
|
|
113
|
-
// removed.
|
|
72
|
+
// Any existing agent def not in this set is reaped.
|
|
114
73
|
const sourceSet = new Set(byName.keys());
|
|
115
74
|
|
|
116
75
|
/**
|
|
117
|
-
* List the `.md` agent defs currently on disk in the destination.
|
|
118
|
-
*
|
|
119
76
|
* @returns {string[]}
|
|
120
77
|
*/
|
|
121
78
|
function listExistingAgents() {
|
|
@@ -133,9 +90,7 @@ for (const name of listExistingAgents()) {
|
|
|
133
90
|
}
|
|
134
91
|
}
|
|
135
92
|
|
|
136
|
-
//
|
|
137
|
-
// frontmatter (so the `---` block stays on line 1 and Claude Code parses the
|
|
138
|
-
// agent's name/description). Use a distinct header comment for local-origin files.
|
|
93
|
+
// The header goes after any frontmatter, so `---` stays on line 1.
|
|
139
94
|
let synced = 0;
|
|
140
95
|
const resolvedEntries = Array.from(byName.values());
|
|
141
96
|
await Promise.all(
|
|
@@ -146,7 +101,6 @@ await Promise.all(
|
|
|
146
101
|
const dest = path.join(DEST_DIR, name);
|
|
147
102
|
const target = applyHeader(content, header);
|
|
148
103
|
|
|
149
|
-
// Skip write if content is already identical (avoid noisy git diffs).
|
|
150
104
|
try {
|
|
151
105
|
const existingContent = await fs.promises.readFile(dest, 'utf8');
|
|
152
106
|
if (existingContent === target) return;
|
|
@@ -1,46 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* The payload directory wins on basename collision: if both sources supply
|
|
12
|
-
* `foo.md`, the payload copy is projected and the local copy is ignored with a
|
|
13
|
-
* `shadowed` warning. Because both sources are unioned into `sourceSet`, local
|
|
14
|
-
* commands are also protected from the orphan-reap — they survive
|
|
15
|
-
* `npm install`, `mandrel sync`, and `mandrel update` with no manual re-sync.
|
|
16
|
-
*
|
|
17
|
-
* Flat projection (reverts the #3576 plugin cutover): the plugin command tree
|
|
18
|
-
* (`.claude/plugins/mandrel/`) and the repo-local marketplace
|
|
19
|
-
* (`.claude/.claude-plugin/marketplace.json`) are NOT written, because the
|
|
20
|
-
* plugin system is unavailable in some Claude Code environments (`/plugin` not
|
|
21
|
-
* present), which left the namespaced `/mandrel:<name>` commands unreachable.
|
|
22
|
-
* Flat `.claude/commands/*.md` is the surface that loads across every
|
|
23
|
-
* environment (CLI, IDE, GUI, web, SDK). On a machine that previously synced
|
|
24
|
-
* the plugin tree, this script reaps it on the next run (see reapPluginTree).
|
|
25
|
-
*
|
|
26
|
-
* Top-level .md files project flat (`/<name>`). The
|
|
27
|
-
* `.agents/workflows/helpers/` subdirectory holds path-included modules
|
|
28
|
-
* (e.g. epic-code-review, epic-retro) that parent workflows read by
|
|
29
|
-
* relative path — they are intentionally **not** exposed as commands, so
|
|
30
|
-
* helpers/ is skipped.
|
|
31
|
-
*
|
|
32
|
-
* The `.agents/workflows/loops/` subdirectory is the **one** exception to
|
|
33
|
-
* the skip-subdirectories rule (Story #4289, Epic #4284). Each loop unit
|
|
34
|
-
* there projects to `.claude/commands/loops/<name>.md`, preserving the
|
|
35
|
-
* subpath so Claude Code namespaces it as `/loops:<name>` (matching Claude
|
|
36
|
-
* Code's subdirectory-command namespacing). Hosts that flatten
|
|
37
|
-
* subdirectory commands surface the same file as the flat fallback
|
|
38
|
-
* `/loops-<name>` (i.e. `loops-<name>` in the command tree) — the
|
|
39
|
-
* projection writes the namespaced path; the flat form is the documented
|
|
40
|
-
* host-side fallback, not a second on-disk copy. No subdirectory other
|
|
41
|
-
* than `loops/` is recursed.
|
|
42
|
-
*
|
|
43
|
-
* Usage: node .agents/scripts/sync-claude-commands.js
|
|
4
|
+
* Project `.agents/workflows/` and `.agents/local/workflows/` into a flat
|
|
5
|
+
* `.claude/commands/` tree (one `/<name>` per top-level workflow). The payload
|
|
6
|
+
* wins a name collision; both sources feed the orphan-reap set, so local
|
|
7
|
+
* commands survive re-syncs. Flat commands, not a plugin tree, because the
|
|
8
|
+
* plugin system is unavailable in some Claude Code hosts. `helpers/` is not
|
|
9
|
+
* projected; `loops/` is the one recursed subdirectory (`/loops:<name>`).
|
|
44
10
|
*/
|
|
45
11
|
|
|
46
12
|
// cli-opt-out: top-level-await script with no main() function — runAsCli wraps an async main, which doesn't apply here.
|
|
@@ -50,27 +16,11 @@ import path from 'node:path';
|
|
|
50
16
|
import { applyHeader, isCommandExcluded } from './lib/command-header.js';
|
|
51
17
|
import { Logger } from './lib/Logger.js';
|
|
52
18
|
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
// It MUST NOT use `__dirname/../..`: in an npm-installed consumer this script
|
|
56
|
-
// runs from `node_modules/mandrel/.agents/scripts/`, so that climb
|
|
57
|
-
// lands on the package dir and the commands would be written *inside
|
|
58
|
-
// node_modules* rather than the consumer — leaving `/<name>` commands
|
|
59
|
-
// unloadable and the `commands-in-sync` doctor check (which resolves the same
|
|
60
|
-
// consumer root via cwd — Story #3588) reporting "N not synced". Every real
|
|
61
|
-
// invocation runs with cwd at the project root: `npm run sync:commands`, the
|
|
62
|
-
// UserPromptSubmit hook, and `mandrel sync-commands` (which inherits the
|
|
63
|
-
// caller's cwd). Tests drive fixture trees via the SYNC_CLAUDE_COMMANDS_SRC/DEST
|
|
64
|
-
// overrides below.
|
|
19
|
+
// The root is cwd, never `__dirname/../..`: installed under node_modules that
|
|
20
|
+
// climb lands on the package dir and would write commands inside it.
|
|
65
21
|
const PROJECT_ROOT = process.cwd();
|
|
66
22
|
|
|
67
|
-
//
|
|
68
|
-
// fixture workflow tree in isolation (regression test for the Epic #1185
|
|
69
|
-
// frontmatter pass-through contract). When unset, behaviour is unchanged
|
|
70
|
-
// — the script defaults to the real workflows / commands directories.
|
|
71
|
-
// SYNC_CLAUDE_COMMANDS_SRC overrides the PAYLOAD source only; the LOCAL_SRC
|
|
72
|
-
// is always derived from the project root so fixture tests can isolate the
|
|
73
|
-
// payload source while still allowing LOCAL_SRC to be present if needed.
|
|
23
|
+
// Test overrides; SYNC_CLAUDE_COMMANDS_SRC replaces the payload source only.
|
|
74
24
|
const PAYLOAD_SRC =
|
|
75
25
|
process.env.SYNC_CLAUDE_COMMANDS_SRC ??
|
|
76
26
|
path.join(PROJECT_ROOT, '.agents', 'workflows');
|
|
@@ -87,8 +37,6 @@ export const LOCAL_HEADER =
|
|
|
87
37
|
'<!-- AUTO-GENERATED from .agents/local/ — do not edit. Source of truth: .agents/local/workflows/ -->\n<!-- Re-run: npm run sync:commands -->\n\n';
|
|
88
38
|
|
|
89
39
|
/**
|
|
90
|
-
* Return true when the given directory path exists and is accessible.
|
|
91
|
-
*
|
|
92
40
|
* @param {string} dir
|
|
93
41
|
* @returns {boolean}
|
|
94
42
|
*/
|
|
@@ -101,14 +49,8 @@ function dirExists(dir) {
|
|
|
101
49
|
}
|
|
102
50
|
|
|
103
51
|
/**
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* flat `/<name>` commands. This is the cutover-back step on existing machines:
|
|
107
|
-
* the plugin tree is no longer written, but a developer who synced under #3576
|
|
108
|
-
* still has it on disk. Removing `.claude/plugins/mandrel/` and the marketplace
|
|
109
|
-
* listing is idempotent and never blocks the flat sync.
|
|
110
|
-
*
|
|
111
|
-
* Skipped when SYNC_CLAUDE_COMMANDS_DEST is set (fixture runs own their tree).
|
|
52
|
+
* Remove any on-disk plugin projection and marketplace listing, which would
|
|
53
|
+
* shadow the flat commands. Idempotent; skipped for fixture runs.
|
|
112
54
|
*
|
|
113
55
|
* @returns {void}
|
|
114
56
|
*/
|
|
@@ -128,7 +70,6 @@ function reapPluginTree() {
|
|
|
128
70
|
Logger.warn(` skip reap ${target}: ${err.message}`);
|
|
129
71
|
}
|
|
130
72
|
}
|
|
131
|
-
// Remove the now-empty .claude-plugin/ dir (ignore if absent or non-empty).
|
|
132
73
|
try {
|
|
133
74
|
fs.rmdirSync(path.join(PROJECT_ROOT, '.claude', '.claude-plugin'));
|
|
134
75
|
} catch {
|
|
@@ -139,22 +80,14 @@ function reapPluginTree() {
|
|
|
139
80
|
reapPluginTree();
|
|
140
81
|
fs.mkdirSync(DEST_DIR, { recursive: true });
|
|
141
82
|
|
|
142
|
-
// The only
|
|
143
|
-
// (notably helpers/) is skipped — those hold path-included modules, not
|
|
144
|
-
// slash commands. Loop units under workflows/loops/ project into
|
|
145
|
-
// .claude/commands/loops/ so Claude Code namespaces them as /loops:<name>
|
|
146
|
-
// (Story #4289).
|
|
83
|
+
// The only recursed subdirectory; helpers/ holds path-included modules.
|
|
147
84
|
const LOOPS_NS = 'loops';
|
|
148
85
|
|
|
149
|
-
// Top-level .md files project flat. Subdirectories are skipped here and the
|
|
150
|
-
// only one re-introduced is loops/ (handled by enumerateLoopUnits below).
|
|
151
86
|
const isTopLevelWorkflow = (entry) =>
|
|
152
87
|
entry.isFile() && entry.name.endsWith('.md');
|
|
153
88
|
|
|
154
89
|
/**
|
|
155
|
-
* `README.md`
|
|
156
|
-
* loop unit — it carries no `loop:` frontmatter and must not project as a
|
|
157
|
-
* `/loops:README` command. Exclude it from the loop-unit enumeration.
|
|
90
|
+
* `loops/README.md` is documentation, not a command.
|
|
158
91
|
*
|
|
159
92
|
* @param {import('node:fs').Dirent} entry
|
|
160
93
|
* @returns {boolean}
|
|
@@ -163,13 +96,9 @@ const isLoopUnit = (entry) =>
|
|
|
163
96
|
isTopLevelWorkflow(entry) && entry.name.toLowerCase() !== 'readme.md';
|
|
164
97
|
|
|
165
98
|
/**
|
|
166
|
-
*
|
|
167
|
-
* Returns entries keyed by the namespaced relative path
|
|
168
|
-
* (`loops/<name>.md`) so they never collide with a flat top-level command
|
|
169
|
-
* of the same basename and so the reap can track them distinctly. The
|
|
170
|
-
* directory's `README.md` is skipped — it is documentation, not a command.
|
|
99
|
+
* Keyed by `loops/<name>.md` so a unit never collides with a flat command.
|
|
171
100
|
*
|
|
172
|
-
* @param {string} dir
|
|
101
|
+
* @param {string} dir A workflows source root.
|
|
173
102
|
* @returns {Array<{dir: string, name: string, rel: string}>}
|
|
174
103
|
*/
|
|
175
104
|
function enumerateLoopUnits(dir) {
|
|
@@ -185,10 +114,7 @@ function enumerateLoopUnits(dir) {
|
|
|
185
114
|
}));
|
|
186
115
|
}
|
|
187
116
|
|
|
188
|
-
//
|
|
189
|
-
// on relative-path collision — a consumer must not silently shadow a core
|
|
190
|
-
// command. Each entry carries its destination-relative path (`rel`): a bare
|
|
191
|
-
// basename for flat top-level commands, `loops/<name>.md` for loop units.
|
|
117
|
+
// Payload first, so it wins a collision.
|
|
192
118
|
const SRC_DIRS = [PAYLOAD_SRC, LOCAL_SRC].filter(dirExists);
|
|
193
119
|
|
|
194
120
|
/** @type {Array<{dir: string, name: string, rel: string}>} */
|
|
@@ -200,12 +126,7 @@ const entries = SRC_DIRS.flatMap((dir) => [
|
|
|
200
126
|
...enumerateLoopUnits(dir),
|
|
201
127
|
]);
|
|
202
128
|
|
|
203
|
-
//
|
|
204
|
-
// destination-relative path so a flat `foo.md` and a `loops/foo.md` are
|
|
205
|
-
// distinct entries. A workflow whose frontmatter carries `command: false`
|
|
206
|
-
// (#4482 — dual-use audit lens files with a host-native standalone
|
|
207
|
-
// equivalent) is excluded from projection entirely: it never enters
|
|
208
|
-
// `sourceSet`, so any previously projected copy is reaped below.
|
|
129
|
+
// A `command: false` workflow never enters `sourceSet`, so a stale copy is reaped.
|
|
209
130
|
const byRel = new Map();
|
|
210
131
|
for (const e of entries) {
|
|
211
132
|
if (byRel.has(e.rel)) {
|
|
@@ -219,15 +140,10 @@ for (const e of entries) {
|
|
|
219
140
|
byRel.set(e.rel, e);
|
|
220
141
|
}
|
|
221
142
|
|
|
222
|
-
//
|
|
223
|
-
// removed. Keyed by destination-relative path so loop units are reaped from
|
|
224
|
-
// the loops/ namespace and flat commands from the root.
|
|
143
|
+
// Any existing command not in this set is reaped.
|
|
225
144
|
const sourceSet = new Set(byRel.keys());
|
|
226
145
|
|
|
227
146
|
/**
|
|
228
|
-
* List the destination-relative paths of every projected command currently
|
|
229
|
-
* on disk: flat `*.md` at the root plus `loops/*.md` in the namespace.
|
|
230
|
-
*
|
|
231
147
|
* @returns {string[]}
|
|
232
148
|
*/
|
|
233
149
|
function listExistingCommands() {
|
|
@@ -252,11 +168,7 @@ for (const rel of listExistingCommands()) {
|
|
|
252
168
|
}
|
|
253
169
|
}
|
|
254
170
|
|
|
255
|
-
//
|
|
256
|
-
// frontmatter (so the `---` block stays on line 1 and Claude Code parses the
|
|
257
|
-
// command description). Use a distinct header comment for local-origin files.
|
|
258
|
-
// Parallelised so the ~30-file sync doesn't serialise on per-file fs latency
|
|
259
|
-
// (noticeable on Windows where each syscall pays a larger fixed cost).
|
|
171
|
+
// The header goes after any frontmatter, so `---` stays on line 1.
|
|
260
172
|
let synced = 0;
|
|
261
173
|
const resolvedEntries = Array.from(byRel.values());
|
|
262
174
|
await Promise.all(
|
|
@@ -267,11 +179,9 @@ await Promise.all(
|
|
|
267
179
|
const dest = path.join(DEST_DIR, rel);
|
|
268
180
|
const target = applyHeader(content, header);
|
|
269
181
|
|
|
270
|
-
// Ensure the namespace subdirectory exists before writing a loop unit.
|
|
271
182
|
await fs.promises.mkdir(path.dirname(dest), { recursive: true });
|
|
272
183
|
|
|
273
|
-
// Skip
|
|
274
|
-
// Use try/catch over existsSync+readFile so we only pay one syscall.
|
|
184
|
+
// Skip identical content to avoid noisy git diffs.
|
|
275
185
|
try {
|
|
276
186
|
const existingContent = await fs.promises.readFile(dest, 'utf8');
|
|
277
187
|
if (existingContent === target) return;
|
|
@@ -2,35 +2,9 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `npm test` so the suite refuses to start in a known-bad state (e.g.
|
|
9
|
-
* core.bare flipped on the main checkout, missing `.env` / `.mcp.json`
|
|
10
|
-
* bootstrap files, etc.). The wrapper runs
|
|
11
|
-
* `runChecks({ scope: 'npm-test', autoFix: true })` against the assembled
|
|
12
|
-
* state probe; on any surviving blocker it prints a `id · summary ·
|
|
13
|
-
* fixCommand` table and exits with code 2 (the project-wide "preflight
|
|
14
|
-
* refused" reservation).
|
|
15
|
-
*
|
|
16
|
-
* On a clean preflight npm continues to `.agents/scripts/run-tests.js`, which
|
|
17
|
-
* execs the underlying Node test runner and cleans test-reserved temp
|
|
18
|
-
* artefacts afterward. This wrapper itself adds no top-level npm dependencies.
|
|
19
|
-
*
|
|
20
|
-
* Wiring: `package.json` points `pretest` at this script. The `test`
|
|
21
|
-
* script remains the node --test invocation so `npm test` still picks up
|
|
22
|
-
* `pretest` automatically per npm lifecycle rules. A failed pretest aborts
|
|
23
|
-
* the lifecycle without invoking the test runner — exit code 2 propagates
|
|
24
|
-
* out through npm.
|
|
25
|
-
*
|
|
26
|
-
* Bypass: set `SKIP_PREFLIGHT=1` to skip the gate entirely (used by the
|
|
27
|
-
* `coverage` script which manages its own preflight separately, and by
|
|
28
|
-
* any debugging session that needs the suite to run despite a known
|
|
29
|
-
* blocker the operator is iterating on).
|
|
30
|
-
*
|
|
31
|
-
* Usage:
|
|
32
|
-
* node .agents/scripts/test-wrapper.js # full preflight + test
|
|
33
|
-
* SKIP_PREFLIGHT=1 node .agents/scripts/test-wrapper.js # skip gate
|
|
5
|
+
* `pretest` preflight: runs the self-healing checks (scope `npm-test`) so the
|
|
6
|
+
* suite refuses to start in a known-bad state; a surviving blocker exits 2,
|
|
7
|
+
* which aborts the npm lifecycle. `SKIP_PREFLIGHT=1` bypasses it.
|
|
34
8
|
*/
|
|
35
9
|
|
|
36
10
|
import { runAsCli } from './lib/cli-utils.js';
|
|
@@ -40,7 +14,6 @@ import {
|
|
|
40
14
|
runPreflight,
|
|
41
15
|
} from './lib/preflight-runner.js';
|
|
42
16
|
|
|
43
|
-
/** Default Logger adapter — same shape preflight-runner uses. */
|
|
44
17
|
const DEFAULT_LOGGER = {
|
|
45
18
|
info: (msg) => Logger.info(msg),
|
|
46
19
|
warn: (msg) => Logger.warn(msg),
|
|
@@ -48,17 +21,11 @@ const DEFAULT_LOGGER = {
|
|
|
48
21
|
};
|
|
49
22
|
|
|
50
23
|
/**
|
|
51
|
-
* Run the npm-test preflight gate. Exported so unit tests can drive it
|
|
52
|
-
* directly with an inline registry, without actually spawning the test
|
|
53
|
-
* runner. Returns `{ status: 'ok' | 'blocked' }` plus the findings/fixed
|
|
54
|
-
* arrays from the runner.
|
|
55
|
-
*
|
|
56
24
|
* @param {object} [opts]
|
|
57
25
|
* @param {string} [opts.cwd=process.cwd()]
|
|
58
|
-
* @param {object} [opts.probes] Test-only
|
|
59
|
-
* @param {object} [opts.registry] Test-only
|
|
60
|
-
*
|
|
61
|
-
* @param {string} [opts.dir] Test-only fixture directory.
|
|
26
|
+
* @param {object} [opts.probes] Test-only.
|
|
27
|
+
* @param {object} [opts.registry] Test-only.
|
|
28
|
+
* @param {string} [opts.dir] Test-only.
|
|
62
29
|
* @param {{ info?: Function, warn?: Function, error?: Function }} [opts.logger]
|
|
63
30
|
* @returns {Promise<{ status: 'ok' | 'blocked', findings: Array, fixed: Array }>}
|
|
64
31
|
*/
|
|
@@ -89,7 +56,6 @@ export async function runTestWrapperPreflight({
|
|
|
89
56
|
runAsCli(
|
|
90
57
|
import.meta.url,
|
|
91
58
|
async () => {
|
|
92
|
-
// Operator bypass for iterative debugging — see the file header.
|
|
93
59
|
if (process.env.SKIP_PREFLIGHT === '1') {
|
|
94
60
|
Logger.warn(
|
|
95
61
|
'[npm-test] SKIP_PREFLIGHT=1 — bypassing preflight checks (debugging mode).',
|
|
@@ -98,9 +64,6 @@ runAsCli(
|
|
|
98
64
|
}
|
|
99
65
|
const result = await runTestWrapperPreflight();
|
|
100
66
|
if (result.status === 'blocked') {
|
|
101
|
-
// The wrapper never spawns the test runner on a blocked preflight.
|
|
102
|
-
// Exit code 2 propagates out through `npm run pretest` and short-
|
|
103
|
-
// circuits the `npm test` lifecycle before the test command runs.
|
|
104
67
|
process.exit(PREFLIGHT_REFUSED_EXIT_CODE);
|
|
105
68
|
}
|
|
106
69
|
},
|
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Refresh `
|
|
4
|
-
* `coverage
|
|
5
|
-
*
|
|
6
|
-
* resulting per-file coverage shifts are expected.
|
|
7
|
-
*
|
|
8
|
-
* Story #3658 (Epic #2173): this CLI is now a thin wrapper around
|
|
9
|
-
* `refreshBaseline({ kind: 'coverage' })` from
|
|
10
|
-
* `.agents/scripts/lib/baselines/refresh-service.js`. All scoring, scope
|
|
11
|
-
* resolution, envelope assembly, and persistence flows through the unified
|
|
12
|
-
* service.
|
|
13
|
-
*
|
|
14
|
-
* The script does NOT run the test suite itself — invoke
|
|
15
|
-
* `npm run test:coverage` first (or rely on its prior run-on-disk
|
|
16
|
-
* artifact). This keeps the refresh idempotent and lets operators
|
|
17
|
-
* inspect coverage output before locking it in.
|
|
3
|
+
* Refresh the coverage baseline from the `coverage-final.json` on disk via
|
|
4
|
+
* `refreshBaseline({ kind: 'coverage' })`. Never runs the suite, so the
|
|
5
|
+
* refresh is idempotent and the output can be inspected first.
|
|
18
6
|
*/
|
|
19
7
|
|
|
20
8
|
import { createRequire } from 'node:module';
|
|
@@ -34,12 +22,7 @@ import {
|
|
|
34
22
|
} from './lib/coverage-baseline.js';
|
|
35
23
|
import { Logger } from './lib/Logger.js';
|
|
36
24
|
|
|
37
|
-
/**
|
|
38
|
-
* Usage block for `--help`. This CLI *writes* on invocation, so the help
|
|
39
|
-
* branch must short-circuit before `main` runs rather than inside it —
|
|
40
|
-
* `runAsCli` answers help first, which makes "a usage probe never mutates a
|
|
41
|
-
* baseline" structural instead of a check `main` has to remember.
|
|
42
|
-
*/
|
|
25
|
+
/** `runAsCli` answers `--help` before `main`, so a usage probe never writes. */
|
|
43
26
|
const USAGE = {
|
|
44
27
|
invocation:
|
|
45
28
|
'node .agents/scripts/update-coverage-baseline.js [--full-scope | --diff-scope <ref>]',
|
|
@@ -84,7 +67,7 @@ function main() {
|
|
|
84
67
|
const refreshOpts = {
|
|
85
68
|
kind: 'coverage',
|
|
86
69
|
writePath: absBaselinePath,
|
|
87
|
-
epsilon: getBaselineEpsilon('coverage'
|
|
70
|
+
epsilon: getBaselineEpsilon('coverage'),
|
|
88
71
|
scorer: buildCoverageUpdaterScorer(cwd, {
|
|
89
72
|
readCoverage: readCoverageFinal,
|
|
90
73
|
loadScope: loadC8Scope,
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
//
|
|
2
|
-
// first import so the check runs before any third-party-importing sibling
|
|
3
|
-
// module is evaluated (Story #3432).
|
|
1
|
+
// Must be the first import: fails fast before any third-party import loads.
|
|
4
2
|
import './lib/runtime-deps/ensure-installed.js';
|
|
5
3
|
import {
|
|
6
4
|
buildCrapUpdaterScorer,
|
|
@@ -24,34 +22,13 @@ import {
|
|
|
24
22
|
import { Logger } from './lib/Logger.js';
|
|
25
23
|
|
|
26
24
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* `.agents/scripts/lib/baselines/refresh-service.js`. All scoring, scope
|
|
32
|
-
* resolution, envelope assembly, and persistence flows through the unified
|
|
33
|
-
* service.
|
|
34
|
-
*
|
|
35
|
-
* Writes the canonical CRAP baseline at the path resolved from
|
|
36
|
-
* `delivery.quality.baselines.crap.path` (default `baselines/crap.json`),
|
|
37
|
-
* or the path supplied via `--baseline <path>`. Output is a deterministic,
|
|
38
|
-
* kernel-stamped envelope. Files without coverage entries are skipped (not
|
|
39
|
-
* scored as 0%) when `requireCoverage: true` — their count and names are
|
|
40
|
-
* logged so the operator can tell the difference between "unscorable" and
|
|
41
|
-
* "safe zero".
|
|
42
|
-
*
|
|
43
|
-
* Exits non-zero only when the scanner itself crashes. An empty result (no
|
|
44
|
-
* coverage at all, no scored methods) still writes an envelope with `rows: []`
|
|
45
|
-
* so downstream `check-crap` can tell "intentional empty baseline" apart from
|
|
46
|
-
* "no baseline yet".
|
|
25
|
+
* Refresh the CRAP baseline via `refreshBaseline({ kind: 'crap' })`. Under
|
|
26
|
+
* `requireCoverage` an uncovered file is skipped and logged, never scored as
|
|
27
|
+
* 0%. An empty result still writes `rows: []`, so an intentional empty
|
|
28
|
+
* baseline differs from a missing one.
|
|
47
29
|
*/
|
|
48
30
|
|
|
49
|
-
/**
|
|
50
|
-
* Usage block for `--help` (Story #4872). This CLI *writes* on invocation, so
|
|
51
|
-
* the help branch must short-circuit before `main` runs rather than inside it —
|
|
52
|
-
* `runAsCli` answers help first, which makes "a usage probe never mutates a
|
|
53
|
-
* baseline" structural instead of a check `main` has to remember.
|
|
54
|
-
*/
|
|
31
|
+
/** `runAsCli` answers `--help` before `main`, so a usage probe never writes. */
|
|
55
32
|
const USAGE = {
|
|
56
33
|
invocation:
|
|
57
34
|
'node .agents/scripts/update-crap-baseline.js [--baseline <path>] [--coverage <path>] [--full-scope | --diff-scope <ref>]',
|
|
@@ -96,7 +73,7 @@ async function main() {
|
|
|
96
73
|
const refreshOpts = {
|
|
97
74
|
kind: 'crap',
|
|
98
75
|
writePath: options.absBaselinePath,
|
|
99
|
-
epsilon: getBaselineEpsilon('crap'
|
|
76
|
+
epsilon: getBaselineEpsilon('crap'),
|
|
100
77
|
scorer: buildCrapUpdaterScorer(options, { loadCoverage }),
|
|
101
78
|
};
|
|
102
79
|
// No flag -> scopeFiles=null + fullScope=false -> the service derives the
|