mandrel 2.60.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { selectSlowestEntries } from './parse-tap.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @param {import('./parse-tap.js').TapProfile} profile
|
|
5
|
-
* @param {{ topN?: number, wallDurationMs?: number | null }} [opts]
|
|
6
|
-
* @returns {string}
|
|
7
|
-
*/
|
|
8
|
-
export function renderProfileReport(profile, opts = {}) {
|
|
9
|
-
const topN = opts.topN ?? 20;
|
|
10
|
-
const slowest = selectSlowestEntries(profile.entries, topN);
|
|
11
|
-
const totalSec = (opts.wallDurationMs ?? profile.totalDurationMs ?? 0) / 1000;
|
|
12
|
-
const lines = [
|
|
13
|
-
'Mandrel test profile summary',
|
|
14
|
-
'===========================',
|
|
15
|
-
'',
|
|
16
|
-
`Total duration: ${totalSec.toFixed(3)}s`,
|
|
17
|
-
`Tests: ${profile.testCount ?? '—'}`,
|
|
18
|
-
`Suites: ${profile.suiteCount ?? '—'}`,
|
|
19
|
-
`Timed entries parsed: ${profile.entries.length}`,
|
|
20
|
-
'',
|
|
21
|
-
`Top ${topN} slowest (tests and suites):`,
|
|
22
|
-
'',
|
|
23
|
-
];
|
|
24
|
-
|
|
25
|
-
if (slowest.length === 0) {
|
|
26
|
-
lines.push(' (no timed entries found in TAP output)');
|
|
27
|
-
} else {
|
|
28
|
-
for (const [idx, row] of slowest.entries()) {
|
|
29
|
-
const kindLabel = row.kind === 'suite' ? 'suite' : 'test';
|
|
30
|
-
const seconds = (row.durationMs / 1000).toFixed(3);
|
|
31
|
-
lines.push(
|
|
32
|
-
`${String(idx + 1).padStart(2)}. [${kindLabel.padEnd(5)}] ${seconds}s ${row.path}`,
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
lines.push('');
|
|
38
|
-
lines.push(
|
|
39
|
-
'Notes: suite rows are parent describe blocks; test rows are leaf cases.',
|
|
40
|
-
);
|
|
41
|
-
lines.push(
|
|
42
|
-
'Compare before/after optimizations using the same command on the same machine.',
|
|
43
|
-
);
|
|
44
|
-
return `${lines.join('\n')}\n`;
|
|
45
|
-
}
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* lint-label-vocabulary.js — enforce that GitHub label tokens cited in
|
|
6
|
-
* `.agents/docs/SDLC.md` and every `*.md` under `.agents/workflows/` use the
|
|
7
|
-
* canonical
|
|
8
|
-
* `<axis>::<value>` separator established by
|
|
9
|
-
* `.agents/scripts/lib/label-constants.js`.
|
|
10
|
-
*
|
|
11
|
-
* Why this exists (Tech Spec F9, Epic #2880): the framework's label
|
|
12
|
-
* vocabulary is the contract between docs and the runtime. A typo such
|
|
13
|
-
* as `type/epic` (the original F9 finding at epic-plan.md:49) drifts
|
|
14
|
-
* silently because nothing reads doc prose against the constants file.
|
|
15
|
-
* This lint closes that gap by failing CI on any inline code span that
|
|
16
|
-
* cites a known axis with the wrong separator.
|
|
17
|
-
*
|
|
18
|
-
* Scope:
|
|
19
|
-
* - Files scanned: `.agents/docs/SDLC.md` plus every `*.md` under
|
|
20
|
-
* `.agents/workflows/`.
|
|
21
|
-
* - Tokens scanned: inline backtick code spans only (e.g. `type/epic`).
|
|
22
|
-
* Prose mentions like "planning/audit metadata" are intentionally
|
|
23
|
-
* ignored — only fenced citations are treated as label references.
|
|
24
|
-
* - Axes recognized: the union of namespaces exported from
|
|
25
|
-
* `lib/label-constants.js` (`agent`, `type`, `status`, `context`,
|
|
26
|
-
* `acceptance`, `meta`, `planning`) plus the persona prefix.
|
|
27
|
-
* - Violation shape: any axis token using a separator other than `::`
|
|
28
|
-
* (e.g. `/`, `:`, `-`). False-positive risk is low because the axes
|
|
29
|
-
* are project-specific identifiers, not common English words.
|
|
30
|
-
*
|
|
31
|
-
* Exit codes:
|
|
32
|
-
* 0 — clean.
|
|
33
|
-
* 1 — at least one violation; offending file + line printed to stderr.
|
|
34
|
-
*
|
|
35
|
-
* Ships as part of `npm run lint` via `.agents/scripts/run-lint.js`.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
import { readdirSync, readFileSync } from 'node:fs';
|
|
39
|
-
import path from 'node:path';
|
|
40
|
-
import { fileURLToPath } from 'node:url';
|
|
41
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
42
|
-
import { walkFilesByExtension } from './lib/fs-walk.js';
|
|
43
|
-
|
|
44
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
45
|
-
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
46
|
-
|
|
47
|
-
const DEFAULT_SCAN_TARGETS = Object.freeze([
|
|
48
|
-
path.join(REPO_ROOT, '.agents', 'docs', 'SDLC.md'),
|
|
49
|
-
path.join(REPO_ROOT, '.agents', 'workflows'),
|
|
50
|
-
]);
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Known label-axis prefixes. Each entry corresponds to a namespace
|
|
54
|
-
* exported from `.agents/scripts/lib/label-constants.js`. The list is
|
|
55
|
-
* hard-coded rather than introspected so the lint stays a pure file
|
|
56
|
-
* walk with no module import side effects.
|
|
57
|
-
*
|
|
58
|
-
* Maintainers: when a new label axis lands in `label-constants.js`, add
|
|
59
|
-
* its prefix here (without trailing colons). Forgetting to add an axis
|
|
60
|
-
* makes the lint silently lenient for that namespace — the tests in
|
|
61
|
-
* `tests/contract/lint/label-vocabulary.test.js` lock the canonical
|
|
62
|
-
* set against drift.
|
|
63
|
-
*/
|
|
64
|
-
export const KNOWN_AXES = Object.freeze([
|
|
65
|
-
'agent',
|
|
66
|
-
'type',
|
|
67
|
-
'status',
|
|
68
|
-
'persona',
|
|
69
|
-
'acceptance',
|
|
70
|
-
'meta',
|
|
71
|
-
'planning',
|
|
72
|
-
]);
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Resolve a mixed list of file/directory paths into the flat set of
|
|
76
|
-
* markdown files to scan. Missing paths are silently skipped (the
|
|
77
|
-
* walker handles ENOENT) so the lint is robust under partial trees.
|
|
78
|
-
*/
|
|
79
|
-
function* resolveTargets(targets) {
|
|
80
|
-
for (const target of targets) {
|
|
81
|
-
let stat;
|
|
82
|
-
try {
|
|
83
|
-
stat = readdirSync(target, { withFileTypes: true });
|
|
84
|
-
} catch (err) {
|
|
85
|
-
if (err.code === 'ENOTDIR') {
|
|
86
|
-
// it's a file path — yield directly if it's .md
|
|
87
|
-
if (target.endsWith('.md')) yield target;
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
if (err.code === 'ENOENT') continue;
|
|
91
|
-
throw err;
|
|
92
|
-
}
|
|
93
|
-
// directory — walk it
|
|
94
|
-
for (const entry of stat) {
|
|
95
|
-
const p = path.join(target, entry.name);
|
|
96
|
-
if (entry.isDirectory()) {
|
|
97
|
-
yield* walkFilesByExtension(p, '.md');
|
|
98
|
-
} else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
99
|
-
yield p;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Scan a single source string for inline backtick code spans containing
|
|
107
|
-
* a label-shaped token that uses a non-`::` separator after a known
|
|
108
|
-
* axis. Returns an array of `{ line, token, axis, separator }`.
|
|
109
|
-
*
|
|
110
|
-
* The matcher operates on inline code spans only (single backtick
|
|
111
|
-
* delimited). Fenced code blocks (```…```) are not stripped because
|
|
112
|
-
* label citations inside them are still drift signals worth flagging.
|
|
113
|
-
*
|
|
114
|
-
* @param {string} src
|
|
115
|
-
* @param {readonly string[]} [axes]
|
|
116
|
-
* @returns {Array<{ line: number, token: string, axis: string, separator: string }>}
|
|
117
|
-
*/
|
|
118
|
-
export function findVocabularyViolations(src, axes = KNOWN_AXES) {
|
|
119
|
-
const violations = [];
|
|
120
|
-
const lines = src.split('\n');
|
|
121
|
-
// Match inline code spans: `…` where the content does not include a
|
|
122
|
-
// newline or another backtick. Greedy enough for label citations,
|
|
123
|
-
// strict enough to avoid swallowing prose.
|
|
124
|
-
const codeSpanRe = /`([^`\n]+)`/g;
|
|
125
|
-
const axisSet = new Set(axes);
|
|
126
|
-
// Anchored axis-drift check. We only flag a code span when its body,
|
|
127
|
-
// taken as a whole, has the shape `<axis><sep><value>` where:
|
|
128
|
-
// - axis is a known label axis (case-insensitive)
|
|
129
|
-
// - sep is one of the non-canonical separators we treat as drift:
|
|
130
|
-
// `/` (the original F9 finding) or a single `:` (also wrong).
|
|
131
|
-
// Hyphens (`agent-protocol`) are intentionally NOT flagged —
|
|
132
|
-
// they collide with legitimate concept slugs and filenames.
|
|
133
|
-
// - value is a lowercase identifier (`[a-z][a-z0-9-]*`)
|
|
134
|
-
//
|
|
135
|
-
// The whole-body anchor avoids false positives on:
|
|
136
|
-
// - `acceptance::n-a` — canonical label, value contains a
|
|
137
|
-
// hyphen but is not at axis position.
|
|
138
|
-
// - `<type>/<slug>` — template placeholders.
|
|
139
|
-
// - `delivery.maxTokenBudget` — config-key paths with `.`.
|
|
140
|
-
// - `delivery.{maxTickets}` — JS destructure shapes.
|
|
141
|
-
// - `agent-protocol.md` — filenames / concept slugs.
|
|
142
|
-
//
|
|
143
|
-
// Real drift like `type/epic` matches because the WHOLE body is
|
|
144
|
-
// `type/epic` (axis 'type', single '/', value 'epic').
|
|
145
|
-
const driftRe = new RegExp(
|
|
146
|
-
`^(${axes.join('|')})([/:])([a-z][a-z0-9-]*)$`,
|
|
147
|
-
'i',
|
|
148
|
-
);
|
|
149
|
-
for (let i = 0; i < lines.length; i += 1) {
|
|
150
|
-
const line = lines[i];
|
|
151
|
-
codeSpanRe.lastIndex = 0;
|
|
152
|
-
let span = codeSpanRe.exec(line);
|
|
153
|
-
while (span !== null) {
|
|
154
|
-
const body = span[1];
|
|
155
|
-
const m = driftRe.exec(body);
|
|
156
|
-
if (m) {
|
|
157
|
-
const axis = m[1].toLowerCase();
|
|
158
|
-
const separator = m[2];
|
|
159
|
-
if (separator !== '::' && axisSet.has(axis)) {
|
|
160
|
-
violations.push({
|
|
161
|
-
line: i + 1,
|
|
162
|
-
token: body,
|
|
163
|
-
axis,
|
|
164
|
-
separator,
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
span = codeSpanRe.exec(line);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return violations;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Aggregate violations across all target files.
|
|
176
|
-
*
|
|
177
|
-
* @param {readonly string[]} targets
|
|
178
|
-
* @param {{ read?: typeof readFileSync }} [opts]
|
|
179
|
-
* @returns {Array<{ file: string, line: number, token: string, axis: string, separator: string }>}
|
|
180
|
-
*/
|
|
181
|
-
export function lintLabelVocabulary(
|
|
182
|
-
targets = DEFAULT_SCAN_TARGETS,
|
|
183
|
-
{ read = readFileSync } = {},
|
|
184
|
-
) {
|
|
185
|
-
const out = [];
|
|
186
|
-
for (const file of resolveTargets(targets)) {
|
|
187
|
-
const src = read(file, 'utf8');
|
|
188
|
-
for (const v of findVocabularyViolations(src)) {
|
|
189
|
-
out.push({ file, ...v });
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return out;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
async function main() {
|
|
196
|
-
const violations = lintLabelVocabulary();
|
|
197
|
-
if (violations.length === 0) {
|
|
198
|
-
process.stdout.write(
|
|
199
|
-
'[label-vocabulary] clean: no drift from canonical `<axis>::<value>` separator in scanned docs.\n',
|
|
200
|
-
);
|
|
201
|
-
return 0;
|
|
202
|
-
}
|
|
203
|
-
for (const v of violations) {
|
|
204
|
-
process.stderr.write(
|
|
205
|
-
`[label-vocabulary] ${v.file}:${v.line}\n token \`${v.token}\` uses '${v.separator}' but axis '${v.axis}' requires canonical '::' separator (see .agents/scripts/lib/label-constants.js).\n`,
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
return 1;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
await runAsCli(import.meta.url, main, {
|
|
212
|
-
source: 'lint-label-vocabulary',
|
|
213
|
-
propagateExitCode: true,
|
|
214
|
-
});
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/* node:coverage ignore file */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* post-structured-comment.js — CLI wrapper for structured comment upsert.
|
|
6
|
-
*
|
|
7
|
-
* Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
|
|
8
|
-
*
|
|
9
|
-
* Delegates to `upsertStructuredComment` from `lib/orchestration/ticketing.js`
|
|
10
|
-
* and emits the `{ success, ticketId, type }` JSON envelope on stdout.
|
|
11
|
-
*
|
|
12
|
-
* Usage:
|
|
13
|
-
* node .agents/scripts/post-structured-comment.js \
|
|
14
|
-
* --ticket <id> --marker <type> --body-file <path> [--provider github]
|
|
15
|
-
*
|
|
16
|
-
* Exit codes:
|
|
17
|
-
* 0 — upsert succeeded
|
|
18
|
-
* non-zero — validation or provider failure (error on stderr)
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import fs from 'node:fs/promises';
|
|
22
|
-
import { parseArgs } from 'node:util';
|
|
23
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
24
|
-
import { resolveConfig } from './lib/config-resolver.js';
|
|
25
|
-
import {
|
|
26
|
-
assertValidStructuredCommentType,
|
|
27
|
-
upsertStructuredComment,
|
|
28
|
-
} from './lib/orchestration/ticketing.js';
|
|
29
|
-
import { createProvider } from './lib/provider-factory.js';
|
|
30
|
-
|
|
31
|
-
const HELP = `Usage: node .agents/scripts/post-structured-comment.js \\
|
|
32
|
-
--ticket <id> --marker <type> --body-file <path> [--provider github]
|
|
33
|
-
|
|
34
|
-
Flags:
|
|
35
|
-
--ticket GitHub issue number to comment on (required).
|
|
36
|
-
--marker Structured-comment type (e.g. progress, friction,
|
|
37
|
-
retro, epic-run-state, wave-0-start) (required).
|
|
38
|
-
--body-file Path to a file containing the markdown body (required).
|
|
39
|
-
--provider Provider name (default: inferred from .agentrc.json github block).
|
|
40
|
-
--help Show this message.
|
|
41
|
-
`;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Core: idempotently upsert the structured comment and return the envelope.
|
|
45
|
-
* Exported so tests can pin input/output parity against direct SDK use
|
|
46
|
-
* without spawning a subprocess.
|
|
47
|
-
*/
|
|
48
|
-
export async function runPostStructuredComment({
|
|
49
|
-
ticketId,
|
|
50
|
-
type,
|
|
51
|
-
body,
|
|
52
|
-
provider,
|
|
53
|
-
}) {
|
|
54
|
-
assertValidStructuredCommentType(type);
|
|
55
|
-
await upsertStructuredComment(provider, ticketId, type, body);
|
|
56
|
-
return { success: true, ticketId, type };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function parseArgv(argv) {
|
|
60
|
-
const { values } = parseArgs({
|
|
61
|
-
args: argv,
|
|
62
|
-
options: {
|
|
63
|
-
ticket: { type: 'string' },
|
|
64
|
-
marker: { type: 'string' },
|
|
65
|
-
'body-file': { type: 'string' },
|
|
66
|
-
provider: { type: 'string' },
|
|
67
|
-
help: { type: 'boolean' },
|
|
68
|
-
},
|
|
69
|
-
strict: false,
|
|
70
|
-
});
|
|
71
|
-
return values;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Pure: validate the required CLI inputs for `post-structured-comment`. The
|
|
76
|
-
* orchestrator is otherwise too dense to score under the CRAP cap, and these
|
|
77
|
-
* rules deserve their own targeted tests.
|
|
78
|
-
*
|
|
79
|
-
* @param {Record<string, unknown>} values parsed CLI values
|
|
80
|
-
* @returns {{ ticketId: number, errors: string[] }} `errors` is empty on success.
|
|
81
|
-
*/
|
|
82
|
-
export function validateRequiredArgs(values) {
|
|
83
|
-
const ticketId = Number.parseInt(values.ticket ?? '', 10);
|
|
84
|
-
const errors = [];
|
|
85
|
-
if (!Number.isFinite(ticketId) || ticketId <= 0) {
|
|
86
|
-
errors.push('--ticket <id> is required.');
|
|
87
|
-
}
|
|
88
|
-
if (!values.marker) errors.push('--marker <type> is required.');
|
|
89
|
-
if (!values['body-file']) errors.push('--body-file <path> is required.');
|
|
90
|
-
return { ticketId, errors };
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export async function main(argv = process.argv.slice(2)) {
|
|
94
|
-
const values = parseArgv(argv);
|
|
95
|
-
|
|
96
|
-
if (values.help) {
|
|
97
|
-
process.stdout.write(HELP);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const { ticketId, errors } = validateRequiredArgs(values);
|
|
102
|
-
if (errors.length) {
|
|
103
|
-
for (const e of errors) {
|
|
104
|
-
process.stderr.write(`[post-structured-comment] ${e}\n`);
|
|
105
|
-
}
|
|
106
|
-
process.stderr.write(HELP);
|
|
107
|
-
process.exit(2);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const body = await fs.readFile(values['body-file'], 'utf8');
|
|
111
|
-
|
|
112
|
-
const config = resolveConfig();
|
|
113
|
-
const effectiveConfig = values.provider
|
|
114
|
-
? { ...config, provider: values.provider }
|
|
115
|
-
: config;
|
|
116
|
-
const provider = createProvider(effectiveConfig);
|
|
117
|
-
|
|
118
|
-
const envelope = await runPostStructuredComment({
|
|
119
|
-
ticketId,
|
|
120
|
-
type: values.marker,
|
|
121
|
-
body,
|
|
122
|
-
provider,
|
|
123
|
-
});
|
|
124
|
-
process.stdout.write(`${JSON.stringify(envelope)}\n`);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
runAsCli(import.meta.url, main, { source: 'post-structured-comment' });
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* provision-git-hooks.js
|
|
5
|
-
*
|
|
6
|
-
* Materialize the repository's git hooks into a linked worktree, so commits
|
|
7
|
-
* made there are subject to the same `commit-msg` / `pre-commit` / `pre-push`
|
|
8
|
-
* gates as commits made in the main checkout.
|
|
9
|
-
*
|
|
10
|
-
* Worktrees created by `single-story-init.js` are provisioned automatically as
|
|
11
|
-
* part of `worktree.bootstrap`. This entry point exists for the worktrees the
|
|
12
|
-
* orchestrator never creates — a harness or hand-made `git worktree add` —
|
|
13
|
-
* which are otherwise unreachable. Run it from inside such a worktree with no
|
|
14
|
-
* arguments.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import path from 'node:path';
|
|
18
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
19
|
-
import {
|
|
20
|
-
materializeGitHooks,
|
|
21
|
-
resolveCommonCheckout,
|
|
22
|
-
} from './lib/worktree/git-hooks.js';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* @param {object} [opts]
|
|
26
|
-
* @param {string[]} [opts.argv]
|
|
27
|
-
* @param {string} [opts.cwd]
|
|
28
|
-
* @returns {{ action: string, reason?: string, hooksPath: string|null,
|
|
29
|
-
* target: string|null, hooks: string[], worktree: string, repoRoot: string }}
|
|
30
|
-
*/
|
|
31
|
-
export function runProvisionGitHooks({
|
|
32
|
-
argv = process.argv.slice(2),
|
|
33
|
-
cwd = process.cwd(),
|
|
34
|
-
} = {}) {
|
|
35
|
-
const positional = [];
|
|
36
|
-
let repoRootFlag = null;
|
|
37
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
38
|
-
if (argv[i] === '--repo-root') {
|
|
39
|
-
repoRootFlag = argv[i + 1];
|
|
40
|
-
if (!repoRootFlag) {
|
|
41
|
-
throw new Error('--repo-root requires a path');
|
|
42
|
-
}
|
|
43
|
-
i += 1;
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
positional.push(argv[i]);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const worktree = path.resolve(cwd, positional[0] ?? '.');
|
|
50
|
-
const repoRoot = repoRootFlag
|
|
51
|
-
? path.resolve(cwd, repoRootFlag)
|
|
52
|
-
: resolveCommonCheckout(worktree);
|
|
53
|
-
|
|
54
|
-
const result = materializeGitHooks({ repoRoot, worktree });
|
|
55
|
-
return { ...result, worktree, repoRoot };
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
runAsCli(
|
|
59
|
-
import.meta.url,
|
|
60
|
-
async () => {
|
|
61
|
-
const result = runProvisionGitHooks();
|
|
62
|
-
// Compact single-line digest: this is the machine contract, and the
|
|
63
|
-
// hook file list is bounded by the hooks directory itself.
|
|
64
|
-
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
source: 'provision-git-hooks',
|
|
68
|
-
usage: {
|
|
69
|
-
invocation:
|
|
70
|
-
'node .agents/scripts/provision-git-hooks.js [<worktree-path>] [--repo-root <path>]',
|
|
71
|
-
summary:
|
|
72
|
-
"Materialize the repository's git hooks into a linked worktree so its commits are gated.",
|
|
73
|
-
flags: [
|
|
74
|
-
[
|
|
75
|
-
'<worktree-path>',
|
|
76
|
-
'Worktree to provision (default: the current directory).',
|
|
77
|
-
],
|
|
78
|
-
[
|
|
79
|
-
'--repo-root <path>',
|
|
80
|
-
'Checkout that owns the hooks (default: derived from --git-common-dir).',
|
|
81
|
-
],
|
|
82
|
-
],
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
);
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// .agents/scripts/prune-baseline-orphans.js — Story #5012.
|
|
4
|
-
//
|
|
5
|
-
// Delete the baseline rows that are provably inert, and nothing else.
|
|
6
|
-
//
|
|
7
|
-
// This is the cheap remedy that makes `check-baseline-scope.js` fair. A gate
|
|
8
|
-
// that hard-fails on a stale row is only defensible while clearing one costs a
|
|
9
|
-
// command rather than a full re-score: the honest alternative — re-derive the
|
|
10
|
-
// whole baseline — spends a coverage run or a full-tree MI pass to express a
|
|
11
|
-
// deletion, which is why stale rows accumulate instead.
|
|
12
|
-
//
|
|
13
|
-
// Two row classes qualify, both decidable without measuring anything:
|
|
14
|
-
//
|
|
15
|
-
// - `absent` — the row's file is gone from disk.
|
|
16
|
-
// - `out-of-scope` — the file is still there, but the gate's own
|
|
17
|
-
// `targetDirs` / `ignoreGlobs` no longer match it.
|
|
18
|
-
//
|
|
19
|
-
// The pruner never adds a row, never restamps `generatedAt` (a fresh stamp
|
|
20
|
-
// over unmeasured rows is the exact failure an age check exists to catch), and
|
|
21
|
-
// recomputes `rollup` through the kind's own arithmetic so the pruned envelope
|
|
22
|
-
// still validates against its schema. An unreadable scope config degrades to
|
|
23
|
-
// orphan-only pruning rather than treating unknown scope as empty scope.
|
|
24
|
-
//
|
|
25
|
-
// Exit codes:
|
|
26
|
-
// 0 nothing to prune (or, without `--check`, the prune was written)
|
|
27
|
-
// 1 `--check` found rows that would be pruned
|
|
28
|
-
// 2 the pruner could not run
|
|
29
|
-
|
|
30
|
-
// Fail-fast if the framework's runtime deps are not installed — must be the
|
|
31
|
-
// first import so the check runs before any third-party-importing sibling
|
|
32
|
-
// module is evaluated (Story #3432).
|
|
33
|
-
import './lib/runtime-deps/ensure-installed.js';
|
|
34
|
-
import { PRUNABLE_KINDS, runPrune } from './lib/baselines/orphan-pruner.js';
|
|
35
|
-
import { runAsCli } from './lib/cli-utils.js';
|
|
36
|
-
import { getQuality } from './lib/config/quality.js';
|
|
37
|
-
import { resolveConfig } from './lib/config-resolver.js';
|
|
38
|
-
|
|
39
|
-
const EXIT_CLEAN = 0;
|
|
40
|
-
const EXIT_WOULD_PRUNE = 1;
|
|
41
|
-
const EXIT_CANNOT_RUN = 2;
|
|
42
|
-
|
|
43
|
-
const HELP = {
|
|
44
|
-
invocation:
|
|
45
|
-
'node .agents/scripts/prune-baseline-orphans.js [--check] [--kind <kind>] [--json]',
|
|
46
|
-
summary:
|
|
47
|
-
"Remove baseline rows whose file is gone from disk or has left the gate's scope. Never adds a row, never restamps generatedAt, never re-scores.",
|
|
48
|
-
flags: [
|
|
49
|
-
['--check', 'Report what would be pruned, write nothing, exit 1 if any.'],
|
|
50
|
-
['--kind <kind>', 'Prune one kind only (repeatable). Default: all.'],
|
|
51
|
-
['--json', 'Emit the report as JSON instead of text.'],
|
|
52
|
-
['--cwd <dir>', 'Repository root to prune. Default: process.cwd().'],
|
|
53
|
-
],
|
|
54
|
-
notes: [
|
|
55
|
-
'Exit codes:\n 0 clean, or pruned\n 1 --check found prunable rows\n 2 the pruner could not run',
|
|
56
|
-
],
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Parse argv into an options bag. An unknown flag is an error, never a silent
|
|
61
|
-
* no-op — a typo'd `--dry-run` must not read as "write the files".
|
|
62
|
-
*
|
|
63
|
-
* @param {string[]} argv
|
|
64
|
-
* @returns {{ kinds: string[], check: boolean, json: boolean, cwd: string }}
|
|
65
|
-
*/
|
|
66
|
-
export function parseArgs(argv = []) {
|
|
67
|
-
const out = { kinds: [], check: false, json: false, cwd: null };
|
|
68
|
-
let i = 0;
|
|
69
|
-
while (i < argv.length) {
|
|
70
|
-
const arg = argv[i];
|
|
71
|
-
const value = argv[i + 1];
|
|
72
|
-
i += 1;
|
|
73
|
-
if (arg === '--check') out.check = true;
|
|
74
|
-
else if (arg === '--json') out.json = true;
|
|
75
|
-
else if (arg === '--kind') {
|
|
76
|
-
out.kinds.push(value);
|
|
77
|
-
i += 1;
|
|
78
|
-
} else if (arg === '--cwd') {
|
|
79
|
-
out.cwd = value;
|
|
80
|
-
i += 1;
|
|
81
|
-
} else throw new Error(`unknown flag "${arg}" (try --help)`);
|
|
82
|
-
}
|
|
83
|
-
const unknown = out.kinds.filter((k) => !PRUNABLE_KINDS.includes(k));
|
|
84
|
-
if (unknown.length > 0) {
|
|
85
|
-
throw new Error(
|
|
86
|
-
`unknown --kind ${unknown.join(', ')}; expected one of ${PRUNABLE_KINDS.join(', ')}`,
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
if (out.kinds.length === 0) out.kinds = [...PRUNABLE_KINDS];
|
|
90
|
-
out.cwd = out.cwd ?? process.cwd();
|
|
91
|
-
return out;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Render one kind's outcome as indented text lines.
|
|
96
|
-
*
|
|
97
|
-
* @param {object} entry
|
|
98
|
-
* @param {boolean} check
|
|
99
|
-
* @returns {string[]}
|
|
100
|
-
*/
|
|
101
|
-
function renderKind(entry, check) {
|
|
102
|
-
if (!entry.present) return [];
|
|
103
|
-
if (entry.skipped)
|
|
104
|
-
return [` - ${entry.kind}: skipped (${entry.skipReason})`];
|
|
105
|
-
const suffix = entry.degraded
|
|
106
|
-
? ` [orphan-only: ${entry.degradedReason}]`
|
|
107
|
-
: '';
|
|
108
|
-
if (entry.removed.length === 0) {
|
|
109
|
-
return [` - ${entry.kind}: clean${suffix}`];
|
|
110
|
-
}
|
|
111
|
-
const verb = check ? 'would prune' : 'pruned';
|
|
112
|
-
return [
|
|
113
|
-
` - ${entry.kind}: ${verb} ${entry.removed.length} row(s)${suffix}`,
|
|
114
|
-
...entry.removed.map((row) => ` · ${row.reason}: ${row.path}`),
|
|
115
|
-
];
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Render the whole report as text.
|
|
120
|
-
*
|
|
121
|
-
* @param {object} report
|
|
122
|
-
* @returns {string}
|
|
123
|
-
*/
|
|
124
|
-
export function formatReport(report) {
|
|
125
|
-
const verb = report.check ? 'would prune' : 'pruned';
|
|
126
|
-
const lines = [
|
|
127
|
-
`[prune-baseline-orphans] ${verb} ${report.removedCount} row(s) across ` +
|
|
128
|
-
`${report.writtenCount} file(s)`,
|
|
129
|
-
...report.kinds.flatMap((entry) => renderKind(entry, report.check)),
|
|
130
|
-
];
|
|
131
|
-
if (report.check && report.removedCount > 0) {
|
|
132
|
-
lines.push(
|
|
133
|
-
'',
|
|
134
|
-
'Run without --check to write the prune:',
|
|
135
|
-
' node .agents/scripts/prune-baseline-orphans.js',
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
return lines.join('\n');
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* CLI entry point. Returns its exit code rather than calling `process.exit()`,
|
|
143
|
-
* so `runAsCli`'s `propagateExitCode` path settles it through `flushStdio` and
|
|
144
|
-
* an unbounded report is not truncated at a pipe boundary (Story #4783).
|
|
145
|
-
*
|
|
146
|
-
* @returns {Promise<number>}
|
|
147
|
-
*/
|
|
148
|
-
async function main() {
|
|
149
|
-
let opts;
|
|
150
|
-
let report;
|
|
151
|
-
try {
|
|
152
|
-
opts = parseArgs(process.argv.slice(2));
|
|
153
|
-
const config = resolveConfig({ cwd: opts.cwd });
|
|
154
|
-
report = runPrune({
|
|
155
|
-
cwd: opts.cwd,
|
|
156
|
-
kinds: opts.kinds,
|
|
157
|
-
check: opts.check,
|
|
158
|
-
quality: getQuality(config) ?? { gates: {} },
|
|
159
|
-
});
|
|
160
|
-
} catch (err) {
|
|
161
|
-
const message = err?.message ?? String(err);
|
|
162
|
-
process.stdout.write(
|
|
163
|
-
`${JSON.stringify({ schemaVersion: '1', error: message }, null, 2)}\n`,
|
|
164
|
-
);
|
|
165
|
-
return EXIT_CANNOT_RUN;
|
|
166
|
-
}
|
|
167
|
-
process.stdout.write(
|
|
168
|
-
opts.json
|
|
169
|
-
? `${JSON.stringify(report, null, 2)}\n`
|
|
170
|
-
: `${formatReport(report)}\n`,
|
|
171
|
-
);
|
|
172
|
-
return report.check && report.removedCount > 0
|
|
173
|
-
? EXIT_WOULD_PRUNE
|
|
174
|
-
: EXIT_CLEAN;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
runAsCli(import.meta.url, main, {
|
|
178
|
-
source: 'prune-baseline-orphans',
|
|
179
|
-
usage: HELP,
|
|
180
|
-
propagateExitCode: true,
|
|
181
|
-
});
|