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
package/lib/cli/sync-agents.js
CHANGED
|
@@ -1,47 +1,9 @@
|
|
|
1
1
|
// lib/cli/sync-agents.js
|
|
2
2
|
/**
|
|
3
|
-
* `mandrel sync-agents
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* (
|
|
7
|
-
* a flat `.claude/agents/` tree. Exact sibling of `sync-commands.js` —
|
|
8
|
-
* same delegation shape, same marker-gated refusal check, same seams —
|
|
9
|
-
* targeting the role-agent tree instead of the command tree. The sync
|
|
10
|
-
* script owns all sync logic; this module exists only to expose it through
|
|
11
|
-
* the mandrel CLI surface without reimplementing it.
|
|
12
|
-
*
|
|
13
|
-
* `sync-claude-agents.js` uses top-level await and has no exported `main()`
|
|
14
|
-
* function (marked `cli-opt-out`), so delegation runs via a child process
|
|
15
|
-
* rather than a direct import. Exit code and all output are forwarded
|
|
16
|
-
* verbatim to the caller so `mandrel sync-agents` is transparent to scripts
|
|
17
|
-
* that check $?.
|
|
18
|
-
*
|
|
19
|
-
* ## Prior to this Story
|
|
20
|
-
*
|
|
21
|
-
* `sync-claude-agents.js` was invoked on the **bootstrap** path
|
|
22
|
-
* (`project-bootstrap.js`'s `sync:agents` script, `prepare`, and
|
|
23
|
-
* `runSyncCommands`) but had no `lib/cli/` subcommand counterpart and was
|
|
24
|
-
* never run by `mandrel sync` / `mandrel update` on the CLI path — the gap
|
|
25
|
-
* #4528 reported. See `update.js`'s `driftHealSteps()` /
|
|
26
|
-
* `fullUpgradeSteps()`, which now spawn a `sync-agents` phase alongside
|
|
27
|
-
* `sync-commands` so `.claude/agents/` materializes on that path too.
|
|
28
|
-
*
|
|
29
|
-
* ## Marker-gated refusal (Story #4526 / #4530) — same shape as sync-commands
|
|
30
|
-
*
|
|
31
|
-
* Before delegating, this wrapper checks whether the `.agents/` tree it is
|
|
32
|
-
* about to project agents FROM actually matches the running CLI's own
|
|
33
|
-
* payload version, exactly as `sync-commands.js` does for the command tree.
|
|
34
|
-
* See that module's doc comment for the full rationale and the anchor-trap
|
|
35
|
-
* warning — it applies identically here (`PROJECT_ROOT` is deliberately the
|
|
36
|
-
* package root, used only to read the running CLI's OWN version; the marker
|
|
37
|
-
* read is anchored at `cwd()`, never at `PROJECT_ROOT`).
|
|
38
|
-
*
|
|
39
|
-
* Gate order:
|
|
40
|
-
* 1. Marker present (`.agents/.mandrel-version`) → compare it to the
|
|
41
|
-
* running CLI's own package version. Mismatch → refuse.
|
|
42
|
-
* 2. Marker absent (a pre-marker install) → fall back to the existing
|
|
43
|
-
* `agents-drift` content-hash check. Drift detected → refuse.
|
|
44
|
-
* 3. Clean either way → project as before.
|
|
3
|
+
* `mandrel sync-agents`: project `.agents/agents/` into `.claude/agents/` via
|
|
4
|
+
* `.agents/scripts/sync-claude-agents.js`. Exact sibling of
|
|
5
|
+
* `sync-commands.js` — same child-process delegation, same marker-gated
|
|
6
|
+
* refusal and anchor rule (see that module's doc).
|
|
45
7
|
*/
|
|
46
8
|
|
|
47
9
|
import { spawnSync } from 'node:child_process';
|
|
@@ -63,11 +25,6 @@ const SYNC_SCRIPT = path.join(
|
|
|
63
25
|
);
|
|
64
26
|
|
|
65
27
|
/**
|
|
66
|
-
* Resolve the running CLI's own package version from `PROJECT_ROOT`'s
|
|
67
|
-
* `package.json`. See `sync-commands.js`'s "anchor trap" module doc: this is
|
|
68
|
-
* the ONE place `PROJECT_ROOT` (the package's own two-dirs-up root) is the
|
|
69
|
-
* correct anchor.
|
|
70
|
-
*
|
|
71
28
|
* @param {typeof nodeFs} fsImpl
|
|
72
29
|
* @returns {string}
|
|
73
30
|
*/
|
|
@@ -79,23 +36,6 @@ function resolveOwnPackageVersion(fsImpl) {
|
|
|
79
36
|
}
|
|
80
37
|
|
|
81
38
|
/**
|
|
82
|
-
* Run the sync-claude-agents script and forward its output + exit code —
|
|
83
|
-
* unless the marker-gated refusal check (see module doc) finds the
|
|
84
|
-
* `.agents/` tree mismatched against the running CLI, in which case it
|
|
85
|
-
* refuses and exits non-zero before spawning anything.
|
|
86
|
-
*
|
|
87
|
-
* Injectable seams — identical shape to `sync-commands.js`:
|
|
88
|
-
* - `runner` — replaces `spawnSync` for the real delegation.
|
|
89
|
-
* - `cwd()` — replaces `process.cwd`; anchors the marker read at the
|
|
90
|
-
* consumer project root.
|
|
91
|
-
* - `fs` — replaces the `node:fs` surface for both the marker read and the
|
|
92
|
-
* own-version read.
|
|
93
|
-
* - `ownVersion` — overrides the running CLI's own resolved version
|
|
94
|
-
* directly, bypassing `resolveOwnPackageVersion`.
|
|
95
|
-
* - `checkAgentsDrift` — overrides the fallback drift probe used when the
|
|
96
|
-
* marker is absent; defaults to `runAgentsDrift({ cwd })`.
|
|
97
|
-
* - `writeErr` / `exit` — replace the corresponding process surfaces.
|
|
98
|
-
*
|
|
99
39
|
* @param {string[]} _argv - Unused; reserved for future flags.
|
|
100
40
|
* @param {{
|
|
101
41
|
* runner?: typeof spawnSync,
|
package/lib/cli/sync-commands.js
CHANGED
|
@@ -1,49 +1,18 @@
|
|
|
1
1
|
// lib/cli/sync-commands.js
|
|
2
2
|
/**
|
|
3
|
-
* `mandrel sync-commands
|
|
3
|
+
* `mandrel sync-commands`: delegate to `.agents/scripts/sync-claude-commands.js`
|
|
4
|
+
* in a child process (it has top-level await and no exported main), forwarding
|
|
5
|
+
* output and exit code.
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Refuses first when `.agents/` does not match the running CLI — otherwise
|
|
8
|
+
* commands are projected from a stale tree, and since `.claude/*` is
|
|
9
|
+
* gitignored nothing surfaces until an agent hits a missing module. With the
|
|
10
|
+
* `.agents/.mandrel-version` marker, compare it to the CLI's own version;
|
|
11
|
+
* without it, fall back to the `agents-drift` content check.
|
|
9
12
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* caller so `mandrel sync-commands` is transparent to scripts that check $?.
|
|
14
|
-
*
|
|
15
|
-
* ## Marker-gated refusal (Story #4526 / #4530)
|
|
16
|
-
*
|
|
17
|
-
* Before delegating, this wrapper checks whether the `.agents/` tree it is
|
|
18
|
-
* about to project commands FROM actually matches the running CLI's own
|
|
19
|
-
* payload version. Without this gate, a consumer whose `.agents/` tree lags
|
|
20
|
-
* the installed package (see #4525's pin-skew scenario) gets commands
|
|
21
|
-
* faithfully projected from a **stale** tree — describing a workflow whose
|
|
22
|
-
* backing scripts are not installed. Because `.claude/*` is conventionally
|
|
23
|
-
* gitignored, that wrong projection leaves no diff and no signal until an
|
|
24
|
-
* agent hits a missing-module error mid-task, far from the actual cause.
|
|
25
|
-
*
|
|
26
|
-
* Gate order:
|
|
27
|
-
* 1. Marker present (`.agents/.mandrel-version`, Story #4530) → compare it
|
|
28
|
-
* to the running CLI's own package version. Mismatch → refuse.
|
|
29
|
-
* 2. Marker absent (a pre-marker install with no baseline to compare) →
|
|
30
|
-
* fall back to the existing `agents-drift` content-hash check
|
|
31
|
-
* (`registry.js`). Drift detected → refuse.
|
|
32
|
-
* 3. Clean either way → project as before.
|
|
33
|
-
*
|
|
34
|
-
* ## Anchor trap (do not repeat)
|
|
35
|
-
*
|
|
36
|
-
* `PROJECT_ROOT` below is deliberately the **package** root — resolved from
|
|
37
|
-
* this module's own two-dirs-up location — because it is used ONLY to read
|
|
38
|
-
* the running CLI's OWN version, which is exactly what that self-referential
|
|
39
|
-
* pattern correctly answers (contrast with the #4525 bug in `update.js`,
|
|
40
|
-
* where the same pattern was wrongly used to answer a *consumer*-pin
|
|
41
|
-
* question). The marker read is a SEPARATE resolution, anchored at `cwd()`
|
|
42
|
-
* (the consumer project root) via `readVersionMarker` — never at
|
|
43
|
-
* `PROJECT_ROOT`. Comparing the marker to `PROJECT_ROOT`'s own version would
|
|
44
|
-
* make the check compare the package against itself and could never fire —
|
|
45
|
-
* the exact trap `registry.js`'s `agents-in-sync` check documents for the
|
|
46
|
-
* same reason.
|
|
13
|
+
* `PROJECT_ROOT` (the package root) answers only "what version is this CLI";
|
|
14
|
+
* the marker is read from `cwd()`. Reading both from `PROJECT_ROOT` would
|
|
15
|
+
* compare the package with itself and never fire.
|
|
47
16
|
*/
|
|
48
17
|
|
|
49
18
|
import { spawnSync } from 'node:child_process';
|
|
@@ -65,10 +34,6 @@ const SYNC_SCRIPT = path.join(
|
|
|
65
34
|
);
|
|
66
35
|
|
|
67
36
|
/**
|
|
68
|
-
* Resolve the running CLI's own package version from `PROJECT_ROOT`'s
|
|
69
|
-
* `package.json`. See the "anchor trap" module doc: this is the ONE place
|
|
70
|
-
* `PROJECT_ROOT` (the package's own two-dirs-up root) is the correct anchor.
|
|
71
|
-
*
|
|
72
37
|
* @param {typeof nodeFs} fsImpl
|
|
73
38
|
* @returns {string}
|
|
74
39
|
*/
|
|
@@ -80,24 +45,6 @@ function resolveOwnPackageVersion(fsImpl) {
|
|
|
80
45
|
}
|
|
81
46
|
|
|
82
47
|
/**
|
|
83
|
-
* Run the sync-claude-commands script and forward its output + exit code —
|
|
84
|
-
* unless the marker-gated refusal check (see module doc) finds the
|
|
85
|
-
* `.agents/` tree mismatched against the running CLI, in which case it
|
|
86
|
-
* refuses and exits non-zero before spawning anything.
|
|
87
|
-
*
|
|
88
|
-
* Injectable seams (used by tests so no real filesystem, child process, or
|
|
89
|
-
* package resolution occurs on the gate path):
|
|
90
|
-
* - `runner` — replaces `spawnSync` for the real delegation.
|
|
91
|
-
* - `cwd()` — replaces `process.cwd`; anchors the marker read at the
|
|
92
|
-
* consumer project root.
|
|
93
|
-
* - `fs` — replaces the `node:fs` surface for both the marker read and the
|
|
94
|
-
* own-version read.
|
|
95
|
-
* - `ownVersion` — overrides the running CLI's own resolved version
|
|
96
|
-
* directly, bypassing `resolveOwnPackageVersion`.
|
|
97
|
-
* - `checkAgentsDrift` — overrides the fallback drift probe used when the
|
|
98
|
-
* marker is absent; defaults to `runAgentsDrift({ cwd })`.
|
|
99
|
-
* - `writeErr` / `exit` — replace the corresponding process surfaces.
|
|
100
|
-
*
|
|
101
48
|
* @param {string[]} _argv - Unused; reserved for future flags.
|
|
102
49
|
* @param {{
|
|
103
50
|
* runner?: typeof spawnSync,
|
package/lib/cli/sync.js
CHANGED
|
@@ -1,64 +1,16 @@
|
|
|
1
1
|
// lib/cli/sync.js
|
|
2
2
|
/**
|
|
3
|
-
* `mandrel sync
|
|
3
|
+
* `mandrel sync`: materialize `node_modules/mandrel/.agents/` into
|
|
4
|
+
* `./.agents/` by plain file copy (never symlinks, so Windows and POSIX
|
|
5
|
+
* match), then prune managed-zone files with no payload counterpart and write
|
|
6
|
+
* the version marker. Idempotent; `--dry-run` writes nothing. `.agents/local/`
|
|
7
|
+
* and `*.local.*` files are never copied into or pruned.
|
|
4
8
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Design contract (per Story #3467 AC, Tech Spec #3459 "API Changes", and
|
|
11
|
-
* Story #4046 sync-prune):
|
|
12
|
-
* - Copy, not symlink. The materialized tree is plain regular files.
|
|
13
|
-
* - Idempotent. A second run overwrites in place and leaves ./.agents/
|
|
14
|
-
* byte-identical to the package payload.
|
|
15
|
-
* - Self-locating. The package root is resolved from the installed
|
|
16
|
-
* `mandrel` package metadata, not from the current working
|
|
17
|
-
* directory, so it works regardless of where `mandrel` is invoked.
|
|
18
|
-
* - Exits non-zero with an actionable message when `mandrel` is
|
|
19
|
-
* not resolvable in node_modules.
|
|
20
|
-
* - `--dry-run` reports the planned copies and writes nothing.
|
|
21
|
-
* - Local-additions zone. The `.agents/local/` subtree is never copied
|
|
22
|
-
* into nor pruned from the destination (Story #3498). It is the
|
|
23
|
-
* consumer-owned space for hand-authored additions that must survive
|
|
24
|
-
* every re-materialization.
|
|
25
|
-
* - Sync prune (Story #4046). After the copy pass, any file inside the
|
|
26
|
-
* managed `.agents/` zone (everything except `.agents/local/`) that has
|
|
27
|
-
* no counterpart in the package payload is deleted. Consumer additions
|
|
28
|
-
* under `.agents/local/` are never touched.
|
|
29
|
-
* - Generated, never-pruned registry (Story #4534). Framework-generated
|
|
30
|
-
* `.agents/` files have no payload counterpart by design, so the prune
|
|
31
|
-
* pass would delete each one unless it is declared in
|
|
32
|
-
* {@link GENERATED_FILES}. That registry — not a per-file special case in
|
|
33
|
-
* {@link listDestFiles} — is the single place a generated artifact is
|
|
34
|
-
* exempted. Registered today: the version marker (Story #4530) and the
|
|
35
|
-
* install ledger the bootstrap writes and `mandrel uninstall` reads.
|
|
36
|
-
* - Version marker (Story #4530). After the prune pass, `.agents/.mandrel-
|
|
37
|
-
* version` is (re)written with the executing package's own version. See
|
|
38
|
-
* {@link readVersionMarker} for how callers consume it.
|
|
39
|
-
*
|
|
40
|
-
* Security (Tech Spec #3459 "Postinstall safety"):
|
|
41
|
-
* - No network, and no shell: every child process is spawned with argv
|
|
42
|
-
* tokens and `shell: false`.
|
|
43
|
-
* - Logs only paths and counts, never file contents or environment values.
|
|
44
|
-
* - One write outside `./.agents/` (Story #5277): the per-clone
|
|
45
|
-
* `merge.mandrel-baseline.driver` git config, and only when the project's
|
|
46
|
-
* own tracked `.gitattributes` already declares the attribute that needs
|
|
47
|
-
* it. That half of the registration cannot ship with the repository — git
|
|
48
|
-
* will not execute a command chosen by whoever wrote it — so every fresh
|
|
49
|
-
* clone silently text-merges generated baselines until something installs
|
|
50
|
-
* it locally, and `sync` is the one command every consumer runs. It never
|
|
51
|
-
* creates or edits `.gitattributes`; a project that has not opted into the
|
|
52
|
-
* quality surface is left untouched.
|
|
53
|
-
*
|
|
54
|
-
* Injectable seams (used by lib/cli/__tests__/sync.test.js):
|
|
55
|
-
* - `resolvePackageRoot` — replaces real `mandrel` resolution
|
|
56
|
-
* - `fs` — replaces the node:fs surface used here
|
|
57
|
-
* - `cwd` — replaces process.cwd()
|
|
58
|
-
* - `ensureMergeDriver` — replaces the git-config merge-driver install
|
|
59
|
-
* - `write` — replaces process.stdout.write
|
|
60
|
-
* - `writeErr` — replaces process.stderr.write
|
|
61
|
-
* - `exit` — replaces process.exit
|
|
9
|
+
* No network, no shell. The one write outside `./.agents/` is the per-clone
|
|
10
|
+
* `merge.mandrel-baseline.driver` git config, made only when the project's
|
|
11
|
+
* tracked `.gitattributes` already declares the attribute — git will not run
|
|
12
|
+
* a command shipped by the repo, so every fresh clone needs it installed
|
|
13
|
+
* locally, and `sync` is the command every consumer runs.
|
|
62
14
|
*/
|
|
63
15
|
|
|
64
16
|
import nodeFs from 'node:fs';
|
|
@@ -70,56 +22,22 @@ import { LEDGER_RELATIVE_PATH } from '../../.agents/scripts/lib/bootstrap/instal
|
|
|
70
22
|
|
|
71
23
|
export const PACKAGE_NAME = 'mandrel';
|
|
72
24
|
|
|
73
|
-
/**
|
|
74
|
-
* Name of the managed destination directory, relative to the project root.
|
|
75
|
-
* Generating modules export their artifact paths relative to the *project
|
|
76
|
-
* root* (e.g. `install-ledger.js`'s `LEDGER_RELATIVE_PATH`), whereas the
|
|
77
|
-
* prune pass compares paths relative to this directory — {@link
|
|
78
|
-
* toManagedZoneRelative} is the one conversion between the two.
|
|
79
|
-
*/
|
|
80
25
|
const AGENTS_DIR = '.agents';
|
|
81
26
|
|
|
82
|
-
/**
|
|
83
|
-
* Top-level directory name (relative to `.agents/`) reserved as the
|
|
84
|
-
* sync-exempt local-additions zone (Story #3498, f-drift-local-zone).
|
|
85
|
-
*
|
|
86
|
-
* `.agents/local/` is a sanctioned space for consumer hand-authored
|
|
87
|
-
* additions: `mandrel sync` never copies a payload file into it (the
|
|
88
|
-
* published payload ships none) and never prunes what a consumer has
|
|
89
|
-
* placed there, so local additions survive every re-materialization. The
|
|
90
|
-
* exemption is enforced by skipping this subtree during source enumeration,
|
|
91
|
-
* which keeps both the dry-run plan and the real copy free of any
|
|
92
|
-
* `.agents/local/**` path even if a future payload were to ship one.
|
|
93
|
-
*/
|
|
27
|
+
/** Top-level `.agents/` subdirectory reserved for consumer additions. */
|
|
94
28
|
export const LOCAL_ZONE_DIR = 'local';
|
|
95
29
|
|
|
96
|
-
/**
|
|
97
|
-
* Basename pattern for consumer local-override files (`*.local.<ext>`,
|
|
98
|
-
* e.g. `instructions.local.md`, `foo.local.json`). Matches the gitignore
|
|
99
|
-
* convention (`.agents/*.local.md`, `.agentrc.local.json`) and the override
|
|
100
|
-
* mechanism documented in `.agents/instructions.md` § 1.E. These files never
|
|
101
|
-
* ship in the payload and are exempt from the sync prune pass.
|
|
102
|
-
*/
|
|
30
|
+
/** Consumer local-override basenames (`instructions.local.md`, …). */
|
|
103
31
|
export const LOCAL_OVERRIDE_RE = /\.local\.[^.]+$/;
|
|
104
32
|
|
|
105
|
-
/**
|
|
106
|
-
* Relative path (from `.agents/`) of the version marker `runSync` writes
|
|
107
|
-
* after every sync, carrying the executing package's own version.
|
|
108
|
-
*/
|
|
33
|
+
/** `.agents/`-relative path of the version marker written after each sync. */
|
|
109
34
|
export const VERSION_MARKER_RELATIVE_PATH = '.mandrel-version';
|
|
110
35
|
|
|
111
36
|
/**
|
|
112
|
-
* Convert a project-root-relative POSIX path
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* {@link GENERATED_FILES} is compared against.
|
|
117
|
-
*
|
|
118
|
-
* Throws on a path outside `.agents/`: a generated file the sync prune pass
|
|
119
|
-
* never walks has no business in the registry, and registering one would be a
|
|
120
|
-
* silent no-op that reads as protection. Failing at module load surfaces the
|
|
121
|
-
* mistake at the first import rather than as a mystery deletion in a
|
|
122
|
-
* consumer's tree.
|
|
37
|
+
* Convert a project-root-relative POSIX path into the `.agents/`-relative,
|
|
38
|
+
* OS-separator form {@link listDestFiles} enumerates. Throws on a path
|
|
39
|
+
* outside `.agents/` at module load, since registering one would be a silent
|
|
40
|
+
* no-op that reads as protection.
|
|
123
41
|
*
|
|
124
42
|
* @param {string} projectRelativePosixPath - e.g. `.agents/.install-manifest.json`.
|
|
125
43
|
* @returns {string} e.g. `.install-manifest.json` (OS separators).
|
|
@@ -136,50 +54,20 @@ function toManagedZoneRelative(projectRelativePosixPath) {
|
|
|
136
54
|
}
|
|
137
55
|
|
|
138
56
|
/**
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
* The prune pass (Story #4046 A3) deletes any managed-zone file absent from
|
|
145
|
-
* the payload. That is the correct rule for consumer drift, but it is also
|
|
146
|
-
* exactly the shape of every file the framework itself generates into
|
|
147
|
-
* `.agents/` outside the payload — so each such artifact is deleted by the very
|
|
148
|
-
* sync that wrote it unless registered here. Two have hit this already: the
|
|
149
|
-
* install ledger (`.agents/.install-manifest.json`), whose loss made
|
|
150
|
-
* `mandrel uninstall` silently reverse nothing and exit 0 (Story #4534), and
|
|
151
|
-
* the version marker (Story #4530).
|
|
152
|
-
*
|
|
153
|
-
* This is deliberately a **registry, not a list of special cases**. Register a
|
|
154
|
-
* new generated file by adding one entry here — keyed off the generating
|
|
155
|
-
* module's own exported constant wherever one exists, never a duplicated
|
|
156
|
-
* string literal — rather than by adding another branch to
|
|
157
|
-
* {@link listDestFiles}. That keeps the never-prune contract declared in one
|
|
158
|
-
* place and keeps the registry honest: if the generator renames its artifact,
|
|
159
|
-
* the exemption moves with it.
|
|
160
|
-
*
|
|
161
|
-
* This registry does **not** subsume the `.agents/local/` zone or the
|
|
162
|
-
* `*.local.*` overrides ({@link LOCAL_ZONE_DIR}, {@link LOCAL_OVERRIDE_RE}).
|
|
163
|
-
* Those are a different concept — consumer-authored overrides, not
|
|
164
|
-
* framework-generated artifacts — and stay separate on purpose.
|
|
57
|
+
* Framework-generated `.agents/` files with no payload counterpart, which the
|
|
58
|
+
* prune pass would otherwise delete (losing the install ledger makes
|
|
59
|
+
* `mandrel uninstall` silently reverse nothing). Register a new one here,
|
|
60
|
+
* keyed off the generator's exported constant — not as a branch in
|
|
61
|
+
* {@link listDestFiles}. Consumer overrides are a separate concept.
|
|
165
62
|
*/
|
|
166
63
|
export const GENERATED_FILES = Object.freeze([
|
|
167
|
-
// Version marker (Story #4530) — written by runSync itself, below.
|
|
168
64
|
VERSION_MARKER_RELATIVE_PATH,
|
|
169
|
-
// Install ledger (Story #4534) — written by the bootstrap
|
|
170
|
-
// (`install-ledger.js`), read by `mandrel uninstall` as its single source of
|
|
171
|
-
// truth. Keyed off the generator's exported constant.
|
|
172
65
|
toManagedZoneRelative(LEDGER_RELATIVE_PATH),
|
|
173
66
|
]);
|
|
174
67
|
|
|
175
68
|
/**
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
* the already-resolved `packageRoot`, never the two-directories-up
|
|
179
|
-
* self-referential pattern `lib/cli/update.js`'s pre-Story-#4530
|
|
180
|
-
* `defaultCurrentVersion` used (that pattern conflates "the CLI that is
|
|
181
|
-
* running" with "the payload that was materialized" — the exact confusion
|
|
182
|
-
* #4525 fixes on the consumer-pin side of this Story).
|
|
69
|
+
* Version of the payload just copied, read at `packageRoot` — not the
|
|
70
|
+
* running CLI's own version, which may differ.
|
|
183
71
|
*
|
|
184
72
|
* @param {string} packageRoot - Absolute path to the resolved package root.
|
|
185
73
|
* @param {typeof nodeFs} fsImpl
|
|
@@ -192,10 +80,8 @@ function resolvePackageVersion(packageRoot, fsImpl) {
|
|
|
192
80
|
}
|
|
193
81
|
|
|
194
82
|
/**
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
* so callers (the sync-commands mismatch refusal, the doctor pin check) can
|
|
198
|
-
* degrade to their existing content-hash drift check rather than failing.
|
|
83
|
+
* `null` when absent (pre-marker install or never synced), so callers can
|
|
84
|
+
* fall back to content-hash drift checks.
|
|
199
85
|
*
|
|
200
86
|
* @param {string} consumerRoot - Consumer project root (not `.agents/`).
|
|
201
87
|
* @param {typeof nodeFs} [fsImpl]
|
|
@@ -216,33 +102,21 @@ export function readVersionMarker(consumerRoot, fsImpl = nodeFs) {
|
|
|
216
102
|
}
|
|
217
103
|
|
|
218
104
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
* Throws an Error with `code: 'MODULE_NOT_FOUND'` when the package is not
|
|
223
|
-
* installed — the caller maps that to an actionable non-zero exit.
|
|
105
|
+
* Resolved from the consumer project so it finds their install, not a copy
|
|
106
|
+
* hoisted next to this module. Throws `MODULE_NOT_FOUND` when not installed.
|
|
224
107
|
*
|
|
225
108
|
* @param {string} fromDir - Directory to resolve from (the consumer project).
|
|
226
109
|
* @returns {string} Absolute path to the package root.
|
|
227
110
|
*/
|
|
228
111
|
export function defaultResolvePackageRoot(fromDir) {
|
|
229
|
-
// Resolve relative to the consumer project so we find *their* install,
|
|
230
|
-
// not a copy hoisted next to this CLI module.
|
|
231
112
|
const requireFrom = createRequire(path.join(fromDir, 'noop.js'));
|
|
232
113
|
const pkgJsonPath = requireFrom.resolve(`${PACKAGE_NAME}/package.json`);
|
|
233
114
|
return path.dirname(pkgJsonPath);
|
|
234
115
|
}
|
|
235
116
|
|
|
236
117
|
/**
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
* Symlinks encountered in the source are dereferenced to their target file
|
|
241
|
-
* content on copy (we never create symlinks in the destination).
|
|
242
|
-
*
|
|
243
|
-
* The top-level `local/` subtree (`.agents/local/`) is skipped entirely:
|
|
244
|
-
* it is the consumer-owned local-additions zone and is never materialized
|
|
245
|
-
* from the package payload (Story #3498). See {@link LOCAL_ZONE_DIR}.
|
|
118
|
+
* Every file under `dir` (relative, OS separators), skipping the top-level
|
|
119
|
+
* local zone only.
|
|
246
120
|
*
|
|
247
121
|
* @param {string} dir - Absolute directory to walk.
|
|
248
122
|
* @param {typeof nodeFs} fsImpl
|
|
@@ -252,9 +126,6 @@ export function defaultResolvePackageRoot(fromDir) {
|
|
|
252
126
|
export function listFiles(dir, fsImpl, prefix = '') {
|
|
253
127
|
const out = [];
|
|
254
128
|
for (const ent of fsImpl.readdirSync(dir, { withFileTypes: true })) {
|
|
255
|
-
// Never enumerate the sync-exempt local-additions zone. Matching on the
|
|
256
|
-
// empty prefix scopes the skip to the top-level `.agents/local/` only,
|
|
257
|
-
// leaving any deeper directory that happens to be named `local` intact.
|
|
258
129
|
if (prefix === '' && ent.name === LOCAL_ZONE_DIR && ent.isDirectory()) {
|
|
259
130
|
continue;
|
|
260
131
|
}
|
|
@@ -270,26 +141,8 @@ export function listFiles(dir, fsImpl, prefix = '') {
|
|
|
270
141
|
}
|
|
271
142
|
|
|
272
143
|
/**
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
* so a caller diffing this against the payload never treats them as stale:
|
|
276
|
-
*
|
|
277
|
-
* 1. The top-level `local/` subtree — consumer additions inside
|
|
278
|
-
* `.agents/local/` are never pruned (Story #3498).
|
|
279
|
-
* 2. Files matching the `*.local.*` convention (e.g.
|
|
280
|
-
* `.agents/instructions.local.md`) — the documented consumer override
|
|
281
|
-
* mechanism (instructions.md § 1.E); they never ship in the payload and
|
|
282
|
-
* must survive every sync.
|
|
283
|
-
* 3. Everything declared in the {@link GENERATED_FILES} registry —
|
|
284
|
-
* framework-generated artifacts with no payload counterpart by design
|
|
285
|
-
* (Story #4534). New generated files are registered there, not added as
|
|
286
|
-
* a fourth branch here.
|
|
287
|
-
*
|
|
288
|
-
* (1) and (2) are consumer-authored; (3) is framework-generated. They are
|
|
289
|
-
* kept separate deliberately — conflating them would muddy both contracts.
|
|
290
|
-
*
|
|
291
|
-
* Mirrors `listFiles` but operates on the destination tree so we can
|
|
292
|
-
* identify stale files that have no payload counterpart (Story #4046 A3).
|
|
144
|
+
* Destination-tree enumeration for pruning. Skips the top-level local zone,
|
|
145
|
+
* `*.local.*` overrides, and {@link GENERATED_FILES}.
|
|
293
146
|
*
|
|
294
147
|
* @param {string} dir - Absolute directory to walk.
|
|
295
148
|
* @param {typeof nodeFs} fsImpl
|
|
@@ -302,23 +155,16 @@ function listDestFiles(dir, fsImpl, prefix = '') {
|
|
|
302
155
|
try {
|
|
303
156
|
entries = fsImpl.readdirSync(dir, { withFileTypes: true });
|
|
304
157
|
} catch {
|
|
305
|
-
// Directory absent — nothing to prune.
|
|
306
158
|
return out;
|
|
307
159
|
}
|
|
308
160
|
for (const ent of entries) {
|
|
309
|
-
// The local-additions zone is never pruned; skip it at the top level.
|
|
310
161
|
if (prefix === '' && ent.name === LOCAL_ZONE_DIR && ent.isDirectory()) {
|
|
311
162
|
continue;
|
|
312
163
|
}
|
|
313
|
-
// Consumer local-override files (`*.local.*`, e.g. instructions.local.md,
|
|
314
|
-
// foo.local.json) are gitignored, never shipped in the payload, and a
|
|
315
|
-
// documented override mechanism (instructions.md § 1.E) — never prune.
|
|
316
164
|
if (!ent.isDirectory() && LOCAL_OVERRIDE_RE.test(ent.name)) {
|
|
317
165
|
continue;
|
|
318
166
|
}
|
|
319
167
|
const rel = prefix ? path.join(prefix, ent.name) : ent.name;
|
|
320
|
-
// Framework-generated artifacts — declared once in the never-pruned
|
|
321
|
-
// registry (Story #4534); see GENERATED_FILES.
|
|
322
168
|
if (!ent.isDirectory() && GENERATED_FILES.includes(rel)) {
|
|
323
169
|
continue;
|
|
324
170
|
}
|
|
@@ -333,13 +179,6 @@ function listDestFiles(dir, fsImpl, prefix = '') {
|
|
|
333
179
|
}
|
|
334
180
|
|
|
335
181
|
/**
|
|
336
|
-
* Materialize the package's `.agents/` tree into `./.agents/`.
|
|
337
|
-
*
|
|
338
|
-
* After the copy pass, any file inside the managed zone of the destination
|
|
339
|
-
* `.agents/` tree (everything outside `.agents/local/`) that has no
|
|
340
|
-
* counterpart in the package payload is deleted (sync-prune, Story #4046 A3).
|
|
341
|
-
* Consumer additions placed under `.agents/local/` are never touched.
|
|
342
|
-
*
|
|
343
182
|
* @param {{
|
|
344
183
|
* argv?: string[],
|
|
345
184
|
* resolvePackageRoot?: (fromDir: string) => string,
|
|
@@ -395,8 +234,6 @@ export function runSync({
|
|
|
395
234
|
for (const rel of payloadFiles) {
|
|
396
235
|
write(`would copy ${path.join('.agents', rel)}\n`);
|
|
397
236
|
}
|
|
398
|
-
// Compute stale files (managed-zone destination files with no payload
|
|
399
|
-
// counterpart) for the dry-run plan so operators can preview pruning.
|
|
400
237
|
const payloadSet = new Set(payloadFiles);
|
|
401
238
|
const destFiles = listDestFiles(destRoot, fs);
|
|
402
239
|
const stale = destFiles.filter((f) => !payloadSet.has(f));
|
|
@@ -418,15 +255,9 @@ export function runSync({
|
|
|
418
255
|
const src = path.join(sourceRoot, rel);
|
|
419
256
|
const dest = path.join(destRoot, rel);
|
|
420
257
|
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
421
|
-
// copyFileSync overwrites the destination in place (idempotent) and
|
|
422
|
-
// produces a plain regular file — never a symlink.
|
|
423
258
|
fs.copyFileSync(src, dest);
|
|
424
259
|
}
|
|
425
260
|
|
|
426
|
-
// Prune pass (Story #4046 A3): remove managed-zone destination files that
|
|
427
|
-
// have no counterpart in the payload. The local-additions zone
|
|
428
|
-
// (.agents/local/) is never enumerated by listDestFiles and is therefore
|
|
429
|
-
// never pruned — consumer additions there are sanctioned, not stale.
|
|
430
261
|
const payloadSet = new Set(payloadFiles);
|
|
431
262
|
const destFiles = listDestFiles(destRoot, fs);
|
|
432
263
|
const staleFiles = destFiles.filter((f) => !payloadSet.has(f));
|
|
@@ -435,22 +266,14 @@ export function runSync({
|
|
|
435
266
|
fs.unlinkSync(dest);
|
|
436
267
|
}
|
|
437
268
|
|
|
438
|
-
//
|
|
439
|
-
// before — the GENERATED_FILES registry already keeps listDestFiles from
|
|
440
|
-
// ever enumerating it as stale, but ordering the write after prune is a
|
|
441
|
-
// second, independent safeguard against the same class of bug (see the
|
|
442
|
-
// GENERATED_FILES doc comment) surviving a future prune-pass reorder. The
|
|
443
|
-
// install ledger gets no such belt-and-braces: it is written by the
|
|
444
|
-
// bootstrap, not here, so the registry is its only protection.
|
|
269
|
+
// Written after the prune as a second safeguard beside GENERATED_FILES.
|
|
445
270
|
const packageVersion = resolvePackageVersion(packageRoot, fs);
|
|
446
271
|
fs.writeFileSync(
|
|
447
272
|
path.join(destRoot, VERSION_MARKER_RELATIVE_PATH),
|
|
448
273
|
`${packageVersion}\n`,
|
|
449
274
|
);
|
|
450
275
|
|
|
451
|
-
//
|
|
452
|
-
// preamble's security note. Never allowed to fail the sync: a consumer
|
|
453
|
-
// without git, or with a read-only config, still gets their `.agents/` tree.
|
|
276
|
+
// Config half only; never allowed to fail the sync (no git, read-only config).
|
|
454
277
|
const driver = ensureMergeDriver({
|
|
455
278
|
projectRoot,
|
|
456
279
|
configOnly: true,
|
|
@@ -476,8 +299,6 @@ export function runSync({
|
|
|
476
299
|
}
|
|
477
300
|
|
|
478
301
|
/**
|
|
479
|
-
* Default export consumed by `bin/mandrel.js`.
|
|
480
|
-
*
|
|
481
302
|
* @param {string[]} argv - Subcommand arguments (after `mandrel sync`).
|
|
482
303
|
* @returns {Promise<void>}
|
|
483
304
|
*/
|