mandrel 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/README.md +10 -10
- package/.agents/agents/story-worker.md +1 -1
- package/.agents/docs/agentrc-reference.json +4 -82
- package/.agents/docs/configuration.md +20 -87
- package/.agents/docs/workflows.md +1 -1
- package/.agents/instructions.md +1 -3
- package/.agents/rules/gherkin-standards.md +4 -0
- package/.agents/schemas/agentrc.schema.json +11 -486
- package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
- package/.agents/schemas/validation-evidence.schema.json +2 -1
- package/.agents/scripts/README.md +14 -14
- package/.agents/scripts/acceptance-eval.js +32 -164
- package/.agents/scripts/agents-bootstrap-github.js +27 -129
- package/.agents/scripts/apply-quality-bootstrap.js +4 -40
- package/.agents/scripts/audit-baselines.js +6 -27
- package/.agents/scripts/audit-labels-bootstrap.js +5 -29
- package/.agents/scripts/audit-to-stories.js +91 -361
- package/.agents/scripts/boot-sweep.js +19 -72
- package/.agents/scripts/bootstrap.js +74 -395
- package/.agents/scripts/ceremony-derive.js +9 -45
- package/.agents/scripts/check-arch-cycles.js +14 -64
- package/.agents/scripts/check-baselines.js +8 -48
- package/.agents/scripts/check-context-budget.js +46 -172
- package/.agents/scripts/check-cyclomatic.js +12 -44
- package/.agents/scripts/check-dead-exports.js +13 -64
- package/.agents/scripts/check-doc-links.js +38 -186
- package/.agents/scripts/check-gherkin-corpus.js +24 -127
- package/.agents/scripts/check-test-temp-hygiene.js +28 -169
- package/.agents/scripts/coverage-capture.js +32 -99
- package/.agents/scripts/deliver-light.js +14 -101
- package/.agents/scripts/deliver-recover.js +6 -42
- package/.agents/scripts/deliver-run.js +36 -133
- package/.agents/scripts/diagnose-friction.js +24 -116
- package/.agents/scripts/drain-pending-cleanup.js +1 -1
- package/.agents/scripts/evidence-gate.js +23 -85
- package/.agents/scripts/file-ci-gap.js +10 -50
- package/.agents/scripts/generate-config-docs.js +30 -170
- package/.agents/scripts/generate-lens-checklists.js +8 -52
- package/.agents/scripts/generate-skills-index.js +14 -112
- package/.agents/scripts/generate-workflows-doc.js +10 -70
- package/.agents/scripts/git-cleanup.js +2 -34
- package/.agents/scripts/lib/Graph.js +24 -81
- package/.agents/scripts/lib/ITicketingProvider.js +47 -143
- package/.agents/scripts/lib/Logger.js +14 -76
- package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
- package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
- package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
- package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
- package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
- package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
- package/.agents/scripts/lib/audit-baselines/read.js +3 -16
- package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
- package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
- package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
- package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
- package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
- package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
- package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
- package/.agents/scripts/lib/audit-suite/findings.js +12 -52
- package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
- package/.agents/scripts/lib/audit-suite/index.js +1 -15
- package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
- package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
- package/.agents/scripts/lib/audit-suite/runner.js +13 -43
- package/.agents/scripts/lib/audit-suite/selector.js +49 -349
- package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
- package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
- package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
- package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
- package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
- package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
- package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
- package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
- package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
- package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
- package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
- package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
- package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
- package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
- package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
- package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
- package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
- package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
- package/.agents/scripts/lib/baseline-loader.js +12 -51
- package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
- package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
- package/.agents/scripts/lib/baselines/components.js +10 -61
- package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
- package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
- package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
- package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
- package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
- package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
- package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
- package/.agents/scripts/lib/baselines/envelope.js +13 -129
- package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
- package/.agents/scripts/lib/baselines/git-base.js +23 -142
- package/.agents/scripts/lib/baselines/kernel.js +11 -111
- package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
- package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
- package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
- package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
- package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
- package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
- package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
- package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
- package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
- package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
- package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
- package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
- package/.agents/scripts/lib/baselines/path-canon.js +19 -128
- package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
- package/.agents/scripts/lib/baselines/reader.js +14 -107
- package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
- package/.agents/scripts/lib/baselines/scope.js +11 -135
- package/.agents/scripts/lib/baselines/writer.js +16 -149
- package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
- package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
- package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
- package/.agents/scripts/lib/bdd-step-index.js +26 -100
- package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
- package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
- package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
- package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
- package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
- package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
- package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
- package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
- package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
- package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
- package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
- package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
- package/.agents/scripts/lib/bootstrap/summary.js +1 -8
- package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
- package/.agents/scripts/lib/branch-name-guard.js +4 -23
- package/.agents/scripts/lib/changed-files.js +31 -143
- package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
- package/.agents/scripts/lib/checks/index.js +18 -101
- package/.agents/scripts/lib/checks/loop-health.js +11 -53
- package/.agents/scripts/lib/checks/state.js +16 -91
- package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
- package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
- package/.agents/scripts/lib/child-exec.js +39 -108
- package/.agents/scripts/lib/cli/standard-args.js +9 -116
- package/.agents/scripts/lib/cli-args.js +31 -146
- package/.agents/scripts/lib/cli-usage.js +5 -27
- package/.agents/scripts/lib/cli-utils.js +2 -12
- package/.agents/scripts/lib/close-validation/commands.js +13 -76
- package/.agents/scripts/lib/close-validation/gates.js +92 -331
- package/.agents/scripts/lib/close-validation/process.js +121 -151
- package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
- package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
- package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
- package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
- package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
- package/.agents/scripts/lib/close-validation/runner.js +53 -110
- package/.agents/scripts/lib/command-header.js +6 -28
- package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
- package/.agents/scripts/lib/config/baselines.js +3 -14
- package/.agents/scripts/lib/config/ci.js +8 -38
- package/.agents/scripts/lib/config/commands.js +1 -15
- package/.agents/scripts/lib/config/defaults.js +4 -33
- package/.agents/scripts/lib/config/delivery-routing.js +6 -35
- package/.agents/scripts/lib/config/explain.js +9 -80
- package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
- package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
- package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
- package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
- package/.agents/scripts/lib/config/gates/index.js +2 -17
- package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
- package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
- package/.agents/scripts/lib/config/gates/shared.js +4 -64
- package/.agents/scripts/lib/config/github.js +4 -22
- package/.agents/scripts/lib/config/limits.js +4 -57
- package/.agents/scripts/lib/config/paths.js +2 -21
- package/.agents/scripts/lib/config/qa.js +4 -38
- package/.agents/scripts/lib/config/quality.js +76 -432
- package/.agents/scripts/lib/config/runners.js +12 -56
- package/.agents/scripts/lib/config/runtime.js +13 -57
- package/.agents/scripts/lib/config/shared.js +2 -16
- package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
- package/.agents/scripts/lib/config/temp-paths.js +40 -280
- package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
- package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
- package/.agents/scripts/lib/config-resolver.js +10 -52
- package/.agents/scripts/lib/config-schema-shared.js +1 -4
- package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
- package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
- package/.agents/scripts/lib/config-settings-schema.js +37 -274
- package/.agents/scripts/lib/coverage-baseline.js +20 -110
- package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
- package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
- package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
- package/.agents/scripts/lib/coverage-capture.js +99 -224
- package/.agents/scripts/lib/coverage-utils.js +14 -79
- package/.agents/scripts/lib/cpu-pool.js +17 -123
- package/.agents/scripts/lib/crap-baseline-join.js +16 -88
- package/.agents/scripts/lib/crap-coordinates.js +6 -25
- package/.agents/scripts/lib/crap-engine.js +40 -153
- package/.agents/scripts/lib/crap-method-identity.js +16 -78
- package/.agents/scripts/lib/crap-utils.js +31 -155
- package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
- package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
- package/.agents/scripts/lib/dead-exports-knip.js +18 -56
- package/.agents/scripts/lib/dead-exports-mode.js +5 -24
- package/.agents/scripts/lib/degraded-mode.js +3 -26
- package/.agents/scripts/lib/dependency-parser.js +8 -40
- package/.agents/scripts/lib/dependency-version.js +13 -35
- package/.agents/scripts/lib/detect-package-manager.js +6 -36
- package/.agents/scripts/lib/doc-tiers.js +22 -126
- package/.agents/scripts/lib/duplicate-search.js +8 -72
- package/.agents/scripts/lib/env-loader.js +5 -27
- package/.agents/scripts/lib/error-redactor.js +6 -31
- package/.agents/scripts/lib/errors/index.js +2 -22
- package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
- package/.agents/scripts/lib/escomplex-kernel.js +21 -123
- package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
- package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
- package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
- package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
- package/.agents/scripts/lib/findings/classify-finding.js +14 -69
- package/.agents/scripts/lib/findings/promote-finding.js +14 -112
- package/.agents/scripts/lib/findings/provenance-field.js +11 -52
- package/.agents/scripts/lib/findings/route-finding.js +37 -255
- package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
- package/.agents/scripts/lib/findings/severity.js +18 -104
- package/.agents/scripts/lib/format-generated-json.js +12 -44
- package/.agents/scripts/lib/full-suite-lock.js +160 -429
- package/.agents/scripts/lib/full-suite-queue.js +213 -0
- package/.agents/scripts/lib/gates/baseline-store.js +5 -9
- package/.agents/scripts/lib/gates/friction.js +1 -3
- package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
- package/.agents/scripts/lib/gh-exec.js +31 -259
- package/.agents/scripts/lib/git/cached-fetch.js +9 -52
- package/.agents/scripts/lib/git/sync-from-base.js +15 -107
- package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
- package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
- package/.agents/scripts/lib/git-utils.js +37 -161
- package/.agents/scripts/lib/github/framework-repo.js +8 -71
- package/.agents/scripts/lib/github-url.js +2 -17
- package/.agents/scripts/lib/import-graph.js +11 -38
- package/.agents/scripts/lib/install-cmd-parser.js +4 -13
- package/.agents/scripts/lib/json-utils.js +3 -18
- package/.agents/scripts/lib/label-constants.js +16 -111
- package/.agents/scripts/lib/label-taxonomy.js +4 -30
- package/.agents/scripts/lib/maintainability-engine.js +12 -80
- package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
- package/.agents/scripts/lib/maintainability-utils.js +16 -92
- package/.agents/scripts/lib/mandrel-catalog.js +12 -70
- package/.agents/scripts/lib/notifications/notifier.js +13 -38
- package/.agents/scripts/lib/npm-scripts.js +4 -23
- package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
- package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
- package/.agents/scripts/lib/observability/signal-validator.js +5 -37
- package/.agents/scripts/lib/observability/signals-writer.js +11 -121
- package/.agents/scripts/lib/observability/source-classifier.js +21 -203
- package/.agents/scripts/lib/observability/terse-result.js +14 -47
- package/.agents/scripts/lib/onboard/init-tail.js +13 -74
- package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
- package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
- package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
- package/.agents/scripts/lib/orchestration/change-set.js +7 -36
- package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
- package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
- package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
- package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
- package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
- package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
- package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
- package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
- package/.agents/scripts/lib/orchestration/check-state.js +92 -0
- package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
- package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
- package/.agents/scripts/lib/orchestration/code-review.js +24 -128
- package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
- package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
- package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
- package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
- package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
- package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
- package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
- package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
- package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
- package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
- package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
- package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
- package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
- package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
- package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
- package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
- package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
- package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
- package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
- package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
- package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
- package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
- package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
- package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
- package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
- package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
- package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
- package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
- package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
- package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
- package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
- package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
- package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
- package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
- package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
- package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
- package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
- package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
- package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
- package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
- package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
- package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
- package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
- package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
- package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
- package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
- package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
- package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
- package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
- package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
- package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
- package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
- package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
- package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
- package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
- package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
- package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
- package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
- package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
- package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
- package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
- package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
- package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
- package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
- package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
- package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
- package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
- package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
- package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
- package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
- package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
- package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
- package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
- package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
- package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
- package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
- package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
- package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
- package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
- package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
- package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
- package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
- package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
- package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
- package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
- package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
- package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
- package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
- package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
- package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
- package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
- package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
- package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
- package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
- package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
- package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
- package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
- package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
- package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
- package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
- package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
- package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
- package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
- package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
- package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
- package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
- package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
- package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
- package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
- package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
- package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
- package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
- package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
- package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
- package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
- package/.agents/scripts/lib/path-security.js +3 -6
- package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
- package/.agents/scripts/lib/preflight-runner.js +13 -69
- package/.agents/scripts/lib/process-group.js +143 -0
- package/.agents/scripts/lib/project-root.js +2 -8
- package/.agents/scripts/lib/provider-factory.js +2 -25
- package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
- package/.agents/scripts/lib/qa/qa-session.js +15 -69
- package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
- package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
- package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
- package/.agents/scripts/lib/reserved-test-ids.js +9 -47
- package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
- package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
- package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
- package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
- package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
- package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
- package/.agents/scripts/lib/signals/detectors/common.js +12 -38
- package/.agents/scripts/lib/signals/index.js +2 -19
- package/.agents/scripts/lib/signals/schema.js +14 -109
- package/.agents/scripts/lib/signals/write.js +2 -11
- package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
- package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
- package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
- package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
- package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
- package/.agents/scripts/lib/single-story-sweep.js +14 -97
- package/.agents/scripts/lib/skills/parse-skill.js +13 -59
- package/.agents/scripts/lib/skills/skills-index.js +8 -29
- package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
- package/.agents/scripts/lib/source-extensions.js +11 -42
- package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
- package/.agents/scripts/lib/stdio-flush.js +9 -36
- package/.agents/scripts/lib/story-adjacency.js +8 -40
- package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
- package/.agents/scripts/lib/story-body/footer-block.js +11 -44
- package/.agents/scripts/lib/story-body/story-body.js +83 -358
- package/.agents/scripts/lib/temp-retention.js +42 -143
- package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
- package/.agents/scripts/lib/test-env.js +12 -65
- package/.agents/scripts/lib/test-run-credit.js +10 -65
- package/.agents/scripts/lib/test-runner-contract.js +19 -74
- package/.agents/scripts/lib/test-temp.js +38 -184
- package/.agents/scripts/lib/test-tiers.js +12 -96
- package/.agents/scripts/lib/ticket-body-sections.js +21 -96
- package/.agents/scripts/lib/transpile.js +15 -74
- package/.agents/scripts/lib/util/concurrent-map.js +6 -25
- package/.agents/scripts/lib/util/parse-id-list.js +8 -34
- package/.agents/scripts/lib/util/poll-loop.js +8 -28
- package/.agents/scripts/lib/util/with-timeout.js +2 -11
- package/.agents/scripts/lib/validation-evidence.js +21 -96
- package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
- package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
- package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
- package/.agents/scripts/lib/workers/crap-worker.js +11 -64
- package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
- package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
- package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
- package/.agents/scripts/lib/workflow-closure.js +22 -105
- package/.agents/scripts/lib/workspace-provisioner.js +16 -54
- package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
- package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
- package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
- package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
- package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
- package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
- package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
- package/.agents/scripts/lib/worktree-manager.js +15 -40
- package/.agents/scripts/lint-issue-body.js +12 -68
- package/.agents/scripts/mandrel-update-preflight.js +10 -70
- package/.agents/scripts/merge-baseline.js +30 -104
- package/.agents/scripts/nav-registry-diff.js +22 -108
- package/.agents/scripts/notify.js +12 -69
- package/.agents/scripts/plan-context.js +27 -111
- package/.agents/scripts/plan-critics.js +12 -66
- package/.agents/scripts/plan-persist.js +31 -148
- package/.agents/scripts/plan-run-epilogue.js +11 -37
- package/.agents/scripts/pr-watch-with-update.js +76 -267
- package/.agents/scripts/providers/github/auth.js +3 -8
- package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
- package/.agents/scripts/providers/github/board-add.js +5 -21
- package/.agents/scripts/providers/github/branch-protection.js +11 -43
- package/.agents/scripts/providers/github/cache.js +2 -14
- package/.agents/scripts/providers/github/comments.js +7 -40
- package/.agents/scripts/providers/github/compose.js +3 -19
- package/.agents/scripts/providers/github/errors.js +22 -125
- package/.agents/scripts/providers/github/issues.js +31 -123
- package/.agents/scripts/providers/github/labels.js +24 -124
- package/.agents/scripts/providers/github/mappers.js +5 -27
- package/.agents/scripts/providers/github/merge-methods.js +3 -22
- package/.agents/scripts/providers/github/project-board.js +2 -17
- package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
- package/.agents/scripts/providers/github/request-helpers.js +5 -32
- package/.agents/scripts/providers/github/search-budget.js +9 -39
- package/.agents/scripts/providers/github/search-query.js +5 -26
- package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
- package/.agents/scripts/providers/github/sub-issues.js +7 -36
- package/.agents/scripts/providers/github/tickets.js +32 -134
- package/.agents/scripts/providers/github.js +18 -59
- package/.agents/scripts/prune-plan-run-labels.js +12 -46
- package/.agents/scripts/quality-preview.js +35 -220
- package/.agents/scripts/resolve-doc-tiers.js +3 -26
- package/.agents/scripts/resolve-stories.js +16 -67
- package/.agents/scripts/resync-status-column.js +6 -25
- package/.agents/scripts/run-tests.js +29 -104
- package/.agents/scripts/single-story-close.js +23 -135
- package/.agents/scripts/single-story-confirm-merge.js +32 -139
- package/.agents/scripts/single-story-init.js +47 -209
- package/.agents/scripts/stories-wave-tick.js +102 -472
- package/.agents/scripts/sync-agentrc.js +3 -21
- package/.agents/scripts/sync-claude-agents.js +9 -55
- package/.agents/scripts/sync-claude-commands.js +20 -110
- package/.agents/scripts/test-wrapper.js +6 -43
- package/.agents/scripts/update-coverage-baseline.js +5 -22
- package/.agents/scripts/update-crap-baseline.js +7 -30
- package/.agents/scripts/update-duplication-baseline.js +16 -92
- package/.agents/scripts/update-maintainability-baseline.js +8 -62
- package/.agents/scripts/update-ticket-state.js +1 -7
- package/.agents/scripts/validate-skills.js +6 -26
- package/.agents/templates/agent-protocol.md +2 -2
- package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
- package/.agents/workflows/audit-accessibility.md +4 -7
- package/.agents/workflows/audit-adrs.md +3 -6
- package/.agents/workflows/audit-architecture.md +3 -11
- package/.agents/workflows/audit-baselines.md +6 -9
- package/.agents/workflows/audit-clean-code.md +8 -12
- package/.agents/workflows/audit-data-model.md +3 -7
- package/.agents/workflows/audit-dependencies.md +4 -7
- package/.agents/workflows/audit-devops.md +4 -8
- package/.agents/workflows/audit-documentation.md +1 -4
- package/.agents/workflows/audit-mobile.md +4 -7
- package/.agents/workflows/audit-navigability.md +3 -6
- package/.agents/workflows/audit-performance.md +2 -4
- package/.agents/workflows/audit-privacy.md +4 -7
- package/.agents/workflows/audit-quality.md +4 -7
- package/.agents/workflows/audit-security.md +4 -7
- package/.agents/workflows/audit-seo.md +4 -7
- package/.agents/workflows/audit-sre.md +4 -7
- package/.agents/workflows/audit-to-stories.md +17 -30
- package/.agents/workflows/audit-ux-ui.md +4 -7
- package/.agents/workflows/helpers/audit-lens-core.md +1 -1
- package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
- package/.agents/workflows/helpers/deliver-digest.md +6 -4
- package/.agents/workflows/helpers/deliver-reference.md +114 -188
- package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
- package/.agents/workflows/helpers/plan-reference.md +86 -139
- package/.agents/workflows/helpers/qa-core.md +12 -0
- package/.agents/workflows/memory-consolidate.md +1 -1
- package/.agents/workflows/qa-assist.md +27 -71
- package/.agents/workflows/qa-explore.md +19 -59
- package/.agents/workflows/qa-run.md +11 -33
- package/README.md +1 -1
- package/bin/mandrel.js +5 -46
- package/bin/postinstall.js +18 -107
- package/docs/CHANGELOG.md +32 -0
- package/lib/cli/doctor.js +11 -71
- package/lib/cli/init.js +26 -165
- package/lib/cli/migrate.js +5 -64
- package/lib/cli/registry.js +84 -467
- package/lib/cli/sync-agents.js +4 -64
- package/lib/cli/sync-commands.js +11 -64
- package/lib/cli/sync.js +34 -213
- package/lib/cli/uninstall.js +40 -219
- package/lib/cli/update.js +105 -661
- package/lib/cli/version-check.js +8 -72
- package/lib/cli/version-helpers.js +14 -87
- package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
- package/lib/migrations/index.js +15 -92
- package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
- package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
- package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
- package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
- package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
- package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
- package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
- package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
- package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
- package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
- package/package.json +16 -14
- package/.agents/docs/SDLC.md +0 -590
- package/.agents/docs/quality-gates.md +0 -1183
- package/.agents/rules/known-tooling-behavior.md +0 -200
- package/.agents/rules/orchestration-error-handling.md +0 -61
- package/.agents/rules/test-seams.md +0 -59
- package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
- package/.agents/schemas/baselines/lint.schema.json +0 -47
- package/.agents/scripts/check-action-pinning.js +0 -260
- package/.agents/scripts/check-audit-attribution.js +0 -302
- package/.agents/scripts/check-baseline-drift.js +0 -211
- package/.agents/scripts/check-baseline-scope.js +0 -362
- package/.agents/scripts/check-generated-validator.js +0 -202
- package/.agents/scripts/check-knip-entries.js +0 -159
- package/.agents/scripts/check-lifecycle-lint.js +0 -294
- package/.agents/scripts/check-pinned-override-notes.js +0 -102
- package/.agents/scripts/check-schema-references.js +0 -368
- package/.agents/scripts/check-test-portability.js +0 -512
- package/.agents/scripts/check-workflow-citations.js +0 -218
- package/.agents/scripts/check-workflow-cli-lint.js +0 -299
- package/.agents/scripts/check-workflow-timeouts.js +0 -291
- package/.agents/scripts/install-matrix-assert.js +0 -326
- package/.agents/scripts/lib/audit-advisories.js +0 -195
- package/.agents/scripts/lib/audit-attribution.js +0 -134
- package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
- package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
- package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
- package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
- package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
- package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
- package/.agents/scripts/lib/c8-cli-path.js +0 -21
- package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
- package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
- package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
- package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
- package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
- package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
- package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
- package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
- package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
- package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
- package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
- package/.agents/scripts/lib/fs-walk.js +0 -52
- package/.agents/scripts/lib/knip-config-resolver.js +0 -181
- package/.agents/scripts/lib/knip-entry-sync.js +0 -452
- package/.agents/scripts/lib/pinned-override-notes.js +0 -88
- package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
- package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
- package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
- package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
- package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
- package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
- package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
- package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
- package/.agents/scripts/lib/test-isolate/runner.js +0 -483
- package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
- package/.agents/scripts/lib/test-profile/render-report.js +0 -45
- package/.agents/scripts/lint-label-vocabulary.js +0 -214
- package/.agents/scripts/post-structured-comment.js +0 -127
- package/.agents/scripts/provision-git-hooks.js +0 -85
- package/.agents/scripts/prune-baseline-orphans.js +0 -181
- package/.agents/scripts/run-coverage.js +0 -197
- package/.agents/scripts/run-lint.js +0 -133
- package/.agents/scripts/run-test-profile.js +0 -129
- package/.agents/scripts/run-verify.js +0 -125
- package/.agents/scripts/test-isolate.js +0 -55
- package/.agents/scripts/update-dead-exports-baseline.js +0 -321
|
@@ -1,47 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* (`lib/story-body/story-body.js`). The forms exist so a human filing a
|
|
7
|
-
* Story in the GitHub web UI produces a body that round-trips through
|
|
8
|
-
* the same `story-body.parse()` agents rely on — closing the
|
|
9
|
-
* human↔agent ticket-shape gap.
|
|
10
|
-
*
|
|
11
|
-
* ## Why generated, not hand-authored
|
|
12
|
-
*
|
|
13
|
-
* Hand-authoring the forms would let the field headings drift from what
|
|
14
|
-
* `parse()` expects. Instead the form field set is derived from a single
|
|
15
|
-
* `HUMAN_INTENT_FIELDS` table here, and each field's heading is the exact
|
|
16
|
-
* section name the parser maps (`goal` → `## Goal`, etc.). The CI
|
|
17
|
-
* conformance lint (`lint-issue-body.js`) runs the real `parse()` against
|
|
18
|
-
* human-opened issues so the form and the parser cannot silently drift.
|
|
19
|
-
*
|
|
20
|
-
* ## Form fields ⊆ body schema
|
|
21
|
-
*
|
|
22
|
-
* The forms expose only the human **intent subset** — `goal`, `changes`,
|
|
23
|
-
* `acceptance`, `verify`, `references`. Machine-managed sections (the
|
|
24
|
-
* `<!-- meta: … -->` block, the frozen dispatch manifest, `agent::*`
|
|
25
|
-
* transitions) are deliberately absent; the runtime fills those. The
|
|
26
|
-
* relationship is "form fields ⊆ body schema," not "form == body."
|
|
27
|
-
*
|
|
28
|
-
* ## GitHub serialization contract (the lossy seam)
|
|
29
|
-
*
|
|
30
|
-
* GitHub Issue Forms render every `textarea`/`input` field as:
|
|
31
|
-
*
|
|
32
|
-
* ```text
|
|
33
|
-
* ### {label}
|
|
34
|
-
*
|
|
35
|
-
* {value}
|
|
36
|
-
* ```
|
|
37
|
-
*
|
|
38
|
-
* i.e. the field label becomes a level-3 heading (`###`), not the level-2
|
|
39
|
-
* (`##`) the canonical serializer emits. `story-body.parse()` accepts both
|
|
40
|
-
* heading levels (Story #4227 widened its heading regex), so a body
|
|
41
|
-
* assembled from form output round-trips. This is the single point where
|
|
42
|
-
* the form shape and the canonical serializer differ, and it is covered by
|
|
43
|
-
* the round-trip test that feeds simulated GitHub output back through
|
|
44
|
-
* `parse()`.
|
|
2
|
+
* Generates the Story Issue Form from the Story-body SSOT so a human-filed
|
|
3
|
+
* body round-trips through `story-body.parse()`. Fields are only the human
|
|
4
|
+
* intent subset; the runtime fills machine-managed sections. GitHub renders
|
|
5
|
+
* labels as `###` headings, not `##` — `parse()` accepts both levels.
|
|
45
6
|
*
|
|
46
7
|
* @module bootstrap/issue-forms-template
|
|
47
8
|
*/
|
|
@@ -49,29 +10,13 @@
|
|
|
49
10
|
import fs from 'node:fs';
|
|
50
11
|
import path from 'node:path';
|
|
51
12
|
|
|
52
|
-
/**
|
|
53
|
-
* Directory (relative to a project root) GitHub reads issue forms from.
|
|
54
|
-
* Internal — the per-form path constants below are the exported surface.
|
|
55
|
-
*/
|
|
56
13
|
const ISSUE_TEMPLATE_RELATIVE_DIR = '.github/ISSUE_TEMPLATE';
|
|
57
14
|
|
|
58
|
-
/**
|
|
59
|
-
* Relative path of the generated Story form, surfaced as a constant so tests
|
|
60
|
-
* and the bootstrap caller assert the canonical write target without
|
|
61
|
-
* re-deriving it.
|
|
62
|
-
*/
|
|
63
15
|
export const STORY_FORM_RELATIVE_PATH = `${ISSUE_TEMPLATE_RELATIVE_DIR}/story.yml`;
|
|
64
16
|
|
|
65
17
|
/**
|
|
66
|
-
*
|
|
67
|
-
* `parse()`
|
|
68
|
-
* the exact section name `story-body.parse()` maps (case-insensitive); the
|
|
69
|
-
* generated YAML uses it verbatim as the field `label` so GitHub's
|
|
70
|
-
* `### {label}` render produces a heading the parser recognises.
|
|
71
|
-
*
|
|
72
|
-
* Machine-managed body fields (`wide`, `reason_to_exist`, `depends_on`
|
|
73
|
-
* meta) are intentionally absent — the runtime fills those. `depends_on` is exposed as a free-text input
|
|
74
|
-
* that serializes to the `blocked by #N` footer `parse()` already reads.
|
|
18
|
+
* Intent fields in `parse()` section order. `heading` must be the exact
|
|
19
|
+
* section name `parse()` maps, since GitHub renders the label as the heading.
|
|
75
20
|
*
|
|
76
21
|
* @type {Array<{
|
|
77
22
|
* id: string,
|
|
@@ -143,11 +88,7 @@ export const HUMAN_INTENT_FIELDS = [
|
|
|
143
88
|
];
|
|
144
89
|
|
|
145
90
|
/**
|
|
146
|
-
*
|
|
147
|
-
* The generated YAML only ever quotes single-line scalars (labels,
|
|
148
|
-
* descriptions, placeholders), so we escape backslashes, double quotes,
|
|
149
|
-
* and collapse embedded newlines into the literal `\n` placeholder GitHub
|
|
150
|
-
* renders verbatim in the form preview.
|
|
91
|
+
* Double-quoted single-line YAML scalar; newlines become literal `\n`.
|
|
151
92
|
*
|
|
152
93
|
* @param {string} value
|
|
153
94
|
* @returns {string}
|
|
@@ -161,10 +102,6 @@ function yamlQuote(value) {
|
|
|
161
102
|
}
|
|
162
103
|
|
|
163
104
|
/**
|
|
164
|
-
* Render a single Issue-Form field block (a `textarea` or `input`) from a
|
|
165
|
-
* {@link HUMAN_INTENT_FIELDS} descriptor. Indented to sit under the
|
|
166
|
-
* top-level `body:` sequence.
|
|
167
|
-
*
|
|
168
105
|
* @param {(typeof HUMAN_INTENT_FIELDS)[number]} field
|
|
169
106
|
* @returns {string}
|
|
170
107
|
*/
|
|
@@ -182,10 +119,7 @@ function renderFieldBlock(field) {
|
|
|
182
119
|
}
|
|
183
120
|
|
|
184
121
|
/**
|
|
185
|
-
*
|
|
186
|
-
* conformance lint / body assembler) into the `blocked by #N` footer lines
|
|
187
|
-
* `parse()` already extracts, so it stays out of the heading-mapped field
|
|
188
|
-
* set above.
|
|
122
|
+
* `depends_on` serializes to `blocked by` footer lines, not a heading.
|
|
189
123
|
*
|
|
190
124
|
* @returns {string}
|
|
191
125
|
*/
|
|
@@ -204,17 +138,11 @@ function renderDependsOnBlock() {
|
|
|
204
138
|
|
|
205
139
|
/**
|
|
206
140
|
* @typedef {object} IssueFormOptions
|
|
207
|
-
* @property {string} [entryStateLabel='agent::review-spec'] -
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
* @property {string} [projectName] - Optional repo/project name woven into
|
|
211
|
-
* the form description. Purely cosmetic.
|
|
141
|
+
* @property {string} [entryStateLabel='agent::review-spec'] - Puts human-filed
|
|
142
|
+
* tickets in the same lane as agent-created ones.
|
|
143
|
+
* @property {string} [projectName] - Cosmetic.
|
|
212
144
|
*/
|
|
213
145
|
|
|
214
|
-
/**
|
|
215
|
-
* Shared header banner stamped on every generated form so the provenance
|
|
216
|
-
* (and the "regenerate, don't hand-edit" rule) travels with the file.
|
|
217
|
-
*/
|
|
218
146
|
const GENERATED_BANNER =
|
|
219
147
|
'# Generated by agents-bootstrap-github (Story #4227) from the Story-body SSOT\n' +
|
|
220
148
|
'# (.agents/scripts/lib/story-body/story-body.js). Do NOT hand-edit the\n' +
|
|
@@ -223,12 +151,7 @@ const GENERATED_BANNER =
|
|
|
223
151
|
'# (lint-issue-body.js) is the drift guard between this form and the parser.';
|
|
224
152
|
|
|
225
153
|
/**
|
|
226
|
-
*
|
|
227
|
-
* ticket type in the label taxonomy, so the generated human-entry surface
|
|
228
|
-
* is story-only.
|
|
229
|
-
*
|
|
230
|
-
* The output is deterministic so the round-trip + idempotency tests assert
|
|
231
|
-
* on its exact shape.
|
|
154
|
+
* Deterministic Story form YAML.
|
|
232
155
|
*
|
|
233
156
|
* @param {'story'} ticketType
|
|
234
157
|
* @param {IssueFormOptions} [opts]
|
|
@@ -268,12 +191,7 @@ ${renderDependsOnBlock()}
|
|
|
268
191
|
}
|
|
269
192
|
|
|
270
193
|
/**
|
|
271
|
-
*
|
|
272
|
-
* a GitHub Issue Form yields (keyed by field `id`). This is the inverse of
|
|
273
|
-
* the form: it reconstructs what GitHub *would* serialize, using the
|
|
274
|
-
* canonical `## {Heading}` form so the result feeds straight into
|
|
275
|
-
* `story-body.parse()`. The conformance lint and the round-trip test use it
|
|
276
|
-
* to prove the form → parser contract without a live GitHub call.
|
|
194
|
+
* Inverse of the form: canonical `## {Heading}` body from field values.
|
|
277
195
|
*
|
|
278
196
|
* @param {Record<string, string>} values - Field id → raw textarea/input value.
|
|
279
197
|
* @returns {string} Canonical markdown body.
|
|
@@ -302,21 +220,11 @@ export function assembleBodyFromFormValues(values = {}) {
|
|
|
302
220
|
return body;
|
|
303
221
|
}
|
|
304
222
|
|
|
305
|
-
/**
|
|
306
|
-
* Relative path of the issue-body conformance workflow — the drift guard
|
|
307
|
-
* that runs `story-body.parse()` against human-opened tickets.
|
|
308
|
-
*/
|
|
223
|
+
/** The drift guard between the form and `story-body.parse()`. */
|
|
309
224
|
export const CONFORMANCE_WORKFLOW_RELATIVE_PATH =
|
|
310
225
|
'.github/workflows/issue-body-conformance.yml';
|
|
311
226
|
|
|
312
227
|
/**
|
|
313
|
-
* Render the CI workflow that runs the issue-body conformance lint
|
|
314
|
-
* (`lint-issue-body.js`) on opened/edited `type::story` issues. This is
|
|
315
|
-
* the mechanism that prevents the generated form and
|
|
316
|
-
* `story-body.parse()` from silently drifting (Story #4227 acceptance).
|
|
317
|
-
* Deterministic so the bootstrap test asserts its exact shape. Internal —
|
|
318
|
-
* exposed to consumers only through {@link ensureIssueForms}.
|
|
319
|
-
*
|
|
320
228
|
* @returns {string}
|
|
321
229
|
*/
|
|
322
230
|
function renderConformanceWorkflow() {
|
|
@@ -364,22 +272,13 @@ jobs:
|
|
|
364
272
|
}
|
|
365
273
|
|
|
366
274
|
/**
|
|
367
|
-
* Write
|
|
368
|
-
*
|
|
369
|
-
*
|
|
370
|
-
* - file absent → `created`
|
|
371
|
-
* - byte-identical → `unchanged`
|
|
372
|
-
* - operator-edited (differs from the rendered template) → `custom-skip`
|
|
373
|
-
* (the existing file is preserved; `rendered` is returned so the caller
|
|
374
|
-
* can offer a diff)
|
|
375
|
-
*
|
|
376
|
-
* Network-free; safe under tests with a tmp `projectRoot`.
|
|
275
|
+
* Write the form and its conformance workflow; an operator-edited file is
|
|
276
|
+
* preserved (`custom-skip`).
|
|
377
277
|
*
|
|
378
278
|
* @param {object} args
|
|
379
279
|
* @param {string} args.projectRoot
|
|
380
280
|
* @param {IssueFormOptions} [args.options]
|
|
381
|
-
* @param {boolean} [args.write=true] -
|
|
382
|
-
* actions without touching disk (dry-run).
|
|
281
|
+
* @param {boolean} [args.write=true] - `false` is a dry run.
|
|
383
282
|
* @returns {{ forms: Array<{ type: 'story'|'conformance-workflow',
|
|
384
283
|
* action: 'created'|'unchanged'|'custom-skip',
|
|
385
284
|
* path: string, rendered: string }> }}
|
|
@@ -389,9 +288,6 @@ export function ensureIssueForms(args) {
|
|
|
389
288
|
const options = args.options ?? {};
|
|
390
289
|
const write = args.write !== false;
|
|
391
290
|
|
|
392
|
-
// Each target pairs a type key with the rendered body. The conformance
|
|
393
|
-
// workflow is materialized alongside the form because it is the form's
|
|
394
|
-
// drift guard — they ship as one unit.
|
|
395
291
|
const targets = [
|
|
396
292
|
{
|
|
397
293
|
type: 'story',
|
|
@@ -1,33 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* ledger
|
|
4
|
-
*
|
|
5
|
-
* `buildMutationManifest(ctx)` enumerates every mutation the bootstrap
|
|
6
|
-
* pipeline can perform as a flat, declarative array. Each entry carries five
|
|
7
|
-
* fields:
|
|
8
|
-
*
|
|
9
|
-
* - `phaseGroup` — one of the four groups (`ide-wiring`, `repo-config`,
|
|
10
|
-
* `github-admin`, `quality-gates`).
|
|
11
|
-
* - `target` — the file path or remote resource the mutation touches.
|
|
12
|
-
* - `action` — the verb describing the mutation (`create`, `merge`,
|
|
13
|
-
* `update`, `run`, `configure`).
|
|
14
|
-
* - `detail` — a one-line operator-facing description of the change.
|
|
15
|
-
* - `reversible` — whether the operator can trivially undo the change
|
|
16
|
-
* (e.g. delete a created file) vs. a remote-admin mutation that is not
|
|
17
|
-
* a simple local revert.
|
|
18
|
-
*
|
|
19
|
-
* Story #3690 replaced the consent-first phased-approval install screen with
|
|
20
|
-
* a plain summary+confirm loop, and Story #5007 removed the vestigial
|
|
21
|
-
* machinery it left behind (the no-write `previewMutationManifest` renderer
|
|
22
|
-
* and the `approvedGroups` set-threading). What survives is load-bearing:
|
|
23
|
-
* `recordLedger` filters these entries into the install ledger, and
|
|
24
|
-
* `mandrel uninstall` walks them — the `phaseGroup` string is the ledger's
|
|
25
|
-
* grouping key, not an approval gate.
|
|
26
|
-
*
|
|
27
|
-
* The manifest describes *intended* mutations deterministically from the
|
|
28
|
-
* project root; it does not read or mutate any file. Whether a given
|
|
29
|
-
* mutation is a no-op on a particular clone (the file already carries the
|
|
30
|
-
* wiring) is decided at execution time by the idempotent `ensure*` steps.
|
|
2
|
+
* Declarative manifest of every mutation bootstrap can perform, filtered into
|
|
3
|
+
* the install ledger and walked by `mandrel uninstall`. Describes intent only;
|
|
4
|
+
* whether a mutation is a no-op is decided by the idempotent `ensure*` steps.
|
|
31
5
|
*
|
|
32
6
|
* @module bootstrap/manifest
|
|
33
7
|
*/
|
|
@@ -35,9 +9,7 @@
|
|
|
35
9
|
import path from 'node:path';
|
|
36
10
|
|
|
37
11
|
/**
|
|
38
|
-
*
|
|
39
|
-
* manifest entry MUST carry exactly one of these values so the install ledger
|
|
40
|
-
* can group and the uninstaller can select what a run actually landed.
|
|
12
|
+
* Ledger/uninstall grouping key, not an approval gate; every entry carries one.
|
|
41
13
|
*
|
|
42
14
|
* @type {Readonly<{ IDE_WIRING: 'ide-wiring', REPO_CONFIG: 'repo-config',
|
|
43
15
|
* GITHUB_ADMIN: 'github-admin', QUALITY_GATES: 'quality-gates' }>}
|
|
@@ -49,22 +21,12 @@ export const PHASE_GROUPS = Object.freeze({
|
|
|
49
21
|
QUALITY_GATES: 'quality-gates',
|
|
50
22
|
});
|
|
51
23
|
|
|
52
|
-
/**
|
|
53
|
-
* Frozen set of valid `phaseGroup` values, for validation and the
|
|
54
|
-
* acceptance check. Derived from `PHASE_GROUPS` so the two never drift.
|
|
55
|
-
*
|
|
56
|
-
* @type {ReadonlySet<string>}
|
|
57
|
-
*/
|
|
24
|
+
/** @type {ReadonlySet<string>} */
|
|
58
25
|
export const PHASE_GROUP_VALUES = Object.freeze(
|
|
59
26
|
new Set(Object.values(PHASE_GROUPS)),
|
|
60
27
|
);
|
|
61
28
|
|
|
62
|
-
/**
|
|
63
|
-
* The five required fields on every manifest entry. Exported so tests and
|
|
64
|
-
* downstream renderers can assert entry shape without re-declaring the list.
|
|
65
|
-
*
|
|
66
|
-
* @type {readonly string[]}
|
|
67
|
-
*/
|
|
29
|
+
/** @type {readonly string[]} */
|
|
68
30
|
export const MANIFEST_ENTRY_FIELDS = Object.freeze([
|
|
69
31
|
'phaseGroup',
|
|
70
32
|
'target',
|
|
@@ -76,33 +38,20 @@ export const MANIFEST_ENTRY_FIELDS = Object.freeze([
|
|
|
76
38
|
/**
|
|
77
39
|
* @typedef {object} MutationManifestEntry
|
|
78
40
|
* @property {'ide-wiring'|'repo-config'|'github-admin'|'quality-gates'} phaseGroup
|
|
79
|
-
*
|
|
80
|
-
* @property {string}
|
|
81
|
-
* remote-resource identifier the mutation touches.
|
|
82
|
-
* @property {string} action — verb describing the mutation.
|
|
41
|
+
* @property {string} target — project-root-relative path or remote resource.
|
|
42
|
+
* @property {string} action
|
|
83
43
|
* @property {string} detail — one-line operator-facing description.
|
|
84
|
-
* @property {boolean} reversible —
|
|
85
|
-
* undo the change locally; false for remote-admin mutations.
|
|
44
|
+
* @property {boolean} reversible — false for remote-admin mutations.
|
|
86
45
|
*/
|
|
87
46
|
|
|
88
47
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* Returns a flat array of {@link MutationManifestEntry} objects covering
|
|
92
|
-
* every mutation the bootstrap pipeline performs, partitioned across the
|
|
93
|
-
* four {@link PHASE_GROUPS}. File targets are project-root-relative
|
|
94
|
-
* forward-slash POSIX paths so the preview renders identically on every
|
|
95
|
-
* platform; remote targets are scoped to the resolved `owner/repo` slug.
|
|
96
|
-
*
|
|
97
|
-
* The `github-admin` group is omitted when `ctx.skipGithub` is set, and the
|
|
98
|
-
* `quality-gates` group is included only when `ctx.withQuality` is true, so
|
|
99
|
-
* the preview reflects the same flags the executing pipeline honours.
|
|
48
|
+
* File targets are POSIX paths so output is platform-identical; the group
|
|
49
|
+
* set honours the same flags the executing pipeline does.
|
|
100
50
|
*
|
|
101
51
|
* @param {object} [ctx]
|
|
102
|
-
* @param {{ owner?: string, repo?: string }} [ctx.answers]
|
|
103
|
-
*
|
|
104
|
-
* @param {boolean} [ctx.
|
|
105
|
-
* @param {boolean} [ctx.withQuality] — include the `quality-gates` group.
|
|
52
|
+
* @param {{ owner?: string, repo?: string }} [ctx.answers]
|
|
53
|
+
* @param {boolean} [ctx.skipGithub]
|
|
54
|
+
* @param {boolean} [ctx.withQuality]
|
|
106
55
|
* @returns {MutationManifestEntry[]}
|
|
107
56
|
*/
|
|
108
57
|
export function buildMutationManifest(ctx = {}) {
|
|
@@ -110,15 +59,6 @@ export function buildMutationManifest(ctx = {}) {
|
|
|
110
59
|
|
|
111
60
|
const entries = [];
|
|
112
61
|
|
|
113
|
-
// --- ide-wiring -------------------------------------------------------
|
|
114
|
-
// Claude Code / IDE integration: the system-prompt import, the generated
|
|
115
|
-
// flat command surface, and the .gitignore entry that keeps the
|
|
116
|
-
// generated tree out of git. (Story #4527/#4530: the UserPromptSubmit
|
|
117
|
-
// per-prompt re-sync hook entry was removed alongside the hook itself —
|
|
118
|
-
// it raced the harness's own read of the same directory and reported
|
|
119
|
-
// "0 file(s) synced" on effectively every invocation; the real sync
|
|
120
|
-
// points — `prepare`, `mandrel sync`/`update`, doctor's
|
|
121
|
-
// `commands-in-sync` — already cover every case.)
|
|
122
62
|
entries.push(
|
|
123
63
|
{
|
|
124
64
|
phaseGroup: PHASE_GROUPS.IDE_WIRING,
|
|
@@ -146,10 +86,7 @@ export function buildMutationManifest(ctx = {}) {
|
|
|
146
86
|
},
|
|
147
87
|
);
|
|
148
88
|
|
|
149
|
-
//
|
|
150
|
-
// Local repository configuration files the bootstrap seeds or extends.
|
|
151
|
-
// Also includes git-init, which is the most irreversible local mutation
|
|
152
|
-
// the bootstrap performs (B1 — uninstall ledger must record it).
|
|
89
|
+
// git-init is the most irreversible local mutation; the ledger must record it.
|
|
153
90
|
entries.push(
|
|
154
91
|
{
|
|
155
92
|
phaseGroup: PHASE_GROUPS.REPO_CONFIG,
|
|
@@ -185,9 +122,6 @@ export function buildMutationManifest(ctx = {}) {
|
|
|
185
122
|
},
|
|
186
123
|
);
|
|
187
124
|
|
|
188
|
-
// --- quality-gates ----------------------------------------------------
|
|
189
|
-
// Stabilized quality-gate surface (husky pre-commit, quality npm
|
|
190
|
-
// scripts, .agentrc quality defaults). Included only when opted in.
|
|
191
125
|
if (ctx.withQuality) {
|
|
192
126
|
entries.push(
|
|
193
127
|
{
|
|
@@ -216,9 +150,6 @@ export function buildMutationManifest(ctx = {}) {
|
|
|
216
150
|
);
|
|
217
151
|
}
|
|
218
152
|
|
|
219
|
-
// --- github-admin -----------------------------------------------------
|
|
220
|
-
// Remote GitHub configuration. These are NOT trivially reversible local
|
|
221
|
-
// edits — they mutate remote repo/org admin state.
|
|
222
153
|
if (!ctx.skipGithub) {
|
|
223
154
|
const repoSlug =
|
|
224
155
|
ctx.answers?.owner && ctx.answers?.repo
|
|
@@ -226,8 +157,6 @@ export function buildMutationManifest(ctx = {}) {
|
|
|
226
157
|
: 'the GitHub repository';
|
|
227
158
|
entries.push(
|
|
228
159
|
{
|
|
229
|
-
// B1: GitHub repo creation is the most irreversible remote mutation —
|
|
230
|
-
// record it so the uninstall ledger always lists it.
|
|
231
160
|
phaseGroup: PHASE_GROUPS.GITHUB_ADMIN,
|
|
232
161
|
target: `${repoSlug} (repo)`,
|
|
233
162
|
action: 'create',
|
|
@@ -1,29 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* consumer repo:
|
|
6
|
-
* - allow_squash_merge: true — single commit per PR; clean history.
|
|
7
|
-
* - allow_rebase_merge: false — no rebase-merge (status checks would
|
|
8
|
-
* need to be re-run per commit).
|
|
9
|
-
* - allow_merge_commit: false — no merge commits cluttering the
|
|
10
|
-
* default branch.
|
|
11
|
-
* - allow_auto_merge: true — required for the auto-merge label
|
|
12
|
-
* feature Story 1 delivered.
|
|
13
|
-
* - delete_branch_on_merge: true — head branches are throwaway.
|
|
14
|
-
*
|
|
15
|
-
* Behaviour rules
|
|
16
|
-
* ---------------
|
|
17
|
-
* No drift (live settings already match the target): no-op, returns
|
|
18
|
-
* `{ status: 'unchanged' }`.
|
|
19
|
-
*
|
|
20
|
-
* Drift (any field differs from the target stance): when a `hitlConfirm`
|
|
21
|
-
* gate is supplied, the proposed payload routes through it — on approval
|
|
22
|
-
* the PATCH is issued; on decline the module returns
|
|
23
|
-
* `{ status: 'skipped', reason: 'hitl-declined' }` without writing (a loud
|
|
24
|
-
* decline, never silent). When NO gate is supplied (non-TTY, no operator
|
|
25
|
-
* present — Story #4045 A4), the framework stance is default-applied with
|
|
26
|
-
* an explicit log line.
|
|
2
|
+
* Applies the framework merge stance (squash-only, auto-merge on, delete head
|
|
3
|
+
* branches). On drift, a supplied `hitlConfirm` gate decides; with no gate
|
|
4
|
+
* (non-TTY) the stance is applied with an explicit log line.
|
|
27
5
|
*/
|
|
28
6
|
|
|
29
7
|
export const TARGET_MERGE_METHODS = Object.freeze({
|
|
@@ -34,11 +12,7 @@ export const TARGET_MERGE_METHODS = Object.freeze({
|
|
|
34
12
|
delete_branch_on_merge: true,
|
|
35
13
|
});
|
|
36
14
|
|
|
37
|
-
/**
|
|
38
|
-
* Compute the drift between `current` (sparse) and the merged
|
|
39
|
-
* (defaults+settings) target. Returns null when nothing diverges so the
|
|
40
|
-
* caller can short-circuit before prompting HITL.
|
|
41
|
-
*/
|
|
15
|
+
/** `null` when nothing diverges. */
|
|
42
16
|
export function diffMergeMethods(current, target) {
|
|
43
17
|
const diff = {};
|
|
44
18
|
for (const key of Object.keys(target)) {
|
|
@@ -66,7 +40,6 @@ export async function applyMergeMethods({
|
|
|
66
40
|
hitlConfirm,
|
|
67
41
|
log = () => {},
|
|
68
42
|
}) {
|
|
69
|
-
// Merge methods live under `github.mergeMethods`.
|
|
70
43
|
const override = settings?.github?.mergeMethods ?? {};
|
|
71
44
|
const target = { ...TARGET_MERGE_METHODS, ...override };
|
|
72
45
|
|
|
@@ -102,8 +75,6 @@ export async function applyMergeMethods({
|
|
|
102
75
|
return { status: 'skipped', reason: 'hitl-declined', diff };
|
|
103
76
|
}
|
|
104
77
|
} else {
|
|
105
|
-
// Non-TTY: no operator present to confirm. Default-apply the framework
|
|
106
|
-
// stance and log explicitly so the consequence is never silent.
|
|
107
78
|
log(
|
|
108
79
|
'[Bootstrap] Merge methods: non-TTY — applying framework stance automatically ' +
|
|
109
80
|
'(allow_squash_merge, allow_auto_merge, delete_branch_on_merge). ' +
|
|
@@ -1,23 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Aggregates the cold-start prerequisite checks into a single
|
|
5
|
-
* fail-before-mutate gate that `bootstrap.js` runs as the FIRST pipeline
|
|
6
|
-
* phase, ahead of any project-side or GitHub-side mutation:
|
|
7
|
-
*
|
|
8
|
-
* - Node version — reuses `checkNodeVersion` from `project-bootstrap.js`.
|
|
9
|
-
* - git available — `git --version` resolves on PATH.
|
|
10
|
-
* - inside-work-tree — `git rev-parse --is-inside-work-tree` is true.
|
|
11
|
-
* - gh CLI + auth — reuses `preflightGh` from `gh-preflight.js`; skipped
|
|
12
|
-
* entirely when `skipGithub` is true.
|
|
13
|
-
*
|
|
14
|
-
* `runPreflight({ skipGithub })` returns `{ ok, checks }` where `ok` is
|
|
15
|
-
* false when any check failed. Every failing check carries a `remedy`
|
|
16
|
-
* string so the CLI can print actionable next steps before halting.
|
|
17
|
-
*
|
|
18
|
-
* The runner seams (`nodeCheck`, `gitRunner`, `gh`) default to the real
|
|
19
|
-
* implementations and are injectable so the unit test can drive every
|
|
20
|
-
* branch without spawning real child processes.
|
|
2
|
+
* Fail-before-mutate prerequisite gate run before any bootstrap mutation.
|
|
3
|
+
* Every failing check carries a `remedy`.
|
|
21
4
|
*/
|
|
22
5
|
|
|
23
6
|
import { spawnSync } from 'node:child_process';
|
|
@@ -32,10 +15,6 @@ const NODE_REMEDY = (result) =>
|
|
|
32
15
|
`Node ${result.version} is below required ${result.required}. Upgrade Node (https://nodejs.org/) and re-run this command.`;
|
|
33
16
|
|
|
34
17
|
/**
|
|
35
|
-
* Default git runner: synchronously execs `git <args>` and returns the
|
|
36
|
-
* normalized `{ status, stdout, stderr, error }` shape. Extracted so the
|
|
37
|
-
* preflight tests can inject a stub without spawning a real child process.
|
|
38
|
-
*
|
|
39
18
|
* @param {string[]} args
|
|
40
19
|
* @returns {{ status: number|null, stdout: string, stderr: string,
|
|
41
20
|
* error?: NodeJS.ErrnoException }}
|
|
@@ -51,9 +30,6 @@ function defaultGitRunner(args) {
|
|
|
51
30
|
}
|
|
52
31
|
|
|
53
32
|
/**
|
|
54
|
-
* Probe Node version via the injected `nodeCheck` seam (defaults to
|
|
55
|
-
* `checkNodeVersion`). Returns a check record.
|
|
56
|
-
*
|
|
57
33
|
* @param {() => { ok: boolean, version: string, required: string }} nodeCheck
|
|
58
34
|
* @returns {{ name: string, ok: boolean, remedy?: string }}
|
|
59
35
|
*/
|
|
@@ -64,8 +40,6 @@ function checkNode(nodeCheck) {
|
|
|
64
40
|
}
|
|
65
41
|
|
|
66
42
|
/**
|
|
67
|
-
* Probe `git --version` for availability on PATH.
|
|
68
|
-
*
|
|
69
43
|
* @param {(args: string[]) => { status: number|null, stdout: string,
|
|
70
44
|
* stderr: string, error?: NodeJS.ErrnoException }} gitRunner
|
|
71
45
|
* @returns {{ name: string, ok: boolean, remedy?: string }}
|
|
@@ -89,9 +63,6 @@ function checkGitAvailable(gitRunner) {
|
|
|
89
63
|
}
|
|
90
64
|
|
|
91
65
|
/**
|
|
92
|
-
* Probe `git rev-parse --is-inside-work-tree` to confirm the command is
|
|
93
|
-
* running inside a git work tree.
|
|
94
|
-
*
|
|
95
66
|
* @param {(args: string[]) => { status: number|null, stdout: string,
|
|
96
67
|
* stderr: string, error?: NodeJS.ErrnoException }} gitRunner
|
|
97
68
|
* @returns {{ name: string, ok: boolean, remedy?: string }}
|
|
@@ -109,10 +80,6 @@ function checkInsideWorkTree(gitRunner) {
|
|
|
109
80
|
}
|
|
110
81
|
|
|
111
82
|
/**
|
|
112
|
-
* Probe the `gh` CLI + auth via the injected `gh` seam (defaults to
|
|
113
|
-
* `preflightGh`). Maps the typed errors `preflightGh` throws into a
|
|
114
|
-
* single failing check carrying the error message as the remedy.
|
|
115
|
-
*
|
|
116
83
|
* @param {(opts?: object) => Promise<{ version: string }>} gh
|
|
117
84
|
* @returns {Promise<{ name: string, ok: boolean, remedy?: string }>}
|
|
118
85
|
*/
|
|
@@ -126,28 +93,17 @@ async function checkGh(gh) {
|
|
|
126
93
|
}
|
|
127
94
|
|
|
128
95
|
/**
|
|
129
|
-
* Run every prerequisite check and aggregate them into a single result.
|
|
130
|
-
*
|
|
131
96
|
* @param {object} [opts]
|
|
132
|
-
* @param {boolean} [opts.skipGithub=false]
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* When false (`bootstrap-new.js`), the work-tree probe is informational:
|
|
137
|
-
* it never fails the gate and its result is reported via the returned
|
|
138
|
-
* `gitInitialized` flag so later steps can fill in the missing git state.
|
|
139
|
-
* @param {boolean} [opts.checkProjectScope=false] — when true (and
|
|
140
|
-
* `skipGithub` is false), also verify the `gh` token carries the
|
|
141
|
-
* `project` scope needed to read/modify GitHub Projects V2.
|
|
97
|
+
* @param {boolean} [opts.skipGithub=false]
|
|
98
|
+
* @param {boolean} [opts.requireWorkTree=true] — false makes the work-tree
|
|
99
|
+
* probe informational (reported via `gitInitialized`); git is initialised later.
|
|
100
|
+
* @param {boolean} [opts.checkProjectScope=false]
|
|
142
101
|
* @param {() => { ok: boolean, version: string, required: string }}
|
|
143
|
-
* [opts.nodeCheck]
|
|
144
|
-
* @param {(args: string[]) => object} [opts.gitRunner]
|
|
145
|
-
*
|
|
146
|
-
* @param {(opts?: object) => Promise<{ version: string }>} [opts.gh] —
|
|
147
|
-
* `gh` preflight seam (defaults to `preflightGh`).
|
|
102
|
+
* [opts.nodeCheck]
|
|
103
|
+
* @param {(args: string[]) => object} [opts.gitRunner]
|
|
104
|
+
* @param {(opts?: object) => Promise<{ version: string }>} [opts.gh]
|
|
148
105
|
* @param {() => Promise<{ name: string, ok: boolean, remedy?: string }>}
|
|
149
|
-
* [opts.projectScope]
|
|
150
|
-
* `checkProjectScopes`).
|
|
106
|
+
* [opts.projectScope]
|
|
151
107
|
* @returns {Promise<{ ok: boolean, gitInitialized: boolean,
|
|
152
108
|
* checks: Array<{ name: string, ok: boolean, remedy?: string }> }>}
|
|
153
109
|
*/
|
|
@@ -164,8 +120,7 @@ export async function runPreflight(opts = {}) {
|
|
|
164
120
|
|
|
165
121
|
const gitAvailable = checkGitAvailable(gitRunner);
|
|
166
122
|
checks.push(gitAvailable);
|
|
167
|
-
//
|
|
168
|
-
// if git is missing the rev-parse error is redundant noise.
|
|
123
|
+
// Without git, the work-tree probe is redundant noise.
|
|
169
124
|
let gitInitialized = false;
|
|
170
125
|
if (gitAvailable.ok) {
|
|
171
126
|
const workTree = checkInsideWorkTree(gitRunner);
|
|
@@ -173,11 +128,7 @@ export async function runPreflight(opts = {}) {
|
|
|
173
128
|
if (requireWorkTree) {
|
|
174
129
|
checks.push(workTree);
|
|
175
130
|
} else {
|
|
176
|
-
//
|
|
177
|
-
// never fail the gate on it — bootstrap initialises git in a later
|
|
178
|
-
// phase. `ok` stays true so the gate passes; the rendered glyph is
|
|
179
|
-
// driven off `gitInitialized` (✓ when a repo exists, ✗ when not) so the
|
|
180
|
-
// operator sees the real state without the run aborting.
|
|
131
|
+
// `ok` stays true; the rendered glyph reads `gitInitialized`.
|
|
181
132
|
checks.push({
|
|
182
133
|
name: 'Local git initialized',
|
|
183
134
|
ok: true,
|