mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* framework wiring (`.agents/` tree, `.agentrc.json`, `CLAUDE.md`,
|
|
7
|
-
* `.claude/settings.json`, `.gitignore`, `package.json`, `.husky/`). Nothing
|
|
8
|
-
* told the operator to commit and push it — yet Story delivery runs in git
|
|
9
|
-
* worktrees that check out **tracked files only**, so an uncommitted
|
|
10
|
-
* `.agents/` means no scripts exist inside any worktree and every Story
|
|
11
|
-
* sub-agent breaks. This module offers that commit + push at the end of the
|
|
12
|
-
* run, and prints the exact manual commands when the offer is declined or the
|
|
13
|
-
* run is non-interactive.
|
|
14
|
-
*
|
|
15
|
-
* Security: the stage step uses an explicit **allowlist** of bootstrap-written
|
|
16
|
-
* paths (`git add -- <path>`), never `git add -A`, and explicitly refuses to
|
|
17
|
-
* stage known secret files (`.env`, `.mcp.json`, `.agentrc.local.json`). This
|
|
18
|
-
* keeps the commit safe regardless of whether the secret-safe `.gitignore`
|
|
19
|
-
* Story (#3894) has landed — secrets are never staged even when un-ignored.
|
|
20
|
-
*
|
|
21
|
-
* Every git-touching helper takes an injectable `runGit` seam so the logic is
|
|
22
|
-
* unit-testable without spawning a real `git`. The seam contract mirrors
|
|
23
|
-
* `bootstrap.js#runGit`: `({ ok, status, stdout, stderr })`.
|
|
2
|
+
* End-of-bootstrap offer to commit and push the wiring: worktrees check out
|
|
3
|
+
* tracked files only, so an uncommitted `.agents/` breaks every Story. Stages
|
|
4
|
+
* an explicit allowlist (never `git add -A`) and refuses secret files even
|
|
5
|
+
* when they are not gitignored.
|
|
24
6
|
*
|
|
25
7
|
* @module bootstrap/commit-push
|
|
26
8
|
*/
|
|
@@ -29,11 +11,8 @@ import fs from 'node:fs';
|
|
|
29
11
|
import path from 'node:path';
|
|
30
12
|
|
|
31
13
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* pipeline writes (see `manifest.js` + `project-bootstrap.js`) plus the
|
|
35
|
-
* materialized `.agents/` tree and `.husky/` quality hook. `.claude/commands/`
|
|
36
|
-
* is intentionally absent — it is generated and gitignored.
|
|
14
|
+
* Mirrors what the bootstrap writes; `.claude/commands/` is generated and
|
|
15
|
+
* gitignored, so it is absent.
|
|
37
16
|
*
|
|
38
17
|
* @type {readonly string[]}
|
|
39
18
|
*/
|
|
@@ -49,10 +28,7 @@ export const BOOTSTRAP_COMMIT_PATHS = Object.freeze([
|
|
|
49
28
|
]);
|
|
50
29
|
|
|
51
30
|
/**
|
|
52
|
-
*
|
|
53
|
-
* (yet) gitignored. These carry secrets or per-operator local overrides. This
|
|
54
|
-
* is the defense-in-depth that lets the offer run safely before the
|
|
55
|
-
* secret-safe `.gitignore` Story (#3894) lands.
|
|
31
|
+
* Secrets and per-operator overrides: never staged, even when not gitignored.
|
|
56
32
|
*
|
|
57
33
|
* @type {ReadonlySet<string>}
|
|
58
34
|
*/
|
|
@@ -67,21 +43,14 @@ export const NEVER_STAGE_PATHS = Object.freeze(
|
|
|
67
43
|
);
|
|
68
44
|
|
|
69
45
|
/**
|
|
70
|
-
* The conventional commit subject the offer uses for the wiring commit.
|
|
71
|
-
*
|
|
72
46
|
* @type {string}
|
|
73
47
|
*/
|
|
74
48
|
export const COMMIT_SUBJECT = 'chore: wire up Mandrel agent framework';
|
|
75
49
|
|
|
76
50
|
/**
|
|
77
|
-
* Resolve the subset of {@link BOOTSTRAP_COMMIT_PATHS} that actually exist on
|
|
78
|
-
* disk and are not in {@link NEVER_STAGE_PATHS}. Pure (filesystem read only):
|
|
79
|
-
* the secret-exclusion is applied here so a never-stage path is dropped before
|
|
80
|
-
* it ever reaches `git add`.
|
|
81
|
-
*
|
|
82
51
|
* @param {string} projectRoot
|
|
83
52
|
* @param {typeof fs} [fsImpl]
|
|
84
|
-
* @returns {string[]}
|
|
53
|
+
* @returns {string[]} existing, secret-free paths safe to stage
|
|
85
54
|
*/
|
|
86
55
|
export function resolveStagePaths(projectRoot, fsImpl = fs) {
|
|
87
56
|
return BOOTSTRAP_COMMIT_PATHS.filter((rel) => {
|
|
@@ -91,16 +60,13 @@ export function resolveStagePaths(projectRoot, fsImpl = fs) {
|
|
|
91
60
|
}
|
|
92
61
|
|
|
93
62
|
/**
|
|
94
|
-
*
|
|
95
|
-
* the
|
|
96
|
-
* non-interactive (`--assume-yes`). The `git add` line stages the resolved
|
|
97
|
-
* allowlist only — never `git add -A` — so copy-pasting it cannot stage a
|
|
98
|
-
* secret file.
|
|
63
|
+
* Manual commands for a declined or non-interactive offer; the `git add` line
|
|
64
|
+
* names the allowlist so copy-pasting it cannot stage a secret.
|
|
99
65
|
*
|
|
100
66
|
* @param {object} args
|
|
101
|
-
* @param {string[]} args.stagePaths
|
|
67
|
+
* @param {string[]} args.stagePaths
|
|
102
68
|
* @param {string} args.baseBranch
|
|
103
|
-
* @returns {string}
|
|
69
|
+
* @returns {string}
|
|
104
70
|
*/
|
|
105
71
|
export function buildManualInstructions({ stagePaths, baseBranch }) {
|
|
106
72
|
const addArgs = stagePaths.length > 0 ? stagePaths.join(' ') : '.';
|
|
@@ -118,10 +84,6 @@ export function buildManualInstructions({ stagePaths, baseBranch }) {
|
|
|
118
84
|
}
|
|
119
85
|
|
|
120
86
|
/**
|
|
121
|
-
* Stage the resolved allowlist via `git add -- <paths>`. No-op (returns
|
|
122
|
-
* `{ ok: true, staged: [] }`) when nothing resolves. Returns the git result on
|
|
123
|
-
* failure so the caller can surface it.
|
|
124
|
-
*
|
|
125
87
|
* @param {object} args
|
|
126
88
|
* @param {string} args.projectRoot
|
|
127
89
|
* @param {(args: string[], cwd: string) => { ok: boolean, status?: number,
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bootstrap/gh-preflight — `gh` CLI + runtime-dependency preflight
|
|
3
|
-
*
|
|
4
|
-
* Provider-agnostic preflight helpers extracted from
|
|
5
|
-
* `agents-bootstrap-github.js` (Story #3349). Holds the version-comparison
|
|
6
|
-
* arithmetic (`parseGhVersion` / `compareSemver`), the `gh` CLI probe
|
|
7
|
-
* (`preflightGh`), and the runtime-dependency probe (`preflightRuntimeDeps`).
|
|
8
|
-
* Keeping these free of any provider coupling lets the bootstrap orchestrator
|
|
9
|
-
* stay focused on sequencing.
|
|
10
|
-
*/
|
|
1
|
+
/** Provider-agnostic `gh` CLI and runtime-dependency preflight. */
|
|
11
2
|
|
|
12
3
|
import { spawnSync } from 'node:child_process';
|
|
13
4
|
import {
|
|
@@ -17,12 +8,7 @@ import {
|
|
|
17
8
|
MissingRuntimeDepsError,
|
|
18
9
|
} from '../errors/index.js';
|
|
19
10
|
|
|
20
|
-
/**
|
|
21
|
-
* Minimum `gh` version the bootstrap supports. Set conservatively per
|
|
22
|
-
* Tech Spec #1350 ("Risks & Mitigations → `gh` version skew"): older
|
|
23
|
-
* releases miss flags the eventual `gh-exec` shim relies on. Bumping this
|
|
24
|
-
* is a deliberate, operator-visible change — keep it tracked here.
|
|
25
|
-
*/
|
|
11
|
+
/** Older releases miss flags the `gh` shim relies on; bumping is operator-visible. */
|
|
26
12
|
export const MIN_GH_VERSION = '2.40.0';
|
|
27
13
|
|
|
28
14
|
const GH_INSTALL_HINT =
|
|
@@ -34,34 +20,20 @@ const GH_PROJECT_SCOPE_NOTE =
|
|
|
34
20
|
const GH_SCOPES_UNREADABLE_NOTE =
|
|
35
21
|
'token scopes not reported by `gh auth status` (fine-grained PAT?) — skipping the classic project-scope assertion. If Projects V2 provisioning later fails, grant the Projects permission (fine-grained) or run `gh auth refresh -s project` (classic).';
|
|
36
22
|
|
|
37
|
-
/**
|
|
38
|
-
* Framework runtime deps the consumer must have installed in
|
|
39
|
-
* `node_modules/` before this script reaches the dynamic
|
|
40
|
-
* `config-resolver` import. `ajv` is the sentinel — if it cannot
|
|
41
|
-
* resolve, the framework runtime dependencies are not installed.
|
|
42
|
-
*/
|
|
23
|
+
/** `ajv` is the sentinel for installed framework runtime deps. */
|
|
43
24
|
const REQUIRED_RUNTIME_DEPS = Object.freeze(['ajv']);
|
|
44
25
|
|
|
45
26
|
const RUNTIME_DEPS_HINT =
|
|
46
27
|
'Run `mandrel init` (for a fresh project) or `npm install mandrel` (for an existing one) to install the framework runtime dependencies, then re-run this command.';
|
|
47
28
|
|
|
48
29
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* can inject a stub without spawning a real child process. Forerunner of
|
|
52
|
-
* the `lib/gh-exec.js` shim described in Tech Spec #1350; once that
|
|
53
|
-
* lands, this helper deletes and the preflight calls `gh.exec(...)`.
|
|
30
|
+
* Raw `spawnSync`, not the `gh-exec` facade: these probes decide whether the
|
|
31
|
+
* facade (which assumes an authenticated `gh`) is usable at all.
|
|
54
32
|
*
|
|
55
33
|
* @param {string[]} args
|
|
56
34
|
* @returns {{ status: number|null, stdout: string, stderr: string,
|
|
57
35
|
* error?: NodeJS.ErrnoException }}
|
|
58
36
|
*/
|
|
59
|
-
// Story #2990: this preflight runner intentionally stays on raw
|
|
60
|
-
// `spawnSync('gh', …)` (not the `lib/gh-exec.js` facade) because it
|
|
61
|
-
// runs *before* auth is resolved — `gh --version` and `gh auth status`
|
|
62
|
-
// are the very probes that decide whether the facade can be used at
|
|
63
|
-
// all. Routing through the provider layer would create a circular
|
|
64
|
-
// dependency: the facade assumes a working, authenticated `gh`.
|
|
65
37
|
function defaultGhRunner(args) {
|
|
66
38
|
const result = spawnSync('gh', args, { encoding: 'utf8' });
|
|
67
39
|
return {
|
|
@@ -73,10 +45,6 @@ function defaultGhRunner(args) {
|
|
|
73
45
|
}
|
|
74
46
|
|
|
75
47
|
/**
|
|
76
|
-
* Parse the first `MAJOR.MINOR.PATCH` triple out of `gh --version` stdout.
|
|
77
|
-
* Returns `null` when the shape is unrecognized so callers can decide
|
|
78
|
-
* whether to surface an error or proceed.
|
|
79
|
-
*
|
|
80
48
|
* @param {string} stdout
|
|
81
49
|
* @returns {string|null}
|
|
82
50
|
*/
|
|
@@ -86,9 +54,7 @@ export function parseGhVersion(stdout) {
|
|
|
86
54
|
}
|
|
87
55
|
|
|
88
56
|
/**
|
|
89
|
-
*
|
|
90
|
-
* Returns negative if `a < b`, positive if `a > b`, zero if equal.
|
|
91
|
-
* Missing segments are treated as `0`. Non-numeric segments compare as 0.
|
|
57
|
+
* Missing or non-numeric segments compare as 0.
|
|
92
58
|
*
|
|
93
59
|
* @param {string} a
|
|
94
60
|
* @param {string} b
|
|
@@ -109,23 +75,7 @@ export function compareSemver(a, b) {
|
|
|
109
75
|
}
|
|
110
76
|
|
|
111
77
|
/**
|
|
112
|
-
*
|
|
113
|
-
* each surfaced as a typed error so callers (CLI `main`, future
|
|
114
|
-
* orchestrators, tests) can `instanceof`-match without parsing strings:
|
|
115
|
-
*
|
|
116
|
-
* - {@link GhNotInstalledError} — `gh` not on PATH (ENOENT) or the
|
|
117
|
-
* `--version` invocation reported a non-zero exit suggesting the
|
|
118
|
-
* binary is missing/broken.
|
|
119
|
-
* - {@link GhVersionError} — `gh` is present but older than
|
|
120
|
-
* {@link MIN_GH_VERSION}; carries `{ found, required }` for the
|
|
121
|
-
* CLI to render an upgrade hint.
|
|
122
|
-
* - {@link GhAuthError} — `gh auth status` exited non-zero, meaning
|
|
123
|
-
* no host is logged in.
|
|
124
|
-
*
|
|
125
|
-
* On success returns `{ version }` so the caller can log the resolved
|
|
126
|
-
* version. The `runner` seam defaults to a real `spawnSync('gh', …)`;
|
|
127
|
-
* tests inject a stub returning the canonical
|
|
128
|
-
* `{ status, stdout, stderr, error }` shape.
|
|
78
|
+
* Throws a typed `GhNotInstalledError`, `GhVersionError` or `GhAuthError`.
|
|
129
79
|
*
|
|
130
80
|
* @param {{ runner?: (args: string[]) => {
|
|
131
81
|
* status: number|null, stdout: string, stderr: string,
|
|
@@ -142,9 +92,7 @@ export async function preflightGh(opts = {}) {
|
|
|
142
92
|
}
|
|
143
93
|
|
|
144
94
|
/**
|
|
145
|
-
*
|
|
146
|
-
* {@link GhNotInstalledError} for every "not installed correctly" shape
|
|
147
|
-
* (ENOENT, non-zero exit, unparseable output).
|
|
95
|
+
* Every "not installed correctly" shape throws {@link GhNotInstalledError}.
|
|
148
96
|
*
|
|
149
97
|
* @param {(args: string[]) => object} runner
|
|
150
98
|
* @returns {string}
|
|
@@ -157,8 +105,6 @@ function resolveGhVersion(runner) {
|
|
|
157
105
|
);
|
|
158
106
|
}
|
|
159
107
|
if (versionResult.status !== 0) {
|
|
160
|
-
// Non-ENOENT failure of `gh --version` is treated as "not installed
|
|
161
|
-
// correctly" — same remediation, same exit semantics.
|
|
162
108
|
const stderrSnippet = (versionResult.stderr || '').trim().slice(0, 200);
|
|
163
109
|
throw new GhNotInstalledError(
|
|
164
110
|
`gh --version failed (exit ${versionResult.status}): ${stderrSnippet}. ${GH_INSTALL_HINT}`,
|
|
@@ -174,9 +120,6 @@ function resolveGhVersion(runner) {
|
|
|
174
120
|
}
|
|
175
121
|
|
|
176
122
|
/**
|
|
177
|
-
* Enforce the {@link MIN_GH_VERSION} floor, throwing {@link GhVersionError}
|
|
178
|
-
* with `{ found, required }` when the installed version is older.
|
|
179
|
-
*
|
|
180
123
|
* @param {string} version
|
|
181
124
|
*/
|
|
182
125
|
function assertGhVersionFloor(version) {
|
|
@@ -189,16 +132,12 @@ function assertGhVersionFloor(version) {
|
|
|
189
132
|
}
|
|
190
133
|
|
|
191
134
|
/**
|
|
192
|
-
* Assert `gh auth status` reports a logged-in host, throwing
|
|
193
|
-
* {@link GhAuthError} (or {@link GhNotInstalledError} on a PATH race).
|
|
194
|
-
*
|
|
195
135
|
* @param {(args: string[]) => object} runner
|
|
196
136
|
*/
|
|
197
137
|
function assertGhAuth(runner) {
|
|
198
138
|
const authResult = runner(['auth', 'status']);
|
|
199
139
|
if (authResult.error?.code === 'ENOENT') {
|
|
200
|
-
//
|
|
201
|
-
// PATH race. Treat the same as not-installed.
|
|
140
|
+
// PATH race after `--version` passed.
|
|
202
141
|
throw new GhNotInstalledError(
|
|
203
142
|
`gh CLI disappeared between version and auth check. ${GH_INSTALL_HINT}`,
|
|
204
143
|
);
|
|
@@ -211,23 +150,9 @@ function assertGhAuth(runner) {
|
|
|
211
150
|
}
|
|
212
151
|
|
|
213
152
|
/**
|
|
214
|
-
* Check
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
* stderr, others to stdout — we scan both) and looks for a `project` scope.
|
|
218
|
-
*
|
|
219
|
-
* Returns a check record `{ name, ok, remedy?, detail? }` rather than
|
|
220
|
-
* throwing, so the preflight aggregator can surface it alongside the other
|
|
221
|
-
* checks. An unreadable scopes line — the normal case for fine-grained PATs
|
|
222
|
-
* and for `gh` builds that omit it — PASSES with a warning `detail` (Story
|
|
223
|
-
* #3690). A present-but-`project`-less scopes line — the normal case for a
|
|
224
|
-
* vanilla `gh auth login` token — also PASSES with a warning `detail`
|
|
225
|
-
* (Story #3893, Finding A.5): the bootstrap's runtime `resolveProject`
|
|
226
|
-
* already degrades to warn-and-skip-board for exactly this condition, so
|
|
227
|
-
* failing the preflight closed was stricter than the code it guards and
|
|
228
|
-
* created a guaranteed first-run → browser → re-run loop. The check never
|
|
229
|
-
* fails the gate on the project scope; the warning `detail` carries the
|
|
230
|
-
* `gh auth refresh -s project` remediation for operators who want boards.
|
|
153
|
+
* Check the token's `project` scope (the `Token scopes:` line may be on
|
|
154
|
+
* stdout or stderr). Never fails: an unreadable or `project`-less line passes
|
|
155
|
+
* with a warning `detail`, matching `resolveProject`'s skip-the-board path.
|
|
231
156
|
*
|
|
232
157
|
* @param {{ runner?: (args: string[]) => {
|
|
233
158
|
* status: number|null, stdout: string, stderr: string,
|
|
@@ -244,9 +169,6 @@ export async function checkProjectScopes(opts = {}) {
|
|
|
244
169
|
}
|
|
245
170
|
|
|
246
171
|
/**
|
|
247
|
-
* Map a (possibly absent) `Token scopes:` match onto the check record.
|
|
248
|
-
* Pure — exported only through {@link checkProjectScopes}.
|
|
249
|
-
*
|
|
250
172
|
* @param {RegExpExecArray|null} scopeLine
|
|
251
173
|
* @returns {{ name: string, ok: boolean, remedy?: string, detail?: string }}
|
|
252
174
|
*/
|
|
@@ -269,17 +191,8 @@ function classifyProjectScopes(scopeLine) {
|
|
|
269
191
|
}
|
|
270
192
|
|
|
271
193
|
/**
|
|
272
|
-
*
|
|
273
|
-
*
|
|
274
|
-
* `config-settings-schema.js`). A consumer who has not installed the
|
|
275
|
-
* framework runtime deps will not have `ajv` available, and the raw
|
|
276
|
-
* `ERR_MODULE_NOT_FOUND` from the dynamic import is opaque. This
|
|
277
|
-
* preflight converts that into a {@link MissingRuntimeDepsError} that
|
|
278
|
-
* names the missing packages and points the operator at the correct
|
|
279
|
-
* remediation (`mandrel init` / `npm install mandrel`).
|
|
280
|
-
*
|
|
281
|
-
* The `resolver` seam lets tests inject a stub without touching the real
|
|
282
|
-
* module graph; production uses `import.meta.resolve(specifier)`.
|
|
194
|
+
* Turn the opaque `ERR_MODULE_NOT_FOUND` of the later `config-resolver`
|
|
195
|
+
* import into a {@link MissingRuntimeDepsError} naming the remedy.
|
|
283
196
|
*
|
|
284
197
|
* @param {{ resolver?: (specifier: string) => string | Promise<string> }} [opts]
|
|
285
198
|
* @returns {Promise<void>}
|
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* gate returns `false` and logs the canonical abort message to stderr —
|
|
7
|
-
* silent-apply is a non-feature. The `opts.assume` override lets tests
|
|
8
|
-
* and automation pin the answer deterministically:
|
|
9
|
-
*
|
|
10
|
-
* - `opts.assume === 'yes'` → returns true, skips the prompt entirely.
|
|
11
|
-
* - `opts.assume === 'no'` → returns false, skips the prompt.
|
|
12
|
-
*
|
|
13
|
-
* The default render is intentionally simple: a single-line summary
|
|
14
|
-
* followed by a JSON dump of `{ current, proposed }`. Callers that want
|
|
15
|
-
* a richer view (per-field colour, contextual unified diff) can wrap
|
|
16
|
-
* `confirm` and render their own preamble before calling.
|
|
17
|
-
*
|
|
18
|
-
* Consent-first install (Story #3526): the GitHub-admin phase group — the
|
|
19
|
-
* irreversible remote mutations (labels, Projects V2, branch protection,
|
|
20
|
-
* merge methods) — is gated by an explicit opt-in, not merely a TTY. A
|
|
21
|
-
* non-TTY run that has not opted in records every group as declined, so the
|
|
22
|
-
* abort hint names BOTH the dedicated `--approve-github-admin` flag (consent
|
|
23
|
-
* to just the remote mutations) and `--assume-yes` (accept every group).
|
|
2
|
+
* y/N confirm of a `{ current, proposed }` diff. Without a TTY it returns
|
|
3
|
+
* `false` and logs the abort hint — never a silent apply. `opts.assume` pins
|
|
4
|
+
* the answer. Irreversible GitHub-admin mutations need an explicit opt-in,
|
|
5
|
+
* so the hint names both `--approve-github-admin` and `--assume-yes`.
|
|
24
6
|
*/
|
|
25
7
|
|
|
26
8
|
import { createInterface } from 'node:readline';
|
|
@@ -39,9 +21,7 @@ const ABORT_MESSAGE =
|
|
|
39
21
|
* stdout?: NodeJS.WritableStream,
|
|
40
22
|
* stderr?: NodeJS.WritableStream,
|
|
41
23
|
* isTTY?: boolean,
|
|
42
|
-
* }} [opts]
|
|
43
|
-
* `process.stdout.isTTY`. `stdin`/`stdout`/`stderr` default to the
|
|
44
|
-
* respective `process.*` streams.
|
|
24
|
+
* }} [opts]
|
|
45
25
|
* @returns {Promise<boolean>} - true ⇒ apply, false ⇒ abort.
|
|
46
26
|
*/
|
|
47
27
|
export async function confirm({ summary, current, proposed }, opts = {}) {
|
|
@@ -58,9 +38,6 @@ export async function confirm({ summary, current, proposed }, opts = {}) {
|
|
|
58
38
|
return false;
|
|
59
39
|
}
|
|
60
40
|
|
|
61
|
-
// Render the diff. Single-line summary, then a JSON block so the
|
|
62
|
-
// operator can pipe the prompt to a logger and still recover the
|
|
63
|
-
// structured shape.
|
|
64
41
|
stdout.write(`\nHITL confirm: ${summary}\n`);
|
|
65
42
|
stdout.write(
|
|
66
43
|
` current: ${JSON.stringify(current ?? null, null, 2)
|
|
@@ -84,6 +61,4 @@ export async function confirm({ summary, current, proposed }, opts = {}) {
|
|
|
84
61
|
}
|
|
85
62
|
}
|
|
86
63
|
|
|
87
|
-
// Re-export the abort message so tests can assert against the single
|
|
88
|
-
// source of truth.
|
|
89
64
|
export { ABORT_MESSAGE };
|
|
@@ -1,21 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* A successful bootstrap run writes a ledger to
|
|
7
|
-
* `<projectRoot>/.agents/.install-manifest.json` enumerating exactly the
|
|
8
|
-
* mutation-manifest entries that were APPROVED and applied (the approved
|
|
9
|
-
* subset of `buildMutationManifest`, never the full manifest). The ledger is
|
|
10
|
-
* the single artifact `mandrel uninstall` will later read to know which
|
|
11
|
-
* reversible mutations to undo and which irreversible (GitHub-admin) ones to
|
|
12
|
-
* surface for manual rollback.
|
|
13
|
-
*
|
|
14
|
-
* The ledger is gitignored (`.agents/.install-manifest.json` is added to the
|
|
15
|
-
* consumer `.gitignore` by the bootstrap) because it is a per-clone install
|
|
16
|
-
* record, not a checked-in source artifact.
|
|
17
|
-
*
|
|
18
|
-
* This module performs filesystem writes but no network I/O.
|
|
2
|
+
* Per-clone (gitignored) record of the manifest entries an install actually
|
|
3
|
+
* applied — never the full manifest — which `mandrel uninstall` reads to undo
|
|
4
|
+
* reversible mutations and surface irreversible ones.
|
|
19
5
|
*
|
|
20
6
|
* @module bootstrap/install-ledger
|
|
21
7
|
*/
|
|
@@ -24,39 +10,24 @@ import fs from 'node:fs';
|
|
|
24
10
|
import path from 'node:path';
|
|
25
11
|
|
|
26
12
|
/**
|
|
27
|
-
*
|
|
28
|
-
* `.gitignore` step keys its ignore entry off this exact POSIX path.
|
|
13
|
+
* The `.gitignore` step keys off this exact POSIX path.
|
|
29
14
|
*
|
|
30
15
|
* @type {string}
|
|
31
16
|
*/
|
|
32
17
|
export const LEDGER_RELATIVE_PATH = '.agents/.install-manifest.json';
|
|
33
18
|
|
|
34
19
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* v2 (Story #3895): each entry now carries `executedAction` — the *live*
|
|
40
|
-
* outcome of the bootstrap phase that produced it (e.g. `seeded` vs
|
|
41
|
-
* `already-present` for `.agentrc.json`). Uninstall keys destructive reversal
|
|
42
|
-
* off this so a pre-existing, operator-authored file the install merely left
|
|
43
|
-
* in place (`already-present`) is never deleted.
|
|
20
|
+
* Uninstall refuses a version it cannot interpret. Entries carry
|
|
21
|
+
* `executedAction` so an operator-authored file the install left in place
|
|
22
|
+
* (`already-present`) is never deleted.
|
|
44
23
|
*
|
|
45
24
|
* @type {number}
|
|
46
25
|
*/
|
|
47
26
|
export const LEDGER_SCHEMA_VERSION = 2;
|
|
48
27
|
|
|
49
28
|
/**
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* whose reversal is destructive enough to need the live outcome are mapped;
|
|
53
|
-
* everything else is reversed content-aware and needs no execution hint.
|
|
54
|
-
*
|
|
55
|
-
* The `.agentrc.json` `create` entry is produced by the `agentrc` phase
|
|
56
|
-
* (`ensureAgentrc`), which returns `{ action: 'seeded' }` when it wrote the
|
|
57
|
-
* file from the starter and `{ action: 'already-present' }` when an
|
|
58
|
-
* operator-authored file was left untouched. Recording that distinction lets
|
|
59
|
-
* uninstall skip deleting a file the install did not create (Story #3895).
|
|
29
|
+
* Target → the phase whose live outcome governs its reversal; only targets
|
|
30
|
+
* whose reversal is destructive are mapped.
|
|
60
31
|
*
|
|
61
32
|
* @type {Readonly<Record<string, string>>}
|
|
62
33
|
*/
|
|
@@ -65,16 +36,8 @@ const TARGET_TO_PHASE = Object.freeze({
|
|
|
65
36
|
});
|
|
66
37
|
|
|
67
38
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* report. Returns `undefined` when the target has no mapped phase, the report
|
|
71
|
-
* is absent, or the phase produced no `action` (so older callers/tests that
|
|
72
|
-
* omit the report degrade to "no hint" rather than throwing).
|
|
73
|
-
*
|
|
74
|
-
* The `.agentrc.json` quality-gates `merge` entry shares the same target as
|
|
75
|
-
* the repo-config `create` entry but is keyed by phase, not target — both
|
|
76
|
-
* manifest entries resolve to the same `agentrc` outcome, which is correct:
|
|
77
|
-
* reversal dedupes them to a single `revertAgentrc` call anyway.
|
|
39
|
+
* `undefined` means no hint. Both `.agentrc.json` entries resolve to the same
|
|
40
|
+
* `agentrc` outcome, which is correct: reversal dedupes them.
|
|
78
41
|
*
|
|
79
42
|
* @param {{ target: string }} entry
|
|
80
43
|
* @param {Record<string, { action?: string }>} [report]
|
|
@@ -89,8 +52,6 @@ function resolveExecutedAction(entry, report) {
|
|
|
89
52
|
}
|
|
90
53
|
|
|
91
54
|
/**
|
|
92
|
-
* Resolve the absolute ledger path for a project root.
|
|
93
|
-
*
|
|
94
55
|
* @param {string} projectRoot
|
|
95
56
|
* @returns {string}
|
|
96
57
|
*/
|
|
@@ -99,24 +60,14 @@ export function ledgerPath(projectRoot) {
|
|
|
99
60
|
}
|
|
100
61
|
|
|
101
62
|
/**
|
|
102
|
-
* Build the ledger record from the approved manifest entries. Pure helper —
|
|
103
|
-
* no I/O — so the shape is unit-testable in isolation. The `appliedAt`
|
|
104
|
-
* timestamp is injectable for deterministic tests.
|
|
105
|
-
*
|
|
106
63
|
* @param {object} args
|
|
107
64
|
* @param {import('./manifest.js').MutationManifestEntry[]} args.entries
|
|
108
|
-
* — the subset
|
|
109
|
-
* @param {string[]} args.approvedGroups —
|
|
110
|
-
*
|
|
111
|
-
* removal of the phased-approval gate; the ledger record shape is a
|
|
112
|
-
* consumer contract read back by `mandrel uninstall`, so it is unchanged.
|
|
65
|
+
* — the applied subset.
|
|
66
|
+
* @param {string[]} args.approvedGroups — groups that landed. The name is a
|
|
67
|
+
* consumer contract read by `mandrel uninstall`; do not rename.
|
|
113
68
|
* @param {{ owner?: string, repo?: string }} [args.answers]
|
|
114
|
-
* @param {string} [args.appliedAt] — ISO-8601
|
|
115
|
-
* @param {Record<string, { action?: string }>} [args.report] —
|
|
116
|
-
* bootstrap execution report (phase name → outcome). When present, each
|
|
117
|
-
* entry whose target maps to a phase records that phase's `action` as
|
|
118
|
-
* `executedAction` so uninstall can distinguish `seeded` from
|
|
119
|
-
* `already-present` (Story #3895).
|
|
69
|
+
* @param {string} [args.appliedAt] — ISO-8601 (default: now).
|
|
70
|
+
* @param {Record<string, { action?: string }>} [args.report] — phase → outcome.
|
|
120
71
|
* @returns {{ schemaVersion: number, appliedAt: string,
|
|
121
72
|
* repo: string|null, approvedGroups: string[],
|
|
122
73
|
* entries: Array<import('./manifest.js').MutationManifestEntry
|
|
@@ -145,10 +96,7 @@ export function buildLedgerRecord(args) {
|
|
|
145
96
|
}
|
|
146
97
|
|
|
147
98
|
/**
|
|
148
|
-
*
|
|
149
|
-
* creating the `.agents/` directory if needed. The file is overwritten on
|
|
150
|
-
* each successful install so the ledger always reflects the most recent run
|
|
151
|
-
* (a re-install with a different approval set replaces, never appends).
|
|
99
|
+
* Overwrites: the ledger always reflects the most recent install.
|
|
152
100
|
*
|
|
153
101
|
* @param {string} projectRoot
|
|
154
102
|
* @param {ReturnType<typeof buildLedgerRecord>} record
|
|
@@ -162,10 +110,6 @@ export function writeInstallLedger(projectRoot, record) {
|
|
|
162
110
|
}
|
|
163
111
|
|
|
164
112
|
/**
|
|
165
|
-
* Read and parse the install ledger. Returns `null` when no ledger exists
|
|
166
|
-
* (never installed, or the ledger was removed). A future `mandrel uninstall`
|
|
167
|
-
* is the primary consumer.
|
|
168
|
-
*
|
|
169
113
|
* @param {string} projectRoot
|
|
170
114
|
* @returns {ReturnType<typeof buildLedgerRecord>|null}
|
|
171
115
|
*/
|