mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,22 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Uses Node's built-in `readline/promises` so the bootstrap stays
|
|
5
|
-
* dependency-free. Provides:
|
|
6
|
-
*
|
|
7
|
-
* - `parseFlags(argv)` — minimal arg parser for the flags the
|
|
8
|
-
* bootstrap CLI accepts.
|
|
9
|
-
* - `inferDefaults(projectRoot)` — derives default values for owner /
|
|
10
|
-
* repo / baseBranch / operatorHandle
|
|
11
|
-
* from the project's git remote and
|
|
12
|
-
* config (no network calls).
|
|
13
|
-
* - `collectAnswers({ flags, defaults, interactive })` — resolves every
|
|
14
|
-
* required value, prompting only for
|
|
15
|
-
* values not supplied via flag.
|
|
16
|
-
*
|
|
17
|
-
* In non-TTY contexts the helper refuses to prompt and returns the
|
|
18
|
-
* accumulated answers; callers must decide whether the remaining required
|
|
19
|
-
* fields are satisfied via flags/env.
|
|
2
|
+
* Dependency-free prompt and CLI-flag helpers for bootstrap.js. Never prompts
|
|
3
|
+
* in non-TTY contexts; callers decide whether missing fields are fatal.
|
|
20
4
|
*/
|
|
21
5
|
|
|
22
6
|
import { spawnSync } from 'node:child_process';
|
|
@@ -24,10 +8,7 @@ import fs from 'node:fs';
|
|
|
24
8
|
import path from 'node:path';
|
|
25
9
|
import readline from 'node:readline/promises';
|
|
26
10
|
|
|
27
|
-
/**
|
|
28
|
-
* Flags the bootstrap CLI accepts. Keep this list in sync with the
|
|
29
|
-
* `--help` text in bootstrap.js.
|
|
30
|
-
*/
|
|
11
|
+
/** Keep in sync with the `--help` text in bootstrap.js. */
|
|
31
12
|
const KNOWN_FLAGS = Object.freeze({
|
|
32
13
|
string: [
|
|
33
14
|
'owner',
|
|
@@ -49,10 +30,7 @@ const KNOWN_FLAGS = Object.freeze({
|
|
|
49
30
|
});
|
|
50
31
|
|
|
51
32
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* Unknown long flags become string flags (last-write-wins) so callers can
|
|
55
|
-
* forward through to nested scripts without losing data.
|
|
33
|
+
* Unknown long flags become string flags so they can be forwarded.
|
|
56
34
|
*
|
|
57
35
|
* @param {string[]} argv
|
|
58
36
|
* @returns {Record<string, string|boolean>}
|
|
@@ -85,10 +63,6 @@ export function parseFlags(argv) {
|
|
|
85
63
|
}
|
|
86
64
|
|
|
87
65
|
/**
|
|
88
|
-
* Parse `owner/repo` out of a git remote URL. Supports HTTPS, SSH, and
|
|
89
|
-
* `git@host:owner/repo.git` forms. Returns `null` when the URL is empty
|
|
90
|
-
* or not recognisable.
|
|
91
|
-
*
|
|
92
66
|
* @param {string} url
|
|
93
67
|
* @returns {{ owner: string, repo: string } | null}
|
|
94
68
|
*/
|
|
@@ -114,16 +88,8 @@ function runGit(args, cwd) {
|
|
|
114
88
|
}
|
|
115
89
|
|
|
116
90
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
* the `projectNumber` question default expects). Returns `null` when the
|
|
120
|
-
* file is missing, unparseable, or carries no integer project number.
|
|
121
|
-
*
|
|
122
|
-
* This is the authoritative default for an already-provisioned project on a
|
|
123
|
-
* bootstrap re-run: surfacing the stored number (rather than the repo name)
|
|
124
|
-
* means an `--assume-yes` re-run resolves a numeric answer, which
|
|
125
|
-
* `detectCreation` classifies as an *existing* project — so no duplicate
|
|
126
|
-
* board is created (Story #3896 / review Finding B.3).
|
|
91
|
+
* Stored `github.projectNumber` as a numeric string. A re-run must default to
|
|
92
|
+
* it so `detectCreation` sees an existing project and no duplicate board is made.
|
|
127
93
|
*
|
|
128
94
|
* @param {string} projectRoot
|
|
129
95
|
* @returns {string|null}
|
|
@@ -147,9 +113,7 @@ export function inferStoredProjectNumber(projectRoot) {
|
|
|
147
113
|
}
|
|
148
114
|
|
|
149
115
|
/**
|
|
150
|
-
*
|
|
151
|
-
* config. No network calls — only inspects the local remote/config and the
|
|
152
|
-
* stored `.agentrc.json` (for the already-provisioned project number).
|
|
116
|
+
* Prompt defaults from local git state and `.agentrc.json`; no network calls.
|
|
153
117
|
*
|
|
154
118
|
* @param {string} projectRoot
|
|
155
119
|
* @returns {{ owner: string|null, repo: string|null, baseBranch: string,
|
|
@@ -175,41 +139,22 @@ export function inferDefaults(projectRoot) {
|
|
|
175
139
|
};
|
|
176
140
|
}
|
|
177
141
|
|
|
178
|
-
//
|
|
179
|
-
//
|
|
180
|
-
//
|
|
181
|
-
// `collectAnswers` used to be a 60-line for-loop with seven `continue`
|
|
182
|
-
// branches — flag, env, silent-accept, interactive (with re-ask), assume-yes,
|
|
183
|
-
// missing-required. The branches all had the same shape: "try to produce a
|
|
184
|
-
// value; if you have one, record it and move on". Each branch is now a
|
|
185
|
-
// dedicated `resolveFrom*` helper that returns one of three outcomes:
|
|
186
|
-
//
|
|
187
|
-
// { kind: 'value', value } — accepted this answer; stop trying resolvers.
|
|
188
|
-
// { kind: 'missing' } — required-but-empty; record on `missing[]`.
|
|
189
|
-
// { kind: 'skip' } — this resolver doesn't apply; try the next.
|
|
190
|
-
//
|
|
191
|
-
// `collectAnswers` becomes a two-level loop: for each question, walk the
|
|
192
|
-
// `RESOLVERS` array in priority order. Each resolver is testable in
|
|
193
|
-
// isolation and measures CC < 8 independently.
|
|
194
|
-
// ---------------------------------------------------------------------------
|
|
142
|
+
// Resolvers return `{ kind: 'value', value }` (stop), `{ kind: 'missing' }`
|
|
143
|
+
// (required-but-empty) or `{ kind: 'skip' }` (try the next resolver).
|
|
195
144
|
|
|
196
145
|
/**
|
|
197
146
|
* @typedef {object} ResolverContext
|
|
198
|
-
* @property {object} q
|
|
147
|
+
* @property {object} q
|
|
199
148
|
* @property {Record<string, string|boolean>} flags
|
|
200
149
|
* @property {NodeJS.ProcessEnv} env
|
|
201
|
-
* @property {Set<string>} silentSet — Keys whose default
|
|
202
|
-
* accepted without prompting.
|
|
150
|
+
* @property {Set<string>} silentSet — Keys whose default is accepted unprompted.
|
|
203
151
|
* @property {boolean} interactive
|
|
204
152
|
* @property {boolean} assumeYes
|
|
205
|
-
* @property {() => Promise<readline.Interface>} getRl — Lazy
|
|
206
|
-
* that returns the same instance across
|
|
207
|
-
* calls within one collectAnswers run.
|
|
153
|
+
* @property {() => Promise<readline.Interface>} getRl — Lazy, one instance per run.
|
|
208
154
|
* @property {NodeJS.WritableStream} output
|
|
209
155
|
*/
|
|
210
156
|
|
|
211
157
|
/**
|
|
212
|
-
* Resolver 1 — CLI flag wins outright.
|
|
213
158
|
* @param {ResolverContext} ctx
|
|
214
159
|
* @returns {{ kind: 'value'|'skip', value?: string }}
|
|
215
160
|
*/
|
|
@@ -222,7 +167,6 @@ export function resolveFromFlag(ctx) {
|
|
|
222
167
|
}
|
|
223
168
|
|
|
224
169
|
/**
|
|
225
|
-
* Resolver 2 — env var override.
|
|
226
170
|
* @param {ResolverContext} ctx
|
|
227
171
|
* @returns {{ kind: 'value'|'skip', value?: string }}
|
|
228
172
|
*/
|
|
@@ -237,8 +181,6 @@ export function resolveFromEnv(ctx) {
|
|
|
237
181
|
}
|
|
238
182
|
|
|
239
183
|
/**
|
|
240
|
-
* Resolver 3 — silent-accept default (key was inferred from local git state
|
|
241
|
-
* and no operator override was supplied).
|
|
242
184
|
* @param {ResolverContext} ctx
|
|
243
185
|
* @returns {{ kind: 'value'|'skip', value?: string }}
|
|
244
186
|
*/
|
|
@@ -250,28 +192,9 @@ export function resolveFromSilent(ctx) {
|
|
|
250
192
|
}
|
|
251
193
|
|
|
252
194
|
/**
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
* GitHub repos / projects) before falling back to free-text entry.
|
|
257
|
-
*
|
|
258
|
-
* The question opts in by carrying an optional `picker: { list }` field,
|
|
259
|
-
* where `list(answers)` is a function returning an array of string choices
|
|
260
|
-
* (commonly a `gh-list` provider). It receives the answers resolved so far,
|
|
261
|
-
* so a later question can list against an earlier answer — e.g. the repo /
|
|
262
|
-
* project pickers fetching the just-entered owner's repos/projects, which is
|
|
263
|
-
* the only owner available when the folder has no git remote to infer from.
|
|
264
|
-
* The resolver returns `kind: 'skip'` — falling through to manual entry via
|
|
265
|
-
* `resolveInteractive` — in three cases:
|
|
266
|
-
*
|
|
267
|
-
* 1. not interactive (`ctx.interactive` is false),
|
|
268
|
-
* 2. the question has no `picker` (or no callable `picker.list`),
|
|
269
|
-
* 3. the provider returns an empty list (no choices to render).
|
|
270
|
-
*
|
|
271
|
-
* Otherwise it renders a numbered menu, reads a selection via `ctx.getRl()`,
|
|
272
|
-
* and returns the chosen value. A blank line or an out-of-range / unparseable
|
|
273
|
-
* selection also falls through to manual entry (`kind: 'skip'`) rather than
|
|
274
|
-
* looping, keeping the resolver single-shot and predictable.
|
|
195
|
+
* Numbered-menu picker for questions carrying `picker.list(answers)`, which
|
|
196
|
+
* sees earlier answers (e.g. the owner just entered). Single-shot: no choices
|
|
197
|
+
* or a blank/invalid selection falls through to manual entry.
|
|
275
198
|
*
|
|
276
199
|
* @param {ResolverContext} ctx
|
|
277
200
|
* @returns {Promise<{ kind: 'value'|'skip', value?: string }>}
|
|
@@ -286,10 +209,6 @@ export async function resolveFromPicker(ctx) {
|
|
|
286
209
|
|
|
287
210
|
const normalized = choices.map(normalizePickerChoice);
|
|
288
211
|
const rl = await ctx.getRl();
|
|
289
|
-
// The picker header uses `pickerMessage` when set, so a question can show
|
|
290
|
-
// list-oriented guidance here (e.g. "Select existing or press ENTER to create
|
|
291
|
-
// new one") while the manual-entry fall-through prompt (`askOnce`) uses the
|
|
292
|
-
// shorter `message` (e.g. "New GitHub repo name"). Falls back to `message`.
|
|
293
212
|
ctx.output.write(`${ctx.q.pickerMessage ?? ctx.q.message}:\n`);
|
|
294
213
|
normalized.forEach((choice, index) => {
|
|
295
214
|
ctx.output.write(` ${index + 1}) ${choice.label}\n`);
|
|
@@ -318,11 +237,6 @@ export async function resolveFromPicker(ctx) {
|
|
|
318
237
|
}
|
|
319
238
|
|
|
320
239
|
/**
|
|
321
|
-
* Normalize a picker choice into a `{ label, value }` pair. A bare string
|
|
322
|
-
* choice uses the same text for both; an object choice carries an explicit
|
|
323
|
-
* `label` shown in the menu and `value` returned on selection. Exported for
|
|
324
|
-
* unit testing.
|
|
325
|
-
*
|
|
326
240
|
* @param {string | { label?: string, value?: string }} choice
|
|
327
241
|
* @returns {{ label: string, value: string }}
|
|
328
242
|
*/
|
|
@@ -337,9 +251,7 @@ export function normalizePickerChoice(choice) {
|
|
|
337
251
|
}
|
|
338
252
|
|
|
339
253
|
/**
|
|
340
|
-
*
|
|
341
|
-
* the operator pressed Enter on an empty line. Pure I/O; exported so
|
|
342
|
-
* `resolveInteractive` can be unit-tested with a mocked readline.
|
|
254
|
+
* An empty line takes the default.
|
|
343
255
|
*
|
|
344
256
|
* @param {readline.Interface} rl
|
|
345
257
|
* @param {object} q
|
|
@@ -354,8 +266,7 @@ async function askOnce(rl, q) {
|
|
|
354
266
|
}
|
|
355
267
|
|
|
356
268
|
/**
|
|
357
|
-
*
|
|
358
|
-
* helper re-asks once more before declaring the answer missing.
|
|
269
|
+
* Re-asks once on a validation failure before declaring the answer missing.
|
|
359
270
|
*
|
|
360
271
|
* @param {ResolverContext} ctx
|
|
361
272
|
* @returns {Promise<{ kind: 'value'|'missing'|'skip', value?: string }>}
|
|
@@ -376,10 +287,6 @@ export async function resolveInteractive(ctx) {
|
|
|
376
287
|
}
|
|
377
288
|
|
|
378
289
|
/**
|
|
379
|
-
* Resolver 5 — non-interactive `--assume-yes` fallback. Accepts the
|
|
380
|
-
* question's default verbatim; emits `missing` for required questions that
|
|
381
|
-
* lack a default.
|
|
382
|
-
*
|
|
383
290
|
* @param {ResolverContext} ctx
|
|
384
291
|
* @returns {{ kind: 'value'|'missing'|'skip', value?: string }}
|
|
385
292
|
*/
|
|
@@ -390,10 +297,7 @@ export function resolveAssumeYes(ctx) {
|
|
|
390
297
|
return { kind: 'skip' };
|
|
391
298
|
}
|
|
392
299
|
|
|
393
|
-
/**
|
|
394
|
-
* Priority-ordered list of resolvers. Each is tried in turn until one
|
|
395
|
-
* returns a non-`skip` outcome. Exported for testing.
|
|
396
|
-
*/
|
|
300
|
+
/** Priority order; the first non-`skip` outcome wins. */
|
|
397
301
|
export const RESOLVERS = Object.freeze([
|
|
398
302
|
resolveFromFlag,
|
|
399
303
|
resolveFromEnv,
|
|
@@ -404,15 +308,7 @@ export const RESOLVERS = Object.freeze([
|
|
|
404
308
|
]);
|
|
405
309
|
|
|
406
310
|
/**
|
|
407
|
-
*
|
|
408
|
-
* routed through the `RESOLVERS` chain in priority order; the first
|
|
409
|
-
* resolver to return `{ kind: 'value' }` wins, `{ kind: 'missing' }` adds
|
|
410
|
-
* the key to `missing[]`, and `{ kind: 'skip' }` continues the chain. If
|
|
411
|
-
* every resolver skips a *required* question, the key is recorded as
|
|
412
|
-
* missing so callers can decide whether to abort.
|
|
413
|
-
*
|
|
414
|
-
* Returns `{ answers, missing }` so the CLI can decide whether to abort
|
|
415
|
-
* (non-TTY with missing required fields and no `--assume-yes`).
|
|
311
|
+
* Resolve each question through `RESOLVERS`; the CLI decides whether `missing` aborts.
|
|
416
312
|
*
|
|
417
313
|
* @param {object} args
|
|
418
314
|
* @param {Array<{ key: string, flag: string, env?: string, message: string,
|
|
@@ -421,8 +317,7 @@ export const RESOLVERS = Object.freeze([
|
|
|
421
317
|
* @param {Record<string, string|boolean>} args.flags
|
|
422
318
|
* @param {boolean} args.interactive
|
|
423
319
|
* @param {boolean} args.assumeYes
|
|
424
|
-
* @param {Iterable<string>} [args.silentAccept]
|
|
425
|
-
* should be accepted without prompting (when no flag/env overrides).
|
|
320
|
+
* @param {Iterable<string>} [args.silentAccept]
|
|
426
321
|
* @param {NodeJS.ReadableStream} [args.input=process.stdin]
|
|
427
322
|
* @param {NodeJS.WritableStream} [args.output=process.stdout]
|
|
428
323
|
* @returns {Promise<{ answers: Record<string, string>, missing: string[] }>}
|
|
@@ -456,9 +351,7 @@ export async function collectAnswers(args) {
|
|
|
456
351
|
assumeYes,
|
|
457
352
|
getRl,
|
|
458
353
|
output,
|
|
459
|
-
//
|
|
460
|
-
// question's picker can key off an earlier answer — e.g. the repo /
|
|
461
|
-
// project pickers listing against the owner just entered.
|
|
354
|
+
// Resolved so far, so a later picker can key off an earlier answer.
|
|
462
355
|
answers,
|
|
463
356
|
};
|
|
464
357
|
let outcome = { kind: 'skip' };
|
|
@@ -474,7 +367,6 @@ export async function collectAnswers(args) {
|
|
|
474
367
|
missing.push(q.key);
|
|
475
368
|
continue;
|
|
476
369
|
}
|
|
477
|
-
// Every resolver skipped — record as missing only if required.
|
|
478
370
|
if (q.required) missing.push(q.key);
|
|
479
371
|
}
|
|
480
372
|
} finally {
|
|
@@ -1,35 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* project clone. Performs five additive actions, each safe to re-run:
|
|
6
|
-
*
|
|
7
|
-
* 1. Copies the `code-quality-guardrails.md` helper into the project's
|
|
8
|
-
* `.agents/workflows/helpers/` (no-op when the helper is already present).
|
|
9
|
-
* 2. Installs `.husky/pre-commit` carrying the `quality:preview` invocation
|
|
10
|
-
* that the framework ships, preserving any custom hook lines already in
|
|
11
|
-
* place. When a custom (non-framework) `pre-commit` exists, it is left
|
|
12
|
-
* untouched and the caller is told to merge in the snippet manually.
|
|
13
|
-
* 3. Adds `quality:preview` and `quality:watch` npm scripts when missing.
|
|
14
|
-
* Existing scripts are preserved.
|
|
15
|
-
* 4. Seeds `delivery.quality.codingGuardrails` and
|
|
16
|
-
* `delivery.quality.autoRefresh` defaults in `.agentrc.json` when
|
|
17
|
-
* the keys are absent. Existing values are preserved.
|
|
18
|
-
* 5. Registers the `baselines/*.json` merge driver (Story #5215) — the
|
|
19
|
-
* `.gitattributes` line plus this clone's `merge.mandrel-baseline.driver`
|
|
20
|
-
* config, so concurrent baseline refreshes merge by row identity instead
|
|
21
|
-
* of conflicting on the `generatedAt` stamp.
|
|
22
|
-
* 6. Prunes a committed pre-v2 `baselines/epic/` tree (Story #5007). The
|
|
23
|
-
* v2 model is Story-only — nothing writes, reads, or reaps per-Epic
|
|
24
|
-
* ratchet snapshots — so an upgrading consumer is left carrying a
|
|
25
|
-
* committed directory no gate consults. Absent on every repo that never
|
|
26
|
-
* ran a pre-v2 install, which is the overwhelmingly common case.
|
|
27
|
-
*
|
|
28
|
-
* Returns a structured summary so the bootstrap and update workflows can
|
|
29
|
-
* surface exactly which actions ran and which were no-ops.
|
|
30
|
-
*
|
|
31
|
-
* Exports are pure-ish (filesystem effects only via the supplied paths) so
|
|
32
|
-
* the test suite can drive the helper against a tmp directory.
|
|
2
|
+
* Idempotent, additive installer for the quality-gates surface: guardrails
|
|
3
|
+
* helper, pre-commit hook, npm scripts, config defaults, baseline merge
|
|
4
|
+
* driver, and pruning the retired `baselines/epic/` tree.
|
|
33
5
|
*
|
|
34
6
|
* @module bootstrap/quality-bootstrap
|
|
35
7
|
*/
|
|
@@ -41,11 +13,7 @@ import { getAgentrcDefaults, lookupPath } from '../config/defaults.js';
|
|
|
41
13
|
import { deepEqual } from '../json-utils.js';
|
|
42
14
|
import { ensureBaselineMergeDriver } from './baseline-merge-driver.js';
|
|
43
15
|
|
|
44
|
-
/**
|
|
45
|
-
* The exact pre-commit body the framework ships. Kept as a single string so
|
|
46
|
-
* the hook-installer can detect a verbatim framework hook (overwrite-safe)
|
|
47
|
-
* vs a custom hook (preserve and warn).
|
|
48
|
-
*/
|
|
16
|
+
/** The framework's own pre-commit body. */
|
|
49
17
|
const FRAMEWORK_PRE_COMMIT = `node scripts/check-version-sync.js
|
|
50
18
|
npx lint-staged
|
|
51
19
|
# Story #1395 / Epic #1386: catch MI/CRAP drift at git-commit time so the
|
|
@@ -56,13 +24,7 @@ npx lint-staged
|
|
|
56
24
|
node .agents/scripts/quality-preview.js --changed-since HEAD --staged
|
|
57
25
|
`;
|
|
58
26
|
|
|
59
|
-
/**
|
|
60
|
-
* Minimal pre-commit body for downstream projects that do not carry the
|
|
61
|
-
* framework's `check-version-sync.js` script. Drops that line and the
|
|
62
|
-
* `lint-staged` invocation (downstream may or may not have lint-staged
|
|
63
|
-
* configured); keeps the quality-preview line which is the load-bearing
|
|
64
|
-
* Epic #1386 addition.
|
|
65
|
-
*/
|
|
27
|
+
/** Consumer pre-commit: only the load-bearing quality-preview line. */
|
|
66
28
|
export const DOWNSTREAM_PRE_COMMIT = `# Stabilized quality gates (Epic #1386 / Story #1401):
|
|
67
29
|
# catch MI/CRAP drift at git-commit time so the agent refactors before the
|
|
68
30
|
# diff is closed. quality:preview wraps both gates with --changed-since HEAD
|
|
@@ -71,43 +33,25 @@ export const DOWNSTREAM_PRE_COMMIT = `# Stabilized quality gates (Epic #1386 / S
|
|
|
71
33
|
node .agents/scripts/quality-preview.js --changed-since HEAD --staged
|
|
72
34
|
`;
|
|
73
35
|
|
|
74
|
-
/**
|
|
75
|
-
* Marker substring used to detect a framework-installed quality-preview line
|
|
76
|
-
* inside a pre-commit hook regardless of which body variant is in use.
|
|
77
|
-
*/
|
|
36
|
+
/** Detects an installed quality-preview line in either body variant. */
|
|
78
37
|
export const PRE_COMMIT_MARKER =
|
|
79
38
|
'node .agents/scripts/quality-preview.js --changed-since HEAD --staged';
|
|
80
39
|
|
|
81
40
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* sync when those numbers move.
|
|
41
|
+
* Mirrors `.agents/docs/agentrc-reference.json`. Other `autoRefresh` knobs are
|
|
42
|
+
* fixed constants; seeding them would write an invalid config.
|
|
85
43
|
*/
|
|
86
44
|
const QUALITY_CONFIG_DEFAULTS = Object.freeze({
|
|
87
|
-
|
|
88
|
-
cyclomaticFlag: 8,
|
|
89
|
-
requireSiblingTest: false,
|
|
90
|
-
}),
|
|
91
|
-
autoRefresh: Object.freeze({
|
|
92
|
-
enabled: true,
|
|
93
|
-
crapJumpCap: 5,
|
|
94
|
-
scope: 'diff',
|
|
95
|
-
}),
|
|
45
|
+
autoRefresh: Object.freeze({ enabled: true }),
|
|
96
46
|
});
|
|
97
47
|
|
|
98
|
-
/**
|
|
99
|
-
* NPM scripts seeded by the bootstrap. Existing values are preserved.
|
|
100
|
-
*/
|
|
101
48
|
export const QUALITY_NPM_SCRIPTS = Object.freeze({
|
|
102
49
|
'quality:preview':
|
|
103
50
|
'node .agents/scripts/quality-preview.js --changed-since HEAD',
|
|
104
51
|
'quality:watch': 'node .agents/scripts/quality-watch.js',
|
|
105
52
|
});
|
|
106
53
|
|
|
107
|
-
/**
|
|
108
|
-
* Read JSON from a path, returning `null` when the file does not exist.
|
|
109
|
-
* Surfaces parse errors so callers can fail loudly on a corrupt config.
|
|
110
|
-
*/
|
|
54
|
+
/** `null` when absent; parse errors propagate so a corrupt config fails loudly. */
|
|
111
55
|
function readJsonIfExists(p) {
|
|
112
56
|
if (!fs.existsSync(p)) return null;
|
|
113
57
|
const raw = fs.readFileSync(p, 'utf8');
|
|
@@ -120,16 +64,9 @@ function writeJson(p, obj) {
|
|
|
120
64
|
}
|
|
121
65
|
|
|
122
66
|
/**
|
|
123
|
-
* Step 1 — Ensure the code-quality-guardrails helper is present under
|
|
124
|
-
* `.agents/workflows/helpers/`. When the helper already exists we report
|
|
125
|
-
* `already-present`. Otherwise the helper is copied from the framework source
|
|
126
|
-
* if available, or skipped with a `missing-source` outcome the caller can
|
|
127
|
-
* surface.
|
|
128
|
-
*
|
|
129
67
|
* @param {object} ctx
|
|
130
68
|
* @param {string} ctx.projectRoot
|
|
131
|
-
* @param {string} [ctx.frameworkRoot] -
|
|
132
|
-
* (defaults to `<projectRoot>/.agents`). Tests pass an explicit path.
|
|
69
|
+
* @param {string} [ctx.frameworkRoot] - Defaults to `<projectRoot>/.agents`.
|
|
133
70
|
*/
|
|
134
71
|
export function ensureGuardrailsHelper(ctx) {
|
|
135
72
|
const projectRoot = ctx.projectRoot;
|
|
@@ -159,16 +96,8 @@ export function ensureGuardrailsHelper(ctx) {
|
|
|
159
96
|
}
|
|
160
97
|
|
|
161
98
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* - No `.husky/pre-commit` file → write the requested body, action `created`.
|
|
165
|
-
* - File exists and already contains the quality-preview marker → no-op,
|
|
166
|
-
* action `already-present`.
|
|
167
|
-
* - File exists, does NOT contain the marker, and matches the framework
|
|
168
|
-
* body byte-for-byte → safe overwrite, action `updated`.
|
|
169
|
-
* - File exists, custom content → leave untouched and emit
|
|
170
|
-
* `custom-hook-skip` so the workflow can print the operator notice with
|
|
171
|
-
* the recommended snippet to merge in.
|
|
99
|
+
* Create the hook when absent; an existing hook without the marker is never
|
|
100
|
+
* overwritten — `custom-hook-skip` hands the operator the snippet to merge.
|
|
172
101
|
*
|
|
173
102
|
* @param {object} ctx
|
|
174
103
|
* @param {string} ctx.projectRoot
|
|
@@ -209,14 +138,7 @@ export function ensurePreCommitHook(ctx) {
|
|
|
209
138
|
};
|
|
210
139
|
}
|
|
211
140
|
|
|
212
|
-
/**
|
|
213
|
-
* Step 3 — Register the `quality:preview` and `quality:watch` npm scripts
|
|
214
|
-
* in the project's `package.json`. Existing values are preserved
|
|
215
|
-
* unconditionally; this helper only adds missing keys.
|
|
216
|
-
*
|
|
217
|
-
* Returns the per-script outcome so the workflow can surface which scripts
|
|
218
|
-
* were added vs already present.
|
|
219
|
-
*/
|
|
141
|
+
/** Add missing quality npm scripts; existing values always win. */
|
|
220
142
|
export function ensureQualityNpmScripts(ctx) {
|
|
221
143
|
const pkgPath = path.join(ctx.projectRoot, 'package.json');
|
|
222
144
|
const pkg = readJsonIfExists(pkgPath);
|
|
@@ -244,24 +166,13 @@ export function ensureQualityNpmScripts(ctx) {
|
|
|
244
166
|
}
|
|
245
167
|
|
|
246
168
|
/**
|
|
247
|
-
*
|
|
248
|
-
*
|
|
249
|
-
*
|
|
250
|
-
* underneath the project config at read time, so a key whose intended
|
|
251
|
-
* value equals the framework default would be written redundantly — and
|
|
252
|
-
* would then be flagged `[REDUNDANT]` by the sync-agentrc helper on the
|
|
253
|
-
* next /mandrel-update. Default-aware seeding keeps the two helpers from
|
|
254
|
-
* contradicting each other.
|
|
255
|
-
*
|
|
256
|
-
* Returns `{ merged, addedKeys[] }` so the caller can report exactly
|
|
257
|
-
* which keys were seeded. Pure-default writes are reported under
|
|
258
|
-
* `skippedKeys[]` so callers can surface why the seed was a no-op.
|
|
169
|
+
* Set only keys that are absent AND differ from the framework default — a
|
|
170
|
+
* default-equal write would be flagged `[REDUNDANT]` by sync-agentrc.
|
|
171
|
+
* Default-equal keys are reported in `skippedKeys`.
|
|
259
172
|
*
|
|
260
173
|
* @param {object} target
|
|
261
|
-
* @param {object} defaults
|
|
262
|
-
*
|
|
263
|
-
* @param {object} frameworkDefaults — the framework's resolved defaults
|
|
264
|
-
* at the seed root. Compared to each intended write.
|
|
174
|
+
* @param {object} defaults
|
|
175
|
+
* @param {object} frameworkDefaults — resolved defaults at the seed root.
|
|
265
176
|
* @param {string} prefix — dotted path under construction.
|
|
266
177
|
*/
|
|
267
178
|
function mergeMissingKeys(
|
|
@@ -309,13 +220,8 @@ function mergeMissingKeys(
|
|
|
309
220
|
}
|
|
310
221
|
|
|
311
222
|
/**
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
* missing keys are added; existing values are preserved unconditionally
|
|
315
|
-
* (including operator overrides that diverge from the framework defaults).
|
|
316
|
-
*
|
|
317
|
-
* When `.agentrc.json` does not exist the action is `missing-config` and
|
|
318
|
-
* nothing is written — the project must complete its base bootstrap first.
|
|
223
|
+
* Seed missing quality defaults into `.agentrc.json`; writes nothing when the
|
|
224
|
+
* file is absent (base bootstrap must run first).
|
|
319
225
|
*/
|
|
320
226
|
export function ensureQualityConfigDefaults(ctx) {
|
|
321
227
|
const cfgPath = path.join(ctx.projectRoot, '.agentrc.json');
|
|
@@ -344,9 +250,7 @@ export function ensureQualityConfigDefaults(ctx) {
|
|
|
344
250
|
if (addedKeys.length > 0) {
|
|
345
251
|
writeJson(cfgPath, cfg);
|
|
346
252
|
} else {
|
|
347
|
-
//
|
|
348
|
-
// and the in-memory snapshot agree (defensive; nothing reads cfg
|
|
349
|
-
// after this).
|
|
253
|
+
// Undo the scaffolding so memory matches disk.
|
|
350
254
|
if (!hadQuality) delete cfg.delivery.quality;
|
|
351
255
|
if (!hadDelivery) delete cfg.delivery;
|
|
352
256
|
}
|
|
@@ -358,31 +262,17 @@ export function ensureQualityConfigDefaults(ctx) {
|
|
|
358
262
|
};
|
|
359
263
|
}
|
|
360
264
|
|
|
361
|
-
/**
|
|
362
|
-
* Repo-root-relative path of the retired committed per-Epic snapshot tree.
|
|
363
|
-
* Module-private: exporting it would add a production-dead row to the
|
|
364
|
-
* dead-exports ratchet for a two-word constant.
|
|
365
|
-
*/
|
|
265
|
+
/** Private: exporting it would add a dead-exports row. */
|
|
366
266
|
const LEGACY_EPIC_BASELINES_RELPATH = 'baselines/epic';
|
|
367
267
|
|
|
368
268
|
/**
|
|
369
|
-
*
|
|
370
|
-
*
|
|
371
|
-
*
|
|
372
|
-
* `baselines/epic/<id>/`. The v2 Story-only model retired epics along with
|
|
373
|
-
* every reader of those snapshots, and `check-baselines.js` resolves
|
|
374
|
-
* baselines by fixed filename rather than by directory glob — so the tree is
|
|
375
|
-
* inert, and the only remaining value in the retired layout migration was
|
|
376
|
-
* getting it out of version control.
|
|
377
|
-
*
|
|
378
|
-
* `git rm -r --ignore-unmatch` stages the removal when the path is tracked
|
|
379
|
-
* and is a safe no-op when it is not (fresh clone / untracked leftovers);
|
|
380
|
-
* the on-disk residue is then removed so a re-run reports `absent`. The
|
|
381
|
-
* caller commits the resulting working-tree delta.
|
|
269
|
+
* Remove the inert per-Epic snapshot tree no reader consults. `git rm
|
|
270
|
+
* --ignore-unmatch` stages it when tracked and no-ops otherwise; the caller
|
|
271
|
+
* commits the delta.
|
|
382
272
|
*
|
|
383
273
|
* @param {object} ctx
|
|
384
274
|
* @param {string} ctx.projectRoot
|
|
385
|
-
* @param {typeof defaultSpawnSync} [ctx.spawnImpl]
|
|
275
|
+
* @param {typeof defaultSpawnSync} [ctx.spawnImpl]
|
|
386
276
|
* @returns {{ action: 'absent'|'pruned', path: string, gitStatus?: number|null }}
|
|
387
277
|
*/
|
|
388
278
|
export function pruneLegacyEpicBaselines(ctx) {
|
|
@@ -411,10 +301,6 @@ export function pruneLegacyEpicBaselines(ctx) {
|
|
|
411
301
|
}
|
|
412
302
|
|
|
413
303
|
/**
|
|
414
|
-
* Run all six steps in order. Composable wrapper used by the bootstrap
|
|
415
|
-
* and update workflows. Each step's outcome is returned under its own key
|
|
416
|
-
* so callers can render a per-action summary.
|
|
417
|
-
*
|
|
418
304
|
* @param {object} ctx
|
|
419
305
|
* @param {string} ctx.projectRoot
|
|
420
306
|
* @param {string} [ctx.frameworkRoot]
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bootstrap/summary — Bootstrap result formatting + summary printing
|
|
3
|
-
*
|
|
4
|
-
* Pure formatting helpers (`format*Summary`) and the `printSummary`
|
|
5
|
-
* presenter extracted from `agents-bootstrap-github.js` (Story #3349).
|
|
6
|
-
* These render the `runBootstrap` result envelope into operator-facing
|
|
7
|
-
* lines; they hold no provider coupling and no orchestration logic.
|
|
8
|
-
*/
|
|
1
|
+
/** Renders the `runBootstrap` result envelope into operator-facing lines. */
|
|
9
2
|
|
|
10
3
|
import { Logger } from '../Logger.js';
|
|
11
4
|
|