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,29 +1,9 @@
|
|
|
1
1
|
/* node:coverage ignore file -- node_modules placement strategies (symlink/copy/install); pure filesystem I/O, integration-shaped */
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* worktree
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - `per-worktree` — run the project's package-manager install inside the
|
|
9
|
-
* worktree (lock-file aware).
|
|
10
|
-
* - `clone` — copy-on-write (reflink/clonefile) clone of the donor's
|
|
11
|
-
* `node_modules` into the worktree (`cp -c` on darwin,
|
|
12
|
-
* `cp --reflink=auto` on linux). Effectively free in time
|
|
13
|
-
* and disk on APFS / reflink-capable filesystems. Falls
|
|
14
|
-
* back to `per-worktree` cleanly on any failure
|
|
15
|
-
* (unsupported filesystem, cross-volume clone, Windows).
|
|
16
|
-
* When the worktree's lockfile byte-matches the donor's
|
|
17
|
-
* and the donor's install markers are present, the
|
|
18
|
-
* per-tree install is skipped.
|
|
19
|
-
* - `symlink` — symlink (or junction on Windows) the worktree's
|
|
20
|
-
* `node_modules` to a donor worktree's copy. Refuses on
|
|
21
|
-
* Windows unless `allowSymlinkOnWindows=true`.
|
|
22
|
-
* - `pnpm-store` — run `pnpm install --frozen-lockfile` against the
|
|
23
|
-
* shared content-addressable store.
|
|
24
|
-
*
|
|
25
|
-
* The context passed to each helper carries the minimum state the strategy
|
|
26
|
-
* needs: config, platform, logger, and repoRoot (for `symlink` / `clone`).
|
|
4
|
+
* Strategies for populating a new worktree's `node_modules`: `per-worktree`
|
|
5
|
+
* (PM install), `clone` (copy-on-write clone of the donor, falling back to
|
|
6
|
+
* install), `symlink` (to a donor; opt-in on Windows) and `pnpm-store`.
|
|
27
7
|
*/
|
|
28
8
|
|
|
29
9
|
import { spawnSync } from 'node:child_process';
|
|
@@ -39,12 +19,10 @@ function sleepSync(ms) {
|
|
|
39
19
|
}
|
|
40
20
|
|
|
41
21
|
/**
|
|
42
|
-
*
|
|
43
|
-
* (the main checkout, which is primed by the host's own install) unless the
|
|
44
|
-
* operator pinned a `primeFromPath`.
|
|
22
|
+
* Clone donor: `primeFromPath` when pinned, else the (host-installed) repo root.
|
|
45
23
|
*
|
|
46
24
|
* @param {{ config: object, repoRoot: string }} ctx
|
|
47
|
-
* @returns {string}
|
|
25
|
+
* @returns {string}
|
|
48
26
|
*/
|
|
49
27
|
function resolveCloneDonor(ctx) {
|
|
50
28
|
const primeFromPath = ctx.config?.primeFromPath;
|
|
@@ -54,11 +32,10 @@ function resolveCloneDonor(ctx) {
|
|
|
54
32
|
}
|
|
55
33
|
|
|
56
34
|
/**
|
|
57
|
-
* Apply
|
|
58
|
-
* Called only during creation.
|
|
35
|
+
* Apply `nodeModulesStrategy` to a freshly created worktree.
|
|
59
36
|
*
|
|
60
37
|
* @param {{ config: object, platform: NodeJS.Platform, logger: object, repoRoot: string }} ctx
|
|
61
|
-
* @param {string} wtPath
|
|
38
|
+
* @param {string} wtPath
|
|
62
39
|
*/
|
|
63
40
|
export function applyNodeModulesStrategy(ctx, wtPath) {
|
|
64
41
|
const strategy = ctx.config.nodeModulesStrategy ?? 'per-worktree';
|
|
@@ -99,10 +76,8 @@ export function applyNodeModulesStrategy(ctx, wtPath) {
|
|
|
99
76
|
|
|
100
77
|
const target = path.join(wtPath, 'node_modules');
|
|
101
78
|
try {
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
// node_modules priming. Key off the real host OS — `ctx.platform` is a
|
|
105
|
-
// test-injection hook and does not change what the filesystem accepts.
|
|
79
|
+
// A junction needs no admin rights on Windows. Keyed off the real host
|
|
80
|
+
// OS: `ctx.platform` is a test hook the filesystem ignores.
|
|
106
81
|
const linkType = process.platform === 'win32' ? 'junction' : 'dir';
|
|
107
82
|
fs.symlinkSync(primeNodeModules, target, linkType);
|
|
108
83
|
} catch (err) {
|
|
@@ -125,28 +100,19 @@ export function applyNodeModulesStrategy(ctx, wtPath) {
|
|
|
125
100
|
}
|
|
126
101
|
|
|
127
102
|
/**
|
|
128
|
-
* Copy-on-write clone the donor's `node_modules` into the worktree.
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* lockfile-match probe in `installDependencies` then skips the per-tree
|
|
132
|
-
* install entirely.
|
|
133
|
-
*
|
|
134
|
-
* Non-fatal by design: any failure (unsupported filesystem, cross-volume
|
|
135
|
-
* clone, Windows, missing donor) falls back to `per-worktree` cleanly — the
|
|
136
|
-
* worktree is simply left without a cloned `node_modules`, and the regular
|
|
137
|
-
* per-tree install runs. Failure NEVER throws; the clone is a fast-path
|
|
138
|
-
* optimization, not a correctness requirement.
|
|
103
|
+
* Copy-on-write clone the donor's `node_modules` into the worktree. A fast
|
|
104
|
+
* path only: every failure returns `cloned: false` (never throws) and the
|
|
105
|
+
* regular install runs instead.
|
|
139
106
|
*
|
|
140
107
|
* @param {{ config: object, platform: NodeJS.Platform, logger: object, repoRoot: string }} ctx
|
|
141
|
-
* @param {string} wtPath
|
|
142
|
-
* @param {{ spawnFn?: typeof spawnSync, fsLike?: typeof fs }} [io]
|
|
108
|
+
* @param {string} wtPath
|
|
109
|
+
* @param {{ spawnFn?: typeof spawnSync, fsLike?: typeof fs }} [io]
|
|
143
110
|
* @returns {{ cloned: boolean, reason?: string }}
|
|
144
111
|
*/
|
|
145
112
|
export function cloneNodeModules(ctx, wtPath, io = {}) {
|
|
146
113
|
const spawnFn = io.spawnFn ?? spawnSync;
|
|
147
114
|
const fsLike = io.fsLike ?? fs;
|
|
148
|
-
//
|
|
149
|
-
// capability decision: Windows has no `cp -c`/`--reflink` equivalent here.
|
|
115
|
+
// Real host OS, not `ctx.platform`: Windows has no clone `cp` here.
|
|
150
116
|
if (process.platform === 'win32') {
|
|
151
117
|
ctx.logger.info(
|
|
152
118
|
'worktree.node_modules strategy=clone fallback=per-worktree reason=windows-unsupported',
|
|
@@ -165,19 +131,15 @@ export function cloneNodeModules(ctx, wtPath, io = {}) {
|
|
|
165
131
|
|
|
166
132
|
const target = path.join(wtPath, 'node_modules');
|
|
167
133
|
if (fsLike.existsSync(target)) {
|
|
168
|
-
//
|
|
169
|
-
// clone-on-top (cp would nest into the existing dir). Treat as already
|
|
170
|
-
// populated and let the install-skip probe decide freshness.
|
|
134
|
+
// cp would nest into an existing dir; let the install-skip probe decide.
|
|
171
135
|
ctx.logger.info(
|
|
172
136
|
`worktree.node_modules strategy=clone skip reason=target-exists target=${target}`,
|
|
173
137
|
);
|
|
174
138
|
return { cloned: false, reason: 'target-exists' };
|
|
175
139
|
}
|
|
176
140
|
|
|
177
|
-
//
|
|
178
|
-
//
|
|
179
|
-
// filesystems — which we deliberately reject below so a slow full-tree copy
|
|
180
|
-
// never masquerades as a free clone.
|
|
141
|
+
// `--reflink=always` (not `auto`) so a slow full copy never masquerades as
|
|
142
|
+
// a free clone.
|
|
181
143
|
const cloneArgs =
|
|
182
144
|
process.platform === 'darwin'
|
|
183
145
|
? ['-c', '-R', donorNodeModules, target]
|
|
@@ -189,8 +151,7 @@ export function cloneNodeModules(ctx, wtPath, io = {}) {
|
|
|
189
151
|
timeout: 120_000,
|
|
190
152
|
});
|
|
191
153
|
if (result.status !== 0) {
|
|
192
|
-
//
|
|
193
|
-
// a known-empty target.
|
|
154
|
+
// Remove a partial copy so the fallback install starts empty.
|
|
194
155
|
try {
|
|
195
156
|
fsLike.rmSync(target, { recursive: true, force: true });
|
|
196
157
|
} catch {
|
|
@@ -210,17 +171,11 @@ export function cloneNodeModules(ctx, wtPath, io = {}) {
|
|
|
210
171
|
}
|
|
211
172
|
|
|
212
173
|
/**
|
|
213
|
-
*
|
|
214
|
-
* worktree path. Returns `null` when the strategy is `symlink` (handled
|
|
215
|
-
* elsewhere) or the worktree has no `package.json`.
|
|
216
|
-
*
|
|
217
|
-
* `clone` shares `per-worktree`'s PM-detection: when the install is *not*
|
|
218
|
-
* skipped (lockfile mismatch), the worktree still installs with the project's
|
|
219
|
-
* detected package manager.
|
|
174
|
+
* Install command for a strategy, or `null` for `symlink` / no `package.json`.
|
|
220
175
|
*
|
|
221
|
-
* @param {string} strategy
|
|
222
|
-
* @param {string} wtPath
|
|
223
|
-
* @param {{ existsSync: (p: string) => boolean }} [fsLike]
|
|
176
|
+
* @param {string} strategy
|
|
177
|
+
* @param {string} wtPath
|
|
178
|
+
* @param {{ existsSync: (p: string) => boolean }} [fsLike]
|
|
224
179
|
* @returns {{ cmd: string, args: string[] } | null}
|
|
225
180
|
*/
|
|
226
181
|
export function selectInstallCommand(strategy, wtPath, fsLike = fs) {
|
|
@@ -230,8 +185,6 @@ export function selectInstallCommand(strategy, wtPath, fsLike = fs) {
|
|
|
230
185
|
if (strategy === 'pnpm-store') {
|
|
231
186
|
return { cmd: 'pnpm', args: ['install', '--frozen-lockfile'] };
|
|
232
187
|
}
|
|
233
|
-
// Shared lockfile probe (Story #4048 B3 — one implementation per concept).
|
|
234
|
-
// `per-worktree` and `clone` both fall through to PM detection here.
|
|
235
188
|
const pm = detectPackageManager(wtPath, (p) => fsLike.existsSync(p)) ?? 'npm';
|
|
236
189
|
if (pm === 'pnpm') {
|
|
237
190
|
return { cmd: 'pnpm', args: ['install', '--frozen-lockfile'] };
|
|
@@ -242,13 +195,7 @@ export function selectInstallCommand(strategy, wtPath, fsLike = fs) {
|
|
|
242
195
|
return { cmd: 'npm', args: ['ci'] };
|
|
243
196
|
}
|
|
244
197
|
|
|
245
|
-
/**
|
|
246
|
-
* Per-package-manager "install completed" marker files written into
|
|
247
|
-
* `node_modules/` by the install command itself. Their presence (and
|
|
248
|
-
* freshness relative to the lockfile) is the cheapest reliable signal that a
|
|
249
|
-
* prior install ran to completion — a failed/interrupted install leaves
|
|
250
|
-
* `node_modules` partially populated without (or with a stale) marker.
|
|
251
|
-
*/
|
|
198
|
+
/** Markers a PM writes only once an install completes. */
|
|
252
199
|
const INSTALL_MARKERS = [
|
|
253
200
|
'.package-lock.json', // npm ci / npm install
|
|
254
201
|
'.modules.yaml', // pnpm
|
|
@@ -259,14 +206,10 @@ const INSTALL_MARKERS = [
|
|
|
259
206
|
const LOCKFILES = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock'];
|
|
260
207
|
|
|
261
208
|
/**
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
265
|
-
* The hash is the load-bearing freshness key for the install-skip decision —
|
|
266
|
-
* never an mtime, which clone (clonefile/reflink) does not preserve reliably
|
|
267
|
-
* and which is trivially perturbed by a no-op `git checkout`.
|
|
209
|
+
* SHA-256 of the first lockfile in `dir`, or `null`. The freshness key is a
|
|
210
|
+
* content hash, never mtime, which clones and checkouts do not preserve.
|
|
268
211
|
*
|
|
269
|
-
* @param {string} dir
|
|
212
|
+
* @param {string} dir
|
|
270
213
|
* @param {{ existsSync: Function, readFileSync: Function }} [fsLike]
|
|
271
214
|
* @returns {string | null}
|
|
272
215
|
*/
|
|
@@ -284,23 +227,12 @@ export function lockfileHash(dir, fsLike = fs) {
|
|
|
284
227
|
}
|
|
285
228
|
|
|
286
229
|
/**
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
* 1. the worktree carries a completed-install marker
|
|
291
|
-
* (`node_modules/<INSTALL_MARKERS>`), AND
|
|
292
|
-
* 2. the worktree's lockfile byte-exactly matches the donor's lockfile.
|
|
293
|
-
*
|
|
294
|
-
* The lockfile match is keyed on a byte-exact SHA-256 hash, NEVER mtime: a
|
|
295
|
-
* reflink/clonefile clone does not preserve mtime relationships, so an mtime
|
|
296
|
-
* comparison would either mis-skip a real change or force a redundant install
|
|
297
|
-
* on every clone. When the donor is omitted (reuse path, no clone donor), the
|
|
298
|
-
* worktree's own lockfile is hashed against itself — i.e. the lockfile-match
|
|
299
|
-
* leg is vacuously satisfied and only the marker presence gates the skip.
|
|
230
|
+
* The install is skippable iff a completed-install marker exists and the
|
|
231
|
+
* worktree lockfile hash matches the donor's (vacuous with no donor).
|
|
300
232
|
*
|
|
301
233
|
* @param {object} opts
|
|
302
|
-
* @param {string} opts.wtPath
|
|
303
|
-
* @param {string} [opts.donorPath]
|
|
234
|
+
* @param {string} opts.wtPath
|
|
235
|
+
* @param {string} [opts.donorPath]
|
|
304
236
|
* @param {{ existsSync: Function, readFileSync: Function }} [opts.fsLike]
|
|
305
237
|
* @returns {{ skippable: boolean, reason: string }}
|
|
306
238
|
*/
|
|
@@ -317,8 +249,6 @@ export function isInstallSkippable({ wtPath, donorPath, fsLike = fs }) {
|
|
|
317
249
|
}
|
|
318
250
|
const wtHash = lockfileHash(wtPath, fsLike);
|
|
319
251
|
if (wtHash === null) {
|
|
320
|
-
// No lockfile in the worktree — nothing to pin freshness against. The
|
|
321
|
-
// marker alone is the signal (matches a lockfile-less project).
|
|
322
252
|
return { skippable: true, reason: 'marker-present-no-lockfile' };
|
|
323
253
|
}
|
|
324
254
|
if (donorPath) {
|
|
@@ -331,31 +261,15 @@ export function isInstallSkippable({ wtPath, donorPath, fsLike = fs }) {
|
|
|
331
261
|
}
|
|
332
262
|
|
|
333
263
|
/**
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
* `skipped/worktree-reused` — when the prior run's install *failed*, that
|
|
337
|
-
* status defeats the install retry exactly when it matters
|
|
338
|
-
* (`deriveInstallAction('skipped')` treats it as "nothing to do").
|
|
264
|
+
* Whether a reused worktree has a completed install. Reports `failed` rather
|
|
265
|
+
* than a blind `skipped` so a prior failed install is retried.
|
|
339
266
|
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* safe to skip.
|
|
344
|
-
* - `{ status: 'failed', reason }` — missing/incomplete install detected;
|
|
345
|
-
* callers should retry the install.
|
|
346
|
-
*
|
|
347
|
-
* Thin wrapper over the shared `isInstallSkippable` predicate (Story #4249 —
|
|
348
|
-
* one freshness predicate, keyed on a byte-exact lockfile hash, never mtime).
|
|
349
|
-
* The reuse path has no separate donor, so freshness reduces to marker
|
|
350
|
-
* presence (the worktree's own lockfile is its own baseline).
|
|
351
|
-
*
|
|
352
|
-
* @param {string} strategy One of `per-worktree | clone | pnpm-store | symlink`.
|
|
353
|
-
* @param {string} wtPath Absolute worktree path.
|
|
354
|
-
* @param {{ existsSync: Function, readFileSync: Function }} [fsLike] Injectable for tests.
|
|
267
|
+
* @param {string} strategy
|
|
268
|
+
* @param {string} wtPath
|
|
269
|
+
* @param {{ existsSync: Function, readFileSync: Function }} [fsLike]
|
|
355
270
|
* @returns {{ status: 'skipped' | 'failed', reason: string }}
|
|
356
271
|
*/
|
|
357
272
|
export function probeReusedInstall(strategy, wtPath, fsLike = fs) {
|
|
358
|
-
// `symlink` re-points node_modules at a donor — no per-tree install to probe.
|
|
359
273
|
if (strategy === 'symlink') {
|
|
360
274
|
return { status: 'skipped', reason: 'worktree-reused' };
|
|
361
275
|
}
|
|
@@ -375,16 +289,7 @@ export function probeReusedInstall(strategy, wtPath, fsLike = fs) {
|
|
|
375
289
|
};
|
|
376
290
|
}
|
|
377
291
|
|
|
378
|
-
/**
|
|
379
|
-
* Pure: retry policy keyed off the chosen command. pnpm gets 3× + 5min.
|
|
380
|
-
*
|
|
381
|
-
* Story #4249: npm/yarn now get a real `maxAttempts` of 2 (was 1). The
|
|
382
|
-
* formerly hardcoded `npm ci` retry inside `runStoryInitPrepare` was deleted
|
|
383
|
-
* in the same change; this in-`ensure` retry budget is what compensates so
|
|
384
|
-
* npm install reliability does not regress — a transient first-attempt
|
|
385
|
-
* failure now retries here, with the correct (PM-detected) command, instead
|
|
386
|
-
* of an unconditional `npm ci` re-run after init.
|
|
387
|
-
*/
|
|
292
|
+
/** Retry policy per command; this is the only install retry. */
|
|
388
293
|
export function installRetryPolicy(cmd) {
|
|
389
294
|
const isPnpm = cmd === 'pnpm';
|
|
390
295
|
return {
|
|
@@ -404,20 +309,9 @@ export function describeAttemptFailure(result, timeoutMs) {
|
|
|
404
309
|
const PNPM_STORE_PRIME_SENTINEL = path.join('temp', '.pnpm-store-primed');
|
|
405
310
|
|
|
406
311
|
/**
|
|
407
|
-
*
|
|
408
|
-
*
|
|
409
|
-
*
|
|
410
|
-
* machine the first `pnpm install --frozen-lockfile` inside a worktree races
|
|
411
|
-
* other workers, and the per-tree retries can all hit the same un-populated
|
|
412
|
-
* store and exhaust without any single attempt succeeding. Priming the store
|
|
413
|
-
* once at `repoRoot` (where the lockfile lives) before any worktree install
|
|
414
|
-
* eliminates that class of transient failure.
|
|
415
|
-
*
|
|
416
|
-
* The sentinel is a zero-byte file under `<repoRoot>/temp/`. The directory
|
|
417
|
-
* lives outside Git (the project's standard scratch root) so the sentinel
|
|
418
|
-
* persists across worktrees on the same machine but never ships to commits.
|
|
419
|
-
*
|
|
420
|
-
* No-op for strategies other than `pnpm-store`.
|
|
312
|
+
* Prime the shared pnpm store once per machine (sentinel under `temp/`): on a
|
|
313
|
+
* cold store, concurrent worktree installs can exhaust their retries racing
|
|
314
|
+
* each other.
|
|
421
315
|
*
|
|
422
316
|
* @returns {{ primed: 'primed' | 'cached' | 'failed' | 'skipped', reason?: string }}
|
|
423
317
|
*/
|
|
@@ -469,8 +363,7 @@ function primePnpmStore({
|
|
|
469
363
|
}
|
|
470
364
|
|
|
471
365
|
/**
|
|
472
|
-
* Run the
|
|
473
|
-
* w.r.t. `spawnFn` + `sleepFn` — the CLI wires real ones; tests inject stubs.
|
|
366
|
+
* Run the install under the retry policy.
|
|
474
367
|
*
|
|
475
368
|
* @returns {{ ok: boolean, attempts: number, lastResult: object }}
|
|
476
369
|
*/
|
|
@@ -517,24 +410,11 @@ export function runInstallWithRetry({
|
|
|
517
410
|
}
|
|
518
411
|
|
|
519
412
|
/**
|
|
520
|
-
*
|
|
521
|
-
*
|
|
522
|
-
*
|
|
523
|
-
* Return shape:
|
|
524
|
-
* - `{ status: 'installed' }` — per-worktree install succeeded.
|
|
525
|
-
* - `{ status: 'failed', reason }` — per-worktree install attempted and
|
|
526
|
-
* failed (or finished 0 but produced
|
|
527
|
-
* no `node_modules/`).
|
|
528
|
-
* - `{ status: 'skipped', reason }` — strategy intentionally skips a
|
|
529
|
-
* per-worktree install. Covers
|
|
530
|
-
* `symlink` (donor `node_modules` is
|
|
531
|
-
* re-pointed), `pnpm-store` (relies
|
|
532
|
-
* on the shared content-addressable
|
|
533
|
-
* store), and the no-`package.json`
|
|
534
|
-
* case.
|
|
413
|
+
* Failure verdict for an install run (non-zero exit, or exit 0 without
|
|
414
|
+
* `node_modules`), or `null` on success.
|
|
535
415
|
*
|
|
536
416
|
* @param {{ config: object, platform: NodeJS.Platform, logger: object }} ctx
|
|
537
|
-
* @param {string} wtPath
|
|
417
|
+
* @param {string} wtPath
|
|
538
418
|
* @returns {{ status: 'installed' | 'failed' | 'skipped', reason?: string }}
|
|
539
419
|
*/
|
|
540
420
|
function verifyInstallOutcome(ctx, wtPath, selection, run, policy) {
|
|
@@ -564,7 +444,6 @@ function verifyInstallOutcome(ctx, wtPath, selection, run, policy) {
|
|
|
564
444
|
|
|
565
445
|
export function installDependencies(ctx, wtPath) {
|
|
566
446
|
const strategy = ctx.config.nodeModulesStrategy ?? 'per-worktree';
|
|
567
|
-
// `symlink` re-points node_modules at a donor — no install command runs.
|
|
568
447
|
if (strategy === 'symlink') {
|
|
569
448
|
return { status: 'skipped', reason: 'symlink-strategy' };
|
|
570
449
|
}
|
|
@@ -572,13 +451,6 @@ export function installDependencies(ctx, wtPath) {
|
|
|
572
451
|
if (selection === null) {
|
|
573
452
|
return { status: 'skipped', reason: 'no-package-json' };
|
|
574
453
|
}
|
|
575
|
-
// `clone` reflink-clones the donor's node_modules in `applyNodeModulesStrategy`.
|
|
576
|
-
// When the cloned tree carries a completed-install marker AND the worktree's
|
|
577
|
-
// lockfile byte-matches the donor's, the per-tree install is pure waste —
|
|
578
|
-
// skip it. The freshness predicate is the single shared `isInstallSkippable`
|
|
579
|
-
// (byte-exact lockfile hash, never mtime). On a lockfile mismatch (donor
|
|
580
|
-
// drifted, or no clone happened) this returns false and the install below
|
|
581
|
-
// runs normally.
|
|
582
454
|
if (strategy === 'clone') {
|
|
583
455
|
const donor = resolveCloneDonor(ctx);
|
|
584
456
|
const probe = isInstallSkippable({ wtPath, donorPath: donor });
|
|
@@ -592,10 +464,7 @@ export function installDependencies(ctx, wtPath) {
|
|
|
592
464
|
`worktree.install strategy=clone install reason=${probe.reason} path=${wtPath}`,
|
|
593
465
|
);
|
|
594
466
|
}
|
|
595
|
-
//
|
|
596
|
-
// worktree's own install runs. No-op for non-pnpm-store strategies. Prime
|
|
597
|
-
// failures are surfaced as warnings but do not short-circuit the install —
|
|
598
|
-
// the retry ladder below still gets its full budget of attempts.
|
|
467
|
+
// A failed prime only warns; the install keeps its full retry budget.
|
|
599
468
|
if (strategy === 'pnpm-store' && ctx.repoRoot) {
|
|
600
469
|
primePnpmStore({
|
|
601
470
|
strategy,
|
|
@@ -618,10 +487,7 @@ export function installDependencies(ctx, wtPath) {
|
|
|
618
487
|
});
|
|
619
488
|
const verdict = verifyInstallOutcome(ctx, wtPath, selection, run, policy);
|
|
620
489
|
if (verdict) return verdict;
|
|
621
|
-
//
|
|
622
|
-
// node_modules is backed by a shared content-addressable store rather
|
|
623
|
-
// than a self-contained tree. Report `skipped` so the workflow treats
|
|
624
|
-
// dependency state as N/A and trusts the strategy.
|
|
490
|
+
// Store-backed, not self-contained: report `skipped` (dependency state N/A).
|
|
625
491
|
if (strategy === 'pnpm-store') {
|
|
626
492
|
return { status: 'skipped', reason: 'pnpm-store-strategy' };
|
|
627
493
|
}
|
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* WorktreeManager — single authority over per-story git worktrees
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* - `lib/worktree/node-modules-strategy.js` — per-worktree / symlink / pnpm-store.
|
|
7
|
-
* - `lib/worktree/bootstrapper.js` — bootstrap-file copy.
|
|
8
|
-
* - `lib/worktree/inspector.js` — pure path + porcelain parsing helpers.
|
|
9
|
-
*
|
|
10
|
-
* External callers import `WorktreeManager` and `parseWorktreePorcelain` from
|
|
11
|
-
* this module path; those exports are preserved verbatim so no other file in
|
|
12
|
-
* the repo needs to change.
|
|
13
|
-
*
|
|
14
|
-
* No other script may call `git worktree` directly. All git calls flow
|
|
15
|
-
* through the injected `ctx.git` (defaults to `./git-utils.js`). Paths are
|
|
16
|
-
* resolved and asserted to live inside `repoRoot`, and callers cannot request
|
|
17
|
-
* force removal; bounded internal fallbacks live in the lifecycle module.
|
|
2
|
+
* WorktreeManager — the single authority over per-story git worktrees, a
|
|
3
|
+
* facade over `lib/worktree/*`. No other script may call `git worktree`.
|
|
4
|
+
* Paths are asserted inside `repoRoot` and callers cannot request force
|
|
5
|
+
* removal.
|
|
18
6
|
*/
|
|
19
7
|
|
|
20
8
|
import path from 'node:path';
|
|
@@ -46,16 +34,13 @@ export { parseWorktreePorcelain };
|
|
|
46
34
|
export class WorktreeManager {
|
|
47
35
|
/**
|
|
48
36
|
* @param {object} opts
|
|
49
|
-
* @param {string} opts.repoRoot
|
|
37
|
+
* @param {string} opts.repoRoot
|
|
50
38
|
* @param {object} [opts.config] Resolved `orchestration.worktreeIsolation` config.
|
|
51
|
-
* @param {object} [opts.logger]
|
|
52
|
-
* @param {object} [opts.git] Injected `{ gitSync, gitSpawn }
|
|
53
|
-
* @param {NodeJS.Platform} [opts.platform]
|
|
39
|
+
* @param {object} [opts.logger]
|
|
40
|
+
* @param {object} [opts.git] Injected `{ gitSync, gitSpawn }`.
|
|
41
|
+
* @param {NodeJS.Platform} [opts.platform]
|
|
54
42
|
* @param {(phase: 'worktree-create'|'bootstrap'|'install') => void} [opts.onPhase]
|
|
55
|
-
*
|
|
56
|
-
* internal phase (git worktree add, bootstrap-file copy, dependency
|
|
57
|
-
* install), so a caller can attribute wall-clock to the sub-phases of
|
|
58
|
-
* worktree provisioning.
|
|
43
|
+
* Fired before each `ensure()` phase, for wall-clock attribution.
|
|
59
44
|
*/
|
|
60
45
|
constructor({
|
|
61
46
|
repoRoot,
|
|
@@ -101,9 +86,7 @@ export class WorktreeManager {
|
|
|
101
86
|
}
|
|
102
87
|
|
|
103
88
|
/**
|
|
104
|
-
*
|
|
105
|
-
* each call so mutating `this.config` between calls is respected, but the
|
|
106
|
-
* cache slot is a stable object so all helpers see the same list.
|
|
89
|
+
* Rebuilt per call so config mutations are seen; the cache slot is stable.
|
|
107
90
|
*/
|
|
108
91
|
_ctx() {
|
|
109
92
|
return {
|
|
@@ -120,9 +103,7 @@ export class WorktreeManager {
|
|
|
120
103
|
maybeWarnWindowsPath(
|
|
121
104
|
{
|
|
122
105
|
platform: this.platform,
|
|
123
|
-
//
|
|
124
|
-
// tracks Windows MAX_PATH minus headroom for the worktree's own
|
|
125
|
-
// path overhead — not a domain knob operators tune.
|
|
106
|
+
// Windows MAX_PATH minus headroom; not an operator knob.
|
|
126
107
|
threshold: 240,
|
|
127
108
|
logger: this.logger,
|
|
128
109
|
},
|
|
@@ -177,23 +158,20 @@ export class WorktreeManager {
|
|
|
177
158
|
};
|
|
178
159
|
}
|
|
179
160
|
|
|
180
|
-
/** Absolute path for a given storyId. */
|
|
181
161
|
pathFor(storyId) {
|
|
182
162
|
return pathFor(this._ctx(), storyId);
|
|
183
163
|
}
|
|
184
164
|
|
|
185
165
|
/**
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
* short-circuit to no-op shapes in that case so the off-branch never
|
|
189
|
-
* touches fs or git regardless of caller-side gating drift.
|
|
166
|
+
* When disabled, mutating methods return no-op shapes and never touch fs or
|
|
167
|
+
* git, whatever the caller's gating.
|
|
190
168
|
*/
|
|
191
169
|
_isDisabled() {
|
|
192
170
|
return this.config?.enabled === false;
|
|
193
171
|
}
|
|
194
172
|
|
|
195
173
|
/**
|
|
196
|
-
*
|
|
174
|
+
* Idempotent.
|
|
197
175
|
*
|
|
198
176
|
* @param {number|string} storyId
|
|
199
177
|
* @param {string} branch
|
|
@@ -210,22 +188,19 @@ export class WorktreeManager {
|
|
|
210
188
|
return ensure(this._ctx(), storyId, branch);
|
|
211
189
|
}
|
|
212
190
|
|
|
213
|
-
/** Enumerate all worktrees known to git. */
|
|
214
191
|
list() {
|
|
215
192
|
return list(this._ctx());
|
|
216
193
|
}
|
|
217
194
|
|
|
218
|
-
/** Check whether a worktree is safe to remove. */
|
|
219
195
|
isSafeToRemove(wtPath, opts) {
|
|
220
196
|
return isSafeToRemove(this._ctx(), wtPath, opts);
|
|
221
197
|
}
|
|
222
198
|
|
|
223
|
-
/** Prune stale git worktree registrations for directories that no longer exist. */
|
|
224
199
|
prune() {
|
|
225
200
|
return prune(this._ctx());
|
|
226
201
|
}
|
|
227
202
|
|
|
228
|
-
/**
|
|
203
|
+
/** Rejects caller-requested force. */
|
|
229
204
|
reap(storyId, opts) {
|
|
230
205
|
if (this._isDisabled()) {
|
|
231
206
|
return {
|