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
|
@@ -2,53 +2,16 @@
|
|
|
2
2
|
/* node:coverage ignore file */
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* plan-context.js —
|
|
5
|
+
* plan-context.js — build the `/mandrel-plan` authoring-context envelope from
|
|
6
|
+
* exactly one entry form (`--seed`, `--seed-file`, `--tickets`, `--amends`),
|
|
7
|
+
* write it with `stories.template.json` under `<tempRoot>/plan-<slug>/`
|
|
8
|
+
* (where `plan-persist.js` discovers the `--tickets` source ids), and print a
|
|
9
|
+
* compact JSON digest as the only stdout.
|
|
6
10
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* Two operator modes (exactly one is required):
|
|
10
|
-
*
|
|
11
|
-
* --seed "<text>" Chat/text ideation. Dup search runs off the
|
|
12
|
-
* raw seed; envelope carries `seed`.
|
|
13
|
-
*
|
|
14
|
-
* --seed-file <path> Same as --seed, but the corpus is read from
|
|
15
|
-
* disk (audit-to-stories handoff, notes).
|
|
16
|
-
*
|
|
17
|
-
* --tickets 123[,456…] Analyze existing issue(s) into proper
|
|
18
|
-
* Stories. Envelope carries `sourceTickets[]`.
|
|
19
|
-
*
|
|
20
|
-
* --amends 123 | #123 Amendment (delta) planning. Composes a DELTA
|
|
21
|
-
* envelope from the prior Story's body, its
|
|
22
|
-
* acceptance criteria, and its delivered file map
|
|
23
|
-
* instead of re-interrogating the repo from
|
|
24
|
-
* scratch (Story #4741). Envelope carries `amends`.
|
|
25
|
-
*
|
|
26
|
-
* Flags:
|
|
27
|
-
* --out <path> Override where the envelope is written (parent dirs
|
|
28
|
-
* created). **Optional since Story #5342** — with no
|
|
29
|
-
* `--out` the envelope lands at
|
|
30
|
-
* `<tempRoot>/plan-<slug>/plan-context.json`, the plan
|
|
31
|
-
* directory `/mandrel-plan` would have named by hand, and
|
|
32
|
-
* `stories.template.json` lands beside it. That is where
|
|
33
|
-
* `plan-persist.js` auto-discovers the `--tickets` source
|
|
34
|
-
* ids from (Story #4554); without a captured envelope
|
|
35
|
-
* persist cannot know a `--tickets` run happened, and
|
|
36
|
-
* superseding degrades to the `--source-tickets` flag.
|
|
37
|
-
* --pretty Pretty-print the written JSON envelope.
|
|
38
|
-
*
|
|
39
|
-
* stdout is reserved for a single JSON payload (Story #2278 discipline) —
|
|
40
|
-
* the compact digest naming the written artifacts (Story #4708
|
|
41
|
-
* script-output contract): `routeAllOutputToStderr()` runs before any
|
|
42
|
-
* pipeline code so the stream is unconditionally parseable by `JSON.parse`.
|
|
43
|
-
*
|
|
44
|
-
* Exit codes:
|
|
45
|
-
* 0 — envelope emitted.
|
|
46
|
-
* 1 — fatal error (see stderr).
|
|
11
|
+
* Exit codes: 0 envelope emitted; 1 fatal.
|
|
47
12
|
*/
|
|
48
13
|
|
|
49
|
-
//
|
|
50
|
-
// first import so the check runs before any third-party-importing sibling
|
|
51
|
-
// module is evaluated (Story #3432).
|
|
14
|
+
// Must be the first import: fail fast before any third-party import runs.
|
|
52
15
|
import './lib/runtime-deps/ensure-installed.js';
|
|
53
16
|
import { mkdir, writeFile } from 'node:fs/promises';
|
|
54
17
|
import path from 'node:path';
|
|
@@ -69,19 +32,14 @@ import {
|
|
|
69
32
|
import { recordPlanInvocation } from './lib/orchestration/plan-metrics.js';
|
|
70
33
|
import { createProvider } from './lib/provider-factory.js';
|
|
71
34
|
|
|
72
|
-
/** Longest slug segment a default plan directory carries. */
|
|
73
35
|
const PLAN_SLUG_MAX_LENGTH = 48;
|
|
74
36
|
|
|
75
37
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* Deliberately lossy: the slug is a human-readable handle on a temp
|
|
79
|
-
* directory, not an identity — two runs from the same seed land in the same
|
|
80
|
-
* directory and the second overwrites the first, which is the idempotent
|
|
81
|
-
* behaviour the operator already got from typing the same `--out` twice.
|
|
38
|
+
* Deliberately lossy: a handle, not an identity — the same seed reuses (and
|
|
39
|
+
* overwrites) the same directory.
|
|
82
40
|
*
|
|
83
41
|
* @param {string} raw
|
|
84
|
-
* @returns {string}
|
|
42
|
+
* @returns {string} `plan` when nothing survives.
|
|
85
43
|
*/
|
|
86
44
|
export function slugifyPlanLabel(raw) {
|
|
87
45
|
const slug = String(raw ?? '')
|
|
@@ -94,28 +52,18 @@ export function slugifyPlanLabel(raw) {
|
|
|
94
52
|
}
|
|
95
53
|
|
|
96
54
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* `--out` was mandatory in practice and optional in the CLI: persist
|
|
101
|
-
* auto-discovers the envelope and the `stories.template.json` beside it from
|
|
102
|
-
* the plan directory, so a run without it silently lost superseding and the
|
|
103
|
-
* authoring skeleton. The path it always pointed at is derivable — the
|
|
104
|
-
* configured `tempRoot`, a `plan-<slug>` directory named for what is being
|
|
105
|
-
* planned — so the CLI derives it rather than asking.
|
|
106
|
-
*
|
|
107
|
-
* Exported for tests: this is the join where a missing flag stops costing
|
|
108
|
-
* the plan its source ids.
|
|
55
|
+
* Envelope path when no `--out` is given. Always written, because persist
|
|
56
|
+
* discovers source ids and the template from this directory.
|
|
109
57
|
*
|
|
110
58
|
* @param {object} args
|
|
111
|
-
* @param {string} args.mode
|
|
59
|
+
* @param {string} args.mode
|
|
112
60
|
* @param {string} [args.seedText]
|
|
113
61
|
* @param {string} [args.seedFilePath]
|
|
114
62
|
* @param {number[]} [args.ticketIds]
|
|
115
63
|
* @param {number} [args.amendsId]
|
|
116
|
-
* @param {object} [args.config]
|
|
64
|
+
* @param {object} [args.config]
|
|
117
65
|
* @param {string} [args.cwd]
|
|
118
|
-
* @returns {string} Absolute path
|
|
66
|
+
* @returns {string} Absolute path.
|
|
119
67
|
*/
|
|
120
68
|
export function resolveDefaultOutPath({
|
|
121
69
|
mode,
|
|
@@ -141,8 +89,6 @@ export function resolveDefaultOutPath({
|
|
|
141
89
|
}
|
|
142
90
|
|
|
143
91
|
/**
|
|
144
|
-
* Parse a comma-/space-separated ticket id list into positive integers.
|
|
145
|
-
*
|
|
146
92
|
* @param {string} raw
|
|
147
93
|
* @returns {number[]}
|
|
148
94
|
*/
|
|
@@ -164,8 +110,6 @@ export function parseTicketIds(raw) {
|
|
|
164
110
|
}
|
|
165
111
|
|
|
166
112
|
/**
|
|
167
|
-
* Parse a single `--amends` id, tolerating a leading `#` (`#123` or `123`).
|
|
168
|
-
*
|
|
169
113
|
* @param {string} raw
|
|
170
114
|
* @returns {number}
|
|
171
115
|
*/
|
|
@@ -183,11 +127,6 @@ export function parseAmendsId(raw) {
|
|
|
183
127
|
}
|
|
184
128
|
|
|
185
129
|
/**
|
|
186
|
-
* Build the envelope, write it (plus the `stories.template.json` skeleton)
|
|
187
|
-
* to `outPath` — or to the derived default when none was passed
|
|
188
|
-
* (Story #5342) — and print the compact digest on stdout. Exported for
|
|
189
|
-
* tests.
|
|
190
|
-
*
|
|
191
130
|
* @param {object} args
|
|
192
131
|
* @returns {Promise<object>} the emitted envelope.
|
|
193
132
|
*/
|
|
@@ -233,11 +172,8 @@ export async function emitPlanContext({
|
|
|
233
172
|
cwd: cwd ?? undefined,
|
|
234
173
|
});
|
|
235
174
|
{
|
|
236
|
-
//
|
|
237
|
-
//
|
|
238
|
-
// later turn. It is always captured to disk (Story #5342 derives the
|
|
239
|
-
// path when `--out` is absent), so stdout carries a compact digest
|
|
240
|
-
// naming the artifacts instead of the payload itself.
|
|
175
|
+
// The ~40KB envelope goes to disk; stdout carries only a digest so it
|
|
176
|
+
// does not ride resident in the transcript.
|
|
241
177
|
await writeEnvelopeFile(resolvedOut, json);
|
|
242
178
|
await writeStoriesTemplateFile(resolvedOut, envelope);
|
|
243
179
|
const resolved = path.resolve(resolvedOut);
|
|
@@ -252,10 +188,7 @@ export async function emitPlanContext({
|
|
|
252
188
|
bytes: Buffer.byteLength(json, 'utf8'),
|
|
253
189
|
sourceTickets: (envelope.sourceTickets ?? []).map((t) => t.id),
|
|
254
190
|
duplicates: (envelope.duplicates ?? []).length,
|
|
255
|
-
// Advisory only
|
|
256
|
-
// /prototype offer — advisory, never an automatic reroute. It rides the
|
|
257
|
-
// digest because with `--out` the digest is the only thing the planner
|
|
258
|
-
// reads.
|
|
191
|
+
// Advisory signals only, never a reroute.
|
|
259
192
|
complexitySignals: envelope.complexitySignals
|
|
260
193
|
? {
|
|
261
194
|
artifactCount: envelope.complexitySignals.artifactCount,
|
|
@@ -264,8 +197,7 @@ export async function emitPlanContext({
|
|
|
264
197
|
uiSurface: envelope.complexitySignals.uiSurface ?? null,
|
|
265
198
|
}
|
|
266
199
|
: null,
|
|
267
|
-
//
|
|
268
|
-
// truncated, and the digest names what was cut.
|
|
200
|
+
// Names what was cut when the envelope exceeded the context ceiling.
|
|
269
201
|
truncated: envelope.truncated ?? null,
|
|
270
202
|
amends: envelope.amends ? { id: envelope.amends.id } : null,
|
|
271
203
|
};
|
|
@@ -275,12 +207,8 @@ export async function emitPlanContext({
|
|
|
275
207
|
}
|
|
276
208
|
|
|
277
209
|
/**
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
*
|
|
281
|
-
* Writing is part of emitting, not a best-effort extra: a failed write means
|
|
282
|
-
* persist will silently see no source tickets, so it throws rather than
|
|
283
|
-
* warning past the problem.
|
|
210
|
+
* Throws on failure: a missing envelope makes persist silently see no source
|
|
211
|
+
* tickets.
|
|
284
212
|
*
|
|
285
213
|
* @param {string} outPath
|
|
286
214
|
* @param {string} json
|
|
@@ -299,19 +227,11 @@ async function writeEnvelopeFile(outPath, json) {
|
|
|
299
227
|
}
|
|
300
228
|
|
|
301
229
|
/**
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
* `stories.json` and fills the placeholders; no step of the authoring path
|
|
305
|
-
* requires reading `story-body.js` source. Written on every run (Story
|
|
306
|
-
* #5342), and throwing on failure for the same reason the envelope write
|
|
307
|
-
* does: a silently missing template re-opens the format-discovery loop it
|
|
308
|
-
* exists to close. The envelope's advisory `complexitySignals` are threaded
|
|
309
|
-
* through so the skeleton's `changes[]` arrive pre-resolved to
|
|
310
|
-
* creates-vs-refactors against the repo snapshot (Story #4723).
|
|
230
|
+
* Write the ready-to-fill authoring template beside the envelope, with
|
|
231
|
+
* `changes[]` pre-resolved from `complexitySignals`. Throws on failure.
|
|
311
232
|
*
|
|
312
|
-
* @param {string} outPath
|
|
313
|
-
*
|
|
314
|
-
* @param {object} [envelope] The emitted plan-context envelope.
|
|
233
|
+
* @param {string} outPath
|
|
234
|
+
* @param {object} [envelope]
|
|
315
235
|
*/
|
|
316
236
|
async function writeStoriesTemplateFile(outPath, envelope = {}) {
|
|
317
237
|
const resolved = path.resolve(
|
|
@@ -380,18 +300,14 @@ async function main() {
|
|
|
380
300
|
mode = 'seed';
|
|
381
301
|
}
|
|
382
302
|
|
|
383
|
-
// stdout is reserved for the JSON
|
|
384
|
-
// could land on stdout to stderr BEFORE any pipeline code runs
|
|
385
|
-
// (Story #2278 — the same stdout-purity guarantee the retired pipeline
|
|
386
|
-
// gives; this CLI is emit-only so the flip is unconditional).
|
|
303
|
+
// stdout is reserved for the JSON digest.
|
|
387
304
|
routeAllOutputToStderr();
|
|
388
305
|
|
|
389
306
|
let config;
|
|
390
307
|
let settings;
|
|
391
308
|
try {
|
|
392
309
|
config = resolveConfig();
|
|
393
|
-
//
|
|
394
|
-
// friends consume: `{ baseBranch, paths, planning, docsContextFiles }`.
|
|
310
|
+
// The bag shape `buildAuthoringContext` consumes.
|
|
395
311
|
settings = {
|
|
396
312
|
baseBranch: config.project?.baseBranch,
|
|
397
313
|
paths: config.project?.paths,
|
|
@@ -1,45 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* plan-critics.js —
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* evaluates the pre-mortem dispatch condition against the draft
|
|
10
|
-
* `stories.json` and prints the verdict as JSON on stdout so the workflow can
|
|
11
|
-
* act on it — dispatching a fresh-context critic sub-agent and folding its
|
|
12
|
-
* findings into a re-author round **before** the plan is persisted.
|
|
13
|
-
*
|
|
14
|
-
* The pre-mortem's external-dependency arm (Story #4700) needs the repo's own
|
|
15
|
-
* manifests to tell an external scoped package from a local one, so this CLI
|
|
16
|
-
* reads them (`collectRepoPackages`) and passes the specifier set down — the
|
|
17
|
-
* pure evaluation modules never touch the filesystem.
|
|
18
|
-
*
|
|
19
|
-
* Why here and nowhere else. The evaluation used to run inside
|
|
20
|
-
* `run-plan-persist.js`, after authoring was finished and immediately before
|
|
21
|
-
* `createStoryIssues` — the one point in the flow where nothing can act on a
|
|
22
|
-
* `dispatch: true` verdict, because the artifacts are about to become live
|
|
23
|
-
* issues. It logged the verdict and moved on. This CLI is now the **single**
|
|
24
|
-
* evaluation point, sited where a re-author loop actually exists.
|
|
25
|
-
*
|
|
26
|
-
* Advisory by contract: a `dispatch: true` verdict routes work to the
|
|
27
|
-
* workflow, it does not gate the run. This CLI exits 0 on any verdict; only a
|
|
28
|
-
* usage/IO error is a failure. Every `dispatch: false` decision is recorded to
|
|
29
|
-
* the plan-metrics ledger (`appendCriticSkip`) so under-firing stays auditable.
|
|
30
|
-
*
|
|
31
|
-
* CLI:
|
|
32
|
-
* --stories <file> Required. The draft Story ticket array (JSON).
|
|
33
|
-
* --tech-spec <file> Optional. Shared Tech Spec, folded into the plan
|
|
34
|
-
* text the external-dependency probe scans.
|
|
35
|
-
*
|
|
36
|
-
* stdout is reserved for the verdict JSON (Story #2278 discipline):
|
|
37
|
-
*
|
|
38
|
-
* {
|
|
39
|
-
* "premortem": { "critic": "pre-mortem", "dispatch": true, "reasons": [...] }
|
|
40
|
-
* }
|
|
41
|
-
*
|
|
42
|
-
* Human-readable log lines go to stderr, matching the sibling `plan-persist`.
|
|
4
|
+
* plan-critics.js — operator-run pre-mortem dispatch verdict for a draft plan,
|
|
5
|
+
* evaluated between Author and Persist, where a re-author loop can still act
|
|
6
|
+
* on it. Advisory: exits 0 on any verdict; each skip is recorded to the
|
|
7
|
+
* plan-metrics ledger so under-firing stays auditable. stdout carries only
|
|
8
|
+
* `{ "premortem": { critic, dispatch, reasons } }`.
|
|
43
9
|
*
|
|
44
10
|
* Exit codes: 0 success (any verdict); 1 usage/IO error.
|
|
45
11
|
*/
|
|
@@ -61,10 +27,8 @@ const CLI_OPTIONS = {
|
|
|
61
27
|
|
|
62
28
|
const USAGE = 'Usage: plan-critics.js --stories <file> [--tech-spec <file>]';
|
|
63
29
|
|
|
64
|
-
/** The `cli` discriminator every ledger record from this surface carries. */
|
|
65
30
|
export const PLAN_CRITICS_CLI = 'plan-critics';
|
|
66
31
|
|
|
67
|
-
/** Dependency maps a manifest can declare a package under. */
|
|
68
32
|
const DEP_MAP_KEYS = [
|
|
69
33
|
'dependencies',
|
|
70
34
|
'devDependencies',
|
|
@@ -72,7 +36,6 @@ const DEP_MAP_KEYS = [
|
|
|
72
36
|
'peerDependencies',
|
|
73
37
|
];
|
|
74
38
|
|
|
75
|
-
/** Add a manifest's own name and every declared dependency to `names`. */
|
|
76
39
|
function collectPackageIdentity(names, pkg) {
|
|
77
40
|
if (typeof pkg?.name === 'string') names.add(pkg.name);
|
|
78
41
|
for (const key of DEP_MAP_KEYS) {
|
|
@@ -92,7 +55,6 @@ async function readJsonIfPresent(filePath) {
|
|
|
92
55
|
}
|
|
93
56
|
}
|
|
94
57
|
|
|
95
|
-
/** Normalize the `workspaces` field (array or `{ packages: [] }`) to a list. */
|
|
96
58
|
function workspacePatterns(pkg) {
|
|
97
59
|
const ws = pkg?.workspaces;
|
|
98
60
|
if (Array.isArray(ws)) return ws;
|
|
@@ -101,9 +63,7 @@ function workspacePatterns(pkg) {
|
|
|
101
63
|
}
|
|
102
64
|
|
|
103
65
|
/**
|
|
104
|
-
*
|
|
105
|
-
* common shapes — a `dir/*` glob (expanded one level) and a literal path — and
|
|
106
|
-
* never throws: an unreadable base directory is skipped.
|
|
66
|
+
* Handles `dir/*` (one level) and literal paths; never throws.
|
|
107
67
|
*
|
|
108
68
|
* @param {string} rootDir
|
|
109
69
|
* @param {string[]} patterns
|
|
@@ -134,11 +94,9 @@ async function resolveWorkspaceManifestPaths(rootDir, patterns) {
|
|
|
134
94
|
}
|
|
135
95
|
|
|
136
96
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* plus every workspace manifest's. Best-effort: a repo with no `package.json`
|
|
141
|
-
* yields `[]`, which only widens what the probe treats as external.
|
|
97
|
+
* Package specifiers the repo's own manifests (root + workspaces) declare, so
|
|
98
|
+
* the external-dependency probe can tell local from external. No manifest
|
|
99
|
+
* yields `[]`, which only widens what counts as external.
|
|
142
100
|
*
|
|
143
101
|
* @param {{ rootDir?: string }} [opts]
|
|
144
102
|
* @returns {Promise<string[]>}
|
|
@@ -160,8 +118,6 @@ export async function collectRepoPackages({ rootDir = process.cwd() } = {}) {
|
|
|
160
118
|
}
|
|
161
119
|
|
|
162
120
|
/**
|
|
163
|
-
* Read the draft artifacts the critics evaluate.
|
|
164
|
-
*
|
|
165
121
|
* @param {{ storiesPath: string, techSpecPath?: string|null }} paths
|
|
166
122
|
* @returns {Promise<{ tickets: object[], techSpecContent: string }>}
|
|
167
123
|
*/
|
|
@@ -188,9 +144,7 @@ export async function loadCriticArtifacts({
|
|
|
188
144
|
}
|
|
189
145
|
|
|
190
146
|
/**
|
|
191
|
-
*
|
|
192
|
-
* ledger write is best-effort by `appendCriticSkip`'s own contract — it can
|
|
193
|
-
* never fail the plan step.
|
|
147
|
+
* The ledger write is best-effort and never fails the plan step.
|
|
194
148
|
*
|
|
195
149
|
* @param {{ premortem: object }} verdict
|
|
196
150
|
* @param {object} config
|
|
@@ -221,10 +175,6 @@ export async function recordCriticSkips(
|
|
|
221
175
|
}
|
|
222
176
|
|
|
223
177
|
/**
|
|
224
|
-
* Load the artifacts, evaluate the pre-mortem, record a skip, and return the
|
|
225
|
-
* verdict. Exported as the CLI's whole body so tests drive it in-process with
|
|
226
|
-
* an explicit config and ledger seam.
|
|
227
|
-
*
|
|
228
178
|
* @param {{
|
|
229
179
|
* storiesPath: string,
|
|
230
180
|
* techSpecPath?: string|null,
|
|
@@ -232,10 +182,7 @@ export async function recordCriticSkips(
|
|
|
232
182
|
* knownPackages?: string[],
|
|
233
183
|
* append?: typeof appendCriticSkip,
|
|
234
184
|
* }} args
|
|
235
|
-
* @param {string[]} [args.knownPackages]
|
|
236
|
-
* manifests declare, forwarded to the pre-mortem external-dependency probe
|
|
237
|
-
* (Story #4700). `main()` resolves them via `collectRepoPackages`; tests may
|
|
238
|
-
* pass an explicit set or omit it (defaults to `[]`).
|
|
185
|
+
* @param {string[]} [args.knownPackages]
|
|
239
186
|
* @returns {Promise<{ premortem: object }>}
|
|
240
187
|
*/
|
|
241
188
|
export async function evaluateCriticArtifacts({
|
|
@@ -266,8 +213,7 @@ async function main() {
|
|
|
266
213
|
throw new Error(USAGE);
|
|
267
214
|
}
|
|
268
215
|
|
|
269
|
-
// stdout is reserved for the verdict JSON
|
|
270
|
-
// could land on stdout to stderr before any evaluation runs.
|
|
216
|
+
// stdout is reserved for the verdict JSON.
|
|
271
217
|
routeAllOutputToStderr();
|
|
272
218
|
|
|
273
219
|
const verdict = await evaluateCriticArtifacts({
|
|
@@ -1,56 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* plan-persist.js —
|
|
5
|
-
* (
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Tech Spec), this CLI validates and creates Story issue(s) directly:
|
|
9
|
-
*
|
|
10
|
-
* changes[] repair → ticket validator / DAG → reachability →
|
|
11
|
-
* split-policy partition → fold Spec into each Story body →
|
|
12
|
-
* createIssue(s) with type::story, resumably by plan fingerprint (NOT
|
|
13
|
-
* agent::ready) → one `story-plan-state` comment (the plan summary) on
|
|
14
|
-
* every Story → flip every Story to agent::ready →
|
|
15
|
-
* comment + close superseded source tickets → temp cleanup + stale reap.
|
|
16
|
-
*
|
|
17
|
-
* Story #4542 retired the authored risk verdict: persist neither requires nor
|
|
18
|
-
* accepts one, and no plan-time step produces one. Review depth and the
|
|
19
|
-
* acceptance-critic mode are derived from the diff at close time
|
|
20
|
-
* (`review-depth.js#deriveChangeLevel`). `--force-review` is the only review
|
|
21
|
-
* gate the planner still carries, and it is an explicit operator flag.
|
|
22
|
-
*
|
|
23
|
-
* CLI:
|
|
24
|
-
* --stories <file> Required Story ticket array (default length 1)
|
|
25
|
-
* --tech-spec <file> Optional shared Tech Spec folded into each Story
|
|
26
|
-
* --plan-dir <dir> Optional temp dir deleted at terminal success.
|
|
27
|
-
* Also where the `plan-context.json` envelope is
|
|
28
|
-
* auto-discovered from (see --plan-context)
|
|
29
|
-
* --plan-context <file> Optional explicit path to the `plan-context.js`
|
|
30
|
-
* envelope. Its `sourceTickets[]` is what makes
|
|
31
|
-
* `--tickets` superseding work without a flag
|
|
32
|
-
* --source-tickets <ids> Explicit OVERRIDE of the envelope-derived source
|
|
33
|
-
* ids, for hand-driven runs. Each id must be
|
|
34
|
-
* claimed by exactly one Story's `supersedes[]`;
|
|
35
|
-
* they are commented on and closed as superseded
|
|
36
|
-
* --no-close-superseded Keep the source tickets open (no comment, no
|
|
37
|
-
* close) — for a genuinely partial supersede
|
|
38
|
-
* --dry-run Assemble + validate without GitHub writes
|
|
39
|
-
* --force-review Operator-forced review stop before persist lands
|
|
40
|
-
*
|
|
41
|
-
* **Persist is one command (Story #5342).** Without `--dry-run` the CLI runs
|
|
42
|
-
* the write-free dry-run first — the
|
|
43
|
-
* changes[] repair, the validator, DAG, reachability, split/supersede
|
|
44
|
-
* partition, Spec fold — and, when the gate list comes back clean, chains
|
|
45
|
-
* straight into the real persist in the SAME invocation. A dry-run failure
|
|
46
|
-
* stops before any `createIssue`, and the run lists every warning (a
|
|
47
|
-
* footprint probe that disagrees with the base branch, an empty `verify[]`,
|
|
48
|
-
* an open question in a body) either way. `--dry-run` still creates nothing.
|
|
49
|
-
*
|
|
50
|
-
* stdout is reserved for the JSON result (Story #2278 discipline, extended to
|
|
51
|
-
* this CLI by Story #4541): `routeAllOutputToStderr()` runs before any
|
|
52
|
-
* pipeline code so a headless driver can `JSON.parse` stdout unconditionally.
|
|
53
|
-
* Human-readable log lines go to stderr, matching the sibling `plan-context`.
|
|
4
|
+
* plan-persist.js — validate authored plan artifacts and create the Story
|
|
5
|
+
* issue(s). Without `--dry-run` it runs the write-free dry-run first and
|
|
6
|
+
* persists in the same invocation only if every gate passes. stdout carries
|
|
7
|
+
* only the JSON result; logs go to stderr.
|
|
54
8
|
*
|
|
55
9
|
* Exit codes: 0 success; 1 fatal; 3 reachability orphans (nothing mutated).
|
|
56
10
|
*/
|
|
@@ -137,9 +91,6 @@ async function readJsonFile(filePath, label) {
|
|
|
137
91
|
}
|
|
138
92
|
|
|
139
93
|
/**
|
|
140
|
-
* Resolve every input path the CLI accepts, including where the
|
|
141
|
-
* `plan-context.js` envelope is discovered from. Exported for tests.
|
|
142
|
-
*
|
|
143
94
|
* @param {object} values Parsed `parseArgs` values.
|
|
144
95
|
*/
|
|
145
96
|
export function resolveInputPaths(values) {
|
|
@@ -171,16 +122,11 @@ async function loadArtifacts(paths) {
|
|
|
171
122
|
}
|
|
172
123
|
|
|
173
124
|
/**
|
|
174
|
-
*
|
|
125
|
+
* Title and goal are required together; exactly one is a usage error rather
|
|
126
|
+
* than a silent no-Epic run.
|
|
175
127
|
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
* cannot be opened at all. Supplying exactly one is a **usage error**, not a
|
|
179
|
-
* silent no-Epic run — the operator asked for a container and would otherwise
|
|
180
|
-
* never learn they did not get one.
|
|
181
|
-
*
|
|
182
|
-
* @param {object} values Parsed `parseArgs` values.
|
|
183
|
-
* @returns {{ title: string, goal: string }|null} `null` when no Epic was requested.
|
|
128
|
+
* @param {object} values
|
|
129
|
+
* @returns {{ title: string, goal: string }|null}
|
|
184
130
|
*/
|
|
185
131
|
export function resolveEpicRequest(values) {
|
|
186
132
|
const title = (values['epic-title'] ?? '').trim();
|
|
@@ -197,15 +143,11 @@ export function resolveEpicRequest(values) {
|
|
|
197
143
|
}
|
|
198
144
|
|
|
199
145
|
/**
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
* A run either joins a container or opens one; asking for both names no
|
|
203
|
-
* coherent outcome, so it is a usage error rather than a silent precedence
|
|
204
|
-
* rule the operator would have to know.
|
|
146
|
+
* A run joins an Epic or opens one, never both.
|
|
205
147
|
*
|
|
206
|
-
* @param {object} values
|
|
148
|
+
* @param {object} values
|
|
207
149
|
* @returns {void}
|
|
208
|
-
* @throws {Error}
|
|
150
|
+
* @throws {Error}
|
|
209
151
|
*/
|
|
210
152
|
export function assertEpicFlagsExclusive(values) {
|
|
211
153
|
const adopts = (values.epic ?? '').trim() !== '';
|
|
@@ -222,14 +164,11 @@ export function assertEpicFlagsExclusive(values) {
|
|
|
222
164
|
}
|
|
223
165
|
|
|
224
166
|
/**
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
* Story #5155. Parsed here rather than deep in the engine so a typo costs a
|
|
228
|
-
* usage error before any provider call — the id itself is verified against
|
|
229
|
-
* live state later, before the first create.
|
|
167
|
+
* `--epic <id>` shape check before any provider call; existence is verified
|
|
168
|
+
* later against live state.
|
|
230
169
|
*
|
|
231
|
-
* @param {object} values
|
|
232
|
-
* @returns {number|null}
|
|
170
|
+
* @param {object} values
|
|
171
|
+
* @returns {number|null}
|
|
233
172
|
*/
|
|
234
173
|
export function resolveEpicAdoptionId(values) {
|
|
235
174
|
const raw = (values.epic ?? '').trim();
|
|
@@ -244,16 +183,13 @@ export function resolveEpicAdoptionId(values) {
|
|
|
244
183
|
}
|
|
245
184
|
|
|
246
185
|
/**
|
|
247
|
-
*
|
|
186
|
+
* Where envelope-derived source ids meet the engine; a break here silently
|
|
187
|
+
* un-wires `--tickets` superseding.
|
|
248
188
|
*
|
|
249
|
-
*
|
|
250
|
-
* meet the persist engine, so a regression here silently un-wires
|
|
251
|
-
* `/mandrel-plan --tickets` superseding (Story #4554).
|
|
252
|
-
*
|
|
253
|
-
* @param {object} values Parsed `parseArgs` values.
|
|
189
|
+
* @param {object} values
|
|
254
190
|
* @param {ReturnType<typeof resolveInputPaths>} paths
|
|
255
191
|
* @param {object|null} planContextEnvelope
|
|
256
|
-
* @returns {object}
|
|
192
|
+
* @returns {object}
|
|
257
193
|
*/
|
|
258
194
|
export function buildPersistOptions(values, paths, planContextEnvelope) {
|
|
259
195
|
const source = resolveSourceTicketIds({
|
|
@@ -270,8 +206,7 @@ export function buildPersistOptions(values, paths, planContextEnvelope) {
|
|
|
270
206
|
sourceTicketOrigin: source.origin,
|
|
271
207
|
epic: resolveEpicRequest(values),
|
|
272
208
|
adoptEpicId: resolveEpicAdoptionId(values),
|
|
273
|
-
//
|
|
274
|
-
// wins over the (default `true`) `--close-superseded`.
|
|
209
|
+
// `--no-close-superseded` always wins.
|
|
275
210
|
closeSuperseded:
|
|
276
211
|
values['no-close-superseded'] === true
|
|
277
212
|
? false
|
|
@@ -313,32 +248,10 @@ async function runPersistInvocation({
|
|
|
313
248
|
}
|
|
314
249
|
|
|
315
250
|
/**
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
* Two passes over the **same** loaded artifacts:
|
|
321
|
-
*
|
|
322
|
-
* 1. A write-free dry-run. Every gate runs before any `createIssue` can
|
|
323
|
-
* happen, so a validation failure — which throws or returns reachability
|
|
324
|
-
* orphans — stops here, before a single issue exists (AC-3).
|
|
325
|
-
* 2. The real write, run when the dry-run passed clean. Because it replays
|
|
326
|
-
* the identical artifacts, the persisted output is byte-identical to
|
|
327
|
-
* what the dry-run validated (AC-1). The lite-route condition that used
|
|
328
|
-
* to gate this step went with the plan-side lite claim: a clean dry-run
|
|
329
|
-
* is the review the chain exists to fold.
|
|
330
|
-
*
|
|
331
|
-
* The caller reads the **second** pass's envelope, so the first pass's
|
|
332
|
-
* evidence has to be carried onto it (Story #5361). The repair pass mutates
|
|
333
|
-
* the loaded tickets in place, which is what makes replaying the identical
|
|
334
|
-
* artifacts possible at all — and it is also why pass 2 recomputes an empty
|
|
335
|
-
* `repairs[]`: by then there is nothing left to repair. The evidence is
|
|
336
|
-
* preserved rather than re-derived, because re-running the repair pass would
|
|
337
|
-
* report repairs the persisting pass did not make.
|
|
338
|
-
*
|
|
339
|
-
* Exported for tests — this is where the round-trip collapse lives, so a
|
|
340
|
-
* regression here silently re-opens the second operator round-trip (or
|
|
341
|
-
* worse, persists a plan the dry-run never gated).
|
|
251
|
+
* Dry-run then persist over the SAME artifacts: a gate failure throws before
|
|
252
|
+
* any issue exists, and the write replays exactly what was validated. The
|
|
253
|
+
* repair pass mutates tickets in place, so pass 2 sees no repairs — carry pass
|
|
254
|
+
* 1's evidence onto the returned envelope.
|
|
342
255
|
*
|
|
343
256
|
* @param {{ values: object, config: object, provider: object,
|
|
344
257
|
* artifacts: object, metricsSince: string }} args
|
|
@@ -385,10 +298,7 @@ export async function runPersistChain({
|
|
|
385
298
|
}
|
|
386
299
|
|
|
387
300
|
/**
|
|
388
|
-
*
|
|
389
|
-
* reported identically. Order is the operator's reading order; the dedupe is
|
|
390
|
-
* by rendered content because a repair is a plain record and a warning is a
|
|
391
|
-
* string, so two passes that noticed the same thing noticed it byte-for-byte.
|
|
301
|
+
* Ordered union, deduped by serialized content.
|
|
392
302
|
*
|
|
393
303
|
* @param {unknown} first
|
|
394
304
|
* @param {unknown} second
|
|
@@ -410,19 +320,7 @@ function mergeEvidence(first, second) {
|
|
|
410
320
|
}
|
|
411
321
|
|
|
412
322
|
/**
|
|
413
|
-
*
|
|
414
|
-
*
|
|
415
|
-
* Story #5342: chaining is the default, not a flag. Every invocation that is
|
|
416
|
-
* not an explicit `--dry-run` runs the gate list and then persists what it
|
|
417
|
-
* passed, so the two operator round-trips collapse without anyone having to
|
|
418
|
-
* remember an opt-in. Story #5361 removed the no-op alias Story #5342 had
|
|
419
|
-
* kept for existing call-sites, rather than accepting and ignoring it: a flag
|
|
420
|
-
* that cannot change an outcome is a shim, and `parseArgs` refuses an unknown
|
|
421
|
-
* option, so passing it now fails loudly instead of reading as honoured.
|
|
422
|
-
*
|
|
423
|
-
* Exported for tests: this one predicate is what makes the CLI one command.
|
|
424
|
-
*
|
|
425
|
-
* @param {object} values Parsed `parseArgs` values.
|
|
323
|
+
* @param {object} values
|
|
426
324
|
* @returns {boolean} `true` to run the gates and then persist.
|
|
427
325
|
*/
|
|
428
326
|
export function shouldChainPersist(values) {
|
|
@@ -430,18 +328,8 @@ export function shouldChainPersist(values) {
|
|
|
430
328
|
}
|
|
431
329
|
|
|
432
330
|
/**
|
|
433
|
-
* Attach the plan-metrics roll-up for
|
|
434
|
-
*
|
|
435
|
-
* Two Story #4541 fixes meet here. `readPlanMetrics` is declared
|
|
436
|
-
* `(epicId, config)` but was called with `config` first, so it threw its
|
|
437
|
-
* `epicId` guard on every run and the catch below turned that into a
|
|
438
|
-
* silently missing summary — v2 persist is always Epic-less, hence the
|
|
439
|
-
* explicit `null`. And the Epic-less ledger is shared across every plan the
|
|
440
|
-
* repo has ever run, so `since` scopes the counts to the current invocation
|
|
441
|
-
* instead of reporting lifetime totals under an invocation-shaped line.
|
|
442
|
-
*
|
|
443
|
-
* This runs *after* `recordPlanInvocation` has appended this run's own
|
|
444
|
-
* record, so the summary always has at least that one entry to report.
|
|
331
|
+
* Attach the plan-metrics roll-up for this invocation. The Epic-less (`null`)
|
|
332
|
+
* ledger is shared by every plan run, so `since` scopes it to this one.
|
|
445
333
|
*
|
|
446
334
|
* @param {object} result Mutated in place with `planMetrics`.
|
|
447
335
|
* @param {object} config
|
|
@@ -468,14 +356,10 @@ async function main() {
|
|
|
468
356
|
throw new Error(USAGE);
|
|
469
357
|
}
|
|
470
358
|
|
|
471
|
-
// stdout is reserved for the JSON result
|
|
472
|
-
// land on stdout to stderr BEFORE any pipeline code runs (Story #2278
|
|
473
|
-
// discipline, extended here by Story #4541 — this CLI interleaved Logger
|
|
474
|
-
// lines with its own JSON, so a headless driver could not parse stdout).
|
|
359
|
+
// stdout is reserved for the JSON result.
|
|
475
360
|
routeAllOutputToStderr();
|
|
476
361
|
|
|
477
|
-
//
|
|
478
|
-
// ledger-writing work so every record this run appends falls inside it.
|
|
362
|
+
// Stamped before any ledger write so this run's records fall inside it.
|
|
479
363
|
const metricsSince = new Date().toISOString();
|
|
480
364
|
|
|
481
365
|
let config;
|
|
@@ -485,8 +369,7 @@ async function main() {
|
|
|
485
369
|
} catch (err) {
|
|
486
370
|
throw new Error(`Config schema validation failed:\n${err.message}`);
|
|
487
371
|
}
|
|
488
|
-
// Argument-shape refusals fire before any I/O
|
|
489
|
-
// the operator can see without waiting on artifact reads or a provider.
|
|
372
|
+
// Argument-shape refusals fire before any I/O.
|
|
490
373
|
assertEpicFlagsExclusive(values);
|
|
491
374
|
resolveEpicRequest(values);
|
|
492
375
|
resolveEpicAdoptionId(values);
|