mandrel 2.60.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 +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +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 +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +25 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,23 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* init-tail.js — post-bootstrap
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* from a freshly bootstrapped project to a ready-to-plan workspace:
|
|
7
|
-
*
|
|
8
|
-
* Phase 1 — Offer to scaffold missing docsContextFiles (scaffold-docs.js).
|
|
9
|
-
* Phase 2 — Run `mandrel doctor` as a readiness gate.
|
|
10
|
-
* Phase 3 — Print the /mandrel-plan handoff next-step text.
|
|
11
|
-
*
|
|
12
|
-
* The whole tail is idempotent: re-running after an already-onboarded project
|
|
13
|
-
* re-checks and re-offers scaffolding without duplicating stubs (the scaffolder
|
|
14
|
-
* only writes genuinely absent files) and without modifying anything (doctor is
|
|
15
|
-
* read-only).
|
|
16
|
-
*
|
|
17
|
-
* Injectable seams: `runDoctor`, `stdout`, `confirmScaffold`, and `isTTY`
|
|
18
|
-
* allow the unit suite to drive every branch without real I/O.
|
|
19
|
-
*
|
|
20
|
-
* Story #4045 (refs #4045).
|
|
2
|
+
* init-tail.js — `mandrel init`'s post-bootstrap tail: offer to scaffold
|
|
3
|
+
* missing docsContextFiles, gate on `mandrel doctor`, then print the
|
|
4
|
+
* `/mandrel-plan` handoff. Idempotent: the scaffolder writes only absent
|
|
5
|
+
* files and doctor is read-only.
|
|
21
6
|
*/
|
|
22
7
|
|
|
23
8
|
import { spawnSync as defaultSpawnSync } from 'node:child_process';
|
|
@@ -26,26 +11,14 @@ import readline from 'node:readline/promises';
|
|
|
26
11
|
|
|
27
12
|
import { STUB_MARKER, scaffoldDocs } from './scaffold-docs.js';
|
|
28
13
|
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
// Phase text constants
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
|
|
33
14
|
/**
|
|
34
|
-
* Text printed at the end of the init tail to hand the operator off to /mandrel-plan.
|
|
35
|
-
*
|
|
36
15
|
* @type {string}
|
|
37
16
|
*/
|
|
38
17
|
export const PLAN_HANDOFF_TEXT =
|
|
39
18
|
'\n✅ Mandrel is ready. Start your first project:\n\n' +
|
|
40
19
|
' /mandrel-plan --seed "<one-line description of what you want to build>"\n';
|
|
41
20
|
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
// Internal helpers
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
|
|
46
21
|
/**
|
|
47
|
-
* Format a list of missing docs as a human-readable report (no prompt).
|
|
48
|
-
*
|
|
49
22
|
* @param {string[]} missing
|
|
50
23
|
* @returns {string}
|
|
51
24
|
*/
|
|
@@ -63,23 +36,9 @@ function formatMissingList(missing) {
|
|
|
63
36
|
const SCAFFOLD_PROMPT = '\nCreate placeholders? [y/N]: ';
|
|
64
37
|
|
|
65
38
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* interactive TTY. No is the default (`[y/N]`): only an explicit `y`/`yes`
|
|
70
|
-
* resolves to `true` (create the placeholders). A bare Enter or any other input
|
|
71
|
-
* declines, matching the same default-off policy as `--with-issue-forms`. A
|
|
72
|
-
* read error resolves to `false` so a genuine I/O failure never writes
|
|
73
|
-
* unattended. The prompt text is written by the caller via `stdout`, so the
|
|
74
|
-
* question string passed here is empty.
|
|
75
|
-
*
|
|
76
|
-
* `terminal: false` is **load-bearing**: with terminal mode on (the default
|
|
77
|
-
* when stdout is a TTY) readline emits cursor-control escapes
|
|
78
|
-
* (`\x1b[1G\x1b[0J`) that erase the `Create placeholders? [y/N]:` prompt already
|
|
79
|
-
* written via the caller's `stdout`, leaving the operator staring at a blank,
|
|
80
|
-
* dead-looking line. Disabling terminal mode preserves the pre-written prompt
|
|
81
|
-
* and reads the line via the TTY's cooked-mode echo. `createInterface` is
|
|
82
|
-
* injectable so a test can assert this option is set (regression guard).
|
|
39
|
+
* y/N (default No; a read error declines). Readline, because a blocking
|
|
40
|
+
* `fs.readFileSync(0)` hangs on a TTY. `terminal: false` is load-bearing:
|
|
41
|
+
* terminal mode's cursor escapes erase the caller's pre-written prompt.
|
|
83
42
|
*
|
|
84
43
|
* @param {{ createInterface?: typeof readline.createInterface }} [opts]
|
|
85
44
|
* @returns {Promise<boolean>}
|
|
@@ -102,24 +61,13 @@ export async function readConfirm({
|
|
|
102
61
|
}
|
|
103
62
|
}
|
|
104
63
|
|
|
105
|
-
// ---------------------------------------------------------------------------
|
|
106
|
-
// Public API
|
|
107
|
-
// ---------------------------------------------------------------------------
|
|
108
|
-
|
|
109
64
|
/**
|
|
110
|
-
* Run the post-bootstrap init tail.
|
|
111
|
-
*
|
|
112
65
|
* @param {object} [opts]
|
|
113
|
-
* @param {string} [opts.root]
|
|
114
|
-
* @param {(msg: string) => void} [opts.stdout]
|
|
115
|
-
*
|
|
116
|
-
* @param {() => boolean} [opts.confirmScaffold] - Read the operator's y/N
|
|
117
|
-
* answer for the scaffold offer. Returns `true` to scaffold. In non-TTY
|
|
118
|
-
* contexts defaults to `false` (no write without operator confirmation).
|
|
66
|
+
* @param {string} [opts.root]
|
|
67
|
+
* @param {(msg: string) => void} [opts.stdout]
|
|
68
|
+
* @param {() => boolean} [opts.confirmScaffold]
|
|
119
69
|
* @param {(extraArgs?: string[]) => { status: number|null }} [opts.runDoctor]
|
|
120
|
-
*
|
|
121
|
-
* @param {boolean} [opts.isTTY] - Whether stdin is a TTY (defaults to
|
|
122
|
-
* `Boolean(process.stdin.isTTY)`).
|
|
70
|
+
* @param {boolean} [opts.isTTY]
|
|
123
71
|
* @returns {Promise<{
|
|
124
72
|
* scaffoldResult: object,
|
|
125
73
|
* doctorStatus: number,
|
|
@@ -136,14 +84,11 @@ export async function runInitTail({
|
|
|
136
84
|
const projectRoot = root ?? process.cwd();
|
|
137
85
|
const tty = isTTY ?? Boolean(process.stdin.isTTY);
|
|
138
86
|
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
// never writes unattended.
|
|
87
|
+
// An injected confirm is always consulted; the default auto-declines off a
|
|
88
|
+
// TTY so the scaffolder never writes unattended.
|
|
142
89
|
const usingDefaultConfirm = confirmScaffold == null;
|
|
143
90
|
const confirmFn = confirmScaffold ?? readConfirm;
|
|
144
91
|
|
|
145
|
-
// Default doctor runner — spawns `mandrel doctor` via the locally installed
|
|
146
|
-
// bin; inherits stdio so the report streams to the terminal.
|
|
147
92
|
const mandrelBin = path.join(
|
|
148
93
|
projectRoot,
|
|
149
94
|
'node_modules',
|
|
@@ -159,7 +104,6 @@ export async function runInitTail({
|
|
|
159
104
|
|
|
160
105
|
const doctorFn = runDoctor ?? defaultRunDoctor;
|
|
161
106
|
|
|
162
|
-
// --- Phase 1: Offer to scaffold missing docsContextFiles -----------------
|
|
163
107
|
const preview = scaffoldDocs({ root: projectRoot, write: false });
|
|
164
108
|
let scaffoldResult = preview;
|
|
165
109
|
|
|
@@ -167,9 +111,6 @@ export async function runInitTail({
|
|
|
167
111
|
stdout('\n[Final Checks] All docsContextFiles are present.\n');
|
|
168
112
|
} else {
|
|
169
113
|
stdout(formatMissingList(preview.missing));
|
|
170
|
-
// On non-TTY without an injected confirm, auto-decline so the scaffolder
|
|
171
|
-
// never writes unattended. On TTY (or with an injected confirm seam), show
|
|
172
|
-
// the prompt and consult the confirm function.
|
|
173
114
|
const canPrompt = tty || !usingDefaultConfirm;
|
|
174
115
|
if (canPrompt) stdout(SCAFFOLD_PROMPT);
|
|
175
116
|
const accepted = canPrompt ? await confirmFn() : false;
|
|
@@ -187,7 +128,6 @@ export async function runInitTail({
|
|
|
187
128
|
}
|
|
188
129
|
}
|
|
189
130
|
|
|
190
|
-
// --- Phase 2: Readiness gate (mandrel doctor) ----------------------------
|
|
191
131
|
stdout('\n[Final Checks] Final installation summary via mandrel doctor…\n');
|
|
192
132
|
const doctorResult = doctorFn();
|
|
193
133
|
const doctorStatus = doctorResult?.status ?? 1;
|
|
@@ -200,7 +140,6 @@ export async function runInitTail({
|
|
|
200
140
|
return { scaffoldResult, doctorStatus, ok: false };
|
|
201
141
|
}
|
|
202
142
|
|
|
203
|
-
// --- Phase 3: Handoff to /mandrel-plan -------------------------------------------
|
|
204
143
|
stdout(PLAN_HANDOFF_TEXT);
|
|
205
144
|
return { scaffoldResult, doctorStatus, ok: true };
|
|
206
145
|
}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Guided-onboard doc scaffolder
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* for each missing file. Stubs are seeded from a dedicated template under
|
|
7
|
-
* `.agents/templates/docs/<name>` when one ships; otherwise a generic
|
|
8
|
-
* placeholder stub is written so the mandatory-read never resolves to a
|
|
9
|
-
* missing file.
|
|
10
|
-
*
|
|
11
|
-
* The detection pass is side-effect free: callers can preview the missing set
|
|
12
|
-
* (`scaffoldDocs({ write: false })`) before deciding whether to scaffold.
|
|
2
|
+
* Guided-onboard doc scaffolder: find the configured
|
|
3
|
+
* `project.docsContextFiles` missing under the docs root and, when `write`,
|
|
4
|
+
* stub each one (from `.agents/templates/docs/<name>` when shipped, else a
|
|
5
|
+
* generic placeholder). `write: false` is a side-effect-free preview.
|
|
13
6
|
*
|
|
14
7
|
* @module lib/onboard/scaffold-docs
|
|
15
8
|
*/
|
|
@@ -25,18 +18,14 @@ const AGENT_ROOT = path.resolve(__dirname, '../../..');
|
|
|
25
18
|
const DOCS_TEMPLATE_DIR = path.join(AGENT_ROOT, 'templates', 'docs');
|
|
26
19
|
|
|
27
20
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* keys off this exact string — do not change it without a hard cutover.
|
|
21
|
+
* Marker in every stub; the `/mandrel-plan` first-run preflight detects
|
|
22
|
+
* unedited stubs by this exact string — changing it is a hard cutover.
|
|
31
23
|
*
|
|
32
24
|
* @type {string}
|
|
33
25
|
*/
|
|
34
26
|
export const STUB_MARKER = '<!-- MANDREL:STUB -->';
|
|
35
27
|
|
|
36
28
|
/**
|
|
37
|
-
* Build the generic placeholder stub for a docsContextFile that has no
|
|
38
|
-
* dedicated template. Derives a human-readable title from the filename.
|
|
39
|
-
*
|
|
40
29
|
* @param {string} fileName - e.g. `data-dictionary.md`
|
|
41
30
|
* @returns {string}
|
|
42
31
|
*/
|
|
@@ -57,11 +46,6 @@ function genericStub(fileName) {
|
|
|
57
46
|
}
|
|
58
47
|
|
|
59
48
|
/**
|
|
60
|
-
* Read the dedicated template body for a docsContextFile, or fall back to the
|
|
61
|
-
* generic stub when no template ships for that name. Either path prepends the
|
|
62
|
-
* {@link STUB_MARKER} so the `/mandrel-plan` first-run preflight can detect un-edited
|
|
63
|
-
* stubs regardless of whether a dedicated template was used.
|
|
64
|
-
*
|
|
65
49
|
* @param {string} fileName
|
|
66
50
|
* @param {import('node:fs')} fsImpl
|
|
67
51
|
* @returns {string}
|
|
@@ -70,25 +54,19 @@ function stubContentFor(fileName, fsImpl) {
|
|
|
70
54
|
const templatePath = path.join(DOCS_TEMPLATE_DIR, fileName);
|
|
71
55
|
if (fsImpl.existsSync(templatePath)) {
|
|
72
56
|
const body = fsImpl.readFileSync(templatePath, 'utf8');
|
|
73
|
-
//
|
|
74
|
-
// themselves are kept marker-free so they read cleanly as documentation).
|
|
57
|
+
// Templates stay marker-free so they read cleanly as documentation.
|
|
75
58
|
return body.startsWith(STUB_MARKER) ? body : `${STUB_MARKER}\n${body}`;
|
|
76
59
|
}
|
|
77
60
|
return genericStub(fileName);
|
|
78
61
|
}
|
|
79
62
|
|
|
80
63
|
/**
|
|
81
|
-
* Detect missing docsContextFiles and, on acceptance, scaffold stubs.
|
|
82
|
-
*
|
|
83
64
|
* @param {object} [opts]
|
|
84
65
|
* @param {string} [opts.root] - Project root to resolve config + docs root
|
|
85
|
-
* against.
|
|
86
|
-
* @param {string[]} [opts.docsContextFiles] - Override the configured list
|
|
87
|
-
*
|
|
88
|
-
* @param {
|
|
89
|
-
* name (relative to `root`). Falls back to `project.paths.docsRoot`.
|
|
90
|
-
* @param {boolean} [opts.write=true] - When `false`, only detect (no files are
|
|
91
|
-
* created). When `true` (acceptance), scaffold each missing file.
|
|
66
|
+
* against.
|
|
67
|
+
* @param {string[]} [opts.docsContextFiles] - Override the configured list.
|
|
68
|
+
* @param {string} [opts.docsRoot] - Override the docs-root directory name.
|
|
69
|
+
* @param {boolean} [opts.write=true] - `false` only detects.
|
|
92
70
|
* @param {import('node:fs')} [opts.fs] - Injectable fs implementation.
|
|
93
71
|
* @returns {{
|
|
94
72
|
* docsRoot: string,
|
|
@@ -126,7 +104,6 @@ export function scaffoldDocs(opts = {}) {
|
|
|
126
104
|
fsImpl.mkdirSync(docsRootAbs, { recursive: true });
|
|
127
105
|
for (const fileName of missing) {
|
|
128
106
|
const target = path.join(docsRootAbs, fileName);
|
|
129
|
-
// Guard against nested paths whose parent dir is absent.
|
|
130
107
|
fsImpl.mkdirSync(path.dirname(target), { recursive: true });
|
|
131
108
|
fsImpl.writeFileSync(target, stubContentFor(fileName, fsImpl), 'utf8');
|
|
132
109
|
created.push(fileName);
|
|
@@ -1,57 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Acceptance
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* (`acceptance-eval.js`) owns the file reads, schema validation, signal
|
|
7
|
-
* emission, and ticket transitions; this module owns the *decision* so it
|
|
8
|
-
* can be unit-tested in isolation.
|
|
9
|
-
*
|
|
10
|
-
* ## Round derivation (Story #4019)
|
|
11
|
-
*
|
|
12
|
-
* The round number is **derived from the signals ledger**, not from the
|
|
13
|
-
* critic's self-reported `verdict.round`: every prior round appended one
|
|
14
|
-
* `acceptance-eval` signal to the Story's `signals.ndjson`, so the
|
|
15
|
-
* current round is `count(prior signals) + 1`. This survives a subagent
|
|
16
|
-
* restart (the ledger is on disk) and removes the critic's scratch value
|
|
17
|
-
* from the cap enforcement path — a critic that always reports `round: 1`
|
|
18
|
-
* can no longer defeat the bounded-loop guarantee.
|
|
19
|
-
*
|
|
20
|
-
* ## Reading a verdict is not a round (Story #4874)
|
|
21
|
-
*
|
|
22
|
-
* Counting signals made *observation* costly: re-running the gate over an
|
|
23
|
-
* already-scored verdict — a resumed sub-agent re-reading its own verdict,
|
|
24
|
-
* an operator re-checking why the loop said `redraft` — appended another
|
|
25
|
-
* signal and advanced the derived round, so a `redraft` could escalate to
|
|
26
|
-
* `block` with no work in between. Every appended signal therefore carries
|
|
27
|
-
* a `details.verdictFingerprint` content-addressing the verdict it scored,
|
|
28
|
-
* and {@link resolveAcceptanceEvalRound} replays the round already recorded
|
|
29
|
-
* for that fingerprint instead of minting a new one. A replay is observably
|
|
30
|
-
* free: the round does not advance and no signal is appended. New work
|
|
31
|
-
* produces different verdict content, hence a new fingerprint, hence a
|
|
32
|
-
* genuine round.
|
|
33
|
-
*
|
|
34
|
-
* ## The three terminal actions
|
|
35
|
-
*
|
|
36
|
-
* - `proceed` — every criterion is `met`. The Story may flip to
|
|
37
|
-
* `closing`.
|
|
38
|
-
* - `redraft` — at least one criterion is `partial`/`unmet` AND the
|
|
39
|
-
* current round is below the cap. The agent reworks the
|
|
40
|
-
* flagged criteria and re-runs the eval pass.
|
|
41
|
-
* - `block` — at least one criterion is `partial`/`unmet` AND the
|
|
42
|
-
* current round has reached (or somehow exceeded) the cap.
|
|
43
|
-
* The Story escalates to `agent::blocked`; it never
|
|
44
|
-
* silently proceeds to close.
|
|
45
|
-
*
|
|
46
|
-
* ## The cap
|
|
47
|
-
*
|
|
48
|
-
* `maxRounds` arrives normalized by `lib/config/acceptance-eval.js` as a
|
|
49
|
-
* non-negative integer (Story #5313: `0` means "score once, no redraft").
|
|
50
|
-
* This reducer maps that onto an effective cap of scored rounds: a cap of
|
|
51
|
-
* `0`, a negative value or a non-integer is coerced to 1, so there is no
|
|
52
|
-
* input — config or verdict — that yields an unbounded `redraft` chain.
|
|
53
|
-
* When `round >= effectiveCap` and criteria remain unmet, the only
|
|
54
|
-
* possible action is `block`.
|
|
2
|
+
* Acceptance-eval decision core: verdict + cap → `proceed`, `redraft`, or
|
|
3
|
+
* `block` (unmet at cap; never a silent close). The round comes from the
|
|
4
|
+
* signals ledger, never the critic's own `round`, so a critic cannot defeat
|
|
5
|
+
* the cap; re-scoring an identical verdict replays its round.
|
|
55
6
|
*/
|
|
56
7
|
|
|
57
8
|
import { createHash } from 'node:crypto';
|
|
@@ -59,21 +10,13 @@ import { readFileSync } from 'node:fs';
|
|
|
59
10
|
|
|
60
11
|
import { runArtifactPath, signalsFile } from '../config/temp-paths.js';
|
|
61
12
|
|
|
62
|
-
/** Epic-level signals stream basename (mirrors signals-writer). */
|
|
63
13
|
const EPIC_SIGNALS_BASENAME = 'signals.ndjson';
|
|
64
14
|
|
|
65
|
-
/**
|
|
66
|
-
* Verdicts that clear a criterion. Anything else (`partial`, `unmet`, or
|
|
67
|
-
* an unrecognised value) is treated as not-yet-met and triggers rework.
|
|
68
|
-
*
|
|
69
|
-
* @type {ReadonlySet<string>}
|
|
70
|
-
*/
|
|
15
|
+
/** @type {ReadonlySet<string>} */
|
|
71
16
|
const MET_VERDICTS = Object.freeze(new Set(['met']));
|
|
72
17
|
|
|
73
18
|
/**
|
|
74
|
-
*
|
|
75
|
-
* last-line guard against an open loop: any degraded cap falls back to a
|
|
76
|
-
* single round rather than an unbounded one.
|
|
19
|
+
* Integer ≥ 1 — the last guard against an unbounded redraft loop.
|
|
77
20
|
*
|
|
78
21
|
* @param {unknown} value
|
|
79
22
|
* @returns {number}
|
|
@@ -86,10 +29,6 @@ function effectiveCap(value) {
|
|
|
86
29
|
}
|
|
87
30
|
|
|
88
31
|
/**
|
|
89
|
-
* Partition a verdict's criteria into met and not-met buckets, preserving
|
|
90
|
-
* order and capturing the evidence for the not-met items (used to compose
|
|
91
|
-
* the blocker comment and the per-criterion signal).
|
|
92
|
-
*
|
|
93
32
|
* @param {Array<{ index?: number, criterion?: string, verdict?: string, evidence?: string }>} criteria
|
|
94
33
|
* @returns {{
|
|
95
34
|
* metCount: number,
|
|
@@ -117,19 +56,10 @@ function partitionCriteria(criteria) {
|
|
|
117
56
|
}
|
|
118
57
|
|
|
119
58
|
/**
|
|
120
|
-
* Decide the next loop action from a single round's verdict.
|
|
121
|
-
*
|
|
122
59
|
* @param {object} args
|
|
123
|
-
* @param {{ criteria?: Array<object> }} args.verdict
|
|
124
|
-
* A verdict already validated against the acceptance-eval-verdict schema.
|
|
125
|
-
* Its `round` field, when present, is ignored — the round is supplied by
|
|
126
|
-
* the caller (derived from the signals ledger; Story #4019).
|
|
60
|
+
* @param {{ criteria?: Array<object> }} args.verdict Its own `round` is ignored.
|
|
127
61
|
* @param {number} args.maxRounds
|
|
128
|
-
*
|
|
129
|
-
* `getAcceptanceEval(config).maxRounds`.
|
|
130
|
-
* @param {number} [args.round]
|
|
131
|
-
* The current round number, derived via `resolveAcceptanceEvalRound`.
|
|
132
|
-
* Defaults to 1 when absent or invalid.
|
|
62
|
+
* @param {number} [args.round] From `resolveAcceptanceEvalRound`.
|
|
133
63
|
* @returns {{
|
|
134
64
|
* decision: 'proceed' | 'redraft' | 'block',
|
|
135
65
|
* round: number,
|
|
@@ -169,18 +99,14 @@ export function decideAcceptanceEval({ verdict, maxRounds, round: roundIn }) {
|
|
|
169
99
|
}
|
|
170
100
|
|
|
171
101
|
/**
|
|
172
|
-
*
|
|
173
|
-
* feedback substrate. Carries which acceptance items needed rework and the
|
|
174
|
-
* round count so `/mandrel-plan` Phase 0 feedback fetch and the retro can
|
|
175
|
-
* surface acceptance churn. PII-free by construction — it carries only
|
|
176
|
-
* acceptance-item indices, verdicts, and the terminal decision.
|
|
102
|
+
* PII-free by construction: indices, verdicts and the decision only.
|
|
177
103
|
*
|
|
178
104
|
* @param {object} args
|
|
179
105
|
* @param {number} args.storyId
|
|
180
106
|
* @param {number | null} args.epicId
|
|
181
107
|
* @param {ReturnType<typeof decideAcceptanceEval>} args.outcome
|
|
182
108
|
* @param {string} [args.phase]
|
|
183
|
-
* @returns {object} The
|
|
109
|
+
* @returns {object} The record without `ts` (the caller stamps it).
|
|
184
110
|
*/
|
|
185
111
|
export function buildAcceptanceEvalSignal({
|
|
186
112
|
storyId,
|
|
@@ -194,18 +120,12 @@ export function buildAcceptanceEvalSignal({
|
|
|
194
120
|
kind: 'acceptance-eval',
|
|
195
121
|
epicId: epicId ?? null,
|
|
196
122
|
storyId: storyId ?? null,
|
|
197
|
-
// Epic #4475 (M4-B): single-delivery acceptance critics score an AC
|
|
198
|
-
// *cluster*, not a Story. `clusterId` scopes the per-cluster round count
|
|
199
|
-
// on the epic-level signals stream; omitted (null) for the per-Story path.
|
|
200
123
|
...(typeof clusterId === 'string' && clusterId.length > 0
|
|
201
124
|
? { clusterId }
|
|
202
125
|
: {}),
|
|
203
126
|
phase,
|
|
204
127
|
emitter: { tool: 'acceptance-eval.js' },
|
|
205
128
|
details: {
|
|
206
|
-
// Content address of the verdict this signal scored. The replay guard
|
|
207
|
-
// in `resolveAcceptanceEvalRound` matches on it, so a re-read of an
|
|
208
|
-
// already-scored verdict reuses its round instead of minting one.
|
|
209
129
|
...(typeof verdictFingerprint === 'string' &&
|
|
210
130
|
verdictFingerprint.length > 0
|
|
211
131
|
? { verdictFingerprint }
|
|
@@ -225,27 +145,19 @@ export function buildAcceptanceEvalSignal({
|
|
|
225
145
|
}
|
|
226
146
|
|
|
227
147
|
/**
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
* The read is restart-safe: the ledger lives on disk, so a subagent that
|
|
233
|
-
* dies mid-loop and restarts still observes every prior round. A missing or
|
|
234
|
-
* unreadable ledger degrades to "no prior rounds" and malformed lines are
|
|
235
|
-
* skipped — observability corruption never wedges the gate.
|
|
148
|
+
* Prior rounds' records, oldest first. A missing ledger or malformed line
|
|
149
|
+
* never wedges the gate. `clusterId` counts per AC cluster on the epic-level
|
|
150
|
+
* stream.
|
|
236
151
|
*
|
|
237
152
|
* @param {object} args
|
|
238
|
-
* @param {number|null} args.epicId
|
|
239
|
-
* standalone Story (routes to `<tempRoot>/standalone/stories/...`).
|
|
153
|
+
* @param {number|null} args.epicId
|
|
240
154
|
* @param {number} args.storyId
|
|
241
|
-
* @param {string|null} [args.clusterId]
|
|
242
|
-
* @param {object} [args.config]
|
|
243
|
-
* @param {(p: string) => string} [args.readFile]
|
|
155
|
+
* @param {string|null} [args.clusterId]
|
|
156
|
+
* @param {object} [args.config]
|
|
157
|
+
* @param {(p: string) => string} [args.readFile]
|
|
244
158
|
* @param {(eid: number|null, sid: number, config?: object) => string} [args.signalsPathResolver]
|
|
245
|
-
* Injectable path resolver (tests). Defaults to `signalsFile`.
|
|
246
159
|
* @param {(eid: number, config?: object) => string} [args.epicSignalsPathResolver]
|
|
247
|
-
*
|
|
248
|
-
* @returns {object[]} The matching records, oldest first.
|
|
160
|
+
* @returns {object[]}
|
|
249
161
|
*/
|
|
250
162
|
function readPriorAcceptanceEvalRecords({
|
|
251
163
|
epicId,
|
|
@@ -257,10 +169,6 @@ function readPriorAcceptanceEvalRecords({
|
|
|
257
169
|
epicSignalsPathResolver = (eid, cfg) =>
|
|
258
170
|
runArtifactPath(eid, EPIC_SIGNALS_BASENAME, cfg),
|
|
259
171
|
}) {
|
|
260
|
-
// Epic #4475 (M4-B): single-delivery critics score AC clusters, not
|
|
261
|
-
// Stories. When `clusterId` is supplied the round is counted per cluster
|
|
262
|
-
// off the epic-level signals stream; otherwise the per-Story path
|
|
263
|
-
// (unchanged) counts by `storyId` off the Story's stream.
|
|
264
172
|
const clusterMode =
|
|
265
173
|
typeof clusterId === 'string' &&
|
|
266
174
|
clusterId.length > 0 &&
|
|
@@ -272,7 +180,6 @@ function readPriorAcceptanceEvalRecords({
|
|
|
272
180
|
? readFile(epicSignalsPathResolver(epicId, config))
|
|
273
181
|
: readFile(signalsPathResolver(epicId ?? null, storyId, config));
|
|
274
182
|
} catch (_err) {
|
|
275
|
-
// No ledger yet → no prior rounds.
|
|
276
183
|
return [];
|
|
277
184
|
}
|
|
278
185
|
|
|
@@ -284,7 +191,7 @@ function readPriorAcceptanceEvalRecords({
|
|
|
284
191
|
try {
|
|
285
192
|
record = JSON.parse(trimmed);
|
|
286
193
|
} catch (_err) {
|
|
287
|
-
continue;
|
|
194
|
+
continue;
|
|
288
195
|
}
|
|
289
196
|
if (!record || typeof record !== 'object') continue;
|
|
290
197
|
if (record.kind !== 'acceptance-eval') continue;
|
|
@@ -299,19 +206,11 @@ function readPriorAcceptanceEvalRecords({
|
|
|
299
206
|
}
|
|
300
207
|
|
|
301
208
|
/**
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
* The fingerprint covers exactly what the decision depends on — the ordered
|
|
306
|
-
* per-criterion `index` / `criterion` / `verdict` / `evidence` tuples — and
|
|
307
|
-
* deliberately nothing else: the verdict's self-reported `round`, its
|
|
308
|
-
* timestamp, and any authoring scratch must not make an unchanged
|
|
309
|
-
* evaluation look like a new one. Conversely, real rework changes at least
|
|
310
|
-
* one criterion's verdict or its evidence, so a genuine re-evaluation
|
|
311
|
-
* always fingerprints differently.
|
|
209
|
+
* Hashes only what the decision depends on, so an unchanged evaluation
|
|
210
|
+
* fingerprints the same and real rework does not.
|
|
312
211
|
*
|
|
313
212
|
* @param {{ criteria?: Array<object> }} verdict
|
|
314
|
-
* @returns {string}
|
|
213
|
+
* @returns {string}
|
|
315
214
|
*/
|
|
316
215
|
export function computeVerdictFingerprint(verdict) {
|
|
317
216
|
const criteria = Array.isArray(verdict?.criteria) ? verdict.criteria : [];
|
|
@@ -328,23 +227,10 @@ export function computeVerdictFingerprint(verdict) {
|
|
|
328
227
|
}
|
|
329
228
|
|
|
330
229
|
/**
|
|
331
|
-
*
|
|
332
|
-
*
|
|
333
|
-
* (Story #4874). A genuine round is `prior-signal count + 1`, so the first
|
|
334
|
-
* run reports round 1 and each completed round advances it by one.
|
|
335
|
-
*
|
|
336
|
-
* When the ledger already carries an `acceptance-eval` signal whose
|
|
337
|
-
* `details.verdictFingerprint` matches, this invocation is a **replay**: it
|
|
338
|
-
* reports that signal's round and tells the caller not to append a second
|
|
339
|
-
* one, so reading is observably free and cannot escalate a `redraft` into a
|
|
340
|
-
* `block`. Otherwise it is a genuine round and the counter advances exactly
|
|
341
|
-
* as the pre-#4874 count-based derivation always did.
|
|
342
|
-
*
|
|
343
|
-
* Signals written before this field existed carry no fingerprint; they can
|
|
344
|
-
* never match, so legacy ledgers keep their count-based behaviour.
|
|
230
|
+
* A matching recorded fingerprint is a replay of that round (the caller must
|
|
231
|
+
* not append); otherwise `prior count + 1`.
|
|
345
232
|
*
|
|
346
|
-
* @param {object} args — {@link readPriorAcceptanceEvalRecords}'s
|
|
347
|
-
* plus:
|
|
233
|
+
* @param {object} args — {@link readPriorAcceptanceEvalRecords}'s args, plus:
|
|
348
234
|
* @param {string} args.verdictFingerprint
|
|
349
235
|
* @returns {{ round: number, replay: boolean }}
|
|
350
236
|
*/
|
|
@@ -1,56 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* auto-merge-cwd.js —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `--delete-branch` flag makes `gh` shell out to local `git` to leave
|
|
9
|
-
* and delete the PR head branch — including a `git checkout <base>` to
|
|
10
|
-
* switch the working tree off the head branch. When the arm runs from a
|
|
11
|
-
* per-Story worktree cwd (checked out on the head branch `story-<id>`)
|
|
12
|
-
* while the base branch (`main`) is already occupied by the primary
|
|
13
|
-
* worktree, `gh`'s internal `git checkout <base>` collides:
|
|
14
|
-
*
|
|
15
|
-
* fatal: '<base>' is already used by worktree at '<primary>'
|
|
16
|
-
*
|
|
17
|
-
* The arm fails (non-fatally), defeating the unattended auto-merge
|
|
18
|
-
* contract — the operator must re-run the merge manually from a clean cwd.
|
|
19
|
-
*
|
|
20
|
-
* Fix (advisory direction #1 from the Story — "ensure the cwd is already
|
|
21
|
-
* on the base branch so gh's `git checkout <base>` is a no-op"):
|
|
22
|
-
* Re-point the arm at the **primary worktree root** — the working tree
|
|
23
|
-
* that holds the base branch — discovered via `git worktree list
|
|
24
|
-
* --porcelain`. From the primary worktree, `gh`'s `--delete-branch`
|
|
25
|
-
* cleanup never has to `git checkout <base>` (it is already there), so
|
|
26
|
-
* the collision cannot occur. `--delete-branch` is preserved verbatim,
|
|
27
|
-
* so the PR head branch is still removed on merge with no dependency on
|
|
28
|
-
* the consumer's repo-level "auto-delete head branches" toggle.
|
|
29
|
-
*
|
|
30
|
-
* Non-fatal by construction: any failure to resolve the primary worktree
|
|
31
|
-
* (not a git repo, `git` missing, single-worktree layout, parse failure)
|
|
32
|
-
* degrades to returning the original `cwd` unchanged. Worst case is the
|
|
33
|
-
* pre-fix behaviour; this helper never throws and never blocks arming.
|
|
2
|
+
* auto-merge-cwd.js — pick a cwd for arming auto-merge that cannot hit the
|
|
3
|
+
* worktree collision. `gh pr merge --delete-branch` runs `git checkout <base>`;
|
|
4
|
+
* from a Story worktree that fails because the primary worktree already holds
|
|
5
|
+
* the base branch. Arming from the primary worktree makes that checkout a
|
|
6
|
+
* no-op while keeping `--delete-branch`. Any resolution failure returns the
|
|
7
|
+
* original `cwd`; never throws.
|
|
34
8
|
*/
|
|
35
9
|
|
|
36
10
|
import { gitSpawn as defaultGitSpawn } from '../git-utils.js';
|
|
37
11
|
|
|
38
12
|
/**
|
|
39
|
-
* Parse `git worktree list --porcelain`
|
|
40
|
-
*
|
|
41
|
-
* The porcelain format emits one stanza per worktree, blank-line
|
|
42
|
-
* separated, e.g.:
|
|
43
|
-
*
|
|
44
|
-
* worktree /abs/path/to/primary
|
|
45
|
-
* HEAD <sha>
|
|
46
|
-
* branch refs/heads/main
|
|
47
|
-
*
|
|
48
|
-
* worktree /abs/path/to/.worktrees/story-4282
|
|
49
|
-
* HEAD <sha>
|
|
50
|
-
* branch refs/heads/story-4282
|
|
51
|
-
*
|
|
52
|
-
* A linked worktree with a detached HEAD emits `detached` instead of a
|
|
53
|
-
* `branch` line. Pure — exported for tests.
|
|
13
|
+
* Parse `git worktree list --porcelain` stanzas; a detached worktree has
|
|
14
|
+
* `branch: null`.
|
|
54
15
|
*
|
|
55
16
|
* @param {string} stdout
|
|
56
17
|
* @returns {Array<{ path: string, branch: string|null }>}
|
|
@@ -70,21 +31,14 @@ export function parseWorktreeList(stdout) {
|
|
|
70
31
|
.trim()
|
|
71
32
|
.replace(/^refs\/heads\//, '');
|
|
72
33
|
}
|
|
73
|
-
// `HEAD <sha>`, `detached`, `bare`, `locked`, `prunable` lines carry
|
|
74
|
-
// no field we need; ignored.
|
|
75
34
|
}
|
|
76
35
|
if (current) records.push(current);
|
|
77
36
|
return records;
|
|
78
37
|
}
|
|
79
38
|
|
|
80
39
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* original (non-linked) working tree and, during delivery, the one that
|
|
84
|
-
* holds the base branch. Returns its absolute path, or `null` when the
|
|
85
|
-
* list is empty / unparseable.
|
|
86
|
-
*
|
|
87
|
-
* Pure — exported for tests.
|
|
40
|
+
* The first stanza is the primary (non-linked) worktree, which holds the base
|
|
41
|
+
* branch during delivery.
|
|
88
42
|
*
|
|
89
43
|
* @param {Array<{ path: string, branch: string|null }>} records
|
|
90
44
|
* @returns {string|null}
|
|
@@ -98,14 +52,7 @@ export function pickPrimaryWorktreePath(records) {
|
|
|
98
52
|
}
|
|
99
53
|
|
|
100
54
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* Returns the primary worktree root (which holds the base branch) when it
|
|
104
|
-
* can be discovered AND it differs from `cwd`; otherwise returns `cwd`
|
|
105
|
-
* unchanged. Never throws.
|
|
106
|
-
*
|
|
107
|
-
* @param {string} cwd — the cwd the caller would otherwise arm from
|
|
108
|
-
* (often a per-Story worktree on the head branch).
|
|
55
|
+
* @param {string} cwd — the cwd the caller would otherwise arm from.
|
|
109
56
|
* @param {{ gitSpawn?: typeof import('../git-utils.js').gitSpawn }} [deps]
|
|
110
57
|
* @returns {string} a cwd safe to run `gh pr merge --delete-branch` from.
|
|
111
58
|
*/
|
|
@@ -121,8 +68,6 @@ export function resolveAutoMergeArmCwd(
|
|
|
121
68
|
if (!primary) return cwd;
|
|
122
69
|
return primary;
|
|
123
70
|
} catch {
|
|
124
|
-
// Any unexpected failure (git missing, non-repo cwd, etc.) degrades
|
|
125
|
-
// to the original cwd — arming stays best-effort.
|
|
126
71
|
return cwd;
|
|
127
72
|
}
|
|
128
73
|
}
|