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,27 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* plan-reachability.js — deterministic
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* plan-reachability.js — deterministic persist-side scan of draft tickets'
|
|
3
|
+
* route paths against the nav registry, run before any provider call so an
|
|
4
|
+
* orphaned surface is fixed by a free one-line amend.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* still free (nothing has been written to GitHub yet).
|
|
11
|
-
*
|
|
12
|
-
* Plan-level coverage semantics (the convergence contract): a route-adding
|
|
13
|
-
* story that never references the nav registry produces orphan surfaces —
|
|
14
|
-
* UNLESS every one of its route paths is also mentioned by some story in
|
|
15
|
-
* the plan that DOES reference the registry (the "navigation owner"). That
|
|
16
|
-
* is exactly what the documented recovery produces: the author appends the
|
|
17
|
-
* single reachability Story (which cites the orphaned routes and the nav
|
|
18
|
-
* registry) in one targeted amend, and the re-run persist passes.
|
|
19
|
-
*
|
|
20
|
-
* Silent no-op when `planning.navigation` is unconfigured (`routeGlobs`
|
|
21
|
-
* empty) — reported as `status: 'skipped'` so the caller can append the
|
|
22
|
-
* audit record to the plan-metrics ledger.
|
|
23
|
-
*
|
|
24
|
-
* Pure over its inputs (tickets + resolved config), no I/O.
|
|
6
|
+
* A route-adding Story that never cites the registry is an orphan unless
|
|
7
|
+
* every one of its route paths is mentioned by some registry-citing Story in
|
|
8
|
+
* the plan (the navigation owner). `skipped` when `routeGlobs` is empty.
|
|
9
|
+
* Pure, no I/O.
|
|
25
10
|
*/
|
|
26
11
|
|
|
27
12
|
import {
|
|
@@ -30,37 +15,28 @@ import {
|
|
|
30
15
|
resolveNavConfig,
|
|
31
16
|
} from './plan-navigation.js';
|
|
32
17
|
|
|
33
|
-
/**
|
|
34
|
-
* Fallback tokens when `navRegistry` is unconfigured but `routeGlobs` is.
|
|
35
|
-
*/
|
|
18
|
+
/** Used when `navRegistry` is unconfigured but `routeGlobs` is. */
|
|
36
19
|
const FALLBACK_REGISTRY_TOKENS = ['nav registry', 'navigation'];
|
|
37
20
|
|
|
38
21
|
/**
|
|
39
22
|
* @typedef {Object} ReachabilityOrphan
|
|
40
23
|
* @property {string} story The offending draft story's slug (or title).
|
|
41
|
-
* @property {string[]} paths
|
|
42
|
-
* owner anywhere in the plan.
|
|
24
|
+
* @property {string[]} paths Route paths with no navigation owner.
|
|
43
25
|
*/
|
|
44
26
|
|
|
45
27
|
/**
|
|
46
28
|
* @typedef {Object} DraftReachabilityResult
|
|
47
29
|
* @property {'skipped'|'ok'|'orphans'} status
|
|
48
30
|
* @property {string[]} reasons
|
|
49
|
-
* @property {ReachabilityOrphan[]} orphans
|
|
50
|
-
* `'orphans'`.
|
|
31
|
+
* @property {ReachabilityOrphan[]} orphans
|
|
51
32
|
* @property {number} scanned Draft stories scanned (0 when skipped).
|
|
52
33
|
*/
|
|
53
34
|
|
|
54
35
|
/**
|
|
55
|
-
* Evaluate draft-ticket reachability against the configured navigation
|
|
56
|
-
* surface.
|
|
57
|
-
*
|
|
58
36
|
* @param {object} input
|
|
59
37
|
* @param {Array<{ slug?: string, title?: string, body?: string }>} input.tickets
|
|
60
|
-
* The draft ticket set
|
|
61
|
-
*
|
|
62
|
-
* @param {object} [input.config] Resolved `.agentrc.json` (threads
|
|
63
|
-
* `planning.navigation`).
|
|
38
|
+
* The draft ticket set about to be created.
|
|
39
|
+
* @param {object} [input.config] Resolved `.agentrc.json`.
|
|
64
40
|
* @returns {DraftReachabilityResult}
|
|
65
41
|
*/
|
|
66
42
|
export function evaluateDraftReachability({ tickets, config }) {
|
|
@@ -82,7 +58,6 @@ export function evaluateDraftReachability({ tickets, config }) {
|
|
|
82
58
|
? navRegistry.map((t) => t.toLowerCase())
|
|
83
59
|
: FALLBACK_REGISTRY_TOKENS;
|
|
84
60
|
|
|
85
|
-
// Pass 1: per-story scan — declared paths, route matches, registry refs.
|
|
86
61
|
const scannedStories = stories.map((story) => {
|
|
87
62
|
const body = typeof story?.body === 'string' ? story.body : '';
|
|
88
63
|
const paths = extractStoryPaths(body);
|
|
@@ -92,8 +67,7 @@ export function evaluateDraftReachability({ tickets, config }) {
|
|
|
92
67
|
return { story, paths, routePaths, referencesRegistry };
|
|
93
68
|
});
|
|
94
69
|
|
|
95
|
-
//
|
|
96
|
-
// registry-referencing story is covered plan-wide.
|
|
70
|
+
// Every path a registry-citing Story mentions is covered plan-wide.
|
|
97
71
|
const coveredPaths = new Set();
|
|
98
72
|
for (const s of scannedStories) {
|
|
99
73
|
if (!s.referencesRegistry) continue;
|
|
@@ -135,9 +109,6 @@ export function evaluateDraftReachability({ tickets, config }) {
|
|
|
135
109
|
}
|
|
136
110
|
|
|
137
111
|
/**
|
|
138
|
-
* Render the named soft-failure message the persist CLI prints — the
|
|
139
|
-
* orphan-surface list plus the one-targeted-amend recovery contract.
|
|
140
|
-
*
|
|
141
112
|
* @param {DraftReachabilityResult} result A `status: 'orphans'` result.
|
|
142
113
|
* @returns {string}
|
|
143
114
|
*/
|
|
@@ -1,47 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* plan-run-labels/reap.js — the
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* plan authored stay filterable in the GitHub UI. That is load-bearing while
|
|
6
|
-
* any Story in the cohort is open, and inert the moment they are all closed —
|
|
7
|
-
* but nothing expressed the second half, so the vocabulary grew one label per
|
|
8
|
-
* persist forever. A consumer repository measured 235 `plan-run::` labels out
|
|
9
|
-
* of 313 total; past that a paged label listing stops seeing the labels that
|
|
10
|
-
* sort after the pile, and every list-then-create caller starts failing.
|
|
11
|
-
*
|
|
12
|
-
* This module is the **one decision engine** behind both surfaces that act on
|
|
13
|
-
* that end of life: the per-Story close tail (automatic, incremental) and
|
|
14
|
-
* `prune-plan-run-labels.js` (manual, whole-repository). Keeping the decision
|
|
15
|
-
* here rather than in either caller is what stops the two from disagreeing
|
|
16
|
-
* about when a label is spent.
|
|
17
|
-
*
|
|
18
|
-
* **The decision.** A cohort label is reapable only when it carries at least
|
|
19
|
-
* one issue and every issue carrying it is closed. The "at least one" clause
|
|
20
|
-
* is the subtle half: a label carrying *zero* issues is indistinguishable from
|
|
21
|
-
* one an in-flight persist has just minted before creating its Stories, and
|
|
22
|
-
* deleting it would break that run. So a zero-issue label is reported under an
|
|
23
|
-
* `unreferenced` reason and reaped only under an explicit opt-in — a default
|
|
24
|
-
* sweep is safe to run concurrently with a persist.
|
|
25
|
-
*
|
|
26
|
-
* **Never load-bearing.** Both surfaces treat a reap failure as a warning.
|
|
27
|
-
* Label hygiene is a chore; nothing downstream reads the cohort label as an
|
|
28
|
-
* input (see `PLAN_RUN_LABEL_PREFIX`'s own docblock), so a failed delete costs
|
|
29
|
-
* a stale label and nothing else.
|
|
2
|
+
* plan-run-labels/reap.js — the one decision engine for reaping spent
|
|
3
|
+
* `plan-run::<id>` cohort labels, shared by the close tail and the manual
|
|
4
|
+
* sweep so the two cannot disagree. A reap failure is only ever a warning.
|
|
30
5
|
*
|
|
31
6
|
* @module lib/orchestration/plan-run-labels/reap
|
|
32
|
-
* @see Story #5189
|
|
33
7
|
*/
|
|
34
8
|
|
|
35
9
|
import { PLAN_RUN_LABEL_PREFIX } from '../plan-persist/story-ops.js';
|
|
36
10
|
|
|
37
11
|
/**
|
|
38
|
-
* Why a cohort label was — or was not — judged reapable. One reason per
|
|
39
|
-
* label, so a `--json` report is auditable without re-deriving anything.
|
|
40
|
-
*
|
|
41
12
|
* - `all-closed` — carries issues, every one closed. Reapable.
|
|
42
|
-
* - `open-stories` — at least one issue still open.
|
|
43
|
-
* - `unreferenced` — carries no issues
|
|
44
|
-
*
|
|
13
|
+
* - `open-stories` — at least one issue still open. Never reapable.
|
|
14
|
+
* - `unreferenced` — carries no issues. Reapable only under explicit opt-in,
|
|
15
|
+
* because an in-flight persist's freshly minted label looks exactly like this.
|
|
45
16
|
*/
|
|
46
17
|
export const REAP_REASONS = Object.freeze({
|
|
47
18
|
ALL_CLOSED: 'all-closed',
|
|
@@ -50,12 +21,6 @@ export const REAP_REASONS = Object.freeze({
|
|
|
50
21
|
});
|
|
51
22
|
|
|
52
23
|
/**
|
|
53
|
-
* Is `name` a plan-run cohort label?
|
|
54
|
-
*
|
|
55
|
-
* The prefix is imported from `plan-persist/story-ops.js` rather than
|
|
56
|
-
* re-declared: minting and reaping must not be able to drift onto two
|
|
57
|
-
* different strings, which is exactly the failure a copied literal invites.
|
|
58
|
-
*
|
|
59
24
|
* @param {unknown} name
|
|
60
25
|
* @returns {boolean}
|
|
61
26
|
*/
|
|
@@ -64,10 +29,7 @@ function isPlanRunLabel(name) {
|
|
|
64
29
|
}
|
|
65
30
|
|
|
66
31
|
/**
|
|
67
|
-
*
|
|
68
|
-
* cohort label names. Accepts either bare strings (a ticket's `labels[]`) or
|
|
69
|
-
* `{ name }` rows (the label listing port), so both callers hand this whatever
|
|
70
|
-
* their own read returned.
|
|
32
|
+
* Sorted, de-duplicated cohort label names from strings or `{ name }` rows.
|
|
71
33
|
*
|
|
72
34
|
* @param {Array<string|{ name?: string }>} [names]
|
|
73
35
|
* @returns {string[]}
|
|
@@ -82,13 +44,8 @@ function selectCohortLabels(names) {
|
|
|
82
44
|
}
|
|
83
45
|
|
|
84
46
|
/**
|
|
85
|
-
* Decide one
|
|
86
|
-
*
|
|
87
|
-
* Reads through `listIssuesByLabel({ state: 'all' })` — the paginating read
|
|
88
|
-
* port — so the verdict is never a function of how many issues fit on one API
|
|
89
|
-
* page. `state` is compared case-insensitively against `closed` and anything
|
|
90
|
-
* else counts as open: an unknown state must never be read as "safe to
|
|
91
|
-
* delete".
|
|
47
|
+
* Decide one label via the paginating read port. Any state other than
|
|
48
|
+
* `closed` counts as open: an unknown state is never "safe to delete".
|
|
92
49
|
*
|
|
93
50
|
* @param {{ provider: object, label: string, includeUnreferenced?: boolean }} args
|
|
94
51
|
* @returns {Promise<{
|
|
@@ -142,12 +99,7 @@ async function decideCohortLabel({
|
|
|
142
99
|
}
|
|
143
100
|
|
|
144
101
|
/**
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
* Sequential on purpose. The whole-repository sweep can face hundreds of
|
|
148
|
-
* labels, and a fan-out over a shared REST budget buys wall-clock at the cost
|
|
149
|
-
* of the one property an operator auditing a pile actually needs: a
|
|
150
|
-
* deterministic, label-ordered report.
|
|
102
|
+
* Sequential on purpose, for a deterministic label-ordered report.
|
|
151
103
|
*
|
|
152
104
|
* @param {{
|
|
153
105
|
* provider: object,
|
|
@@ -171,13 +123,8 @@ async function evaluateCohortLabels({
|
|
|
171
123
|
}
|
|
172
124
|
|
|
173
125
|
/**
|
|
174
|
-
* Decide, then (unless `check`) delete.
|
|
175
|
-
*
|
|
176
|
-
* A delete that throws is recorded in `failed[]` and warned about rather than
|
|
177
|
-
* propagated: one unreachable label must not abandon the rest of a sweep, and
|
|
178
|
-
* on the close path it must not touch the land. A delete the provider reports
|
|
179
|
-
* as a no-op (`deleted: false` — the label was already gone) is still a
|
|
180
|
-
* success; that is what makes a re-run idempotent.
|
|
126
|
+
* Decide, then (unless `check`) delete. A throwing delete is recorded in
|
|
127
|
+
* `failed[]`, never propagated; an already-gone label counts as success.
|
|
181
128
|
*
|
|
182
129
|
* @param {{
|
|
183
130
|
* provider: object,
|
|
@@ -225,18 +172,8 @@ async function reapCohortLabels({
|
|
|
225
172
|
}
|
|
226
173
|
|
|
227
174
|
/**
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
* The Story's own label set comes from `getTicket` (labels are immutable for
|
|
232
|
-
* this purpose, so a cached snapshot is fine); every *state* judgment comes
|
|
233
|
-
* from the fresh `listIssuesByLabel` read inside {@link decideCohortLabel}, so
|
|
234
|
-
* a primed ticket cache cannot make a still-open sibling look closed.
|
|
235
|
-
*
|
|
236
|
-
* A Story whose own issue has not yet registered as closed — the merge webhook
|
|
237
|
-
* that fires `Closes #<id>` is not instantaneous — simply reports
|
|
238
|
-
* `open-stories` and is left alone. Deferring is the safe direction, and the
|
|
239
|
-
* manual sweep is the backstop that collects whatever a race leaves behind.
|
|
175
|
+
* Every state judgment is a fresh read; a Story not yet registered closed is
|
|
176
|
+
* deferred to the manual sweep.
|
|
240
177
|
*
|
|
241
178
|
* @param {{
|
|
242
179
|
* storyId: number,
|
|
@@ -275,11 +212,7 @@ export async function reapPlanRunLabelsForStory({
|
|
|
275
212
|
}
|
|
276
213
|
|
|
277
214
|
/**
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
* Reads the whole label vocabulary through the paginating listing port and
|
|
281
|
-
* projects it onto the cohort axis here, so the sweep is bounded by what the
|
|
282
|
-
* repository actually holds rather than by an API page size.
|
|
215
|
+
* Sweep every cohort label in the repository.
|
|
283
216
|
*
|
|
284
217
|
* @param {{
|
|
285
218
|
* provider: object,
|
|
@@ -309,15 +242,7 @@ export async function sweepCohortLabels({
|
|
|
309
242
|
return { totalLabels: rows.length, evaluated: labels.length, ...outcome };
|
|
310
243
|
}
|
|
311
244
|
|
|
312
|
-
/**
|
|
313
|
-
* Test-only surface. The five helpers below compose the two exported entry
|
|
314
|
-
* points (`reapPlanRunLabelsForStory`, `sweepCohortLabels`) and have no
|
|
315
|
-
* production consumer outside this module, so exporting each one individually
|
|
316
|
-
* would advertise five API surfaces nothing imports — and `dead-exports
|
|
317
|
-
* --production` correctly reports each as dead. They are still worth unit
|
|
318
|
-
* testing per arm, which is what this barrel is for; it follows the same
|
|
319
|
-
* `__testing` idiom `git-probes.js` and `source-classifier.js` use.
|
|
320
|
-
*/
|
|
245
|
+
/** Test-only barrel, so `dead-exports --production` sees no unused exports. */
|
|
321
246
|
export const __testing = {
|
|
322
247
|
isPlanRunLabel,
|
|
323
248
|
selectCohortLabels,
|
|
@@ -1,33 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* plan-runner/worktree-sweep.js
|
|
2
|
+
* plan-runner/worktree-sweep.js — plan-boot sweep that force-removes
|
|
3
|
+
* `.worktrees/story-<id>/` entries whose Story is closed or `agent::done`,
|
|
4
|
+
* after draining the pending-cleanup manifest.
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `
|
|
7
|
-
* entries registered with git, looks up each parent Story, and force-removes
|
|
8
|
-
* any whose Story is already closed or labeled `agent::done`.
|
|
9
|
-
*
|
|
10
|
-
* The `--force` flag is intentional. By the time a Story is `agent::done`
|
|
11
|
-
* its branch has already been merged into the Epic branch (via
|
|
12
|
-
* `single-story-close.js`), so any residue left in the worktree — dirty
|
|
13
|
-
* build artifacts, an interrupted rebase, a stray Windows lock — is noise.
|
|
14
|
-
* The safety rails in `WorktreeManager.reap` exist for the _active_ close
|
|
15
|
-
* path; at plan time we already know the Story is done and want the
|
|
16
|
-
* directory gone no matter what.
|
|
17
|
-
*
|
|
18
|
-
* Public API:
|
|
19
|
-
* - `sweepStaleStoryWorktrees({ provider, repoRoot, git?, logger?, fsRm?, worktreeRoot? })`
|
|
20
|
-
*
|
|
21
|
-
* Also drains any `.worktrees/.pending-cleanup.json` manifest left behind
|
|
22
|
-
* by Stage 1 (`removeWorktreeWithRecovery` → fs-rm-retry exhaustion, see
|
|
23
|
-
* `../worktree/lifecycle/pending-cleanup.js`). Entries whose Stage 1 retry now
|
|
24
|
-
* succeeds are removed from the manifest; entries reaching
|
|
25
|
-
* MAX_SWEEP_ATTEMPTS emit an `OPERATOR ACTION REQUIRED: persistent-lock`.
|
|
26
|
-
*
|
|
27
|
-
* Returns `{
|
|
28
|
-
* reaped, skipped,
|
|
29
|
-
* drainedPending, persistentPending, stillPending
|
|
30
|
-
* }`.
|
|
6
|
+
* `--force` is deliberate: a done Story's branch is already merged, so any
|
|
7
|
+
* residue (dirty artifacts, an interrupted rebase, a Windows lock) is noise;
|
|
8
|
+
* the `WorktreeManager.reap` safety rails are for the active close path.
|
|
31
9
|
*/
|
|
32
10
|
|
|
33
11
|
import path from 'node:path';
|
|
@@ -56,20 +34,13 @@ function storyIdFromPath(wtPath) {
|
|
|
56
34
|
}
|
|
57
35
|
|
|
58
36
|
/**
|
|
59
|
-
*
|
|
60
|
-
* done (closed or `agent::done`). Never touches worktrees whose Story is
|
|
61
|
-
* still open — those are live or in-flight.
|
|
62
|
-
*
|
|
63
|
-
* Provider reads are fanned out at concurrency 8 via `concurrentMap`; the
|
|
64
|
-
* subsequent `git worktree remove` calls stay sequential because they
|
|
65
|
-
* mutate `.git/worktrees/`.
|
|
37
|
+
* Never touches a worktree whose Story is still open.
|
|
66
38
|
*
|
|
67
39
|
* @param {object} opts
|
|
68
|
-
* @param {object} opts.provider
|
|
69
|
-
* `getTicket(id)` is required.
|
|
40
|
+
* @param {object} opts.provider Only `getTicket(id)` is required.
|
|
70
41
|
* @param {string} opts.repoRoot Absolute path to the main checkout.
|
|
71
|
-
* @param {object} [opts.git]
|
|
72
|
-
* @param {object} [opts.logger]
|
|
42
|
+
* @param {object} [opts.git]
|
|
43
|
+
* @param {object} [opts.logger]
|
|
73
44
|
* @returns {Promise<{
|
|
74
45
|
* reaped: Array<{ storyId: number, path: string }>,
|
|
75
46
|
* skipped: Array<{ storyId: number|null, path: string, reason: string }>,
|
|
@@ -95,11 +66,8 @@ export async function sweepStaleStoryWorktrees(opts = {}) {
|
|
|
95
66
|
const resolvedWorktreeRoot =
|
|
96
67
|
worktreeRoot ?? path.join(repoRoot, '.worktrees');
|
|
97
68
|
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
// whose Windows file locks have since released; entries still stuck get
|
|
101
|
-
// their handle-holders enumerated and terminated (Windows only) so the
|
|
102
|
-
// ledger self-heals across sprints instead of accumulating.
|
|
69
|
+
// Drain the pending-cleanup manifest first so entries whose Windows locks
|
|
70
|
+
// have released self-heal instead of accumulating.
|
|
103
71
|
const drainResult = await forceDrainPendingCleanup({
|
|
104
72
|
repoRoot,
|
|
105
73
|
worktreeRoot: resolvedWorktreeRoot,
|
|
@@ -121,10 +89,8 @@ export async function sweepStaleStoryWorktrees(opts = {}) {
|
|
|
121
89
|
|
|
122
90
|
const entries = parseWorktreePorcelain(listRes.stdout || '');
|
|
123
91
|
|
|
124
|
-
//
|
|
125
|
-
//
|
|
126
|
-
// concurrentMap's first-rejection-wins policy and abort the whole sweep;
|
|
127
|
-
// we want the original per-entry skip/continue semantics preserved.
|
|
92
|
+
// Each mapper captures its own error so one provider hiccup cannot abort
|
|
93
|
+
// the sweep via concurrentMap's first-rejection-wins policy.
|
|
128
94
|
const reads = await concurrentMap(
|
|
129
95
|
entries,
|
|
130
96
|
async (entry) => {
|
|
@@ -142,10 +108,8 @@ export async function sweepStaleStoryWorktrees(opts = {}) {
|
|
|
142
108
|
{ concurrency: TICKET_READ_CONCURRENCY },
|
|
143
109
|
);
|
|
144
110
|
|
|
145
|
-
//
|
|
146
|
-
//
|
|
147
|
-
// racing git's own locking on Windows where a half-removed entry can
|
|
148
|
-
// leave a partial admin dir that the next remove then trips over.
|
|
111
|
+
// Removes stay sequential: they mutate .git/worktrees/, and racing git's
|
|
112
|
+
// locking on Windows can leave a partial admin dir the next remove trips on.
|
|
149
113
|
for (const r of reads) {
|
|
150
114
|
if (r.kind === 'no-path' || r.kind === 'non-story') continue;
|
|
151
115
|
if (r.kind === 'provider-error') {
|
|
@@ -198,8 +162,6 @@ export async function sweepStaleStoryWorktrees(opts = {}) {
|
|
|
198
162
|
);
|
|
199
163
|
}
|
|
200
164
|
|
|
201
|
-
// Drop any lingering worktree registrations. Cheap; safe to run whether
|
|
202
|
-
// or not we actually removed anything.
|
|
203
165
|
git.gitSpawn(repoRoot, 'worktree', 'prune');
|
|
204
166
|
|
|
205
167
|
return {
|
|
@@ -1,30 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* plan-text-hygiene.js —
|
|
3
|
-
* over body prose (
|
|
4
|
-
* `pinned-identifier` over
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* open question persisted into its body ("Flag if…", "TBD", "confirm with the
|
|
8
|
-
* operator", a trailing `?`) can never be answered where it is read. This
|
|
9
|
-
* module makes that class checkable at the one point a re-author loop exists —
|
|
10
|
-
* the persist dry-run, which lists every match as a **warning** and proceeds.
|
|
11
|
-
*
|
|
12
|
-
* Story #5312 deleted the sibling `dangling-citation` and `slicing-mass`
|
|
13
|
-
* lints with the critic gate that surfaced them: both scored prose shape the
|
|
14
|
-
* authoring model already judges, and neither ever changed a persisted body.
|
|
15
|
-
*
|
|
16
|
-
* `pinned-identifier` is the one lint that scores the **binding** half of the
|
|
17
|
-
* ticket; its classifier lives in
|
|
18
|
-
* [`pinned-identifier-lint.js`](pinned-identifier-lint.js), which shares no
|
|
19
|
-
* vocabulary with the prose heuristic here.
|
|
20
|
-
*
|
|
21
|
-
* Advisory by contract: findings are deterministic text for the dry-run's
|
|
22
|
-
* warning list. They never gate persist and spawn nothing.
|
|
23
|
-
*
|
|
24
|
-
* Pure, synchronous, no I/O. Operates on the draft `stories.json` array,
|
|
25
|
-
* reusing `parse()` from `lib/story-body/story-body.js` for section access.
|
|
26
|
-
* An unparseable draft body is skipped, not failed — hygiene is advisory
|
|
27
|
-
* and the persist validators own structural rejection.
|
|
2
|
+
* plan-text-hygiene.js — advisory draft-Story lints for the persist dry-run:
|
|
3
|
+
* `open-question` over body prose (a non-interactive sub-agent can never
|
|
4
|
+
* answer "TBD" or "confirm with the operator") and `pinned-identifier` over
|
|
5
|
+
* `acceptance[]`. Findings are warnings only; an unparseable body is skipped,
|
|
6
|
+
* since structural rejection belongs to the persist validators. Pure, no I/O.
|
|
28
7
|
*
|
|
29
8
|
* @module lib/orchestration/plan-text-hygiene
|
|
30
9
|
*/
|
|
@@ -32,14 +11,8 @@
|
|
|
32
11
|
import { parse } from '../story-body/story-body.js';
|
|
33
12
|
import { findPinnedIdentifiers } from './pinned-identifier-lint.js';
|
|
34
13
|
|
|
35
|
-
/** Truncation length for the `evidence` excerpt on each finding. */
|
|
36
14
|
const EVIDENCE_MAX_CHARS = 160;
|
|
37
15
|
|
|
38
|
-
/**
|
|
39
|
-
* Operator-directed open-question phrasings. Each match is an instruction
|
|
40
|
-
* or question aimed at a human, which a non-interactive delivery sub-agent
|
|
41
|
-
* can never answer.
|
|
42
|
-
*/
|
|
43
16
|
const OPEN_QUESTION_MARKERS = [
|
|
44
17
|
/\bflag if\b/i,
|
|
45
18
|
/\bTBD\b/,
|
|
@@ -55,16 +28,13 @@ const OPEN_QUESTION_MARKERS = [
|
|
|
55
28
|
*/
|
|
56
29
|
|
|
57
30
|
/**
|
|
58
|
-
* Private-use
|
|
59
|
-
*
|
|
60
|
-
* the heuristic while keeping the sentence split where the span sat.
|
|
31
|
+
* Private-use stand-in for an inline code span: inert to the heuristic but
|
|
32
|
+
* keeps the sentence split where the span sat.
|
|
61
33
|
*/
|
|
62
34
|
const CODE_SLOT = '\uE000';
|
|
63
35
|
|
|
64
36
|
/**
|
|
65
|
-
*
|
|
66
|
-
* positional slot, so code content (shell snippets, grep patterns, JSON)
|
|
67
|
-
* never trips a prose heuristic.
|
|
37
|
+
* Remove code so shell snippets or patterns never trip a prose heuristic.
|
|
68
38
|
*
|
|
69
39
|
* @param {string} text
|
|
70
40
|
* @returns {string}
|
|
@@ -74,8 +44,7 @@ function stripCodeSpans(text) {
|
|
|
74
44
|
}
|
|
75
45
|
|
|
76
46
|
/**
|
|
77
|
-
*
|
|
78
|
-
* are boundaries too, so a bullet list yields one unit per bullet.
|
|
47
|
+
* Newlines are boundaries too: one unit per bullet.
|
|
79
48
|
*
|
|
80
49
|
* @param {string} text
|
|
81
50
|
* @returns {string[]}
|
|
@@ -88,8 +57,6 @@ function splitSentences(text) {
|
|
|
88
57
|
}
|
|
89
58
|
|
|
90
59
|
/**
|
|
91
|
-
* Truncate an excerpt for the finding's `evidence` field.
|
|
92
|
-
*
|
|
93
60
|
* @param {string} text
|
|
94
61
|
* @returns {string}
|
|
95
62
|
*/
|
|
@@ -101,9 +68,6 @@ function excerpt(text) {
|
|
|
101
68
|
}
|
|
102
69
|
|
|
103
70
|
/**
|
|
104
|
-
* open-question: operator-directed phrasing (or a trailing `?`) in prose a
|
|
105
|
-
* non-interactive sub-agent executes.
|
|
106
|
-
*
|
|
107
71
|
* @param {string} prose - Raw Goal/Spec prose.
|
|
108
72
|
* @param {string} slug
|
|
109
73
|
* @returns {TextHygieneFinding[]}
|
|
@@ -130,12 +94,8 @@ function findOpenQuestions(prose, slug) {
|
|
|
130
94
|
}
|
|
131
95
|
|
|
132
96
|
/**
|
|
133
|
-
* Evaluate the advisory lints over a draft Story array.
|
|
134
|
-
*
|
|
135
97
|
* @param {{ draftStories?: Array<object>|null }} args - The draft
|
|
136
|
-
* `stories.json` array
|
|
137
|
-
* `body`). Null/absent evaluates to zero findings (the single-delivery
|
|
138
|
-
* shape authors no draft tickets).
|
|
98
|
+
* `stories.json` array; null/absent yields no findings.
|
|
139
99
|
* @returns {{ findings: TextHygieneFinding[] }}
|
|
140
100
|
*/
|
|
141
101
|
export function evaluateTextHygiene({ draftStories = null } = {}) {
|
|
@@ -147,8 +107,6 @@ export function evaluateTextHygiene({ draftStories = null } = {}) {
|
|
|
147
107
|
try {
|
|
148
108
|
body = parse(story?.body).body;
|
|
149
109
|
} catch {
|
|
150
|
-
// Advisory lint: an unparseable body is the persist validators'
|
|
151
|
-
// rejection to make, not this evaluator's.
|
|
152
110
|
continue;
|
|
153
111
|
}
|
|
154
112
|
const goal = typeof body.goal === 'string' ? body.goal : '';
|