mandrel 2.59.0 → 2.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +21 -19
- package/.agents/agents/acceptance-critic.md +24 -43
- package/.agents/agents/story-worker.md +20 -21
- package/.agents/docs/agentrc-reference.json +5 -84
- package/.agents/docs/configuration.md +48 -132
- package/.agents/docs/workflows.md +2 -2
- package/.agents/instructions.md +5 -8
- package/.agents/rules/ci-remediation.md +41 -8
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
- package/.agents/schemas/agentrc.schema.json +16 -496
- package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +23 -13
- package/.agents/scripts/acceptance-eval.js +35 -169
- 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 +10 -41
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +105 -311
- 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 +34 -98
- package/.agents/scripts/deliver-light.js +25 -171
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +534 -0
- 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 +57 -49
- 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 +7 -19
- 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 +39 -121
- 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 -34
- package/.agents/scripts/lib/config/explain.js +10 -83
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
- 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 +11 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
- 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 +18 -35
- package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
- package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
- 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 -124
- 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 +94 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
- 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 +123 -191
- 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 +22 -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 +28 -156
- 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 +121 -157
- 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 +118 -462
- 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 +37 -307
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
- 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 +16 -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 +71 -289
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
- 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 -91
- 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 +245 -326
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
- 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 +180 -273
- 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 -200
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
- 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 -135
- 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 +63 -344
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
- 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 +51 -66
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +123 -344
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
- 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 +67 -209
- 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 -105
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +97 -92
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +71 -137
- package/.agents/scripts/plan-run-epilogue.js +20 -43
- package/.agents/scripts/pr-watch-with-update.js +79 -263
- 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 -259
- package/.agents/scripts/stories-wave-tick.js +179 -415
- 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/skills/core/gates-and-baselines/reference.md +0 -1
- package/.agents/skills/skills.index.json +2 -2
- package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
- 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/acceptance-self-eval.md +84 -157
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/code-review.md +4 -2
- package/.agents/workflows/helpers/deliver-digest.md +37 -28
- package/.agents/workflows/helpers/deliver-light.md +92 -101
- package/.agents/workflows/helpers/deliver-reference.md +162 -220
- package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
- package/.agents/workflows/helpers/deliver-story.md +17 -18
- package/.agents/workflows/helpers/plan-reference.md +125 -167
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/mandrel-deliver.md +47 -31
- package/.agents/workflows/mandrel-plan.md +22 -21
- package/.agents/workflows/mandrel-update.md +36 -21
- 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 +60 -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 +326 -523
- 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 +17 -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 +21 -0
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +17 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1179
- package/.agents/rules/known-tooling-behavior.md +0 -150
- 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/schemas/model-attribution.schema.json +0 -53
- 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 -366
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -332
- 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/orchestration/model-attribution.js +0 -418
- package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
- package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
- 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 -118
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,43 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// `--check`
|
|
8
|
-
// generator output (ignoring the volatile `generatedAt` field) and exits
|
|
9
|
-
// non-zero with a diff-style message if they diverge.
|
|
10
|
-
//
|
|
11
|
-
// Two indexes, never one (Story #5135). The shipped manifest above is a
|
|
12
|
-
// committed payload file that `mandrel doctor` / `mandrel sync-agents`
|
|
13
|
-
// compare byte-for-byte against the installed package, so consumer-authored
|
|
14
|
-
// skills under the `.agents/local/skills/` zone MUST NOT be folded into it —
|
|
15
|
-
// a merged index would read as payload drift in every consumer that authored
|
|
16
|
-
// a skill, and those commands would refuse. Local skills are therefore
|
|
17
|
-
// indexed into their own `.agents/local/skills/skills.index.json`, inside
|
|
18
|
-
// the zone sync never prunes and drift never walks.
|
|
19
|
-
//
|
|
20
|
-
// CLI surface:
|
|
21
|
-
//
|
|
22
|
-
// node generate-skills-index.js [--check] [--root <dir>] [--out <file>]
|
|
23
|
-
//
|
|
24
|
-
// --check Read the on-disk manifest, compare to generator output
|
|
25
|
-
// modulo `generatedAt`. Exit 0 on match, non-zero on
|
|
26
|
-
// drift. Does not write.
|
|
27
|
-
// --root <dir> Use <dir> as the repo root (defaults to the project
|
|
28
|
-
// root containing `.agents/skills`). Useful for tests
|
|
29
|
-
// staging fixture trees outside the real repo.
|
|
30
|
-
// --out <file> Override the manifest output path (defaults to
|
|
31
|
-
// `<root>/.agents/skills/skills.index.json`).
|
|
32
|
-
//
|
|
33
|
-
// Written output is passed through the project formatter (Biome) so that
|
|
34
|
-
// regenerating on a clean tree leaves no format drift behind; the step is
|
|
35
|
-
// best-effort and degrades to plain `JSON.stringify` output where Biome is
|
|
36
|
-
// not installed. See `lib/format-generated-json.js`.
|
|
37
|
-
//
|
|
38
|
-
// Honors AGENT_LOG_LEVEL via the shared `Logger`. Stdout is reserved for
|
|
39
|
-
// the diff text in --check failure mode; informational progress goes to
|
|
40
|
-
// stderr.
|
|
2
|
+
// Writes `.agents/skills/skills.index.json` from every payload SKILL.md;
|
|
3
|
+
// `--check` compares modulo `generatedAt`. Consumer skills under
|
|
4
|
+
// `.agents/local/skills/` get their own index and must never be merged into
|
|
5
|
+
// the payload one: doctor/sync-agents compare it byte-for-byte against the
|
|
6
|
+
// package and would read a merged index as drift. Stdout is reserved for the
|
|
7
|
+
// `--check` diff; progress goes to stderr.
|
|
41
8
|
|
|
42
9
|
import fs from 'node:fs';
|
|
43
10
|
import path from 'node:path';
|
|
@@ -72,11 +39,7 @@ function defaultRepoRoot() {
|
|
|
72
39
|
return path.resolve(here, '..', '..');
|
|
73
40
|
}
|
|
74
41
|
|
|
75
|
-
/**
|
|
76
|
-
* Parse CLI flags. Returns `{ check, root, out }`. Unknown flags trigger
|
|
77
|
-
* a thrown Error (from the shared parser) so the runAsCli boundary can
|
|
78
|
-
* surface a clean message.
|
|
79
|
-
*/
|
|
42
|
+
/** Unknown flags throw, for runAsCli to surface. */
|
|
80
43
|
export function parseArgs(argv) {
|
|
81
44
|
if (argv.some((t) => t === '--help' || t === '-h')) {
|
|
82
45
|
return { check: false, root: null, out: null, help: true };
|
|
@@ -92,15 +55,7 @@ export function parseArgs(argv) {
|
|
|
92
55
|
return { check: values.check, root: values.root, out: values.out };
|
|
93
56
|
}
|
|
94
57
|
|
|
95
|
-
/**
|
|
96
|
-
* Project a parseSkill result into an index entry shaped by
|
|
97
|
-
* `.agents/schemas/skills-index.schema.json`.
|
|
98
|
-
*
|
|
99
|
-
* Post-Wave-2 every SKILL.md carries a 5–12-bullet Policy Capsule.
|
|
100
|
-
* `policyCapsuleBullets` records that count for the manifest entry.
|
|
101
|
-
* A value of `0` means the parser did not find the capsule section and
|
|
102
|
-
* is a validator-rejected condition (see validate-skills.js).
|
|
103
|
-
*/
|
|
58
|
+
/** `policyCapsuleBullets: 0` means no capsule was found (validator-rejected). */
|
|
104
59
|
function projectEntry(parsed) {
|
|
105
60
|
return {
|
|
106
61
|
name: parsed.name,
|
|
@@ -119,10 +74,6 @@ function projectEntry(parsed) {
|
|
|
119
74
|
};
|
|
120
75
|
}
|
|
121
76
|
|
|
122
|
-
/**
|
|
123
|
-
* Build the manifest object (without `generatedAt`) by walking the tree
|
|
124
|
-
* and projecting each parsed SKILL.md into an index entry.
|
|
125
|
-
*/
|
|
126
77
|
export function buildManifestBody(repoRoot, collect = collectSkillFiles) {
|
|
127
78
|
const skillFiles = collect(repoRoot);
|
|
128
79
|
const skills = skillFiles.map((absPath) =>
|
|
@@ -134,10 +85,6 @@ export function buildManifestBody(repoRoot, collect = collectSkillFiles) {
|
|
|
134
85
|
};
|
|
135
86
|
}
|
|
136
87
|
|
|
137
|
-
/**
|
|
138
|
-
* Build the full manifest with `generatedAt`. `nowIso` is injected so
|
|
139
|
-
* tests can pin the timestamp deterministically.
|
|
140
|
-
*/
|
|
141
88
|
export function buildManifest(repoRoot, { nowIso, collect } = {}) {
|
|
142
89
|
const body = buildManifestBody(repoRoot, collect);
|
|
143
90
|
return {
|
|
@@ -148,44 +95,24 @@ export function buildManifest(repoRoot, { nowIso, collect } = {}) {
|
|
|
148
95
|
}
|
|
149
96
|
|
|
150
97
|
/**
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
* byte-identical output modulo `generatedAt`.
|
|
154
|
-
*
|
|
155
|
-
* This is the *pre-format* shape. `JSON.stringify` expands every array
|
|
156
|
-
* across multiple lines, while Biome collapses short ones that fit
|
|
157
|
-
* inside `lineWidth` (`"allowedTools": ["Read", "Bash"]`). Writing this
|
|
158
|
-
* text verbatim therefore leaves the tree format-dirty on every run —
|
|
159
|
-
* see `lib/format-generated-json.js`, which reconciles the two.
|
|
98
|
+
* Pre-format shape: Biome collapses short arrays this expands, so writes go
|
|
99
|
+
* through `formatGeneratedJson` or the tree is format-dirty on every run.
|
|
160
100
|
*/
|
|
161
101
|
export function serializeManifest(manifest) {
|
|
162
102
|
return `${JSON.stringify(manifest, null, 2)}\n`;
|
|
163
103
|
}
|
|
164
104
|
|
|
165
|
-
/**
|
|
166
|
-
* Resolve the manifest output path given (root, optional explicit
|
|
167
|
-
* override).
|
|
168
|
-
*/
|
|
169
105
|
function resolveOutPath(root, override) {
|
|
170
106
|
return override
|
|
171
107
|
? path.resolve(override)
|
|
172
108
|
: indexPathFor(root, PAYLOAD_SKILLS_SEGMENTS);
|
|
173
109
|
}
|
|
174
110
|
|
|
175
|
-
/**
|
|
176
|
-
* Resolve the local-zone manifest path. Deliberately NOT overridable by
|
|
177
|
-
* `--out`: that flag redirects the payload manifest (tests stage fixture
|
|
178
|
-
* trees with it), and letting it also move the local manifest would let one
|
|
179
|
-
* invocation write both indexes to the same file.
|
|
180
|
-
*/
|
|
111
|
+
/** Not overridable by `--out`, or one run could write both indexes to one file. */
|
|
181
112
|
function resolveLocalOutPath(root) {
|
|
182
113
|
return indexPathFor(root, LOCAL_SKILLS_SEGMENTS);
|
|
183
114
|
}
|
|
184
115
|
|
|
185
|
-
/**
|
|
186
|
-
* Write one manifest through the project formatter so a regeneration on a
|
|
187
|
-
* clean tree leaves no format drift behind.
|
|
188
|
-
*/
|
|
189
116
|
function writeManifest(manifest, outPath, root) {
|
|
190
117
|
const serialized = serializeManifest(manifest);
|
|
191
118
|
const opts = { cwd: root, filename: INDEX_FILENAME };
|
|
@@ -196,12 +123,7 @@ function writeManifest(manifest, outPath, root) {
|
|
|
196
123
|
);
|
|
197
124
|
}
|
|
198
125
|
|
|
199
|
-
/**
|
|
200
|
-
* Write (or reap) the local-zone manifest. A consumer who deletes their last
|
|
201
|
-
* local skill would otherwise be left with a stale index reporting skills
|
|
202
|
-
* that no longer exist, so an emptied zone removes the artifact rather than
|
|
203
|
-
* leaving it behind.
|
|
204
|
-
*/
|
|
126
|
+
/** An emptied local zone removes its index rather than leave a stale one. */
|
|
205
127
|
function writeLocalManifest(localFresh, localOutPath, root) {
|
|
206
128
|
const rel = path.relative(root, localOutPath).split(path.sep).join('/');
|
|
207
129
|
if (localFresh === null) {
|
|
@@ -215,11 +137,6 @@ function writeLocalManifest(localFresh, localOutPath, root) {
|
|
|
215
137
|
Logger.info(`wrote ${rel} (${localFresh.skills.length} entries)`);
|
|
216
138
|
}
|
|
217
139
|
|
|
218
|
-
/**
|
|
219
|
-
* Compare the local-zone manifest against fresh generator output. Returns
|
|
220
|
-
* null when in sync (including the common case of no local skills and no
|
|
221
|
-
* artifact), or a diff-style message.
|
|
222
|
-
*/
|
|
223
140
|
function checkLocalManifest(localFresh, localOutPath) {
|
|
224
141
|
const exists = fs.existsSync(localOutPath);
|
|
225
142
|
if (localFresh === null) {
|
|
@@ -240,13 +157,7 @@ function checkLocalManifest(localFresh, localOutPath) {
|
|
|
240
157
|
}
|
|
241
158
|
|
|
242
159
|
/**
|
|
243
|
-
*
|
|
244
|
-
* and a fresh manifest when the consumer has authored any local skill (null
|
|
245
|
-
* otherwise, which is the signal to reap a stale artifact).
|
|
246
|
-
*
|
|
247
|
-
* Split out of `run` so the payload path and the local path each read as one
|
|
248
|
-
* step there rather than interleaving.
|
|
249
|
-
*
|
|
160
|
+
* A null `localFresh` signals reaping a stale artifact.
|
|
250
161
|
* @param {string} root
|
|
251
162
|
* @param {Date} now
|
|
252
163
|
* @returns {{ localFresh: object | null, localOutPath: string }}
|
|
@@ -264,9 +175,6 @@ function buildLocalPlan(root, now) {
|
|
|
264
175
|
}
|
|
265
176
|
|
|
266
177
|
/**
|
|
267
|
-
* Render the freshness line's entry counts, naming the local zone only when
|
|
268
|
-
* one exists.
|
|
269
|
-
*
|
|
270
178
|
* @param {object} fresh
|
|
271
179
|
* @param {object | null} localFresh
|
|
272
180
|
* @returns {string}
|
|
@@ -279,13 +187,7 @@ function describeCounts(fresh, localFresh) {
|
|
|
279
187
|
}
|
|
280
188
|
|
|
281
189
|
/**
|
|
282
|
-
*
|
|
283
|
-
* report the first drift found, payload first.
|
|
284
|
-
*
|
|
285
|
-
* Lives outside `run` so the entry point reads as "resolve inputs, then check
|
|
286
|
-
* or write" — and so the check path's branches are not charged to a function
|
|
287
|
-
* that also owns argument resolution.
|
|
288
|
-
*
|
|
190
|
+
* Reports the first drift found, payload first.
|
|
289
191
|
* @param {{ outPath: string, fresh: object, localOutPath: string, localFresh: object | null }} plan
|
|
290
192
|
* @returns {{ status: number, output: string }}
|
|
291
193
|
*/
|
|
@@ -1,33 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `.agents/docs/workflows.md` from the on-disk workflow set under
|
|
7
|
-
* `.agents/workflows/*.md` (top-level only — `helpers/` are path-included
|
|
8
|
-
* modules, not runnable slash commands). The catalog logic is shared with
|
|
9
|
-
* the in-process backend in `lib/mandrel-catalog.js`, so the generated doc
|
|
10
|
-
* and any programmatic catalog reader never drift from one another.
|
|
11
|
-
*
|
|
12
|
-
* Why generated (Story #3708): `workflows.md` used to be hand-maintained and
|
|
13
|
-
* was *not* drift-gated, so it could silently fall out of sync with the
|
|
14
|
-
* actual workflow set. The retired `/mandrel` discoverability command was
|
|
15
|
-
* always accurate because it rendered the catalog live. Rather than keep the
|
|
16
|
-
* drift-prone hand-authored doc and the accurate-but-ephemeral command, this
|
|
17
|
-
* generator makes the doc itself a rendering of the same catalog, gates it via
|
|
18
|
-
* `--check`, and ships it to consumers under `.agents/docs/`.
|
|
19
|
-
*
|
|
20
|
-
* Modes:
|
|
21
|
-
* (default) — rewrites `.agents/docs/workflows.md` in full from the
|
|
22
|
-
* current workflow set.
|
|
23
|
-
* --check — exits 0 when the on-disk file matches the freshly generated
|
|
24
|
-
* content, throws (→ exit 1) with a regeneration hint otherwise.
|
|
25
|
-
* --root — read and write under another checkout's `.agents/` tree.
|
|
26
|
-
* See {@link resolveTargets} for why this seam exists.
|
|
27
|
-
*
|
|
28
|
-
* Per `.agents/rules/orchestration-error-handling.md`, unrecoverable failures
|
|
29
|
-
* surface via `throw new Error(...)` so `runAsCli` maps the throw to
|
|
30
|
-
* `process.exit(1)` deterministically (no `Logger.fatal`).
|
|
3
|
+
* Renders `.agents/docs/workflows.md` from the top-level workflow set via the
|
|
4
|
+
* shared `lib/mandrel-catalog.js`, so the doc and programmatic readers cannot
|
|
5
|
+
* drift; `--check` gates it.
|
|
31
6
|
*/
|
|
32
7
|
|
|
33
8
|
import fs from 'node:fs';
|
|
@@ -43,28 +18,9 @@ const __dirname = path.dirname(__filename);
|
|
|
43
18
|
const PROJECT_ROOT = path.resolve(__dirname, '..', '..');
|
|
44
19
|
|
|
45
20
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* The `--root` seam this backs exists for the drift gate's own test. That
|
|
50
|
-
* test used to prove the gate by editing the *real*
|
|
51
|
-
* `.agents/workflows/mandrel-deliver.md`, running `--check`, and restoring
|
|
52
|
-
* the file in `afterEach`. The proof was sound; the blast radius was not.
|
|
53
|
-
* `node --test` runs test files in parallel against one shared checkout, so
|
|
54
|
-
* for the ~1s the real file sat mutated, every other test file observed a
|
|
55
|
-
* dirty tree — and `tests/enforcement/workflow-script-help.test.js`, whose
|
|
56
|
-
* final assertion is a repo-wide `git status --porcelain`, reported it as
|
|
57
|
-
* "`--help` mutated the working tree" on the Windows Smoke job, where the
|
|
58
|
-
* wider process-spawn cost stretches that window far enough to collide.
|
|
59
|
-
*
|
|
60
|
-
* A generator that can only ever be pointed at its own checkout forces that
|
|
61
|
-
* choice. Pointing it at a fixture root removes it.
|
|
62
|
-
*
|
|
63
|
-
* The `--root` default is applied here rather than at the call site so the
|
|
64
|
-
* one branch it costs lives with the resolution it belongs to.
|
|
65
|
-
*
|
|
66
|
-
* @param {string} [root] Repository root to render against; defaults to this
|
|
67
|
-
* checkout. A relative path is resolved against the process cwd.
|
|
21
|
+
* The `--root` seam lets the drift gate's test use a fixture root: mutating
|
|
22
|
+
* the real workflow file dirties the shared checkout for parallel test files.
|
|
23
|
+
* @param {string} [root]
|
|
68
24
|
* @returns {{ root: string, workflowsDir: string, docPath: string }}
|
|
69
25
|
*/
|
|
70
26
|
export function resolveTargets(root) {
|
|
@@ -76,21 +32,11 @@ export function resolveTargets(root) {
|
|
|
76
32
|
};
|
|
77
33
|
}
|
|
78
34
|
|
|
79
|
-
/** This checkout's own targets — the default when `--root` is absent. */
|
|
80
35
|
const { workflowsDir: WORKFLOWS_DIR, docPath: DOC_PATH } = resolveTargets();
|
|
81
36
|
|
|
82
37
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* - pipe characters (`|`) so a description can never break the table grid;
|
|
86
|
-
* - stray newlines;
|
|
87
|
-
* - bare emphasis markers (`*`, `_`) so a glob like `audit-*` in a
|
|
88
|
-
* description is rendered literally instead of being parsed as emphasis
|
|
89
|
-
* (which trips markdownlint MD037 in the generated doc).
|
|
90
|
-
*
|
|
91
|
-
* Framework workflow descriptions do not embed `*`/`_` inside inline code
|
|
92
|
-
* spans, so a global escape is safe and keeps the generator pure.
|
|
93
|
-
*
|
|
38
|
+
* Escapes `*`/`_` so a glob like `audit-*` is not parsed as emphasis (MD037);
|
|
39
|
+
* safe globally because descriptions put neither inside code spans.
|
|
94
40
|
* @param {string | null} description
|
|
95
41
|
* @returns {string}
|
|
96
42
|
*/
|
|
@@ -103,9 +49,6 @@ function cellEscape(description) {
|
|
|
103
49
|
}
|
|
104
50
|
|
|
105
51
|
/**
|
|
106
|
-
* Render the full generated `workflows.md` content from the flat command
|
|
107
|
-
* catalog and the loop-unit catalog.
|
|
108
|
-
*
|
|
109
52
|
* @param {Array<{ name: string, description: string | null, vague: boolean }>} catalog
|
|
110
53
|
* @param {Array<{ name: string, description: string | null, vague: boolean }>} [loopCatalog]
|
|
111
54
|
* @returns {string}
|
|
@@ -124,7 +67,7 @@ export function renderWorkflowsDoc(catalog, loopCatalog = []) {
|
|
|
124
67
|
'This is an **auto-generated reference index** of every slash command shipped',
|
|
125
68
|
'under `.agents/workflows/` (top-level only — `helpers/` are path-included',
|
|
126
69
|
'modules, not runnable commands). The canonical workflow narrative lives in',
|
|
127
|
-
'[`SDLC.md`](SDLC.md) — read that first to understand how the commands',
|
|
70
|
+
'[`SDLC.md`](https://github.com/dsj1984/mandrel/blob/main/docs/SDLC.md) — read that first to understand how the commands',
|
|
128
71
|
'compose. This file is only for "which command does X?" lookups.',
|
|
129
72
|
'',
|
|
130
73
|
'Every command file lives at `.agents/workflows/<name>.md` and is projected',
|
|
@@ -184,10 +127,7 @@ export function renderWorkflowsDoc(catalog, loopCatalog = []) {
|
|
|
184
127
|
}
|
|
185
128
|
|
|
186
129
|
/**
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
* @param {string} [root] Repository root to render against; see
|
|
190
|
-
* {@link resolveTargets}.
|
|
130
|
+
* @param {string} [root]
|
|
191
131
|
* @returns {{
|
|
192
132
|
* generated: string,
|
|
193
133
|
* original: string | null,
|
|
@@ -2,41 +2,9 @@
|
|
|
2
2
|
/* node:coverage ignore file -- multi-phase repo-cleanup CLI; thin shell over `git` + `gh` */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
* cleanup pipeline.
|
|
5
|
+
* Thin CLI shell over the `lib/orchestration/git-cleanup/phases/` pipeline.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* 1. parse-args — argv → normalized opts bag (`parseCleanupArgs`).
|
|
11
|
-
* 2. filters — pure glob + protected-branch helpers.
|
|
12
|
-
* 3. git-probes — every `gitSpawn` / `gh` subprocess wrapper plus
|
|
13
|
-
* small parsers (`probeMergedPr`, etc).
|
|
14
|
-
* 4. branches — merged-branch reap (`planCleanup`,
|
|
15
|
-
* `executeCleanup`).
|
|
16
|
-
* 5. fast-forward — fast-forward-main phase.
|
|
17
|
-
* 6. prune — prune-remotes phase + `parsePrunedRefs`.
|
|
18
|
-
* 7. stashes — stash triage (`parseStashList`, `planStashes`,
|
|
19
|
-
* `executeStashes`, `stashRefIndex`,
|
|
20
|
-
* `buildAllowlistDecider`).
|
|
21
|
-
* 8. render — operator-facing renderers + `buildJsonEnvelope`,
|
|
22
|
-
* `computeExitCode`.
|
|
23
|
-
* 9. cli — interactive prompts + per-phase drivers + `main`.
|
|
24
|
-
*
|
|
25
|
-
* Public CLI surface, named exports, and exit codes are byte-identical
|
|
26
|
-
* to the pre-refactor implementation. See the original module docstring
|
|
27
|
-
* (preserved below) for the operator-facing flag + phase contract.
|
|
28
|
-
*
|
|
29
|
-
* Phases (selectable, run sequentially when no narrowing flag set):
|
|
30
|
-
* 1. fast-forward-main — `git fetch origin <base>` → `git merge --ff-only`.
|
|
31
|
-
* 2. prune-remotes — `git fetch --prune <remote>`.
|
|
32
|
-
* 3. branches — enumerate merged local branches via `gh pr list`
|
|
33
|
-
* + `git branch --merged <base>` and reap.
|
|
34
|
-
* 4. stashes — `git stash list` → optional per-stash drops.
|
|
35
|
-
*
|
|
36
|
-
* Exit codes:
|
|
37
|
-
* 0 — clean (dry-run preview, or every active phase succeeded).
|
|
38
|
-
* 1 — at least one phase reported a failure.
|
|
39
|
-
* 2 — every active phase produced nothing to do (informational).
|
|
7
|
+
* Exit codes: 0 clean or dry-run, 1 a phase failed, 2 nothing to do.
|
|
40
8
|
*/
|
|
41
9
|
|
|
42
10
|
import { runAsCli } from './lib/cli-utils.js';
|
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Graph.js
|
|
3
|
-
* Extracted mathematical DAG logic for topological sorting, cycle detection,
|
|
4
|
-
* transitive reduction, and auto-serialization of concurrent task overlaps.
|
|
5
|
-
*/
|
|
1
|
+
/** DAG utilities: cycle detection, layering, reduction, topological sort. */
|
|
6
2
|
|
|
7
|
-
/**
|
|
8
|
-
* Builds an adjacency list from the manifest tasks.
|
|
9
|
-
* Returns { adjacency: Map<id, id[]>, taskMap: Map<id, task> }
|
|
10
|
-
*/
|
|
3
|
+
/** Returns { adjacency: Map<id, id[]>, taskMap: Map<id, task> }. */
|
|
11
4
|
export function buildGraph(tasks) {
|
|
12
5
|
const adjacency = new Map();
|
|
13
6
|
const taskMap = new Map();
|
|
@@ -20,10 +13,7 @@ export function buildGraph(tasks) {
|
|
|
20
13
|
return { adjacency, taskMap };
|
|
21
14
|
}
|
|
22
15
|
|
|
23
|
-
/**
|
|
24
|
-
* Detects cycles using DFS. Returns the first cycle found as an array of ids,
|
|
25
|
-
* or null if the graph is acyclic.
|
|
26
|
-
*/
|
|
16
|
+
/** The first cycle found as an array of ids, or null. */
|
|
27
17
|
export function detectCycle(adjacency) {
|
|
28
18
|
const WHITE = 0,
|
|
29
19
|
_GRAY = 1,
|
|
@@ -50,7 +40,7 @@ function dfsVisit(u, adjacency, color, parent) {
|
|
|
50
40
|
|
|
51
41
|
for (const v of adjacency.get(u) || []) {
|
|
52
42
|
if (color.get(v) === 1) {
|
|
53
|
-
// Back edge
|
|
43
|
+
// Back edge: reconstruct the cycle.
|
|
54
44
|
const cycle = [v, u];
|
|
55
45
|
let cur = u;
|
|
56
46
|
while (parent.has(cur) && parent.get(cur) !== v) {
|
|
@@ -70,10 +60,7 @@ function dfsVisit(u, adjacency, color, parent) {
|
|
|
70
60
|
return null;
|
|
71
61
|
}
|
|
72
62
|
|
|
73
|
-
/**
|
|
74
|
-
* Assigns each task a layer (depth from root). Root tasks (no dependencies)
|
|
75
|
-
* are layer 0. Returns Map<id, layer>.
|
|
76
|
-
*/
|
|
63
|
+
/** Depth from root (roots are layer 0) as Map<id, layer>. */
|
|
77
64
|
export function assignLayers(adjacency) {
|
|
78
65
|
const layers = new Map();
|
|
79
66
|
const memo = new Map();
|
|
@@ -101,36 +88,18 @@ export function assignLayers(adjacency) {
|
|
|
101
88
|
}
|
|
102
89
|
|
|
103
90
|
/**
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* Removes edge (u→v) iff some *other* direct dependency w of u satisfies
|
|
107
|
-
* v ∈ reach(w) — i.e. v is reachable from u via a path of length > 1 that
|
|
108
|
-
* does not use the edge (u→v) itself.
|
|
91
|
+
* Remove edge (u→v) iff another direct dependency of u already reaches v.
|
|
109
92
|
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* check is then O(1) (`reach(w).has(v)`), making the overall reduction
|
|
115
|
-
* O(V+E) on top of the (amortized) cost of producing `reachable` once.
|
|
116
|
-
*
|
|
117
|
-
* Single-arg form (back-compat): when `reachable` is omitted we compute
|
|
118
|
-
* it locally via `computeReachability(adjacency)` so the function stays
|
|
119
|
-
* a drop-in replacement for the historical single-argument signature.
|
|
120
|
-
* Output is byte-identical between the two forms.
|
|
121
|
-
*
|
|
122
|
-
* @param {Map<*, *[]>} adjacency Dependency map (node → deps[]).
|
|
123
|
-
* @param {Map<*, Set<*>>} [reachable] Optional pre-computed reachability
|
|
124
|
-
* matrix matching `adjacency`. When supplied it MUST cover every node
|
|
125
|
-
* in `adjacency` — passing a partial map will silently corrupt output.
|
|
126
|
-
* @returns {Map<*, *[]>} Reduced adjacency map.
|
|
93
|
+
* @param {Map<*, *[]>} adjacency node → deps[].
|
|
94
|
+
* @param {Map<*, Set<*>>} [reachable] Precomputed reachability; when given it
|
|
95
|
+
* MUST cover every node, or output is silently corrupt.
|
|
96
|
+
* @returns {Map<*, *[]>}
|
|
127
97
|
*/
|
|
128
98
|
export function transitiveReduction(adjacency, reachable) {
|
|
129
99
|
const reach = reachable ?? computeReachability(adjacency);
|
|
130
100
|
const result = new Map();
|
|
131
101
|
|
|
132
102
|
for (const [node, deps] of adjacency.entries()) {
|
|
133
|
-
// Early-return: nodes with zero or one dependency cannot have redundant edges
|
|
134
103
|
if (deps.length <= 1) {
|
|
135
104
|
result.set(node, [...deps]);
|
|
136
105
|
continue;
|
|
@@ -138,8 +107,6 @@ export function transitiveReduction(adjacency, reachable) {
|
|
|
138
107
|
|
|
139
108
|
const kept = [];
|
|
140
109
|
for (const dep of deps) {
|
|
141
|
-
// Edge (node → dep) is redundant iff some other direct dep `other`
|
|
142
|
-
// of `node` already reaches `dep` transitively.
|
|
143
110
|
let isRedundant = false;
|
|
144
111
|
for (const other of deps) {
|
|
145
112
|
if (other === dep) continue;
|
|
@@ -156,12 +123,8 @@ export function transitiveReduction(adjacency, reachable) {
|
|
|
156
123
|
return result;
|
|
157
124
|
}
|
|
158
125
|
|
|
159
|
-
/**
|
|
160
|
-
* Computes which Chat Sessions each Chat Session depends on.
|
|
161
|
-
* Returns a Map<chatNumber, chatNumber[]>.
|
|
162
|
-
*/
|
|
126
|
+
/** Returns a transitively reduced Map<chatNumber, chatNumber[]>. */
|
|
163
127
|
export function computeChatDependencies(chatSessions, _adjacency) {
|
|
164
|
-
// Build a reverse lookup: taskId → chatNumber
|
|
165
128
|
const taskToChat = new Map();
|
|
166
129
|
for (const session of chatSessions) {
|
|
167
130
|
for (const task of session.tasks) {
|
|
@@ -186,22 +149,16 @@ export function computeChatDependencies(chatSessions, _adjacency) {
|
|
|
186
149
|
);
|
|
187
150
|
}
|
|
188
151
|
|
|
189
|
-
// Apply transitive reduction to chat-level dependencies
|
|
190
152
|
return transitiveReduction(chatDeps);
|
|
191
153
|
}
|
|
192
154
|
|
|
193
|
-
/**
|
|
194
|
-
* Computes the transitive closure (reachability matrix) for the DAG.
|
|
195
|
-
* Returns a Map<id, Set<id>> where each key maps to a set of all tasks it can reach.
|
|
196
|
-
*/
|
|
155
|
+
/** Transitive closure as Map<id, Set<id>>, by memoized DFS: O(V·(V+E)). */
|
|
197
156
|
export function computeReachability(adjacency) {
|
|
198
|
-
// Memoized DFS: each node's reachable set is computed once and cached.
|
|
199
|
-
// Complexity: O(V·(V+E)) — avoids the O(N³) Floyd-Warshall triple loop.
|
|
200
157
|
const memo = new Map();
|
|
201
158
|
|
|
202
159
|
function reach(id) {
|
|
203
160
|
if (memo.has(id)) return memo.get(id);
|
|
204
|
-
//
|
|
161
|
+
// Placeholder first, so a cycle cannot recurse forever.
|
|
205
162
|
const set = new Set();
|
|
206
163
|
memo.set(id, set);
|
|
207
164
|
for (const neighbour of adjacency.get(id) || []) {
|
|
@@ -221,17 +178,14 @@ export function computeReachability(adjacency) {
|
|
|
221
178
|
}
|
|
222
179
|
|
|
223
180
|
/**
|
|
224
|
-
*
|
|
225
|
-
* Returns tasks ordered such that all dependencies precede their dependents.
|
|
226
|
-
* Deterministic: ties are broken by task ID (ascending) for stable output.
|
|
181
|
+
* Kahn's algorithm; ties break by ascending id for stable output.
|
|
227
182
|
*
|
|
228
|
-
* @param {Map<number, number[]>} adjacency
|
|
229
|
-
* @param {Map<number, object>} taskMap
|
|
230
|
-
* @returns {object[]}
|
|
231
|
-
* @throws {Error}
|
|
183
|
+
* @param {Map<number, number[]>} adjacency id → blockedBy[].
|
|
184
|
+
* @param {Map<number, object>} taskMap
|
|
185
|
+
* @returns {object[]}
|
|
186
|
+
* @throws {Error} On a cycle (run `detectCycle` first).
|
|
232
187
|
*/
|
|
233
188
|
export function topologicalSort(adjacency, taskMap) {
|
|
234
|
-
// Pre-compute reverse adjacency and in-degree for O(V+E)
|
|
235
189
|
const inDegree = new Map();
|
|
236
190
|
const reverseAdj = new Map();
|
|
237
191
|
|
|
@@ -250,7 +204,6 @@ export function topologicalSort(adjacency, taskMap) {
|
|
|
250
204
|
inDegree.set(nodeId, activeDeps);
|
|
251
205
|
}
|
|
252
206
|
|
|
253
|
-
// Seed queue with zero-in-degree nodes (tasks with no active dependencies), sorted by id for determinism
|
|
254
207
|
const queue = [...inDegree.entries()]
|
|
255
208
|
.filter(([, deg]) => deg === 0)
|
|
256
209
|
.map(([id]) => id)
|
|
@@ -259,17 +212,15 @@ export function topologicalSort(adjacency, taskMap) {
|
|
|
259
212
|
const sorted = [];
|
|
260
213
|
|
|
261
214
|
while (queue.length > 0) {
|
|
262
|
-
//
|
|
215
|
+
// The queue is kept sorted, so this is the smallest id.
|
|
263
216
|
const id = queue.shift();
|
|
264
217
|
sorted.push(taskMap.get(id));
|
|
265
218
|
|
|
266
|
-
// Decrement in-degree for dependents using pre-computed reverse map
|
|
267
219
|
for (const dependent of reverseAdj.get(id) ?? []) {
|
|
268
220
|
const newDeg = (inDegree.get(dependent) ?? 0) - 1;
|
|
269
221
|
inDegree.set(dependent, newDeg);
|
|
270
222
|
if (newDeg === 0) {
|
|
271
|
-
// Binary insertion
|
|
272
|
-
// instead of re-sorting the entire queue each iteration.
|
|
223
|
+
// Binary insertion keeps the queue sorted without a re-sort.
|
|
273
224
|
let lo = 0,
|
|
274
225
|
hi = queue.length;
|
|
275
226
|
while (lo < hi) {
|
|
@@ -292,18 +243,11 @@ export function topologicalSort(adjacency, taskMap) {
|
|
|
292
243
|
}
|
|
293
244
|
|
|
294
245
|
/**
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
* A wave contains all tasks whose dependencies are fully satisfied by
|
|
298
|
-
* previously completed waves. Tasks within the same wave can run concurrently
|
|
299
|
-
* (subject to focus-area serialization in the Dispatcher).
|
|
300
|
-
*
|
|
301
|
-
* Uses `assignLayers` to compute depth, then groups by layer value.
|
|
302
|
-
* The returned array is sorted by wave index (wave 0 = roots).
|
|
246
|
+
* Group tasks by layer; each wave's dependencies are all in earlier waves.
|
|
303
247
|
*
|
|
304
|
-
* @param {Map<number, number[]>} adjacency
|
|
305
|
-
* @param {Map<number, object>} taskMap
|
|
306
|
-
* @returns {object[][]}
|
|
248
|
+
* @param {Map<number, number[]>} adjacency id → blockedBy[].
|
|
249
|
+
* @param {Map<number, object>} taskMap
|
|
250
|
+
* @returns {object[][]}
|
|
307
251
|
*/
|
|
308
252
|
export function computeWaves(adjacency, taskMap) {
|
|
309
253
|
const layers = assignLayers(adjacency);
|
|
@@ -314,7 +258,6 @@ export function computeWaves(adjacency, taskMap) {
|
|
|
314
258
|
waveMap.get(layer).push(taskMap.get(id));
|
|
315
259
|
}
|
|
316
260
|
|
|
317
|
-
// Sort waves by layer, sort tasks within each wave by id for determinism
|
|
318
261
|
const maxLayer = Math.max(...waveMap.keys());
|
|
319
262
|
const waves = [];
|
|
320
263
|
for (let i = 0; i <= maxLayer; i++) {
|