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
package/lib/cli/doctor.js
CHANGED
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
// lib/cli/doctor.js
|
|
2
2
|
/**
|
|
3
|
-
* `mandrel doctor
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* prints a ✔/✘ per-check report with remedies for failures, prints a
|
|
7
|
-
* final summary line, and exits 0 when all checks pass or non-zero when
|
|
8
|
-
* any check fails.
|
|
9
|
-
*
|
|
10
|
-
* Output contract (per Story #3450 AC):
|
|
11
|
-
* pass → "✔ <name> <detail>"
|
|
12
|
-
* fail → "✘ <name> <detail>\n → <remedy>"
|
|
13
|
-
* final → "✅ Ready (N/N checks passed)"
|
|
14
|
-
* | "❌ Not ready (N/N checks failed)"
|
|
15
|
-
*
|
|
16
|
-
* All output goes to process.stdout so it can be captured by tests.
|
|
17
|
-
* Exit code 0 = all pass, 1 = any fail.
|
|
18
|
-
*
|
|
19
|
-
* Injectable seams (used by tests):
|
|
20
|
-
* - `checks` — replaces the default registry array
|
|
21
|
-
* - `write` — replaces process.stdout.write
|
|
22
|
-
* - `exit` — replaces process.exit
|
|
23
|
-
* - `writeResultCache` — replaces the temp/doctor-result.json writer
|
|
3
|
+
* `mandrel doctor`: run the registry checks in order, print a ✔/✘ line per
|
|
4
|
+
* check (with the remedy under a failure) and a summary; exit 1 on any
|
|
5
|
+
* failure.
|
|
24
6
|
*/
|
|
25
7
|
|
|
26
8
|
import nodeFs from 'node:fs';
|
|
@@ -32,13 +14,7 @@ import {
|
|
|
32
14
|
} from '../../.agents/scripts/lib/doc-tiers.js';
|
|
33
15
|
import { registry } from './registry.js';
|
|
34
16
|
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
// Formatting helpers
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
|
|
39
17
|
/**
|
|
40
|
-
* Pad or truncate `name` to `width` characters so columns line up neatly.
|
|
41
|
-
*
|
|
42
18
|
* @param {string} name
|
|
43
19
|
* @param {number} width
|
|
44
20
|
* @returns {string}
|
|
@@ -47,13 +23,10 @@ function padName(name, width) {
|
|
|
47
23
|
return name.length >= width ? name : name + ' '.repeat(width - name.length);
|
|
48
24
|
}
|
|
49
25
|
|
|
50
|
-
//
|
|
51
|
-
// "agents-materialized" = 19 chars; use 21 for breathing room).
|
|
26
|
+
// Longest check name is 19 chars.
|
|
52
27
|
const NAME_COL = 21;
|
|
53
28
|
|
|
54
29
|
/**
|
|
55
|
-
* Format a single check result line (or lines when a remedy is present).
|
|
56
|
-
*
|
|
57
30
|
* @param {{ name: string, ok: boolean, detail: string, remedy?: string }} result
|
|
58
31
|
* @returns {string}
|
|
59
32
|
*/
|
|
@@ -68,8 +41,6 @@ function formatResult({ name, ok, detail, remedy }) {
|
|
|
68
41
|
}
|
|
69
42
|
|
|
70
43
|
/**
|
|
71
|
-
* Format the final summary line.
|
|
72
|
-
*
|
|
73
44
|
* @param {number} passed
|
|
74
45
|
* @param {number} total
|
|
75
46
|
* @returns {string}
|
|
@@ -83,17 +54,9 @@ function formatSummary(passed, total) {
|
|
|
83
54
|
}
|
|
84
55
|
|
|
85
56
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* tally and therefore never changes the doctor exit code (Story #4438). Any
|
|
90
|
-
* failure to resolve the closure degrades to a neutral line rather than
|
|
91
|
-
* throwing, so an unreadable tree never breaks the doctor run.
|
|
92
|
-
*
|
|
93
|
-
* Security (security-baseline § 5 — Data Leakage & Logging): emits only a file
|
|
94
|
-
* count and byte total, never file contents.
|
|
95
|
-
*
|
|
96
|
-
* Exported for testing.
|
|
57
|
+
* Informational line for the `CLAUDE.md` always-loaded closure (file count,
|
|
58
|
+
* KB). Never counted toward the verdict; a resolve failure degrades to a
|
|
59
|
+
* neutral line.
|
|
97
60
|
*
|
|
98
61
|
* @param {{ cwd?: () => string, resolveClosure?: (root: string) => Array<{ path: string, bytes: number }> }} [opts]
|
|
99
62
|
* @returns {string} a single line terminated by `\n`
|
|
@@ -116,19 +79,9 @@ export function formatClosureReport({
|
|
|
116
79
|
return `ℹ ${label} ${files.length} file(s), ${kb} KB always-loaded\n`;
|
|
117
80
|
}
|
|
118
81
|
|
|
119
|
-
// ---------------------------------------------------------------------------
|
|
120
|
-
// Result cache
|
|
121
|
-
// ---------------------------------------------------------------------------
|
|
122
|
-
|
|
123
82
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* preflight) can read the last recorded verdict without re-running doctor.
|
|
127
|
-
* `temp/` is the gitignored scratch root, so neither git nor the sync prune
|
|
128
|
-
* pass ever sees the cache. Any write failure is swallowed — the cache is
|
|
129
|
-
* advisory, never a gate.
|
|
130
|
-
*
|
|
131
|
-
* Exported for testing.
|
|
83
|
+
* Record the verdict in `temp/doctor-result.json` for workflows that read it
|
|
84
|
+
* without re-running doctor. Advisory: write failures are swallowed.
|
|
132
85
|
*
|
|
133
86
|
* @param {'ready'|'unready'} verdict
|
|
134
87
|
* @param {{ fs?: typeof nodeFs, cwd?: () => string }} [opts]
|
|
@@ -146,17 +99,11 @@ export function writeDoctorResultCache(
|
|
|
146
99
|
`${JSON.stringify({ verdict, checkedAt: new Date().toISOString() }, null, 2)}\n`,
|
|
147
100
|
);
|
|
148
101
|
} catch {
|
|
149
|
-
//
|
|
102
|
+
// An unwritable temp/ must never fail the doctor run.
|
|
150
103
|
}
|
|
151
104
|
}
|
|
152
105
|
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
// Doctor runner (exported for testing)
|
|
155
|
-
// ---------------------------------------------------------------------------
|
|
156
|
-
|
|
157
106
|
/**
|
|
158
|
-
* Run all checks and emit a formatted report.
|
|
159
|
-
*
|
|
160
107
|
* @param {{
|
|
161
108
|
* checks?: Array<{ name: string, run(opts?: unknown): { ok: boolean, detail: string, remedy?: string } }>,
|
|
162
109
|
* write?: (s: string) => void,
|
|
@@ -181,8 +128,7 @@ export async function runDoctor({
|
|
|
181
128
|
write(formatResult({ name: check.name, ...result }));
|
|
182
129
|
}
|
|
183
130
|
|
|
184
|
-
// Report-only
|
|
185
|
-
// never affects the doctor verdict or exit code (Story #4438).
|
|
131
|
+
// Report-only: not counted toward passed/total.
|
|
186
132
|
write(closureReport());
|
|
187
133
|
|
|
188
134
|
const total = checks.length;
|
|
@@ -195,13 +141,7 @@ export async function runDoctor({
|
|
|
195
141
|
}
|
|
196
142
|
}
|
|
197
143
|
|
|
198
|
-
// ---------------------------------------------------------------------------
|
|
199
|
-
// Subcommand entry point (called by bin/mandrel.js)
|
|
200
|
-
// ---------------------------------------------------------------------------
|
|
201
|
-
|
|
202
144
|
/**
|
|
203
|
-
* Default export consumed by `bin/mandrel.js`.
|
|
204
|
-
*
|
|
205
145
|
* @param {string[]} _argv Unused — `mandrel doctor` takes no arguments.
|
|
206
146
|
* @returns {Promise<void>}
|
|
207
147
|
*/
|
package/lib/cli/init.js
CHANGED
|
@@ -1,67 +1,14 @@
|
|
|
1
1
|
// lib/cli/init.js
|
|
2
2
|
/**
|
|
3
|
-
* `mandrel init
|
|
3
|
+
* `mandrel init`: cold start. When `./.agents/` is absent, run
|
|
4
|
+
* `npm install mandrel --ignore-scripts` then an explicit sync through the
|
|
5
|
+
* installed bin (one deterministic materialization, no lifecycle scripts);
|
|
6
|
+
* then ask whether to run `bootstrap.js` now (default yes). `--assume-yes`
|
|
7
|
+
* skips the prompt; a non-TTY without it stays files-only so GitHub
|
|
8
|
+
* provisioning never runs unattended.
|
|
4
9
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* mandrel init`, or `mandrel init` once installed) takes a project from a
|
|
8
|
-
* blank folder to a configured Mandrel environment in one command:
|
|
9
|
-
*
|
|
10
|
-
* 1. **Install-if-absent.** When `./.agents/` is missing in the cwd, install
|
|
11
|
-
* the framework deterministically — `npm install mandrel --ignore-scripts`
|
|
12
|
-
* followed by an explicit sync run against the freshly installed bin
|
|
13
|
-
* (`node ./node_modules/mandrel/bin/mandrel.js sync`, NOT a bare `mandrel`
|
|
14
|
-
* on `PATH` — see `SYNC_BIN` below). The `--ignore-scripts` install
|
|
15
|
-
* skips the package's best-effort `postinstall` sync so the explicit
|
|
16
|
-
* `sync` is the single, deterministic materialization (review rec D.3 —
|
|
17
|
-
* no postinstall-then-init double-sync, and no arbitrary install
|
|
18
|
-
* lifecycle scripts during cold start). When `./.agents/` already exists
|
|
19
|
-
* (the operator ran `npm install mandrel` first), step 1 is skipped and
|
|
20
|
-
* `init` goes straight to the prompt — the one subcommand is idempotent
|
|
21
|
-
* across both the cold-start and post-install entry points.
|
|
22
|
-
*
|
|
23
|
-
* 2. **Yes/no prompt.** Ask whether to begin the interactive setup now
|
|
24
|
-
* (yes → run `node .agents/scripts/bootstrap.js`, forwarding every
|
|
25
|
-
* passthrough flag unchanged) or stop at "just the files" (no → print a
|
|
26
|
-
* re-run hint and exit 0). Yes is the default, so a bare Enter configures
|
|
27
|
-
* (mirrors the `[Y/n]` convention in bootstrap.js). `--assume-yes` skips
|
|
28
|
-
* the prompt and configures (the flag is also forwarded to bootstrap for
|
|
29
|
-
* its own non-interactive run). A non-TTY stdin without `--assume-yes`
|
|
30
|
-
* defaults to no (files-only) so the side-effecting GitHub provisioning
|
|
31
|
-
* never runs unattended.
|
|
32
|
-
*
|
|
33
|
-
* ## Cold-start provenance
|
|
34
|
-
*
|
|
35
|
-
* The installed package name is the **hardcoded build-time constant**
|
|
36
|
-
* `PACKAGE_NAME` below — it is NEVER read from argv or the environment. A
|
|
37
|
-
* cold start fetches `mandrel` from npx's temp cache and runs this bin; the
|
|
38
|
-
* package it then installs into the project must be the same `mandrel`, not an
|
|
39
|
-
* attacker-influenced name supplied on the command line. The forwarded
|
|
40
|
-
* passthrough flags reach `bootstrap.js` (the sole bootstrap orchestrator),
|
|
41
|
-
* which owns its own summary + confirm loop and validates its own inputs.
|
|
42
|
-
*
|
|
43
|
-
* ## Injectable seams (used by tests/cli/init.test.js)
|
|
44
|
-
*
|
|
45
|
-
* The plan/decision logic is a pure function (`planInit`) over injected
|
|
46
|
-
* boundaries so the suite is hermetic — no real TTY, npm, or network:
|
|
47
|
-
*
|
|
48
|
-
* - `argv` — subcommand args (after `mandrel init`)
|
|
49
|
-
* - `exists` — `(path) => boolean`; defaults to an `fs.existsSync` probe
|
|
50
|
-
* for `./.agents/` in the cwd
|
|
51
|
-
* - `runStep` — `(cmd, args) => { status }`; runs one install/sync/bootstrap
|
|
52
|
-
* step. Defaults to a `spawnSync` runner with `stdio: inherit`.
|
|
53
|
-
* - `confirm` — `() => boolean | Promise<boolean>`; reads the operator's
|
|
54
|
-
* yes/no answer (true = configure now). Defaults to a
|
|
55
|
-
* `node:readline` stdin prompt (awaited) with yes as the
|
|
56
|
-
* default.
|
|
57
|
-
* - `stdout` — `(s) => void`; defaults to `process.stdout.write`.
|
|
58
|
-
* - `isTTY` — boolean; defaults to `process.stdin.isTTY`.
|
|
59
|
-
* - `exit` — `(code) => void`; defaults to `process.exit`.
|
|
60
|
-
*
|
|
61
|
-
* Security (security-baseline § 5/6): logs only flag/step descriptions and
|
|
62
|
-
* never reads or echoes tokens, credentials, or env values. The package name
|
|
63
|
-
* is a hardcoded constant rather than interpolated input, and the step runner
|
|
64
|
-
* passes argv as an array (no shell-string concatenation of user input).
|
|
10
|
+
* The installed package is the hardcoded `PACKAGE_NAME`, never argv or env,
|
|
11
|
+
* so a cold start cannot be steered to another package.
|
|
65
12
|
*/
|
|
66
13
|
|
|
67
14
|
import { spawnSync } from 'node:child_process';
|
|
@@ -70,10 +17,7 @@ import path from 'node:path';
|
|
|
70
17
|
import readline from 'node:readline/promises';
|
|
71
18
|
import { pathToFileURL } from 'node:url';
|
|
72
19
|
|
|
73
|
-
//
|
|
74
|
-
// `.agents/` is absent) does not try to import from a directory that does not
|
|
75
|
-
// exist yet. The import is performed after bootstrap succeeds and `.agents/`
|
|
76
|
-
// is guaranteed to be materialised.
|
|
20
|
+
// Lazy: `.agents/` does not exist until the cold start has materialized it.
|
|
77
21
|
let _runInitTail = null;
|
|
78
22
|
async function getRunInitTail(projectRoot) {
|
|
79
23
|
if (_runInitTail) return _runInitTail;
|
|
@@ -85,39 +29,21 @@ async function getRunInitTail(projectRoot) {
|
|
|
85
29
|
'onboard',
|
|
86
30
|
'init-tail.js',
|
|
87
31
|
);
|
|
88
|
-
//
|
|
89
|
-
// `file://C:\…` template treats the drive letter as a URL host — same
|
|
90
|
-
// fix as commit 2e3d210b in lib/transpile.js).
|
|
32
|
+
// A raw `file://C:\…` template would read the drive letter as a URL host.
|
|
91
33
|
const mod = await import(pathToFileURL(tailPath).href);
|
|
92
34
|
_runInitTail = mod.runInitTail;
|
|
93
35
|
return _runInitTail;
|
|
94
36
|
}
|
|
95
37
|
|
|
96
|
-
/**
|
|
97
|
-
* Hardcoded build-time package name. NEVER read from argv or env — cold-start
|
|
98
|
-
* provenance requires the install target to be the same package this bin
|
|
99
|
-
* shipped from. See the module header.
|
|
100
|
-
*/
|
|
38
|
+
/** Never read from argv or env (see the module header). */
|
|
101
39
|
const PACKAGE_NAME = 'mandrel';
|
|
102
40
|
|
|
103
|
-
//
|
|
104
|
-
// resolve relative to the consumer's cwd at run time (the materialized
|
|
105
|
-
// `.agents/` lives there), so they are expressed as cwd-relative steps rather
|
|
106
|
-
// than against PROJECT_ROOT (which, under npx, is npx's throwaway cache).
|
|
41
|
+
// Cwd-relative: under npx the package root is npx's throwaway cache.
|
|
107
42
|
const BOOTSTRAP_SCRIPT = path.join('.agents', 'scripts', 'bootstrap.js');
|
|
108
43
|
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
//
|
|
112
|
-
// way (a documented `npm install mandrel` then `mandrel init`, or a plain
|
|
113
|
-
// `node bin/mandrel.js init`), the freshly installed binary lives at
|
|
114
|
-
// `./node_modules/mandrel/bin/mandrel.js` — off `PATH` — and a bare spawn dies
|
|
115
|
-
// with ENOENT, leaving `.agents/` un-materialized. Spawning `process.execPath`
|
|
116
|
-
// against the package entrypoint resolves identically under npx, under a
|
|
117
|
-
// post-install invocation, and in tests — and, by going through `node`, also
|
|
118
|
-
// sidesteps the win32 `.cmd`-shim concern entirely (no `shell: true` needed for
|
|
119
|
-
// this step). The path is cwd-relative because the package is installed into
|
|
120
|
-
// the consumer's cwd (the same reason BOOTSTRAP_SCRIPT is cwd-relative).
|
|
44
|
+
// Spawned as `node <installed bin>`, not a bare `mandrel`: the bare name only
|
|
45
|
+
// resolves while npx's `.bin` is on PATH (ENOENT after a plain `npm install`),
|
|
46
|
+
// and going through node avoids the win32 `.cmd` shim.
|
|
121
47
|
const SYNC_BIN = path.join('node_modules', PACKAGE_NAME, 'bin', 'mandrel.js');
|
|
122
48
|
|
|
123
49
|
const PROMPT_TEXT =
|
|
@@ -128,12 +54,7 @@ const PROMPT_TEXT =
|
|
|
128
54
|
|
|
129
55
|
const FILES_ONLY_HINT = 'Setup any time with: npx mandrel init\n';
|
|
130
56
|
|
|
131
|
-
//
|
|
132
|
-
// install/sync output streams to the terminal. Paste multi-line ASCII art
|
|
133
|
-
// between the fences below. `String.raw` keeps backslashes literal so the art
|
|
134
|
-
// renders exactly as pasted — the only characters to avoid inside are a
|
|
135
|
-
// literal backtick and the `${` sequence. The leading/trailing blank lines
|
|
136
|
-
// frame the art in the terminal.
|
|
57
|
+
// `String.raw` keeps the art's backslashes literal; avoid backticks and `${`.
|
|
137
58
|
const BANNER = String.raw`
|
|
138
59
|
|
|
139
60
|
______ ___ _________ ______
|
|
@@ -145,20 +66,11 @@ ____________________________________________________
|
|
|
145
66
|
|
|
146
67
|
`;
|
|
147
68
|
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
// `shell: true` only there. Off win32, never shell out — array argv stays
|
|
151
|
-
// injection-proof. (The `sync` step no longer hits a `.cmd` shim at all: it is
|
|
152
|
-
// dispatched as `process.execPath` + `SYNC_BIN`, a plain `node` spawn — but the
|
|
153
|
-
// `npm install` step still needs the shim handling, so `NEEDS_SHELL` stays.)
|
|
69
|
+
// Win32 `npm` is a `.cmd` shim Node will not spawn without a shell
|
|
70
|
+
// (CVE-2024-27980); shell nowhere else, so array argv stays injection-proof.
|
|
154
71
|
const NEEDS_SHELL = process.platform === 'win32';
|
|
155
72
|
|
|
156
73
|
/**
|
|
157
|
-
* Strip the `--assume-yes` flag from a passthrough argv, returning the
|
|
158
|
-
* remaining flags. `--assume-yes` is consumed by `init` to skip the prompt but
|
|
159
|
-
* is ALSO forwarded to bootstrap (see `buildBootstrapArgs`), so this helper
|
|
160
|
-
* exists only to detect its presence, not to drop it from the forward set.
|
|
161
|
-
*
|
|
162
74
|
* @param {string[]} argv
|
|
163
75
|
* @returns {boolean} whether `--assume-yes` is present
|
|
164
76
|
*/
|
|
@@ -167,9 +79,7 @@ function hasAssumeYes(argv) {
|
|
|
167
79
|
}
|
|
168
80
|
|
|
169
81
|
/**
|
|
170
|
-
*
|
|
171
|
-
* forwarded unchanged; `--assume-yes` is appended when chosen but absent so
|
|
172
|
-
* bootstrap runs non-interactively without the operator having typed it.
|
|
82
|
+
* All flags forwarded unchanged, plus `--assume-yes` when chosen but absent.
|
|
173
83
|
*
|
|
174
84
|
* @param {string[]} argv
|
|
175
85
|
* @param {boolean} assumeYes
|
|
@@ -183,13 +93,7 @@ function buildBootstrapArgs(argv, assumeYes) {
|
|
|
183
93
|
}
|
|
184
94
|
|
|
185
95
|
/**
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
* This is the testable core: it consults `exists` to decide whether to run the
|
|
189
|
-
* install + sync steps, resolves the prompt outcome from `isTTY` / `--assume-yes`
|
|
190
|
-
* / `confirm`, and either runs the bootstrap step or prints the files-only hint.
|
|
191
|
-
* Every effectful boundary is injected so the suite never touches a real TTY,
|
|
192
|
-
* npm, or the network.
|
|
96
|
+
* The cold-start plan over injected boundaries.
|
|
193
97
|
*
|
|
194
98
|
* @param {{
|
|
195
99
|
* argv?: string[],
|
|
@@ -219,10 +123,6 @@ export async function planInit({
|
|
|
219
123
|
const steps = [];
|
|
220
124
|
|
|
221
125
|
/**
|
|
222
|
-
* Run one step through the injected runner and record it. A non-zero status
|
|
223
|
-
* short-circuits the plan with that exit code (the runner inherits stdio, so
|
|
224
|
-
* the failing tool's own output already reached the terminal).
|
|
225
|
-
*
|
|
226
126
|
* @param {string} cmd
|
|
227
127
|
* @param {string[]} args
|
|
228
128
|
* @returns {number} the step's exit code (0 on success)
|
|
@@ -233,10 +133,6 @@ export async function planInit({
|
|
|
233
133
|
return result?.status ?? 1;
|
|
234
134
|
};
|
|
235
135
|
|
|
236
|
-
// --- Step 1: install-if-absent ------------------------------------------
|
|
237
|
-
// When `./.agents/` is missing, materialize the framework deterministically:
|
|
238
|
-
// `npm install <pkg> --ignore-scripts` then explicit `mandrel sync`. When it
|
|
239
|
-
// is present, skip straight to the prompt (idempotent post-install path).
|
|
240
136
|
const agentsPresent = exists('.agents');
|
|
241
137
|
if (!agentsPresent) {
|
|
242
138
|
const installStatus = step('npm', [
|
|
@@ -266,13 +162,8 @@ export async function planInit({
|
|
|
266
162
|
|
|
267
163
|
const installed = !agentsPresent;
|
|
268
164
|
|
|
269
|
-
// --- Step 2: configure-or-files prompt ----------------------------------
|
|
270
165
|
const assumeYes = hasAssumeYes(argv);
|
|
271
166
|
|
|
272
|
-
// Decide the outcome: configure (run bootstrap) vs. files-only.
|
|
273
|
-
// - `--assume-yes` → configure, prompt skipped entirely.
|
|
274
|
-
// - non-TTY without `--assume-yes` → files-only (never provision unattended).
|
|
275
|
-
// - TTY → consult the confirm seam for the yes/no answer (yes = configure).
|
|
276
167
|
let proceed;
|
|
277
168
|
if (assumeYes) {
|
|
278
169
|
proceed = true;
|
|
@@ -298,11 +189,8 @@ export async function planInit({
|
|
|
298
189
|
};
|
|
299
190
|
}
|
|
300
191
|
|
|
301
|
-
//
|
|
302
|
-
//
|
|
303
|
-
// `ok: false` (the doctor gate failed) makes the whole init exit
|
|
304
|
-
// non-zero; the tail already printed its own remediation message, and the
|
|
305
|
-
// earlier install/sync/bootstrap phases' results stand as completed.
|
|
192
|
+
// A tail reporting `ok: false` (doctor gate failed) fails init; it has
|
|
193
|
+
// already printed its own remediation.
|
|
306
194
|
if (afterBootstrap) {
|
|
307
195
|
const tail = await afterBootstrap(process.cwd());
|
|
308
196
|
if (tail && tail.ok === false) {
|
|
@@ -323,14 +211,11 @@ export async function planInit({
|
|
|
323
211
|
};
|
|
324
212
|
}
|
|
325
213
|
|
|
326
|
-
// Declined (files-only): print the re-run hint and exit cleanly.
|
|
327
214
|
stdout(FILES_ONLY_HINT);
|
|
328
215
|
return { installed, ranBootstrap: false, steps, exitCode: 0 };
|
|
329
216
|
}
|
|
330
217
|
|
|
331
218
|
/**
|
|
332
|
-
* Default `exists` seam — probe for `./.agents/` in the consumer's cwd.
|
|
333
|
-
*
|
|
334
219
|
* @param {string} relPath
|
|
335
220
|
* @returns {boolean}
|
|
336
221
|
*/
|
|
@@ -339,12 +224,6 @@ function defaultExists(relPath) {
|
|
|
339
224
|
}
|
|
340
225
|
|
|
341
226
|
/**
|
|
342
|
-
* Default step runner — spawn the tool synchronously, inheriting stdio so its
|
|
343
|
-
* output streams to the terminal. Sets `shell: true` only on win32 so the
|
|
344
|
-
* `npm.cmd` shim resolves under CVE-2024-27980 hardening. The `sync` and
|
|
345
|
-
* bootstrap steps spawn `process.execPath` (a plain `node`), which needs no
|
|
346
|
-
* shell on any platform.
|
|
347
|
-
*
|
|
348
227
|
* @param {string} cmd
|
|
349
228
|
* @param {string[]} args
|
|
350
229
|
* @returns {{ status: number | null }}
|
|
@@ -358,23 +237,10 @@ function defaultRunStep(cmd, args) {
|
|
|
358
237
|
}
|
|
359
238
|
|
|
360
239
|
/**
|
|
361
|
-
*
|
|
362
|
-
*
|
|
363
|
-
*
|
|
364
|
-
* `
|
|
365
|
-
* (`n`/`no`, case-insensitive) — including bare Enter — resolves to `true`
|
|
366
|
-
* (configure), matching the `[Y/n]` convention where yes is the default. The
|
|
367
|
-
* prompt text is written by `planInit` via `stdout`, so the question string
|
|
368
|
-
* passed here is empty.
|
|
369
|
-
*
|
|
370
|
-
* `terminal: false` is **load-bearing**, not cosmetic: with terminal mode on
|
|
371
|
-
* (the default when stdout is a TTY) readline emits cursor-control escapes
|
|
372
|
-
* (`\x1b[1G\x1b[0J` — column-1 + erase-to-end-of-screen) when it takes over the
|
|
373
|
-
* line, which **erases the `[Y/n]:` prompt already written via `stdout`** — the
|
|
374
|
-
* operator then sees only the first prompt line and a dead-looking cursor.
|
|
375
|
-
* Disabling terminal mode leaves the pre-written prompt intact and reads the
|
|
376
|
-
* line via the TTY's own cooked-mode echo. `createInterface` is injectable so a
|
|
377
|
-
* test can assert this option is set (regression guard).
|
|
240
|
+
* Anything but `n`/`no` (including bare Enter) means yes. Reads a line rather
|
|
241
|
+
* than waiting for EOF, which would hang on a TTY. `terminal: false` is
|
|
242
|
+
* load-bearing: terminal mode emits erase-line escapes that wipe the
|
|
243
|
+
* `[Y/n]:` prompt `planInit` already wrote.
|
|
378
244
|
*
|
|
379
245
|
* @param {{ createInterface?: typeof readline.createInterface }} [opts]
|
|
380
246
|
* @returns {Promise<boolean>}
|
|
@@ -391,7 +257,6 @@ export async function defaultConfirm({
|
|
|
391
257
|
const answer = (await rl.question('')).trim().toLowerCase();
|
|
392
258
|
return answer !== 'n' && answer !== 'no';
|
|
393
259
|
} catch {
|
|
394
|
-
// No readable line (e.g. stdin closed) → default to yes (configure).
|
|
395
260
|
return true;
|
|
396
261
|
} finally {
|
|
397
262
|
rl.close();
|
|
@@ -399,8 +264,6 @@ export async function defaultConfirm({
|
|
|
399
264
|
}
|
|
400
265
|
|
|
401
266
|
/**
|
|
402
|
-
* Default export consumed by `bin/mandrel.js`.
|
|
403
|
-
*
|
|
404
267
|
* @param {string[]} [argv] - Subcommand arguments (after `mandrel init`).
|
|
405
268
|
* @returns {Promise<void>}
|
|
406
269
|
*/
|
|
@@ -417,8 +280,6 @@ export default async function run(argv = []) {
|
|
|
417
280
|
return;
|
|
418
281
|
}
|
|
419
282
|
|
|
420
|
-
// Banner is the very first output — before the install + sync steps that
|
|
421
|
-
// planInit kicks off — so it greets the operator on a cold start.
|
|
422
283
|
process.stdout.write(BANNER);
|
|
423
284
|
|
|
424
285
|
const result = await planInit({
|
package/lib/cli/migrate.js
CHANGED
|
@@ -1,54 +1,8 @@
|
|
|
1
1
|
// lib/cli/migrate.js
|
|
2
2
|
/**
|
|
3
|
-
* `mandrel migrate
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Exposes the version-keyed migration runner from `lib/migrations/index.js` as
|
|
8
|
-
* a standalone command so operators can apply (or preview) on-disk migrations
|
|
9
|
-
* without going through a full `mandrel update` cycle or a package bump. This
|
|
10
|
-
* is the manual escape hatch for re-running a migration that a prior upgrade
|
|
11
|
-
* missed, or for inspecting what a version crossing would do before committing
|
|
12
|
-
* to it.
|
|
13
|
-
*
|
|
14
|
-
* ## CLI surface
|
|
15
|
-
*
|
|
16
|
-
* mandrel migrate --from <v> --to <v> [--dry-run]
|
|
17
|
-
*
|
|
18
|
-
* --from <v> Version the tree is currently on (exclusive lower bound).
|
|
19
|
-
* --to <v> Version the tree is upgrading to (inclusive upper bound).
|
|
20
|
-
* --dry-run Report the steps that WOULD run and write nothing.
|
|
21
|
-
*
|
|
22
|
-
* Both `--from` and `--to` are required for a live run; a missing bound is a
|
|
23
|
-
* usage error (non-zero exit). `--from`/`--to` accept either `--from 1.4.0` or
|
|
24
|
-
* `--from=1.4.0` spellings.
|
|
25
|
-
*
|
|
26
|
-
* ## `--dry-run`
|
|
27
|
-
*
|
|
28
|
-
* Resolves the in-range steps from the registry, consults each step's
|
|
29
|
-
* `detect(ctx)` against a throwaway context to decide whether it would apply
|
|
30
|
-
* or be skipped, prints the plan, and returns WITHOUT calling any step's
|
|
31
|
-
* `apply` — nothing on disk changes. The dry-run never mutates the shared
|
|
32
|
-
* context the caller would use for a live run; it probes a fresh `{}` so
|
|
33
|
-
* `detect` side effects (there should be none) cannot leak into a later live
|
|
34
|
-
* pass.
|
|
35
|
-
*
|
|
36
|
-
* ## Injectable seams (used by lib/cli/__tests__/migrate.test.js)
|
|
37
|
-
*
|
|
38
|
-
* - `argv` — subcommand args (after `mandrel migrate`)
|
|
39
|
-
* - `runMigrations` — version-keyed migration runner (lib/migrations)
|
|
40
|
-
* - `registry` — step registry; defaults to the module `migrations`
|
|
41
|
-
* array, injected by tests with fixture steps so the
|
|
42
|
-
* dry-run plan and the live pass are both exercisable
|
|
43
|
-
* without a real contract step existing
|
|
44
|
-
* - `ctx` — opaque context threaded to each step's detect/apply
|
|
45
|
-
* - `write`/`writeErr` — stdout / stderr sinks
|
|
46
|
-
* - `exit` — process.exit replacement
|
|
47
|
-
*
|
|
48
|
-
* Security (security-baseline § 5 — Data Leakage & Logging): logs only version
|
|
49
|
-
* strings and step descriptions. No tokens, credentials, or env values are
|
|
50
|
-
* read or logged, and no shell-string interpolation occurs (the runner is a
|
|
51
|
-
* pure in-process call; transport is owned by the steps themselves).
|
|
3
|
+
* `mandrel migrate --from <v> --to <v> [--dry-run]`: run (or preview) the
|
|
4
|
+
* version-keyed migrations outside an `update` cycle, e.g. to re-run one a
|
|
5
|
+
* prior upgrade missed. Both bounds are required.
|
|
52
6
|
*/
|
|
53
7
|
|
|
54
8
|
import {
|
|
@@ -58,8 +12,6 @@ import {
|
|
|
58
12
|
} from '../migrations/index.js';
|
|
59
13
|
|
|
60
14
|
/**
|
|
61
|
-
* Parse a single `--flag value` / `--flag=value` option out of argv.
|
|
62
|
-
*
|
|
63
15
|
* @param {string[]} argv
|
|
64
16
|
* @param {string} flag The long flag name including leading dashes (e.g. `--from`).
|
|
65
17
|
* @returns {string | undefined} The option value, or undefined when absent.
|
|
@@ -78,9 +30,6 @@ function parseOption(argv, flag) {
|
|
|
78
30
|
}
|
|
79
31
|
|
|
80
32
|
/**
|
|
81
|
-
* The envelope shape every `runMigrate` exit returns. Centralised so the four
|
|
82
|
-
* exits cannot drift in which fields they populate.
|
|
83
|
-
*
|
|
84
33
|
* @param {object} fields
|
|
85
34
|
* @returns {object}
|
|
86
35
|
*/
|
|
@@ -115,10 +64,8 @@ function reportUsageError({ writeErr, exit }) {
|
|
|
115
64
|
}
|
|
116
65
|
|
|
117
66
|
/**
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
* changes. The ordering comes from `selectStepsInRange`, the same selector the
|
|
121
|
-
* live run uses, so the preview cannot disagree with what would happen.
|
|
67
|
+
* Probes `detect` against a throwaway context and never calls `apply`. Uses
|
|
68
|
+
* the live run's selector, so the preview cannot disagree with it.
|
|
122
69
|
*
|
|
123
70
|
* @param {{
|
|
124
71
|
* registry: Array<object>,
|
|
@@ -172,8 +119,6 @@ function reportApplied({ applied, fromVersion, toVersion, write }) {
|
|
|
172
119
|
}
|
|
173
120
|
|
|
174
121
|
/**
|
|
175
|
-
* Run the standalone `mandrel migrate` command.
|
|
176
|
-
*
|
|
177
122
|
* @param {{
|
|
178
123
|
* argv?: string[],
|
|
179
124
|
* runMigrations?: typeof defaultRunMigrations,
|
|
@@ -235,8 +180,6 @@ export function runMigrate({
|
|
|
235
180
|
});
|
|
236
181
|
}
|
|
237
182
|
|
|
238
|
-
// The runner owns ordering, range filtering, idempotency, and the per-step
|
|
239
|
-
// `migrated …` log line.
|
|
240
183
|
const { applied, skipped } = runMigrations({
|
|
241
184
|
fromVersion,
|
|
242
185
|
toVersion,
|
|
@@ -256,8 +199,6 @@ export function runMigrate({
|
|
|
256
199
|
}
|
|
257
200
|
|
|
258
201
|
/**
|
|
259
|
-
* Default export consumed by `bin/mandrel.js`.
|
|
260
|
-
*
|
|
261
202
|
* @param {string[]} argv - Subcommand arguments (after `mandrel migrate`).
|
|
262
203
|
* @returns {Promise<void>}
|
|
263
204
|
*/
|