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/uninstall.js
CHANGED
|
@@ -1,53 +1,10 @@
|
|
|
1
1
|
// lib/cli/uninstall.js
|
|
2
2
|
/**
|
|
3
|
-
* `mandrel uninstall
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* (`{ phaseGroup, target, action, reversible }`); uninstall walks the
|
|
9
|
-
* reversible entries and undoes exactly the mutation the install applied,
|
|
10
|
-
* keyed off the entry's `target` path.
|
|
11
|
-
*
|
|
12
|
-
* Design goals
|
|
13
|
-
* ------------
|
|
14
|
-
* - **Preserve pre-existing user content.** Reversal is marker-based, not
|
|
15
|
-
* blunt file deletion: the CLAUDE.md import block is stripped (not the file
|
|
16
|
-
* removed) so a CLAUDE.md the operator authored before install survives;
|
|
17
|
-
* the `.claude/settings.json` sync hook is spliced out without touching
|
|
18
|
-
* other hooks; the `.gitignore` entries are removed without disturbing the
|
|
19
|
-
* operator's own ignore rules; only the framework's own npm scripts are
|
|
20
|
-
* removed from `package.json`. A file is deleted outright only when
|
|
21
|
-
* stripping the framework block leaves it empty / framework-only (the
|
|
22
|
-
* install created it from nothing).
|
|
23
|
-
* - **GitHub-side state is never touched by default.** The `github-admin`
|
|
24
|
-
* ledger entries carry `reversible: false`; they are surfaced as a manual
|
|
25
|
-
* rollback checklist and are only acted on when the operator opts in with
|
|
26
|
-
* `--include-github` (which, for now, still only enumerates them — remote
|
|
27
|
-
* admin reversal is out of scope for this Story and would require the same
|
|
28
|
-
* `gh` plumbing the bootstrap uses).
|
|
29
|
-
* - **Idempotent.** Re-running after a successful uninstall is a no-op: the
|
|
30
|
-
* ledger is removed last, and every reversal step is a no-op when the
|
|
31
|
-
* marker is already absent.
|
|
32
|
-
*
|
|
33
|
-
* Output contract
|
|
34
|
-
* ---------------
|
|
35
|
-
* reversed file → "✔ reverted <target> <detail>"
|
|
36
|
-
* skipped → "• skipped <target> <reason>"
|
|
37
|
-
* manual (gh) → "! manual <target> <detail>"
|
|
38
|
-
* final → "✅ Uninstalled (<n> reversed, <m> manual follow-ups)"
|
|
39
|
-
* | "❌ No install ledger found — nothing to uninstall."
|
|
40
|
-
*
|
|
41
|
-
* All output goes to process.stdout (never console.log — the repo enforces a
|
|
42
|
-
* no-console rule). Exit code 0 on success (including the no-ledger case,
|
|
43
|
-
* which is a benign no-op), 1 only on an unrecoverable error.
|
|
44
|
-
*
|
|
45
|
-
* Injectable seams (used by tests so no real filesystem is touched):
|
|
46
|
-
* - `projectRoot` — overrides the resolved consumer root.
|
|
47
|
-
* - `fsImpl` — replaces the `node:fs` surface.
|
|
48
|
-
* - `write` — replaces process.stdout.write.
|
|
49
|
-
* - `exit` — replaces process.exit.
|
|
50
|
-
* - `includeGithub`— forces the --include-github behaviour.
|
|
3
|
+
* `mandrel uninstall`: reverse the reversible entries of the install ledger
|
|
4
|
+
* (`.agents/.install-manifest.json`). Reversal is marker-based so
|
|
5
|
+
* operator-authored content survives; a file is deleted only when the install
|
|
6
|
+
* created it. `github-admin` entries (`reversible: false`) are only listed as
|
|
7
|
+
* manual follow-ups. Idempotent: the ledger is removed last.
|
|
51
8
|
*
|
|
52
9
|
* @module cli/uninstall
|
|
53
10
|
*/
|
|
@@ -74,16 +31,7 @@ import {
|
|
|
74
31
|
QUALITY_NPM_SCRIPTS,
|
|
75
32
|
} from '../../.agents/scripts/lib/bootstrap/quality-bootstrap.js';
|
|
76
33
|
|
|
77
|
-
// ---------------------------------------------------------------------------
|
|
78
|
-
// Project-root resolution
|
|
79
|
-
// ---------------------------------------------------------------------------
|
|
80
|
-
|
|
81
34
|
/**
|
|
82
|
-
* Resolve the consumer project root — the directory that holds `.agents/`.
|
|
83
|
-
* `mandrel uninstall` runs from the consumer's checkout, so the install
|
|
84
|
-
* ledger and every target path are anchored at `process.cwd()`. This mirrors
|
|
85
|
-
* how `lib/cli/sync.js` and the doctor checks anchor consumer-facing paths.
|
|
86
|
-
*
|
|
87
35
|
* @param {() => string} [cwd=process.cwd]
|
|
88
36
|
* @returns {string}
|
|
89
37
|
*/
|
|
@@ -91,17 +39,10 @@ function resolveProjectRoot(cwd = () => process.cwd()) {
|
|
|
91
39
|
return cwd();
|
|
92
40
|
}
|
|
93
41
|
|
|
94
|
-
// ---------------------------------------------------------------------------
|
|
95
|
-
// npm-script removal set
|
|
96
|
-
// ---------------------------------------------------------------------------
|
|
97
|
-
|
|
98
42
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* special: the bootstrap may *append* the sync command to an existing
|
|
103
|
-
* `prepare`, so reversal strips the framework fragment rather than deleting
|
|
104
|
-
* the whole key. Mirrors `ensurePackageJson` / `ensureQualityNpmScripts`.
|
|
43
|
+
* Scripts the bootstrap seeds; one is removed only while its value still
|
|
44
|
+
* equals the seeded command. `prepare` is handled separately because the
|
|
45
|
+
* sync command may have been appended to an existing value.
|
|
105
46
|
*
|
|
106
47
|
* @type {Readonly<Record<string, string>>}
|
|
107
48
|
*/
|
|
@@ -111,10 +52,6 @@ const FRAMEWORK_NPM_SCRIPTS = Object.freeze({
|
|
|
111
52
|
...QUALITY_NPM_SCRIPTS,
|
|
112
53
|
});
|
|
113
54
|
|
|
114
|
-
// ---------------------------------------------------------------------------
|
|
115
|
-
// Pure reversal helpers (filesystem effects via the injected fsImpl)
|
|
116
|
-
// ---------------------------------------------------------------------------
|
|
117
|
-
|
|
118
55
|
/**
|
|
119
56
|
* @typedef {object} ReversalOutcome
|
|
120
57
|
* @property {'reverted'|'skipped'|'manual'} kind
|
|
@@ -123,15 +60,9 @@ const FRAMEWORK_NPM_SCRIPTS = Object.freeze({
|
|
|
123
60
|
*/
|
|
124
61
|
|
|
125
62
|
/**
|
|
126
|
-
* Strip the
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* operator content is markdown headings — is preserved with just the framework
|
|
130
|
-
* block excised.
|
|
131
|
-
*
|
|
132
|
-
* Using a byte-equality check rather than a "non-`#` meaningful lines"
|
|
133
|
-
* heuristic prevents data loss when an operator's pre-install `CLAUDE.md`
|
|
134
|
-
* consists entirely of markdown headings (all lines start with `#`).
|
|
63
|
+
* Strip the system-prompt import block from `CLAUDE.md`. The file is deleted
|
|
64
|
+
* only when byte-identical to the install template — a heading-only heuristic
|
|
65
|
+
* would delete an operator's all-headings file.
|
|
135
66
|
*
|
|
136
67
|
* @param {string} projectRoot
|
|
137
68
|
* @param {typeof fs} fsImpl
|
|
@@ -147,9 +78,6 @@ function revertClaudeMd(projectRoot, fsImpl) {
|
|
|
147
78
|
if (!original.includes(SYSTEM_PROMPT_IMPORT)) {
|
|
148
79
|
return { kind: 'skipped', target: rel, detail: 'import already absent' };
|
|
149
80
|
}
|
|
150
|
-
// Delete only when the file is exactly the install-authored template — i.e.
|
|
151
|
-
// the install created it from nothing. Operator-authored content (even an
|
|
152
|
-
// all-headings file) must survive.
|
|
153
81
|
if (original.trim() === SYSTEM_PROMPT_CLAUDE_MD.trim()) {
|
|
154
82
|
fsImpl.rmSync(target, { force: true });
|
|
155
83
|
return {
|
|
@@ -158,8 +86,7 @@ function revertClaudeMd(projectRoot, fsImpl) {
|
|
|
158
86
|
detail: 'removed install-created CLAUDE.md',
|
|
159
87
|
};
|
|
160
88
|
}
|
|
161
|
-
//
|
|
162
|
-
// bare import line so a hand-edited block without the heading still clears.
|
|
89
|
+
// Full block first, then the bare import line for a hand-edited block.
|
|
163
90
|
let next = original.includes(SYSTEM_PROMPT_BLOCK)
|
|
164
91
|
? original.replace(SYSTEM_PROMPT_BLOCK, '')
|
|
165
92
|
: original;
|
|
@@ -169,7 +96,6 @@ function revertClaudeMd(projectRoot, fsImpl) {
|
|
|
169
96
|
.filter((line) => line.trim() !== SYSTEM_PROMPT_IMPORT)
|
|
170
97
|
.join('\n');
|
|
171
98
|
}
|
|
172
|
-
// Collapse any run of 3+ blank lines the splice may have produced.
|
|
173
99
|
next = next.replace(/\n{3,}/g, '\n\n').replace(/^\n+/, '');
|
|
174
100
|
fsImpl.writeFileSync(
|
|
175
101
|
target,
|
|
@@ -184,10 +110,8 @@ function revertClaudeMd(projectRoot, fsImpl) {
|
|
|
184
110
|
}
|
|
185
111
|
|
|
186
112
|
/**
|
|
187
|
-
* Splice the
|
|
188
|
-
*
|
|
189
|
-
* other hook and setting intact. When the settings file is left with no hooks
|
|
190
|
-
* and no other keys, it is removed.
|
|
113
|
+
* Splice the sync hook and any legacy plugin-enablement keys out of
|
|
114
|
+
* `.claude/settings.json`, keeping everything else; delete the file if empty.
|
|
191
115
|
*
|
|
192
116
|
* @param {string} projectRoot
|
|
193
117
|
* @param {typeof fs} fsImpl
|
|
@@ -207,9 +131,6 @@ function revertClaudeSettings(projectRoot, fsImpl) {
|
|
|
207
131
|
|
|
208
132
|
let mutated = false;
|
|
209
133
|
|
|
210
|
-
// 1. Strip any legacy plugin-enablement keys (#3576). The flat-command
|
|
211
|
-
// projection no longer writes these, but a consumer upgraded from a
|
|
212
|
-
// #3576 install may still carry them — clean them up on uninstall.
|
|
213
134
|
if (
|
|
214
135
|
settings.enabledPlugins &&
|
|
215
136
|
settings.enabledPlugins['mandrel@mandrel'] !== undefined
|
|
@@ -228,7 +149,6 @@ function revertClaudeSettings(projectRoot, fsImpl) {
|
|
|
228
149
|
mutated = true;
|
|
229
150
|
}
|
|
230
151
|
|
|
231
|
-
// 2. Splice out the UserPromptSubmit sync hook.
|
|
232
152
|
if (Array.isArray(groups)) {
|
|
233
153
|
const kept = groups
|
|
234
154
|
.map((group) => ({
|
|
@@ -273,11 +193,8 @@ function revertClaudeSettings(projectRoot, fsImpl) {
|
|
|
273
193
|
}
|
|
274
194
|
|
|
275
195
|
/**
|
|
276
|
-
* Remove the generated
|
|
277
|
-
*
|
|
278
|
-
* it is safe to remove wholesale (it is gitignored and never hand-edited). Any
|
|
279
|
-
* legacy #3576 plugin projection (`.claude/plugins/mandrel/` +
|
|
280
|
-
* `.claude/.claude-plugin/`) left by an older install is also removed.
|
|
196
|
+
* Remove the generated (gitignored, never hand-edited) `.claude/commands/`
|
|
197
|
+
* tree plus any legacy plugin projection.
|
|
281
198
|
*
|
|
282
199
|
* @param {string} projectRoot
|
|
283
200
|
* @param {typeof fs} fsImpl
|
|
@@ -287,7 +204,6 @@ function revertClaudeCommands(projectRoot, fsImpl) {
|
|
|
287
204
|
const rel = '.claude/commands';
|
|
288
205
|
const targets = [
|
|
289
206
|
path.join(projectRoot, '.claude', 'commands'),
|
|
290
|
-
// Legacy #3576 plugin projection — clean it up too if present.
|
|
291
207
|
path.join(projectRoot, '.claude', 'plugins', 'mandrel'),
|
|
292
208
|
path.join(projectRoot, '.claude', '.claude-plugin'),
|
|
293
209
|
];
|
|
@@ -310,13 +226,9 @@ function revertClaudeCommands(projectRoot, fsImpl) {
|
|
|
310
226
|
}
|
|
311
227
|
|
|
312
228
|
/**
|
|
313
|
-
* Remove the
|
|
314
|
-
* `.
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
* The `.mcp.json` ignore block is intentionally retained when a real
|
|
318
|
-
* `.mcp.json` exists at the project root: that file may carry secrets and
|
|
319
|
-
* removing the ignore entry would expose it on the next `git add .`.
|
|
229
|
+
* Remove the install's `.gitignore` blocks, keeping operator lines. The
|
|
230
|
+
* `.mcp.json` block is kept while a real `.mcp.json` exists — it may carry
|
|
231
|
+
* secrets and would otherwise be exposed to `git add .`.
|
|
320
232
|
*
|
|
321
233
|
* @param {string} projectRoot
|
|
322
234
|
* @param {typeof fs} fsImpl
|
|
@@ -333,8 +245,6 @@ function revertGitignore(projectRoot, fsImpl) {
|
|
|
333
245
|
let next = original;
|
|
334
246
|
for (const [key, def] of Object.entries(GITIGNORE_BLOCKS)) {
|
|
335
247
|
if (next.includes(def.block)) {
|
|
336
|
-
// Retain the .mcp.json ignore entry when a real .mcp.json is present —
|
|
337
|
-
// removing it would expose a potentially secret-bearing file to git.
|
|
338
248
|
if (key === 'mcp' && mcpJsonExists) {
|
|
339
249
|
continue;
|
|
340
250
|
}
|
|
@@ -361,10 +271,6 @@ function revertGitignore(projectRoot, fsImpl) {
|
|
|
361
271
|
}
|
|
362
272
|
|
|
363
273
|
/**
|
|
364
|
-
* Remove the framework-seeded npm scripts (and the appended `prepare`
|
|
365
|
-
* fragment) from `package.json`, leaving every operator-authored script and
|
|
366
|
-
* field intact. A script whose value the operator overwrote is preserved.
|
|
367
|
-
*
|
|
368
274
|
* @param {string} projectRoot
|
|
369
275
|
* @param {typeof fs} fsImpl
|
|
370
276
|
* @returns {ReversalOutcome}
|
|
@@ -386,11 +292,8 @@ function revertPackageJson(projectRoot, fsImpl) {
|
|
|
386
292
|
removed.push(name);
|
|
387
293
|
}
|
|
388
294
|
}
|
|
389
|
-
// `prepare`
|
|
390
|
-
//
|
|
391
|
-
// When stripping leaves an empty string, delete the key rather than writing
|
|
392
|
-
// `"prepare": ""`. Only push 'prepare' onto `removed` when the value
|
|
393
|
-
// actually changed (i.e. the fragment was present and was stripped).
|
|
295
|
+
// `prepare` is either the bare sync command or an operator command with it
|
|
296
|
+
// appended via ` && `; strip just the fragment, never write `""`.
|
|
394
297
|
const prepare = pkg.scripts.prepare;
|
|
395
298
|
if (typeof prepare === 'string' && prepare.includes(SYNC_COMMAND)) {
|
|
396
299
|
if (prepare === SYNC_COMMAND) {
|
|
@@ -426,24 +329,9 @@ function revertPackageJson(projectRoot, fsImpl) {
|
|
|
426
329
|
}
|
|
427
330
|
|
|
428
331
|
/**
|
|
429
|
-
*
|
|
430
|
-
*
|
|
431
|
-
*
|
|
432
|
-
*
|
|
433
|
-
* The ledger now records the **live** outcome of the `agentrc` bootstrap phase
|
|
434
|
-
* as `executedAction` (schema v2). `ensureAgentrc` returns `seeded` when it
|
|
435
|
-
* wrote the file from the starter and `already-present` when it left a
|
|
436
|
-
* pre-existing, operator-authored file untouched. Reversal is gated on that:
|
|
437
|
-
*
|
|
438
|
-
* - `executedAction === 'already-present'` → the operator owned this file
|
|
439
|
-
* before the install ran; the install created nothing, so deleting it would
|
|
440
|
-
* be data loss. Skip.
|
|
441
|
-
* - `executedAction === 'seeded'` (or any other create-class outcome) → the
|
|
442
|
-
* install authored the file from nothing; deleting it returns the project to
|
|
443
|
-
* the pre-install state.
|
|
444
|
-
* - `executedAction` absent (legacy v1 ledger / no hint) → cannot happen for a
|
|
445
|
-
* v2 ledger written by this framework, but if encountered we fail **safe**
|
|
446
|
-
* and skip rather than risk deleting operator content.
|
|
332
|
+
* Delete `.agentrc.json` only when the ledger's `executedAction` is `seeded`
|
|
333
|
+
* (the install wrote it). `already-present`, a missing hint, or anything else
|
|
334
|
+
* fails safe and preserves the operator's file.
|
|
447
335
|
*
|
|
448
336
|
* @param {string} projectRoot
|
|
449
337
|
* @param {typeof fs} fsImpl
|
|
@@ -456,9 +344,6 @@ function revertAgentrc(projectRoot, fsImpl, executedAction) {
|
|
|
456
344
|
if (!fsImpl.existsSync(target)) {
|
|
457
345
|
return { kind: 'skipped', target: rel, detail: 'file absent' };
|
|
458
346
|
}
|
|
459
|
-
// Only delete a file the install actually created. Any non-`seeded` outcome
|
|
460
|
-
// (pre-existing `already-present`, a missing hint, or an unexpected value)
|
|
461
|
-
// is treated as "not install-created" → preserve the operator's file.
|
|
462
347
|
if (executedAction !== 'seeded') {
|
|
463
348
|
return {
|
|
464
349
|
kind: 'skipped',
|
|
@@ -475,14 +360,9 @@ function revertAgentrc(projectRoot, fsImpl, executedAction) {
|
|
|
475
360
|
}
|
|
476
361
|
|
|
477
362
|
/**
|
|
478
|
-
*
|
|
479
|
-
*
|
|
480
|
-
*
|
|
481
|
-
* or comments — is preserved with just the quality-preview line stripped.
|
|
482
|
-
*
|
|
483
|
-
* Using a byte-equality check rather than a "non-`#` meaningful lines"
|
|
484
|
-
* heuristic prevents data loss when an operator's pre-install hook consists
|
|
485
|
-
* entirely of a shebang line and/or comments (all lines start with `#`).
|
|
363
|
+
* Strip the quality-preview line from `.husky/pre-commit`; delete the file
|
|
364
|
+
* only when byte-identical to the install template (an operator hook of only
|
|
365
|
+
* a shebang and comments must survive).
|
|
486
366
|
*
|
|
487
367
|
* @param {string} projectRoot
|
|
488
368
|
* @param {typeof fs} fsImpl
|
|
@@ -498,9 +378,6 @@ function revertPreCommitHook(projectRoot, fsImpl) {
|
|
|
498
378
|
if (!original.includes(PRE_COMMIT_MARKER)) {
|
|
499
379
|
return { kind: 'skipped', target: rel, detail: 'quality line absent' };
|
|
500
380
|
}
|
|
501
|
-
// Delete only when the file is exactly the install-authored template — i.e.
|
|
502
|
-
// the install created it from nothing. Operator-authored content (even an
|
|
503
|
-
// all-comments hook) must survive.
|
|
504
381
|
if (original.trim() === DOWNSTREAM_PRE_COMMIT.trim()) {
|
|
505
382
|
fsImpl.rmSync(target, { force: true });
|
|
506
383
|
return {
|
|
@@ -521,19 +398,9 @@ function revertPreCommitHook(projectRoot, fsImpl) {
|
|
|
521
398
|
};
|
|
522
399
|
}
|
|
523
400
|
|
|
524
|
-
// ---------------------------------------------------------------------------
|
|
525
|
-
// Dispatch table — ledger target → reversal helper
|
|
526
|
-
// ---------------------------------------------------------------------------
|
|
527
|
-
|
|
528
401
|
/**
|
|
529
|
-
*
|
|
530
|
-
*
|
|
531
|
-
* `quality-gates` touch `package.json`) are deduped by the caller so each
|
|
532
|
-
* file is reverted once.
|
|
533
|
-
*
|
|
534
|
-
* Handlers take `(root, fsImpl)`; `.agentrc.json` additionally takes the
|
|
535
|
-
* recorded `executedAction` (the third arg, ignored by the others) so it can
|
|
536
|
-
* preserve a pre-existing file the install did not create (Story #3895).
|
|
402
|
+
* Ledger target → reversal helper. Only `revertAgentrc` reads the third
|
|
403
|
+
* `executedAction` argument.
|
|
537
404
|
*
|
|
538
405
|
* @type {Readonly<Record<string, (root: string, fsImpl: typeof fs, executedAction?: string) => ReversalOutcome>>}
|
|
539
406
|
*/
|
|
@@ -547,23 +414,10 @@ const REVERSAL_BY_TARGET = Object.freeze({
|
|
|
547
414
|
'.husky/pre-commit': revertPreCommitHook,
|
|
548
415
|
});
|
|
549
416
|
|
|
550
|
-
// ---------------------------------------------------------------------------
|
|
551
|
-
// Planner (pure over the ledger; effects deferred to the helpers)
|
|
552
|
-
// ---------------------------------------------------------------------------
|
|
553
|
-
|
|
554
417
|
/**
|
|
555
|
-
* Partition
|
|
556
|
-
*
|
|
557
|
-
*
|
|
558
|
-
*
|
|
559
|
-
* Pure — derives entirely from the ledger record, with no filesystem access.
|
|
560
|
-
*
|
|
561
|
-
* The returned `executedActionByTarget` map carries the per-target
|
|
562
|
-
* `executedAction` recorded in the ledger (schema v2, Story #3895). When more
|
|
563
|
-
* than one entry shares a target (e.g. the repo-config `create` and
|
|
564
|
-
* quality-gates `merge` entries for `.agentrc.json`), the first defined
|
|
565
|
-
* `executedAction` wins — they resolve to the same bootstrap phase outcome, so
|
|
566
|
-
* the choice is unambiguous.
|
|
418
|
+
* Partition ledger entries into deduped file targets and manual follow-ups.
|
|
419
|
+
* Pure. For a target shared by several entries, the first defined
|
|
420
|
+
* `executedAction` wins (they record the same phase outcome).
|
|
567
421
|
*
|
|
568
422
|
* @param {{ entries: Array<import('../../.agents/scripts/lib/bootstrap/manifest.js').MutationManifestEntry & { executedAction?: string }> }} ledger
|
|
569
423
|
* @returns {{ fileTargets: string[], manual: import('../../.agents/scripts/lib/bootstrap/manifest.js').MutationManifestEntry[], executedActionByTarget: Record<string, string> }}
|
|
@@ -579,8 +433,7 @@ export function planUninstall(ledger) {
|
|
|
579
433
|
continue;
|
|
580
434
|
}
|
|
581
435
|
if (!REVERSAL_BY_TARGET[entry.target]) {
|
|
582
|
-
//
|
|
583
|
-
// operator is never silently left with an un-reverted mutation.
|
|
436
|
+
// Never silently leave a mutation un-reverted.
|
|
584
437
|
manual.push(entry);
|
|
585
438
|
continue;
|
|
586
439
|
}
|
|
@@ -598,10 +451,6 @@ export function planUninstall(ledger) {
|
|
|
598
451
|
return { fileTargets, manual, executedActionByTarget };
|
|
599
452
|
}
|
|
600
453
|
|
|
601
|
-
// ---------------------------------------------------------------------------
|
|
602
|
-
// Formatting
|
|
603
|
-
// ---------------------------------------------------------------------------
|
|
604
|
-
|
|
605
454
|
const TARGET_COL = 22;
|
|
606
455
|
|
|
607
456
|
function pad(value, width) {
|
|
@@ -625,13 +474,7 @@ function formatOutcome(outcome) {
|
|
|
625
474
|
return `${icon} ${label} ${pad(outcome.target, TARGET_COL)} ${outcome.detail}\n`;
|
|
626
475
|
}
|
|
627
476
|
|
|
628
|
-
// ---------------------------------------------------------------------------
|
|
629
|
-
// Runner (exported for testing)
|
|
630
|
-
// ---------------------------------------------------------------------------
|
|
631
|
-
|
|
632
477
|
/**
|
|
633
|
-
* Execute the uninstall against a project root.
|
|
634
|
-
*
|
|
635
478
|
* @param {{
|
|
636
479
|
* projectRoot?: string,
|
|
637
480
|
* cwd?: () => string,
|
|
@@ -670,8 +513,7 @@ export function runUninstall({
|
|
|
670
513
|
|
|
671
514
|
if (!ledger) {
|
|
672
515
|
write('❌ No install ledger found — nothing to uninstall.\n');
|
|
673
|
-
//
|
|
674
|
-
// uninstalled), so this is success, not an error.
|
|
516
|
+
// Never installed or already uninstalled: a benign no-op.
|
|
675
517
|
exit(0);
|
|
676
518
|
return {
|
|
677
519
|
revertedCount: 0,
|
|
@@ -696,7 +538,6 @@ export function runUninstall({
|
|
|
696
538
|
|
|
697
539
|
const { fileTargets, manual, executedActionByTarget } = planUninstall(ledger);
|
|
698
540
|
|
|
699
|
-
// --- Dry run — show what would be reversed without touching anything. ---
|
|
700
541
|
if (dryRun) {
|
|
701
542
|
write('mandrel uninstall — planned reversal (dry run)\n');
|
|
702
543
|
for (const target of fileTargets) {
|
|
@@ -734,22 +575,14 @@ export function runUninstall({
|
|
|
734
575
|
for (const target of fileTargets) {
|
|
735
576
|
let outcome;
|
|
736
577
|
try {
|
|
737
|
-
// The third arg carries the recorded `executedAction` for the target
|
|
738
|
-
// (schema v2). Only `revertAgentrc` consults it; the other handlers
|
|
739
|
-
// ignore extra arguments. This is how uninstall avoids deleting a
|
|
740
|
-
// pre-existing `.agentrc.json` the install did not create (Story #3895).
|
|
741
578
|
outcome = REVERSAL_BY_TARGET[target](
|
|
742
579
|
root,
|
|
743
580
|
fsImpl,
|
|
744
581
|
executedActionByTarget[target],
|
|
745
582
|
);
|
|
746
583
|
} catch (err) {
|
|
747
|
-
//
|
|
748
|
-
//
|
|
749
|
-
// uninstall and leave earlier targets reverted while later ones are not.
|
|
750
|
-
// Emit a `skipped` outcome so the operator knows they must revert this
|
|
751
|
-
// target by hand, and leave the install ledger intact so a re-run after
|
|
752
|
-
// the file is fixed can resume cleanly.
|
|
584
|
+
// One corrupt operator file must not abort a half-done uninstall;
|
|
585
|
+
// report it and keep the ledger so a re-run can resume.
|
|
753
586
|
outcome = {
|
|
754
587
|
kind: 'skipped',
|
|
755
588
|
target,
|
|
@@ -761,9 +594,7 @@ export function runUninstall({
|
|
|
761
594
|
write(formatOutcome(outcome));
|
|
762
595
|
}
|
|
763
596
|
|
|
764
|
-
//
|
|
765
|
-
// They are NEVER acted on automatically; --include-github only annotates
|
|
766
|
-
// that the operator acknowledged them (remote reversal stays out of scope).
|
|
597
|
+
// Never acted on automatically; --include-github only acknowledges them.
|
|
767
598
|
let manualCount = 0;
|
|
768
599
|
for (const entry of manual) {
|
|
769
600
|
manualCount += 1;
|
|
@@ -775,10 +606,7 @@ export function runUninstall({
|
|
|
775
606
|
);
|
|
776
607
|
}
|
|
777
608
|
|
|
778
|
-
//
|
|
779
|
-
// mid-reversal still leaves the ledger for a resume. When any target was
|
|
780
|
-
// skipped due to a parse error, leave the ledger in place so the operator
|
|
781
|
-
// can fix the corrupt file and re-run to complete the uninstall.
|
|
609
|
+
// Ledger goes last, and stays when any target failed, so a re-run resumes.
|
|
782
610
|
const lp = ledgerPath(root);
|
|
783
611
|
if (fsImpl.existsSync(lp) && parseErrorCount === 0) {
|
|
784
612
|
fsImpl.rmSync(lp, { force: true });
|
|
@@ -809,16 +637,9 @@ export function runUninstall({
|
|
|
809
637
|
return { revertedCount, manualCount, ledgerFound: true, parseErrorCount };
|
|
810
638
|
}
|
|
811
639
|
|
|
812
|
-
// ---------------------------------------------------------------------------
|
|
813
|
-
// Subcommand entry point (called by bin/mandrel.js)
|
|
814
|
-
// ---------------------------------------------------------------------------
|
|
815
|
-
|
|
816
640
|
/**
|
|
817
|
-
*
|
|
818
|
-
*
|
|
819
|
-
* Supported flags:
|
|
820
|
-
* --include-github Acknowledge GitHub-side manual follow-ups.
|
|
821
|
-
* --dry-run Show what would be reversed without touching anything.
|
|
641
|
+
* Flags: `--include-github` (acknowledge GitHub-side follow-ups),
|
|
642
|
+
* `--dry-run`.
|
|
822
643
|
*
|
|
823
644
|
* @param {string[]} argv
|
|
824
645
|
* @returns {Promise<void>}
|